leds-h1940.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*
  2. * drivers/leds/leds-h1940.c
  3. * Copyright (c) Arnaud Patard <arnaud.patard@rtp-net.org>
  4. *
  5. * This file is subject to the terms and conditions of the GNU General Public
  6. * License. See the file COPYING in the main directory of this archive for
  7. * more details.
  8. *
  9. * H1940 leds driver
  10. *
  11. */
  12. #include <linux/module.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/delay.h>
  15. #include <linux/string.h>
  16. #include <linux/ctype.h>
  17. #include <linux/leds.h>
  18. #include <mach/regs-gpio.h>
  19. #include <mach/hardware.h>
  20. #include <mach/h1940-latch.h>
  21. /*
  22. * Green led.
  23. */
  24. static void h1940_greenled_set(struct led_classdev *led_dev,
  25. enum led_brightness value)
  26. {
  27. switch (value) {
  28. case LED_HALF:
  29. h1940_latch_control(0, H1940_LATCH_LED_FLASH);
  30. s3c2410_gpio_setpin(S3C2410_GPA7, 1);
  31. break;
  32. case LED_FULL:
  33. h1940_latch_control(0, H1940_LATCH_LED_GREEN);
  34. s3c2410_gpio_setpin(S3C2410_GPA7, 1);
  35. break;
  36. default:
  37. case LED_OFF:
  38. h1940_latch_control(H1940_LATCH_LED_FLASH, 0);
  39. h1940_latch_control(H1940_LATCH_LED_GREEN, 0);
  40. s3c2410_gpio_setpin(S3C2410_GPA7, 0);
  41. break;
  42. }
  43. }
  44. static struct led_classdev h1940_greenled = {
  45. .name = "h1940:green",
  46. .brightness_set = h1940_greenled_set,
  47. .default_trigger = "h1940-charger",
  48. };
  49. /*
  50. * Red led.
  51. */
  52. static void h1940_redled_set(struct led_classdev *led_dev,
  53. enum led_brightness value)
  54. {
  55. switch (value) {
  56. case LED_HALF:
  57. h1940_latch_control(0, H1940_LATCH_LED_FLASH);
  58. s3c2410_gpio_setpin(S3C2410_GPA1, 1);
  59. break;
  60. case LED_FULL:
  61. h1940_latch_control(0, H1940_LATCH_LED_RED);
  62. s3c2410_gpio_setpin(S3C2410_GPA1, 1);
  63. break;
  64. default:
  65. case LED_OFF:
  66. h1940_latch_control(H1940_LATCH_LED_FLASH, 0);
  67. h1940_latch_control(H1940_LATCH_LED_RED, 0);
  68. s3c2410_gpio_setpin(S3C2410_GPA1, 0);
  69. break;
  70. }
  71. }
  72. static struct led_classdev h1940_redled = {
  73. .name = "h1940:red",
  74. .brightness_set = h1940_redled_set,
  75. .default_trigger = "h1940-charger",
  76. };
  77. /*
  78. * Blue led.
  79. * (it can only be blue flashing led)
  80. */
  81. static void h1940_blueled_set(struct led_classdev *led_dev,
  82. enum led_brightness value)
  83. {
  84. if (value) {
  85. /* flashing Blue */
  86. h1940_latch_control(0, H1940_LATCH_LED_FLASH);
  87. s3c2410_gpio_setpin(S3C2410_GPA3, 1);
  88. } else {
  89. h1940_latch_control(H1940_LATCH_LED_FLASH, 0);
  90. s3c2410_gpio_setpin(S3C2410_GPA3, 0);
  91. }
  92. }
  93. static struct led_classdev h1940_blueled = {
  94. .name = "h1940:blue",
  95. .brightness_set = h1940_blueled_set,
  96. .default_trigger = "h1940-bluetooth",
  97. };
  98. static int __init h1940leds_probe(struct platform_device *pdev)
  99. {
  100. int ret;
  101. ret = led_classdev_register(&pdev->dev, &h1940_greenled);
  102. if (ret)
  103. goto err_green;
  104. ret = led_classdev_register(&pdev->dev, &h1940_redled);
  105. if (ret)
  106. goto err_red;
  107. ret = led_classdev_register(&pdev->dev, &h1940_blueled);
  108. if (ret)
  109. goto err_blue;
  110. return 0;
  111. err_blue:
  112. led_classdev_unregister(&h1940_redled);
  113. err_red:
  114. led_classdev_unregister(&h1940_greenled);
  115. err_green:
  116. return ret;
  117. }
  118. static int h1940leds_remove(struct platform_device *pdev)
  119. {
  120. led_classdev_unregister(&h1940_greenled);
  121. led_classdev_unregister(&h1940_redled);
  122. led_classdev_unregister(&h1940_blueled);
  123. return 0;
  124. }
  125. static struct platform_driver h1940leds_driver = {
  126. .driver = {
  127. .name = "h1940-leds",
  128. .owner = THIS_MODULE,
  129. },
  130. .probe = h1940leds_probe,
  131. .remove = h1940leds_remove,
  132. };
  133. static int __init h1940leds_init(void)
  134. {
  135. return platform_driver_register(&h1940leds_driver);
  136. }
  137. static void __exit h1940leds_exit(void)
  138. {
  139. platform_driver_unregister(&h1940leds_driver);
  140. }
  141. module_init(h1940leds_init);
  142. module_exit(h1940leds_exit);
  143. MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
  144. MODULE_DESCRIPTION("LED driver for the iPAQ H1940");
  145. MODULE_LICENSE("GPL");
  146. MODULE_ALIAS("platform:h1940-leds");