leds-osk.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * linux/arch/arm/mach-omap1/leds-osk.c
  3. *
  4. * LED driver for OSK with optional Mistral QVGA board
  5. */
  6. #include <linux/init.h>
  7. #include <mach/hardware.h>
  8. #include <asm/leds.h>
  9. #include <asm/system.h>
  10. #include <mach/gpio.h>
  11. #include "leds.h"
  12. #define LED_STATE_ENABLED (1 << 0)
  13. #define LED_STATE_CLAIMED (1 << 1)
  14. static u8 led_state;
  15. #define TIMER_LED (1 << 3) /* Mistral board */
  16. #define IDLE_LED (1 << 4) /* Mistral board */
  17. static u8 hw_led_state;
  18. #ifdef CONFIG_OMAP_OSK_MISTRAL
  19. /* For now, all system indicators require the Mistral board, since that
  20. * LED can be manipulated without a task context. This LED is either red,
  21. * or green, but not both; it can't give the full "disco led" effect.
  22. */
  23. #define GPIO_LED_RED 3
  24. #define GPIO_LED_GREEN OMAP_MPUIO(4)
  25. static void mistral_setled(void)
  26. {
  27. int red = 0;
  28. int green = 0;
  29. if (hw_led_state & TIMER_LED)
  30. red = 1;
  31. else if (hw_led_state & IDLE_LED)
  32. green = 1;
  33. /* else both sides are disabled */
  34. gpio_set_value(GPIO_LED_GREEN, green);
  35. gpio_set_value(GPIO_LED_RED, red);
  36. }
  37. #endif
  38. void osk_leds_event(led_event_t evt)
  39. {
  40. unsigned long flags;
  41. u16 leds;
  42. local_irq_save(flags);
  43. if (!(led_state & LED_STATE_ENABLED) && evt != led_start)
  44. goto done;
  45. leds = hw_led_state;
  46. switch (evt) {
  47. case led_start:
  48. led_state |= LED_STATE_ENABLED;
  49. hw_led_state = 0;
  50. leds = ~0;
  51. break;
  52. case led_halted:
  53. case led_stop:
  54. led_state &= ~LED_STATE_ENABLED;
  55. hw_led_state = 0;
  56. break;
  57. case led_claim:
  58. led_state |= LED_STATE_CLAIMED;
  59. hw_led_state = 0;
  60. leds = ~0;
  61. break;
  62. case led_release:
  63. led_state &= ~LED_STATE_CLAIMED;
  64. hw_led_state = 0;
  65. break;
  66. #ifdef CONFIG_OMAP_OSK_MISTRAL
  67. case led_timer:
  68. hw_led_state ^= TIMER_LED;
  69. mistral_setled();
  70. break;
  71. case led_idle_start: /* idle == off */
  72. hw_led_state &= ~IDLE_LED;
  73. mistral_setled();
  74. break;
  75. case led_idle_end:
  76. hw_led_state |= IDLE_LED;
  77. mistral_setled();
  78. break;
  79. #endif /* CONFIG_OMAP_OSK_MISTRAL */
  80. default:
  81. break;
  82. }
  83. leds ^= hw_led_state;
  84. done:
  85. local_irq_restore(flags);
  86. }