linux/drivers/leds
Timo Teräs 803d19d57a leds: leds-gpio: reserve gpio before using it
This reverts commit a99d76f (leds: leds-gpio: use gpio_request_one)
and commit 2d7c22f (leds: leds-gpio: set devm_gpio_request_one()
flags param correctly) which was a fix of the first one.

The conversion to devm_gpio_request in commit e3b1d44c (leds:
leds-gpio: use devm_gpio_request_one) is not reverted.

The problem is that gpio_cansleep() and gpio_get_value_cansleep()
calls can crash if the gpio is not first reserved. Incidentally this
same bug existed earlier and was fixed similarly in commit d95cbe61
(leds: Fix potential leds-gpio oops). But the OOPS is real. It happens
when GPIOs are provided by module which is not yet loaded.

So this fixes the following BUG during my ALIX boot (3.9.2-vanilla):

BUG: unable to handle kernel NULL pointer dereference at 0000004c
IP: [<c11287d6>] __gpio_cansleep+0xe/0x1a
*pde = 00000000
Oops: 0000 [#1] SMP
Modules linked in: leds_gpio(+) via_rhine mii cs5535_mfd mfd_core
geode_rng rng_core geode_aes isofs nls_utf8 nls_cp437 vfat fat
ata_generic pata_amd pata_cs5536 pata_acpi libata ehci_pci ehci_hcd
ohci_hcd usb_storage usbcore usb_common sd_mod scsi_mod squashfs loop
Pid: 881, comm: modprobe Not tainted 3.9.2 #1-Alpine
EIP: 0060:[<c11287d6>] EFLAGS: 00010282 CPU: 0
EIP is at __gpio_cansleep+0xe/0x1a
EAX: 00000000 EBX: cf364018 ECX: c132b8b9 EDX: 00000000
ESI: c13993a4 EDI: c1399370 EBP: cded9dbc ESP: cded9dbc
 DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
CR0: 8005003b CR2: 0000004c CR3: 0f0c4000 CR4: 00000090
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: ffff0ff0 DR7: 00000400
Process modprobe (pid: 881, ti=cded8000 task=cf094aa0 task.ti=cded8000)
Stack:
 cded9de0 d09471cb 00000000 c1399260 cf364014 00000000 c1399260 c1399254
 d0949014 cded9df4 c118cd59 c1399260 d0949014 d0949014 cded9e08 c118ba47
 c1399260 d0949014 c1399294 cded9e1c c118bb75 cded9e24 d0949014 00000000
Call Trace:
 [<d09471cb>] gpio_led_probe+0xba/0x203 [leds_gpio]
 [<c118cd59>] platform_drv_probe+0x26/0x48
 [<c118ba47>] driver_probe_device+0x75/0x15c
 [<c118bb75>] __driver_attach+0x47/0x63
 [<c118a727>] bus_for_each_dev+0x3c/0x66
 [<c118b6f9>] driver_attach+0x14/0x16
 [<c118bb2e>] ? driver_probe_device+0x15c/0x15c
 [<c118b3d5>] bus_add_driver+0xbd/0x1bc
 [<d08b4000>] ? 0xd08b3fff
 [<d08b4000>] ? 0xd08b3fff
 [<c118bffc>] driver_register+0x74/0xec
 [<d08b4000>] ? 0xd08b3fff
 [<c118c8e8>] platform_driver_register+0x38/0x3a
 [<d08b400d>] gpio_led_driver_init+0xd/0x1000 [leds_gpio]
 [<c100116c>] do_one_initcall+0x6b/0x10f
 [<d08b4000>] ? 0xd08b3fff
 [<c105e918>] load_module+0x1631/0x1907
 [<c10975d6>] ? insert_vmalloc_vmlist+0x14/0x43
 [<c1098d5b>] ? __vmalloc_node_range+0x13e/0x15f
 [<c105ec50>] sys_init_module+0x62/0x77
 [<c1257888>] syscall_call+0x7/0xb
EIP: [<c11287d6>] __gpio_cansleep+0xe/0x1a SS:ESP 0068:cded9dbc
CR2: 000000000000004c
 ---[ end trace 5308fb20d2514822 ]---

Signed-off-by: Timo Teräs <timo.teras@iki.f>
Cc: Sachin Kamat <sachin.kamat@linaro.org>
Cc: Raphael Assenat <raph@8d.com>
Cc: Trent Piepho <tpiepho@freescale.com>
Cc: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
Cc: Arnaud Patard <arnaud.patard@rtp-net.org>
Cc: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Acked-by: Jingoo Han <jg1.han@samsung.com>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
2013-05-21 11:26:53 -07:00
..
trigger leds: add camera LED triggers 2013-04-01 11:04:50 -07:00
Kconfig Removal of GENERIC_GPIO for v3.10 2013-05-09 09:59:16 -07:00
Makefile leds: move LED trigger drivers into new subdirectory 2013-04-01 11:04:48 -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: led-class: Fix checkpatch warning 2012-11-27 14:49:25 -08: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: led-triggers: Fix checkpatch warnings 2012-11-27 14:49:30 -08:00
leds-88pm860x.c leds: 88pm860x: Add missing of_node_put() 2013-02-06 16:00:43 -08:00
leds-adp5520.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-asic3.c leds: leds-asic3: switch to using SIMPLE_DEV_PM_OPS 2013-04-01 11:04:54 -07:00
leds-atmel-pwm.c leds: atmel-pwm: remove erroneous __exit annotation 2013-04-01 11:04:48 -07:00
leds-bd2802.c leds: leds-bd2802: add CONFIG_PM_SLEEP to suspend/resume functions 2013-04-01 11:04:53 -07:00
leds-blinkm.c leds: remove use of __devexit 2012-11-28 12:35:06 -08:00
leds-clevo-mail.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-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 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-da9052.c leds: remove use of __devexit 2012-11-28 12:35:06 -08:00
leds-dac124s085.c leds: convert DAC124S085 LED driver to devm_kzalloc() 2012-07-24 07:52:40 +08: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: leds-gpio: reserve gpio before using it 2013-05-21 11:26:53 -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: lm355x, lm3642: support camera LED triggers for flash and torch 2013-04-01 11:04:50 -07:00
leds-lm3530.c leds: lm3530: Ensure drvdata->enable has correct status if regulator_disable fails 2013-02-01 17:47:06 -08:00
leds-lm3533.c leds: remove use of __devexit 2012-11-28 12:35:06 -08:00
leds-lm3642.c leds: lm355x, lm3642: support camera LED triggers for flash and torch 2013-04-01 11:04:50 -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: lp55xx: use common clock framework when external clock is used 2013-04-01 11:04:53 -07:00
leds-lp55xx-common.h leds: lp55xx: use common clock framework when external clock is used 2013-04-01 11:04:53 -07:00
leds-lp3944.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-lp5521.c leds: lp55xx: configure the clock detection 2013-04-01 11:04:53 -07:00
leds-lp5523.c leds-lp5521/5523: add author and copyright description 2013-02-06 15:59:30 -08:00
leds-lp5562.c leds: lp55xx: configure the clock detection 2013-04-01 11:04:53 -07:00
leds-lp8788.c leds-lp8788: fix a parent device in _probe() 2013-02-01 17:47:05 -08:00
leds-lt3593.c leds: leds-lt3593: set devm_gpio_request_one() flags param correctly 2013-04-01 11:04:49 -07:00
leds-max8997.c leds: remove use of __devexit 2012-11-28 12:35:06 -08:00
leds-mc13783.c leds: remove use of __devexit 2012-11-28 12:35:06 -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 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-ns2.c leds: leds-ns2: fix oops at module removal 2013-04-01 11:04:52 -07:00
leds-ot200.c leds: remove use of __devexit 2012-11-28 12:35:06 -08:00
leds-pca955x.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-pca9532.c leds: pca9532: fix suspect code indent for conditional statements 2013-02-01 17:47:06 -08:00
leds-pca9633.c leds: remove use of __devexit 2012-11-28 12:35:06 -08:00
leds-pwm.c leds: leds-pwm: Defer led_pwm_set() if PWM can sleep 2013-04-01 11:04:50 -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: remove use of __devexit 2012-11-28 12:35:06 -08:00
leds-renesas-tpu.c leds: renesas: set gpio_request_one() flags param correctly 2013-04-01 11:04:49 -07:00
leds-s3c24xx.c ARM: samsung: move platform_data definitions 2012-09-19 17:42:18 +02:00
leds-ss4200.c leds: leds-ss4200: use DEFINE_PCI_DEVICE_TABLE 2013-02-01 17:47:06 -08:00
leds-sunfire.c leds: leds-sunfire: use dev_err()/pr_err() instead of printk() 2013-02-06 16:00:43 -08:00
leds-tca6507.c leds: tca6507: Use of_match_ptr() macro 2013-04-01 11:04:50 -07:00
leds-wm831x-status.c leds: wm831x: add missing const 2013-02-01 17:47:06 -08:00
leds-wm8350.c leds: wm8350: Complain if we fail to reenable DCDC 2013-04-01 11:04:49 -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