1/* 2 * LED Triggers Core 3 * 4 * Copyright 2005-2006 Openedhand Ltd. 5 * 6 * Author: Richard Purdie <rpurdie@openedhand.com> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 * 12 */ 13 14#include <linux/kernel.h> 15#include <linux/init.h> 16#include <linux/platform_device.h> 17#include <linux/leds.h> 18#include <asm/mach-types.h> 19#include <asm/arch/corgi.h> 20#include <asm/arch/hardware.h> 21#include <asm/arch/pxa-regs.h> 22#include <asm/hardware/scoop.h> 23 24static void corgiled_amber_set(struct led_classdev *led_cdev, enum led_brightness value) 25{ 26 if (value) 27 GPSR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE); 28 else 29 GPCR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE); 30} 31 32static void corgiled_green_set(struct led_classdev *led_cdev, enum led_brightness value) 33{ 34 if (value) 35 set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN); 36 else 37 reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN); 38} 39 40static struct led_classdev corgi_amber_led = { 41 .name = "corgi:amber", 42 .default_trigger = "sharpsl-charge", 43 .brightness_set = corgiled_amber_set, 44}; 45 46static struct led_classdev corgi_green_led = { 47 .name = "corgi:green", 48 .default_trigger = "nand-disk", 49 .brightness_set = corgiled_green_set, 50}; 51 52#ifdef CONFIG_PM 53static int corgiled_suspend(struct platform_device *dev, pm_message_t state) 54{ 55#ifdef CONFIG_LEDS_TRIGGERS 56 if (corgi_amber_led.trigger && strcmp(corgi_amber_led.trigger->name, "sharpsl-charge")) 57#endif 58 led_classdev_suspend(&corgi_amber_led); 59 led_classdev_suspend(&corgi_green_led); 60 return 0; 61} 62 63static int corgiled_resume(struct platform_device *dev) 64{ 65 led_classdev_resume(&corgi_amber_led); 66 led_classdev_resume(&corgi_green_led); 67 return 0; 68} 69#endif 70 71static int corgiled_probe(struct platform_device *pdev) 72{ 73 int ret; 74 75 ret = led_classdev_register(&pdev->dev, &corgi_amber_led); 76 if (ret < 0) 77 return ret; 78 79 ret = led_classdev_register(&pdev->dev, &corgi_green_led); 80 if (ret < 0) 81 led_classdev_unregister(&corgi_amber_led); 82 83 return ret; 84} 85 86static int corgiled_remove(struct platform_device *pdev) 87{ 88 led_classdev_unregister(&corgi_amber_led); 89 led_classdev_unregister(&corgi_green_led); 90 return 0; 91} 92 93static struct platform_driver corgiled_driver = { 94 .probe = corgiled_probe, 95 .remove = corgiled_remove, 96#ifdef CONFIG_PM 97 .suspend = corgiled_suspend, 98 .resume = corgiled_resume, 99#endif 100 .driver = { 101 .name = "corgi-led", 102 }, 103}; 104 105static int __init corgiled_init(void) 106{ 107 return platform_driver_register(&corgiled_driver); 108} 109 110static void __exit corgiled_exit(void) 111{ 112 platform_driver_unregister(&corgiled_driver); 113} 114 115module_init(corgiled_init); 116module_exit(corgiled_exit); 117 118MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>"); 119MODULE_DESCRIPTION("Corgi LED driver"); 120MODULE_LICENSE("GPL"); 121