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