leds-h1940.c 3.7 KB

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