diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2019-02-06 13:29:17 -0500 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2019-02-11 17:25:31 -0500 |
| commit | 83cd203084f68707839c00df120eed367d49e311 (patch) | |
| tree | 292a4501a6b207a9ff53a02e67a692c6615c09a5 | |
| parent | a342083abe576db43594a32d458a61fa81f7cb32 (diff) | |
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>
| -rw-r--r-- | drivers/input/keyboard/qt2160.c | 69 |
1 files changed, 27 insertions, 42 deletions
diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c index 43b86482dda0..d466bc07aebb 100644 --- a/drivers/input/keyboard/qt2160.c +++ b/drivers/input/keyboard/qt2160.c | |||
| @@ -58,10 +58,9 @@ static unsigned char qt2160_key2code[] = { | |||
| 58 | struct qt2160_led { | 58 | struct qt2160_led { |
| 59 | struct qt2160_data *qt2160; | 59 | struct qt2160_data *qt2160; |
| 60 | struct led_classdev cdev; | 60 | struct led_classdev cdev; |
| 61 | struct work_struct work; | ||
| 62 | char name[32]; | 61 | char name[32]; |
| 63 | int id; | 62 | int id; |
| 64 | enum led_brightness new_brightness; | 63 | enum led_brightness brightness; |
| 65 | }; | 64 | }; |
| 66 | #endif | 65 | #endif |
| 67 | 66 | ||
| @@ -74,7 +73,6 @@ struct qt2160_data { | |||
| 74 | u16 key_matrix; | 73 | u16 key_matrix; |
| 75 | #ifdef CONFIG_LEDS_CLASS | 74 | #ifdef CONFIG_LEDS_CLASS |
| 76 | struct qt2160_led leds[QT2160_NUM_LEDS_X]; | 75 | struct qt2160_led leds[QT2160_NUM_LEDS_X]; |
| 77 | struct mutex led_lock; | ||
| 78 | #endif | 76 | #endif |
| 79 | }; | 77 | }; |
| 80 | 78 | ||
| @@ -83,46 +81,39 @@ static int qt2160_write(struct i2c_client *client, u8 reg, u8 data); | |||
| 83 | 81 | ||
| 84 | #ifdef CONFIG_LEDS_CLASS | 82 | #ifdef CONFIG_LEDS_CLASS |
| 85 | 83 | ||
| 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) | ||
| 87 | { | 86 | { |
| 88 | struct qt2160_led *led = container_of(work, struct qt2160_led, work); | 87 | struct qt2160_led *led = container_of(cdev, struct qt2160_led, cdev); |
| 89 | struct qt2160_data *qt2160 = led->qt2160; | 88 | struct qt2160_data *qt2160 = led->qt2160; |
| 90 | struct i2c_client *client = qt2160->client; | 89 | struct i2c_client *client = qt2160->client; |
| 91 | int value = led->new_brightness; | ||
| 92 | u32 drive, pwmen; | 90 | u32 drive, pwmen; |
| 93 | 91 | ||
| 94 | mutex_lock(&qt2160->led_lock); | 92 | if (value != led->brightness) { |
| 95 | 93 | drive = qt2160_read(client, QT2160_CMD_DRIVE_X); | |
| 96 | drive = qt2160_read(client, QT2160_CMD_DRIVE_X); | 94 | pwmen = qt2160_read(client, QT2160_CMD_PWMEN_X); |
| 97 | pwmen = qt2160_read(client, QT2160_CMD_PWMEN_X); | 95 | if (value != LED_OFF) { |
| 98 | if (value != LED_OFF) { | 96 | drive |= BIT(led->id); |
| 99 | drive |= (1 << led->id); | 97 | pwmen |= BIT(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); | ||
| 108 | 98 | ||
| 109 | /* | 99 | } else { |
| 110 | * Changing this register will change the brightness | 100 | drive &= ~BIT(led->id); |
| 111 | * of every LED in the qt2160. It's a HW limitation. | 101 | pwmen &= ~BIT(led->id); |
| 112 | */ | 102 | } |
| 113 | if (value != LED_OFF) | 103 | qt2160_write(client, QT2160_CMD_DRIVE_X, drive); |
| 114 | qt2160_write(client, QT2160_CMD_PWM_DUTY, value); | 104 | qt2160_write(client, QT2160_CMD_PWMEN_X, pwmen); |
| 115 | 105 | ||
| 116 | mutex_unlock(&qt2160->led_lock); | 106 | /* |
| 117 | } | 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); | ||
| 118 | 112 | ||
| 119 | static void qt2160_led_set(struct led_classdev *cdev, | 113 | led->brightness = value; |
| 120 | enum led_brightness value) | 114 | } |
| 121 | { | ||
| 122 | struct qt2160_led *led = container_of(cdev, struct qt2160_led, cdev); | ||
| 123 | 115 | ||
| 124 | led->new_brightness = value; | 116 | return 0; |
| 125 | schedule_work(&led->work); | ||
| 126 | } | 117 | } |
| 127 | 118 | ||
| 128 | #endif /* CONFIG_LEDS_CLASS */ | 119 | #endif /* CONFIG_LEDS_CLASS */ |
| @@ -293,20 +284,16 @@ static int qt2160_register_leds(struct qt2160_data *qt2160) | |||
| 293 | int ret; | 284 | int ret; |
| 294 | int i; | 285 | int i; |
| 295 | 286 | ||
| 296 | mutex_init(&qt2160->led_lock); | ||
| 297 | |||
| 298 | for (i = 0; i < QT2160_NUM_LEDS_X; i++) { | 287 | for (i = 0; i < QT2160_NUM_LEDS_X; i++) { |
| 299 | struct qt2160_led *led = &qt2160->leds[i]; | 288 | struct qt2160_led *led = &qt2160->leds[i]; |
| 300 | 289 | ||
| 301 | snprintf(led->name, sizeof(led->name), "qt2160:x%d", i); | 290 | snprintf(led->name, sizeof(led->name), "qt2160:x%d", i); |
| 302 | led->cdev.name = led->name; | 291 | led->cdev.name = led->name; |
| 303 | led->cdev.brightness_set = qt2160_led_set; | 292 | led->cdev.brightness_set_blocking = qt2160_led_set; |
| 304 | led->cdev.brightness = LED_OFF; | 293 | led->cdev.brightness = LED_OFF; |
| 305 | led->id = i; | 294 | led->id = i; |
| 306 | led->qt2160 = qt2160; | 295 | led->qt2160 = qt2160; |
| 307 | 296 | ||
| 308 | INIT_WORK(&led->work, qt2160_led_work); | ||
| 309 | |||
| 310 | ret = led_classdev_register(&client->dev, &led->cdev); | 297 | ret = led_classdev_register(&client->dev, &led->cdev); |
| 311 | if (ret < 0) | 298 | if (ret < 0) |
| 312 | return ret; | 299 | return ret; |
| @@ -324,10 +311,8 @@ static void qt2160_unregister_leds(struct qt2160_data *qt2160) | |||
| 324 | { | 311 | { |
| 325 | int i; | 312 | int i; |
| 326 | 313 | ||
| 327 | for (i = 0; i < QT2160_NUM_LEDS_X; i++) { | 314 | for (i = 0; i < QT2160_NUM_LEDS_X; i++) |
| 328 | led_classdev_unregister(&qt2160->leds[i].cdev); | 315 | led_classdev_unregister(&qt2160->leds[i].cdev); |
| 329 | cancel_work_sync(&qt2160->leds[i].work); | ||
| 330 | } | ||
| 331 | } | 316 | } |
| 332 | 317 | ||
| 333 | #else | 318 | #else |
