linux/drivers/leds
Russell King 7a5db34ad2 leds: leds-pwm: properly clean up after probe failure
commit 392369019e upstream.

When probing with DT, we add each LED one at a time.  If we find a LED
without a PWM device (because it is not available yet) we fail the
initialisation, unregister previous LEDs, and then by way of managed
resources, we free the structure.

The problem with this is we may have a scheduled and active work_struct
in this structure, and this results in a nasty kernel oops.

We need to cancel this work_struct properly upon cleanup - and the
cleanup we require is the same cleanup as we do when the LED platform
device is removed.  Rather than writing this same code three times,
move it into a separate function and use it in all three places.

Fixes: c971ff185f ("leds: leds-pwm: Defer led_pwm_set() if PWM can sleep")
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-06-07 10:28:18 -07:00
..
trigger leds: trigger: ledtrig-backlight: Fix invalid memory access in fb_event notification callback 2013-08-26 17:46:36 -07:00
Kconfig leds: Added driver for the NXP PCA9685 I2C chip 2013-10-22 10:57:35 -07:00
Makefile leds: Added driver for the NXP PCA9685 I2C chip 2013-10-22 10:57:35 -07:00
dell-led.c drivers/leds: Add module.h to files using it implicitly 2011-10-31 19:31:49 -04:00
led-class.c leds: convert class code to use dev_groups 2013-07-26 18:05:17 -07:00
led-core.c leds: delay led_set_brightness if stopping soft-blink 2012-09-11 18:32:40 +08:00
led-triggers.c leds: replace list_for_each with list_for_each_entry 2014-01-27 17:28:52 -08:00
leds-88pm860x.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-adp5520.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-asic3.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-atmel-pwm.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-bd2802.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-blinkm.c leds: blinkm: Remove redundant break 2013-10-22 10:57:34 -07:00
leds-clevo-mail.c leds: clevo-mail: Fix incorrect placement of __initdata 2013-08-26 17:22:11 -07:00
leds-cobalt-qube.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds 2012-12-15 12:52:42 -08:00
leds-cobalt-raq.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds 2012-12-15 12:52:42 -08:00
leds-da903x.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-da9052.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-dac124s085.c leds: dac124s085: Remove redundant spi_set_drvdata 2013-10-22 10:57:34 -07:00
leds-fsg.c leds: leds-fsg: use devm_ioremap 2012-11-26 14:28:45 -08:00
leds-gpio-register.c leds: provide helper to register "leds-gpio" devices 2011-05-25 08:39:51 -07:00
leds-gpio.c leds-gpio: of: led should not be created if its status is disabled 2013-10-25 10:12:55 -07:00
leds-hp6xx.c leds: convert led platform drivers to module_platform_driver 2012-01-10 16:30:48 -08:00
leds-lm355x.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-lm3530.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-lm3533.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-lm3642.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-locomo.c drivers/leds: Add module.h to files using it implicitly 2011-10-31 19:31:49 -04:00
leds-lp55xx-common.c leds: lp5523: Support LED MUX configuration on running a pattern 2014-01-27 17:28:48 -08:00
leds-lp55xx-common.h leds: lp55xx: add common macros for device attributes 2013-08-26 17:22:12 -07:00
leds-lp3944.c leds: leds-lp3944, fix "sparse" warning "mixing different enum types" 2013-08-26 17:22:11 -07:00
leds-lp5521.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds 2014-01-28 18:53:01 -08:00
leds-lp5523.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds 2014-01-28 18:53:01 -08:00
leds-lp5562.c leds: Include linux/of.h header 2013-10-22 10:57:34 -07:00
leds-lp8501.c lp5523, lp8501: comment improvements 2014-01-10 11:44:44 +01:00
leds-lp8788.c leds-lp8788: fix a parent device in _probe() 2013-02-01 17:47:05 -08:00
leds-lt3593.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-max8997.c leds: remove use of __devexit 2012-11-28 12:35:06 -08:00
leds-mc13783.c leds: leds-mc13783: Remove unneeded mc13xxx_{un}lock 2014-01-27 17:28:50 -08:00
leds-net48xx.c leds: leds-net48xx: Use linux/io.h instead of asm/io.h 2012-11-27 14:49:28 -08:00
leds-netxbig.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-ns2.c leds: Include linux/of.h header 2013-10-22 10:57:34 -07:00
leds-ot200.c drivers/leds/leds-ot200.c: fix error caused by shifted mask 2013-05-24 16:22:51 -07:00
leds-pca955x.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-pca963x.c leds-pca963x: Fix device tree parsing 2013-08-26 17:22:14 -07:00
leds-pca9532.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-pca9685.c leds: Added driver for the NXP PCA9685 I2C chip 2013-10-22 10:57:35 -07:00
leds-pwm.c leds: leds-pwm: properly clean up after probe failure 2014-06-07 10:28:18 -07:00
leds-rb532.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds 2012-12-15 12:52:42 -08:00
leds-regulator.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-s3c24xx.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds 2014-01-28 18:53:01 -08:00
leds-ss4200.c leds: ss4200: Fix incorrect placement of __initdata 2013-08-26 17:22:12 -07:00
leds-sunfire.c leds: use platform_{get,set}_drvdata() 2013-06-20 16:21:33 -07:00
leds-tca6507.c drivers: leds: leds-tca6507: check CONFIG_GPIOLIB whether defined for 'gpio_base' 2014-01-27 17:28:49 -08:00
leds-wm831x-status.c leds: wm831x-status: Request a REG resource 2013-08-30 10:17:45 -07:00
leds-wm8350.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-wrap.c leds: leds-wrap: Use <linux/io.h> instead of <asm/io.h> 2012-11-27 14:49:30 -08:00
leds.h leds: delay led_set_brightness if stopping soft-blink 2012-09-11 18:32:40 +08:00