aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Valerio Riedel <hvr@gnu.org>2008-03-09 19:48:25 -0400
committerRichard Purdie <rpurdie@rpsys.net>2008-04-24 18:37:42 -0400
commitca3259b3603539e72faacc6821050ee889a52103 (patch)
tree0c8e482b4354d2433046e86aabb6cb8e1db32162
parent4d404fd5c51772720e9c72aa3185bd5119bc6e69 (diff)
leds: enable support for blink_set() platform hook in leds-gpio
Enhance leds-gpio to provide hardware-based led flashing by passing through the blink_set() call to a optionally set platform-specific function pointer. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org> Signed-off-by: Richard Purdie <rpurdie@rpsys.net>
-rw-r--r--drivers/leds/leds-gpio.c15
-rw-r--r--include/linux/leds.h3
2 files changed, 18 insertions, 0 deletions
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c
index 1aae8b332134..b13bd2950e95 100644
--- a/drivers/leds/leds-gpio.c
+++ b/drivers/leds/leds-gpio.c
@@ -24,6 +24,8 @@ struct gpio_led_data {
24 u8 new_level; 24 u8 new_level;
25 u8 can_sleep; 25 u8 can_sleep;
26 u8 active_low; 26 u8 active_low;
27 int (*platform_gpio_blink_set)(unsigned gpio,
28 unsigned long *delay_on, unsigned long *delay_off);
27}; 29};
28 30
29static void gpio_led_work(struct work_struct *work) 31static void gpio_led_work(struct work_struct *work)
@@ -60,6 +62,15 @@ static void gpio_led_set(struct led_classdev *led_cdev,
60 gpio_set_value(led_dat->gpio, level); 62 gpio_set_value(led_dat->gpio, level);
61} 63}
62 64
65static int gpio_blink_set(struct led_classdev *led_cdev,
66 unsigned long *delay_on, unsigned long *delay_off)
67{
68 struct gpio_led_data *led_dat =
69 container_of(led_cdev, struct gpio_led_data, cdev);
70
71 return led_dat->platform_gpio_blink_set(led_dat->gpio, delay_on, delay_off);
72}
73
63static int gpio_led_probe(struct platform_device *pdev) 74static int gpio_led_probe(struct platform_device *pdev)
64{ 75{
65 struct gpio_led_platform_data *pdata = pdev->dev.platform_data; 76 struct gpio_led_platform_data *pdata = pdev->dev.platform_data;
@@ -88,6 +99,10 @@ static int gpio_led_probe(struct platform_device *pdev)
88 led_dat->gpio = cur_led->gpio; 99 led_dat->gpio = cur_led->gpio;
89 led_dat->can_sleep = gpio_cansleep(cur_led->gpio); 100 led_dat->can_sleep = gpio_cansleep(cur_led->gpio);
90 led_dat->active_low = cur_led->active_low; 101 led_dat->active_low = cur_led->active_low;
102 if (pdata->gpio_blink_set) {
103 led_dat->platform_gpio_blink_set = pdata->gpio_blink_set;
104 led_dat->cdev.blink_set = gpio_blink_set;
105 }
91 led_dat->cdev.brightness_set = gpio_led_set; 106 led_dat->cdev.brightness_set = gpio_led_set;
92 led_dat->cdev.brightness = LED_OFF; 107 led_dat->cdev.brightness = LED_OFF;
93 108
diff --git a/include/linux/leds.h b/include/linux/leds.h
index b07e3d400bd6..c195a674b6ca 100644
--- a/include/linux/leds.h
+++ b/include/linux/leds.h
@@ -126,6 +126,9 @@ struct gpio_led {
126struct gpio_led_platform_data { 126struct gpio_led_platform_data {
127 int num_leds; 127 int num_leds;
128 struct gpio_led *leds; 128 struct gpio_led *leds;
129 int (*gpio_blink_set)(unsigned gpio,
130 unsigned long *delay_on,
131 unsigned long *delay_off);
129}; 132};
130 133
131 134