Commit | Line | Data |
---|---|---|
2fea6f35 FF |
1 | /* |
2 | * Copyright 2006 - Florian Fainelli <florian@openwrt.org> | |
3 | * | |
4 | * Control the Cobalt Qube/RaQ front LED | |
5 | */ | |
4276fd73 YY |
6 | #include <linux/init.h> |
7 | #include <linux/io.h> | |
8 | #include <linux/ioport.h> | |
9 | #include <linux/leds.h> | |
2fea6f35 | 10 | #include <linux/module.h> |
4276fd73 | 11 | #include <linux/platform_device.h> |
2fea6f35 | 12 | #include <linux/types.h> |
2fea6f35 | 13 | |
4276fd73 YY |
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, | |
4d404fd5 | 21 | enum led_brightness brightness) |
2fea6f35 FF |
22 | { |
23 | if (brightness) | |
4276fd73 | 24 | led_value = LED_FRONT_LEFT | LED_FRONT_RIGHT; |
2fea6f35 | 25 | else |
4276fd73 YY |
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; | |
2fea6f35 FF |
76 | } |
77 | ||
3c4ded97 KS |
78 | /* work with hotplug and coldplug */ |
79 | MODULE_ALIAS("platform:cobalt-qube-leds"); | |
80 | ||
4276fd73 YY |
81 | static struct platform_driver cobalt_qube_led_driver = { |
82 | .probe = cobalt_qube_led_probe, | |
83 | .remove = __devexit_p(cobalt_qube_led_remove), | |
84 | .driver = { | |
85 | .name = "cobalt-qube-leds", | |
86 | .owner = THIS_MODULE, | |
87 | }, | |
2fea6f35 FF |
88 | }; |
89 | ||
4276fd73 | 90 | static int __init cobalt_qube_led_init(void) |
2fea6f35 | 91 | { |
4276fd73 | 92 | return platform_driver_register(&cobalt_qube_led_driver); |
2fea6f35 FF |
93 | } |
94 | ||
4276fd73 | 95 | static void __exit cobalt_qube_led_exit(void) |
2fea6f35 | 96 | { |
4276fd73 | 97 | platform_driver_unregister(&cobalt_qube_led_driver); |
2fea6f35 FF |
98 | } |
99 | ||
4276fd73 YY |
100 | module_init(cobalt_qube_led_init); |
101 | module_exit(cobalt_qube_led_exit); | |
2fea6f35 FF |
102 | |
103 | MODULE_LICENSE("GPL"); | |
104 | MODULE_DESCRIPTION("Front LED support for Cobalt Server"); | |
105 | MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>"); |