diff options
author | Herbert Valerio Riedel <hvr@gnu.org> | 2008-03-09 19:48:25 -0400 |
---|---|---|
committer | Richard Purdie <rpurdie@rpsys.net> | 2008-04-24 18:37:42 -0400 |
commit | ca3259b3603539e72faacc6821050ee889a52103 (patch) | |
tree | 0c8e482b4354d2433046e86aabb6cb8e1db32162 | |
parent | 4d404fd5c51772720e9c72aa3185bd5119bc6e69 (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.c | 15 | ||||
-rw-r--r-- | include/linux/leds.h | 3 |
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 | ||
29 | static void gpio_led_work(struct work_struct *work) | 31 | static 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 | ||
65 | static 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 | |||
63 | static int gpio_led_probe(struct platform_device *pdev) | 74 | static 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 { | |||
126 | struct gpio_led_platform_data { | 126 | struct 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 | ||