diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-11 20:40:48 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-11 20:40:48 -0800 |
commit | 2c487121e3c4f87e82cff493872675bde52e47fc (patch) | |
tree | c32f72d674c3503cff63063804de6b4e990d9545 /drivers/leds/leds-pca955x.c | |
parent | d870a9d5e31ea69a1ceb7555d0d79364c442c5c0 (diff) | |
parent | 522f17e1214cf112e62cff56150964d8b68b94b2 (diff) |
Merge tag 'leds-for-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds
Pull LED subsystem updates from Jacek Anaszewski:
"Besides regular driver updates, we introduce a portion of LED core
improvements, that allow to avoid the need for using work queues in
the LED class drivers, that set brightness in a blocking way.
Affected LED class drivers are being optimized accordingly.
- LED core improvements:
- use EXPORT_SYMBOL_GPL consistently,
- add two new LED_BLINK_ flags,
- rename brightness_set_sync op to brightness_set_blocking,
- add led_set_brightness_nosleep{nopm} functions,
- use set_brightness_work for the blocking op,
- drivers shouldn't enforce SYNC/ASYNC brightness setting,
- turn off the LED and wait for completion on unregistering LED
class device,
- add managed version of led_trigger_register,
- add description of brightness setting API to the LED class doc.
- Remove work queues from drivers: leds-tlc591xx, leds-88pm860x, leds-adp5520,
leds-bd2802, leds-blinkm, leds-lm3533, leds-lm3642, leds-pca9532,
leds-lp3944, leds-lp55xx, leds-lp8788, leds-lp8860, leds-pca955x,
leds-pca963x, leds-wm831x, leds-da903x, leds-da9052, leds-dac124d085,
leds-lt3593, leds-max8997, leds-mc13783, leds-regulator, leds-wm8350,
leds-max77693, leds-aat1290, leds-ktd2692, leds-gpio, leds-pwm,
leds-lm355x, leds-ns2.
- Replace brightness_set op with a new brightness_set_blocking op to
make the drivers compatible with led triggers: leds-ipaq-micro,
leds-powernv.
- Add missing of_node_put: leds-ktd2692, leds-aat1290, leds-max77693.
- Make the driver explicitly non-modular: ledtrig-cpu,
ledtrig-ide-disk, leds-syscon.
- Improvements to leds-bcm6328:
- reuse bcm6328_led_set() instead of copying its functionality,
- swap LED ON and OFF definitions,
- improve blink support,
- simplify duplicated unlock in bcm6328_blink_set,
- add little endian support,
- remove unneded lock when checking initial LED status,
- add HAS_IOMEM dependency,
- code cleaning.
- Improvements to leds-bcm6358:
- use bcm6358_led_set() in order to get rid of the lock,
- merge bcm6358_led_mode and bcm6358_led_set,
- add little endian support,
- remove unneded lock when checking initial LED status,
- add HAS_IOMEM dependency,
- remove unneeded busy status check.
- Call led_pwm_set() in leds-pwm to enforce default LED_OFF.
- Fix duration to be msec instead of jiffies: ledtrig-transient.
- Removing NULL check: leds-powernv.
- Use platform_register/unregister_drivers(): leds-sunfire.
- Fix module license specification: ledtrig-oneshot.
- Fix driver description and make license match the header: leds-pwm.
- Remove checking for state < 1 in flash_strobe_store():
led-class-flash.
- Use led_set_brightness_sync for torch brightness:
v4l2-flash-led-class"
* tag 'leds-for-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds: (68 commits)
leds: add HAS_IOMEM dependency to LEDS_BCM6328/LEDS_BCM6358
leds: core: add managed version of led_trigger_register
leds: bcm6358: remove unneeded busy status check
leds: bcm6328: improve blink support
leds: bcm6358: merge bcm6358_led_mode and bcm6358_led_set
leds: bcm6328: simplify duplicated unlock in bcm6328_blink_set
leds: bcm6358: add little endian support
leds: bcm6328: add little endian support
leds: bcm6358: remove unneded lock when checking initial LED status
leds: bcm6358: Use bcm6358_led_set() in order to get rid of the lock
leds: bcm6328: remove unneded lock when checking initial LED
leds: bcm6328: code cleaning
leds: syscon: Make the driver explicitly non-modular
leds: ledtrig-ide-disk: Make the driver explicitly non-modular
leds: ledtrig-cpu: Make the driver explicitly non-modular
leds: sunfire: Use platform_register/unregister_drivers()
leds: max77693: Add missing of_node_put
leds: aat1290: Add missing of_node_put
leds: powernv: Implement brightness_set_blocking op
leds: ipaq-micro: Implement brightness_set_blocking op
...
Diffstat (limited to 'drivers/leds/leds-pca955x.c')
-rw-r--r-- | drivers/leds/leds-pca955x.c | 39 |
1 files changed, 9 insertions, 30 deletions
diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c index b775e1efecd3..840401ae9a4e 100644 --- a/drivers/leds/leds-pca955x.c +++ b/drivers/leds/leds-pca955x.c @@ -47,7 +47,6 @@ #include <linux/leds.h> #include <linux/err.h> #include <linux/i2c.h> -#include <linux/workqueue.h> #include <linux/slab.h> /* LED select registers determine the source that drives LED outputs */ @@ -110,8 +109,6 @@ struct pca955x { struct pca955x_led { struct pca955x *pca955x; - struct work_struct work; - enum led_brightness brightness; struct led_classdev led_cdev; int led_num; /* 0 .. 15 potentially */ char name[32]; @@ -193,7 +190,8 @@ static u8 pca955x_read_ls(struct i2c_client *client, int n) pca95xx_num_input_regs(pca955x->chipdef->bits) + 4 + n); } -static void pca955x_led_work(struct work_struct *work) +static int pca955x_led_set(struct led_classdev *led_cdev, + enum led_brightness value) { struct pca955x_led *pca955x_led; struct pca955x *pca955x; @@ -201,7 +199,7 @@ static void pca955x_led_work(struct work_struct *work) int chip_ls; /* which LSx to use (0-3 potentially) */ int ls_led; /* which set of bits within LSx to use (0-3) */ - pca955x_led = container_of(work, struct pca955x_led, work); + pca955x_led = container_of(led_cdev, struct pca955x_led, led_cdev); pca955x = pca955x_led->pca955x; chip_ls = pca955x_led->led_num / 4; @@ -211,7 +209,7 @@ static void pca955x_led_work(struct work_struct *work) ls = pca955x_read_ls(pca955x->client, chip_ls); - switch (pca955x_led->brightness) { + switch (value) { case LED_FULL: ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_LED_ON); break; @@ -230,7 +228,7 @@ static void pca955x_led_work(struct work_struct *work) * just turning off for all other values. */ pca955x_write_pwm(pca955x->client, 1, - 255 - pca955x_led->brightness); + 255 - value); ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_BLINK1); break; } @@ -238,21 +236,8 @@ static void pca955x_led_work(struct work_struct *work) pca955x_write_ls(pca955x->client, chip_ls, ls); mutex_unlock(&pca955x->lock); -} - -static void pca955x_led_set(struct led_classdev *led_cdev, enum led_brightness value) -{ - struct pca955x_led *pca955x; - - pca955x = container_of(led_cdev, struct pca955x_led, led_cdev); - - pca955x->brightness = value; - /* - * Must use workqueue for the actual I/O since I2C operations - * can sleep. - */ - schedule_work(&pca955x->work); + return 0; } static int pca955x_probe(struct i2c_client *client, @@ -328,9 +313,7 @@ static int pca955x_probe(struct i2c_client *client, } pca955x_led->led_cdev.name = pca955x_led->name; - pca955x_led->led_cdev.brightness_set = pca955x_led_set; - - INIT_WORK(&pca955x_led->work, pca955x_led_work); + pca955x_led->led_cdev.brightness_set_blocking = pca955x_led_set; err = led_classdev_register(&client->dev, &pca955x_led->led_cdev); @@ -355,10 +338,8 @@ static int pca955x_probe(struct i2c_client *client, return 0; exit: - while (i--) { + while (i--) led_classdev_unregister(&pca955x->leds[i].led_cdev); - cancel_work_sync(&pca955x->leds[i].work); - } return err; } @@ -368,10 +349,8 @@ static int pca955x_remove(struct i2c_client *client) struct pca955x *pca955x = i2c_get_clientdata(client); int i; - for (i = 0; i < pca955x->chipdef->bits; i++) { + for (i = 0; i < pca955x->chipdef->bits; i++) led_classdev_unregister(&pca955x->leds[i].led_cdev); - cancel_work_sync(&pca955x->leds[i].work); - } return 0; } |