| /* | 
 |  * drivers/leds/leds-h1940.c | 
 |  * Copyright (c) Arnaud Patard <arnaud.patard@rtp-net.org> | 
 |  * | 
 |  * This file is subject to the terms and conditions of the GNU General Public | 
 |  * License.  See the file COPYING in the main directory of this archive for | 
 |  * more details. | 
 |  * | 
 |  * H1940 leds driver | 
 |  * | 
 |  */ | 
 |  | 
 | #include <linux/module.h> | 
 | #include <linux/platform_device.h> | 
 | #include <linux/delay.h> | 
 | #include <linux/string.h> | 
 | #include <linux/ctype.h> | 
 | #include <linux/leds.h> | 
 | #include <linux/gpio.h> | 
 |  | 
 | #include <mach/regs-gpio.h> | 
 | #include <mach/hardware.h> | 
 | #include <mach/h1940-latch.h> | 
 |  | 
 | /* | 
 |  * Green led. | 
 |  */ | 
 | static void h1940_greenled_set(struct led_classdev *led_dev, | 
 | 			       enum led_brightness value) | 
 | { | 
 | 	switch (value) { | 
 | 	case LED_HALF: | 
 | 		h1940_latch_control(0, H1940_LATCH_LED_FLASH); | 
 | 		s3c2410_gpio_setpin(S3C2410_GPA7, 1); | 
 | 		break; | 
 | 	case LED_FULL: | 
 | 		h1940_latch_control(0, H1940_LATCH_LED_GREEN); | 
 | 		s3c2410_gpio_setpin(S3C2410_GPA7, 1); | 
 | 		break; | 
 | 	default: | 
 | 	case LED_OFF: | 
 | 		h1940_latch_control(H1940_LATCH_LED_FLASH, 0); | 
 | 		h1940_latch_control(H1940_LATCH_LED_GREEN, 0); | 
 | 		s3c2410_gpio_setpin(S3C2410_GPA7, 0); | 
 | 		break; | 
 | 	} | 
 | } | 
 |  | 
 | static struct led_classdev h1940_greenled = { | 
 | 	.name			= "h1940:green", | 
 | 	.brightness_set		= h1940_greenled_set, | 
 | 	.default_trigger	= "h1940-charger", | 
 | }; | 
 |  | 
 | /* | 
 |  * Red led. | 
 |  */ | 
 | static void h1940_redled_set(struct led_classdev *led_dev, | 
 | 			     enum led_brightness value) | 
 | { | 
 | 	switch (value) { | 
 | 	case LED_HALF: | 
 | 		h1940_latch_control(0, H1940_LATCH_LED_FLASH); | 
 | 		s3c2410_gpio_setpin(S3C2410_GPA1, 1); | 
 | 		break; | 
 | 	case LED_FULL: | 
 | 		h1940_latch_control(0, H1940_LATCH_LED_RED); | 
 | 		s3c2410_gpio_setpin(S3C2410_GPA1, 1); | 
 | 		break; | 
 | 	default: | 
 | 	case LED_OFF: | 
 | 		h1940_latch_control(H1940_LATCH_LED_FLASH, 0); | 
 | 		h1940_latch_control(H1940_LATCH_LED_RED, 0); | 
 | 		s3c2410_gpio_setpin(S3C2410_GPA1, 0); | 
 | 		break; | 
 | 	} | 
 | } | 
 |  | 
 | static struct led_classdev h1940_redled = { | 
 | 	.name			= "h1940:red", | 
 | 	.brightness_set		= h1940_redled_set, | 
 | 	.default_trigger	= "h1940-charger", | 
 | }; | 
 |  | 
 | /* | 
 |  * Blue led. | 
 |  * (it can only be blue flashing led) | 
 |  */ | 
 | static void h1940_blueled_set(struct led_classdev *led_dev, | 
 | 			      enum led_brightness value) | 
 | { | 
 | 	if (value) { | 
 | 		/* flashing Blue */ | 
 | 		h1940_latch_control(0, H1940_LATCH_LED_FLASH); | 
 | 		s3c2410_gpio_setpin(S3C2410_GPA3, 1); | 
 | 	} else { | 
 | 		h1940_latch_control(H1940_LATCH_LED_FLASH, 0); | 
 | 		s3c2410_gpio_setpin(S3C2410_GPA3, 0); | 
 | 	} | 
 |  | 
 | } | 
 |  | 
 | static struct led_classdev h1940_blueled = { | 
 | 	.name			= "h1940:blue", | 
 | 	.brightness_set		= h1940_blueled_set, | 
 | 	.default_trigger	= "h1940-bluetooth", | 
 | }; | 
 |  | 
 | static int __devinit h1940leds_probe(struct platform_device *pdev) | 
 | { | 
 | 	int ret; | 
 |  | 
 | 	ret = led_classdev_register(&pdev->dev, &h1940_greenled); | 
 | 	if (ret) | 
 | 		goto err_green; | 
 |  | 
 | 	ret = led_classdev_register(&pdev->dev, &h1940_redled); | 
 | 	if (ret) | 
 | 		goto err_red; | 
 |  | 
 | 	ret = led_classdev_register(&pdev->dev, &h1940_blueled); | 
 | 	if (ret) | 
 | 		goto err_blue; | 
 |  | 
 | 	return 0; | 
 |  | 
 | err_blue: | 
 | 	led_classdev_unregister(&h1940_redled); | 
 | err_red: | 
 | 	led_classdev_unregister(&h1940_greenled); | 
 | err_green: | 
 | 	return ret; | 
 | } | 
 |  | 
 | static int h1940leds_remove(struct platform_device *pdev) | 
 | { | 
 | 	led_classdev_unregister(&h1940_greenled); | 
 | 	led_classdev_unregister(&h1940_redled); | 
 | 	led_classdev_unregister(&h1940_blueled); | 
 | 	return 0; | 
 | } | 
 |  | 
 |  | 
 | static struct platform_driver h1940leds_driver = { | 
 | 	.driver		= { | 
 | 		.name	= "h1940-leds", | 
 | 		.owner	= THIS_MODULE, | 
 | 	}, | 
 | 	.probe		= h1940leds_probe, | 
 | 	.remove		= h1940leds_remove, | 
 | }; | 
 |  | 
 |  | 
 | static int __init h1940leds_init(void) | 
 | { | 
 | 	return platform_driver_register(&h1940leds_driver); | 
 | } | 
 |  | 
 | static void __exit h1940leds_exit(void) | 
 | { | 
 | 	platform_driver_unregister(&h1940leds_driver); | 
 | } | 
 |  | 
 | module_init(h1940leds_init); | 
 | module_exit(h1940leds_exit); | 
 |  | 
 | MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>"); | 
 | MODULE_DESCRIPTION("LED driver for the iPAQ H1940"); | 
 | MODULE_LICENSE("GPL"); | 
 | MODULE_ALIAS("platform:h1940-leds"); |