leds-h1940.c 3.6 KB

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