diff options
author | Enric Balletbo i Serra <eballetbo@gmail.com> | 2010-10-08 13:22:28 -0400 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2010-10-08 13:22:28 -0400 |
commit | bee153906424f3bf669afec397c810b76117e22b (patch) | |
tree | 80fa27fa7e254254f9f0bc17d61db323025c7285 /arch/arm/mach-omap2 | |
parent | 61e118dd7755417c541a8ecf32a82c3971258cff (diff) |
omap3: fix and improve the LED handling on IGEP v2 board
The IGEP v2 board has four leds, this patch allows control all
of these LEDs using the LED class if CONFIG_LEDS_GPIO is selected
or using the General Purpose Input/Output (GPIO) interface if
CONFIG_LEDS_GPIO is not selected.
Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r-- | arch/arm/mach-omap2/board-igep0020.c | 156 |
1 files changed, 87 insertions, 69 deletions
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 2f40d77a2f1e..d7a0db7058e1 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
@@ -262,6 +262,77 @@ static struct omap2_hsmmc_info mmc[] = { | |||
262 | {} /* Terminator */ | 262 | {} /* Terminator */ |
263 | }; | 263 | }; |
264 | 264 | ||
265 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) | ||
266 | #include <linux/leds.h> | ||
267 | |||
268 | static struct gpio_led igep2_gpio_leds[] = { | ||
269 | [0] = { | ||
270 | .name = "gpio-led:red:d0", | ||
271 | .gpio = IGEP2_GPIO_LED0_RED, | ||
272 | .default_trigger = "default-off" | ||
273 | }, | ||
274 | [1] = { | ||
275 | .name = "gpio-led:green:d0", | ||
276 | .gpio = IGEP2_GPIO_LED0_GREEN, | ||
277 | .default_trigger = "default-off", | ||
278 | }, | ||
279 | [2] = { | ||
280 | .name = "gpio-led:red:d1", | ||
281 | .gpio = IGEP2_GPIO_LED1_RED, | ||
282 | .default_trigger = "default-off", | ||
283 | }, | ||
284 | [3] = { | ||
285 | .name = "gpio-led:green:d1", | ||
286 | .default_trigger = "heartbeat", | ||
287 | .gpio = -EINVAL, /* gets replaced */ | ||
288 | }, | ||
289 | }; | ||
290 | |||
291 | static struct gpio_led_platform_data igep2_led_pdata = { | ||
292 | .leds = igep2_gpio_leds, | ||
293 | .num_leds = ARRAY_SIZE(igep2_gpio_leds), | ||
294 | }; | ||
295 | |||
296 | static struct platform_device igep2_led_device = { | ||
297 | .name = "leds-gpio", | ||
298 | .id = -1, | ||
299 | .dev = { | ||
300 | .platform_data = &igep2_led_pdata, | ||
301 | }, | ||
302 | }; | ||
303 | |||
304 | static void __init igep2_leds_init(void) | ||
305 | { | ||
306 | platform_device_register(&igep2_led_device); | ||
307 | } | ||
308 | |||
309 | #else | ||
310 | static inline void igep2_leds_init(void) | ||
311 | { | ||
312 | if ((gpio_request(IGEP2_GPIO_LED0_RED, "gpio-led:red:d0") == 0) && | ||
313 | (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) { | ||
314 | gpio_export(IGEP2_GPIO_LED0_RED, 0); | ||
315 | gpio_set_value(IGEP2_GPIO_LED0_RED, 0); | ||
316 | } else | ||
317 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n"); | ||
318 | |||
319 | if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) && | ||
320 | (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) { | ||
321 | gpio_export(IGEP2_GPIO_LED0_GREEN, 0); | ||
322 | gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0); | ||
323 | } else | ||
324 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n"); | ||
325 | |||
326 | if ((gpio_request(IGEP2_GPIO_LED1_RED, "gpio-led:red:d1") == 0) && | ||
327 | (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) { | ||
328 | gpio_export(IGEP2_GPIO_LED1_RED, 0); | ||
329 | gpio_set_value(IGEP2_GPIO_LED1_RED, 0); | ||
330 | } else | ||
331 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n"); | ||
332 | |||
333 | } | ||
334 | #endif | ||
335 | |||
265 | static int igep2_twl_gpio_setup(struct device *dev, | 336 | static int igep2_twl_gpio_setup(struct device *dev, |
266 | unsigned gpio, unsigned ngpio) | 337 | unsigned gpio, unsigned ngpio) |
267 | { | 338 | { |
@@ -291,14 +362,26 @@ static int igep2_twl_gpio_setup(struct device *dev, | |||
291 | (gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0)) | 362 | (gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0)) |
292 | pr_err("IGEP2: Could not obtain gpio for USBH_CPEN"); | 363 | pr_err("IGEP2: Could not obtain gpio for USBH_CPEN"); |
293 | 364 | ||
365 | /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ | ||
366 | #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) | ||
367 | if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0) | ||
368 | && (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) { | ||
369 | gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0); | ||
370 | gpio_set_value(gpio + TWL4030_GPIO_MAX + 1, 0); | ||
371 | } else | ||
372 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_GREEN\n"); | ||
373 | #else | ||
374 | igep2_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1; | ||
375 | #endif | ||
376 | |||
294 | return 0; | 377 | return 0; |
295 | }; | 378 | }; |
296 | 379 | ||
297 | static struct twl4030_gpio_platform_data igep2_gpio_data = { | 380 | static struct twl4030_gpio_platform_data igep2_twl4030_gpio_pdata = { |
298 | .gpio_base = OMAP_MAX_GPIO_LINES, | 381 | .gpio_base = OMAP_MAX_GPIO_LINES, |
299 | .irq_base = TWL4030_GPIO_IRQ_BASE, | 382 | .irq_base = TWL4030_GPIO_IRQ_BASE, |
300 | .irq_end = TWL4030_GPIO_IRQ_END, | 383 | .irq_end = TWL4030_GPIO_IRQ_END, |
301 | .use_leds = false, | 384 | .use_leds = true, |
302 | .setup = igep2_twl_gpio_setup, | 385 | .setup = igep2_twl_gpio_setup, |
303 | }; | 386 | }; |
304 | 387 | ||
@@ -372,47 +455,6 @@ static void __init igep2_display_init(void) | |||
372 | pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n"); | 455 | pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n"); |
373 | } | 456 | } |
374 | 457 | ||
375 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) | ||
376 | #include <linux/leds.h> | ||
377 | |||
378 | static struct gpio_led igep2_gpio_leds[] = { | ||
379 | { | ||
380 | .name = "led0:red", | ||
381 | .gpio = IGEP2_GPIO_LED0_RED, | ||
382 | }, | ||
383 | { | ||
384 | .name = "led0:green", | ||
385 | .default_trigger = "heartbeat", | ||
386 | .gpio = IGEP2_GPIO_LED0_GREEN, | ||
387 | }, | ||
388 | { | ||
389 | .name = "led1:red", | ||
390 | .gpio = IGEP2_GPIO_LED1_RED, | ||
391 | }, | ||
392 | }; | ||
393 | |||
394 | static struct gpio_led_platform_data igep2_led_pdata = { | ||
395 | .leds = igep2_gpio_leds, | ||
396 | .num_leds = ARRAY_SIZE(igep2_gpio_leds), | ||
397 | }; | ||
398 | |||
399 | static struct platform_device igep2_led_device = { | ||
400 | .name = "leds-gpio", | ||
401 | .id = -1, | ||
402 | .dev = { | ||
403 | .platform_data = &igep2_led_pdata, | ||
404 | }, | ||
405 | }; | ||
406 | |||
407 | static void __init igep2_init_led(void) | ||
408 | { | ||
409 | platform_device_register(&igep2_led_device); | ||
410 | } | ||
411 | |||
412 | #else | ||
413 | static inline void igep2_init_led(void) {} | ||
414 | #endif | ||
415 | |||
416 | static struct platform_device *igep2_devices[] __initdata = { | 458 | static struct platform_device *igep2_devices[] __initdata = { |
417 | &igep2_dss_device, | 459 | &igep2_dss_device, |
418 | }; | 460 | }; |
@@ -442,7 +484,7 @@ static struct twl4030_platform_data igep2_twldata = { | |||
442 | /* platform_data for children goes here */ | 484 | /* platform_data for children goes here */ |
443 | .usb = &igep2_usb_data, | 485 | .usb = &igep2_usb_data, |
444 | .codec = &igep2_codec_data, | 486 | .codec = &igep2_codec_data, |
445 | .gpio = &igep2_gpio_data, | 487 | .gpio = &igep2_twl4030_gpio_pdata, |
446 | .vmmc1 = &igep2_vmmc1, | 488 | .vmmc1 = &igep2_vmmc1, |
447 | .vmmc2 = &igep2_vmmc2, | 489 | .vmmc2 = &igep2_vmmc2, |
448 | .vpll2 = &igep2_vpll2, | 490 | .vpll2 = &igep2_vpll2, |
@@ -503,34 +545,10 @@ static void __init igep2_init(void) | |||
503 | usb_ehci_init(&ehci_pdata); | 545 | usb_ehci_init(&ehci_pdata); |
504 | 546 | ||
505 | igep2_flash_init(); | 547 | igep2_flash_init(); |
506 | igep2_init_led(); | 548 | igep2_leds_init(); |
507 | igep2_display_init(); | 549 | igep2_display_init(); |
508 | igep2_init_smsc911x(); | 550 | igep2_init_smsc911x(); |
509 | 551 | ||
510 | /* GPIO userspace leds */ | ||
511 | #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) | ||
512 | if ((gpio_request(IGEP2_GPIO_LED0_RED, "led0:red") == 0) && | ||
513 | (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) { | ||
514 | gpio_export(IGEP2_GPIO_LED0_RED, 0); | ||
515 | gpio_set_value(IGEP2_GPIO_LED0_RED, 0); | ||
516 | } else | ||
517 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n"); | ||
518 | |||
519 | if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "led0:green") == 0) && | ||
520 | (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) { | ||
521 | gpio_export(IGEP2_GPIO_LED0_GREEN, 0); | ||
522 | gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0); | ||
523 | } else | ||
524 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n"); | ||
525 | |||
526 | if ((gpio_request(IGEP2_GPIO_LED1_RED, "led1:red") == 0) && | ||
527 | (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) { | ||
528 | gpio_export(IGEP2_GPIO_LED1_RED, 0); | ||
529 | gpio_set_value(IGEP2_GPIO_LED1_RED, 0); | ||
530 | } else | ||
531 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n"); | ||
532 | #endif | ||
533 | |||
534 | /* GPIO W-LAN + Bluetooth combo module */ | 552 | /* GPIO W-LAN + Bluetooth combo module */ |
535 | if ((gpio_request(IGEP2_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) && | 553 | if ((gpio_request(IGEP2_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) && |
536 | (gpio_direction_output(IGEP2_GPIO_WIFI_NPD, 1) == 0)) { | 554 | (gpio_direction_output(IGEP2_GPIO_WIFI_NPD, 1) == 0)) { |