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