1 /* 2 * Copyright 2006 - Florian Fainelli <florian@openwrt.org> 3 * 4 * Control the Cobalt Qube/RaQ front LED 5 */ 6 #include <linux/init.h> 7 #include <linux/io.h> 8 #include <linux/ioport.h> 9 #include <linux/leds.h> 10 #include <linux/module.h> 11 #include <linux/platform_device.h> 12 #include <linux/types.h> 13 14 #define LED_FRONT_LEFT 0x01 15 #define LED_FRONT_RIGHT 0x02 16 17 static void __iomem *led_port; 18 static u8 led_value; 19 20 static void qube_front_led_set(struct led_classdev *led_cdev, 21 enum led_brightness brightness) 22 { 23 if (brightness) 24 led_value = LED_FRONT_LEFT | LED_FRONT_RIGHT; 25 else 26 led_value = ~(LED_FRONT_LEFT | LED_FRONT_RIGHT); 27 writeb(led_value, led_port); 28 } 29 30 static struct led_classdev qube_front_led = { 31 .name = "qube-front", 32 .brightness = LED_FULL, 33 .brightness_set = qube_front_led_set, 34 .default_trigger = "ide-disk", 35 }; 36 37 static int __devinit cobalt_qube_led_probe(struct platform_device *pdev) 38 { 39 struct resource *res; 40 int retval; 41 42 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 43 if (!res) 44 return -EBUSY; 45 46 led_port = ioremap(res->start, res->end - res->start + 1); 47 if (!led_port) 48 return -ENOMEM; 49 50 led_value = LED_FRONT_LEFT | LED_FRONT_RIGHT; 51 writeb(led_value, led_port); 52 53 retval = led_classdev_register(&pdev->dev, &qube_front_led); 54 if (retval) 55 goto err_iounmap; 56 57 return 0; 58 59 err_iounmap: 60 iounmap(led_port); 61 led_port = NULL; 62 63 return retval; 64 } 65 66 static int __devexit cobalt_qube_led_remove(struct platform_device *pdev) 67 { 68 led_classdev_unregister(&qube_front_led); 69 70 if (led_port) { 71 iounmap(led_port); 72 led_port = NULL; 73 } 74 75 return 0; 76 } 77 78 static struct platform_driver cobalt_qube_led_driver = { 79 .probe = cobalt_qube_led_probe, 80 .remove = __devexit_p(cobalt_qube_led_remove), 81 .driver = { 82 .name = "cobalt-qube-leds", 83 .owner = THIS_MODULE, 84 }, 85 }; 86 87 static int __init cobalt_qube_led_init(void) 88 { 89 return platform_driver_register(&cobalt_qube_led_driver); 90 } 91 92 static void __exit cobalt_qube_led_exit(void) 93 { 94 platform_driver_unregister(&cobalt_qube_led_driver); 95 } 96 97 module_init(cobalt_qube_led_init); 98 module_exit(cobalt_qube_led_exit); 99 100 MODULE_LICENSE("GPL"); 101 MODULE_DESCRIPTION("Front LED support for Cobalt Server"); 102 MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>"); 103