2 * LED driver for the RouterBOARD 750
4 * Copyright (C) 2010 Gabor Juhos <juhosg@openwrt.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/platform_device.h>
15 #include <linux/leds.h>
16 #include <linux/slab.h>
18 #include <asm/mach-ath79/mach-rb750.h>
20 #define DRV_NAME "leds-rb750"
22 struct rb750_led_dev
{
23 struct led_classdev cdev
;
28 struct rb750_led_drvdata
{
29 struct rb750_led_dev
*led_devs
;
33 static inline struct rb750_led_dev
*to_rbled(struct led_classdev
*led_cdev
)
35 return (struct rb750_led_dev
*)container_of(led_cdev
,
36 struct rb750_led_dev
, cdev
);
39 static void rb750_led_brightness_set(struct led_classdev
*led_cdev
,
40 enum led_brightness value
)
42 struct rb750_led_dev
*rbled
= to_rbled(led_cdev
);
45 level
= (value
== LED_OFF
) ? 0 : 1;
46 level
^= rbled
->active_low
;
49 rb750_latch_change(0, rbled
->mask
);
51 rb750_latch_change(rbled
->mask
, 0);
54 static int __devinit
rb750_led_probe(struct platform_device
*pdev
)
56 struct rb750_led_platform_data
*pdata
;
57 struct rb750_led_drvdata
*drvdata
;
61 pdata
= pdev
->dev
.platform_data
;
65 drvdata
= kzalloc(sizeof(struct rb750_led_drvdata
) +
66 sizeof(struct rb750_led_dev
) * pdata
->num_leds
,
71 drvdata
->num_leds
= pdata
->num_leds
;
72 drvdata
->led_devs
= (struct rb750_led_dev
*) &drvdata
[1];
74 for (i
= 0; i
< drvdata
->num_leds
; i
++) {
75 struct rb750_led_dev
*rbled
= &drvdata
->led_devs
[i
];
76 struct rb750_led_data
*led_data
= &pdata
->leds
[i
];
78 rbled
->cdev
.name
= led_data
->name
;
79 rbled
->cdev
.default_trigger
= led_data
->default_trigger
;
80 rbled
->cdev
.brightness_set
= rb750_led_brightness_set
;
81 rbled
->cdev
.brightness
= LED_OFF
;
83 rbled
->mask
= led_data
->mask
;
84 rbled
->active_low
= !!led_data
->active_low
;
86 ret
= led_classdev_register(&pdev
->dev
, &rbled
->cdev
);
91 platform_set_drvdata(pdev
, drvdata
);
95 for (i
= i
- 1; i
>= 0; i
--)
96 led_classdev_unregister(&drvdata
->led_devs
[i
].cdev
);
102 static int __devexit
rb750_led_remove(struct platform_device
*pdev
)
104 struct rb750_led_drvdata
*drvdata
;
107 drvdata
= platform_get_drvdata(pdev
);
108 for (i
= 0; i
< drvdata
->num_leds
; i
++)
109 led_classdev_unregister(&drvdata
->led_devs
[i
].cdev
);
115 static struct platform_driver rb750_led_driver
= {
116 .probe
= rb750_led_probe
,
117 .remove
= __devexit_p(rb750_led_remove
),
120 .owner
= THIS_MODULE
,
124 MODULE_ALIAS("platform:leds-rb750");
126 static int __init
rb750_led_init(void)
128 return platform_driver_register(&rb750_led_driver
);
131 static void __exit
rb750_led_exit(void)
133 platform_driver_unregister(&rb750_led_driver
);
136 module_init(rb750_led_init
);
137 module_exit(rb750_led_exit
);
139 MODULE_DESCRIPTION(DRV_NAME
);
140 MODULE_DESCRIPTION("LED driver for the RouterBOARD 750");
141 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
142 MODULE_LICENSE("GPL v2");