Skip to content

Commit 83cd203

Browse files
committed
Input: qt2160 - switch to using brightness_set_blocking()
Now that LEDs core allows "blocking" flavor of "set brightness" method we can use it and get rid of private work items. Reviewed-by: Sven Van Asbroeck <TheSven73@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
1 parent a342083 commit 83cd203

File tree

1 file changed

+27
-42
lines changed

1 file changed

+27
-42
lines changed

drivers/input/keyboard/qt2160.c

Lines changed: 27 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,9 @@ static unsigned char qt2160_key2code[] = {
5858
struct qt2160_led {
5959
struct qt2160_data *qt2160;
6060
struct led_classdev cdev;
61-
struct work_struct work;
6261
char name[32];
6362
int id;
64-
enum led_brightness new_brightness;
63+
enum led_brightness brightness;
6564
};
6665
#endif
6766

@@ -74,7 +73,6 @@ struct qt2160_data {
7473
u16 key_matrix;
7574
#ifdef CONFIG_LEDS_CLASS
7675
struct qt2160_led leds[QT2160_NUM_LEDS_X];
77-
struct mutex led_lock;
7876
#endif
7977
};
8078

@@ -83,46 +81,39 @@ static int qt2160_write(struct i2c_client *client, u8 reg, u8 data);
8381

8482
#ifdef CONFIG_LEDS_CLASS
8583

86-
static void qt2160_led_work(struct work_struct *work)
84+
static int qt2160_led_set(struct led_classdev *cdev,
85+
enum led_brightness value)
8786
{
88-
struct qt2160_led *led = container_of(work, struct qt2160_led, work);
87+
struct qt2160_led *led = container_of(cdev, struct qt2160_led, cdev);
8988
struct qt2160_data *qt2160 = led->qt2160;
9089
struct i2c_client *client = qt2160->client;
91-
int value = led->new_brightness;
9290
u32 drive, pwmen;
9391

94-
mutex_lock(&qt2160->led_lock);
95-
96-
drive = qt2160_read(client, QT2160_CMD_DRIVE_X);
97-
pwmen = qt2160_read(client, QT2160_CMD_PWMEN_X);
98-
if (value != LED_OFF) {
99-
drive |= (1 << led->id);
100-
pwmen |= (1 << led->id);
101-
102-
} else {
103-
drive &= ~(1 << led->id);
104-
pwmen &= ~(1 << led->id);
105-
}
106-
qt2160_write(client, QT2160_CMD_DRIVE_X, drive);
107-
qt2160_write(client, QT2160_CMD_PWMEN_X, pwmen);
92+
if (value != led->brightness) {
93+
drive = qt2160_read(client, QT2160_CMD_DRIVE_X);
94+
pwmen = qt2160_read(client, QT2160_CMD_PWMEN_X);
95+
if (value != LED_OFF) {
96+
drive |= BIT(led->id);
97+
pwmen |= BIT(led->id);
10898

109-
/*
110-
* Changing this register will change the brightness
111-
* of every LED in the qt2160. It's a HW limitation.
112-
*/
113-
if (value != LED_OFF)
114-
qt2160_write(client, QT2160_CMD_PWM_DUTY, value);
99+
} else {
100+
drive &= ~BIT(led->id);
101+
pwmen &= ~BIT(led->id);
102+
}
103+
qt2160_write(client, QT2160_CMD_DRIVE_X, drive);
104+
qt2160_write(client, QT2160_CMD_PWMEN_X, pwmen);
115105

116-
mutex_unlock(&qt2160->led_lock);
117-
}
106+
/*
107+
* Changing this register will change the brightness
108+
* of every LED in the qt2160. It's a HW limitation.
109+
*/
110+
if (value != LED_OFF)
111+
qt2160_write(client, QT2160_CMD_PWM_DUTY, value);
118112

119-
static void qt2160_led_set(struct led_classdev *cdev,
120-
enum led_brightness value)
121-
{
122-
struct qt2160_led *led = container_of(cdev, struct qt2160_led, cdev);
113+
led->brightness = value;
114+
}
123115

124-
led->new_brightness = value;
125-
schedule_work(&led->work);
116+
return 0;
126117
}
127118

128119
#endif /* CONFIG_LEDS_CLASS */
@@ -293,20 +284,16 @@ static int qt2160_register_leds(struct qt2160_data *qt2160)
293284
int ret;
294285
int i;
295286

296-
mutex_init(&qt2160->led_lock);
297-
298287
for (i = 0; i < QT2160_NUM_LEDS_X; i++) {
299288
struct qt2160_led *led = &qt2160->leds[i];
300289

301290
snprintf(led->name, sizeof(led->name), "qt2160:x%d", i);
302291
led->cdev.name = led->name;
303-
led->cdev.brightness_set = qt2160_led_set;
292+
led->cdev.brightness_set_blocking = qt2160_led_set;
304293
led->cdev.brightness = LED_OFF;
305294
led->id = i;
306295
led->qt2160 = qt2160;
307296

308-
INIT_WORK(&led->work, qt2160_led_work);
309-
310297
ret = led_classdev_register(&client->dev, &led->cdev);
311298
if (ret < 0)
312299
return ret;
@@ -324,10 +311,8 @@ static void qt2160_unregister_leds(struct qt2160_data *qt2160)
324311
{
325312
int i;
326313

327-
for (i = 0; i < QT2160_NUM_LEDS_X; i++) {
314+
for (i = 0; i < QT2160_NUM_LEDS_X; i++)
328315
led_classdev_unregister(&qt2160->leds[i].cdev);
329-
cancel_work_sync(&qt2160->leds[i].work);
330-
}
331316
}
332317

333318
#else

0 commit comments

Comments
 (0)