diff options
author | Herbert Valerio Riedel <hvr@gnu.org> | 2008-03-09 23:48:25 +0000 |
---|---|---|
committer | Richard Purdie <rpurdie@rpsys.net> | 2008-04-24 23:37:42 +0100 |
commit | ca3259b3603539e72faacc6821050ee889a52103 (patch) | |
tree | 0c8e482b4354d2433046e86aabb6cb8e1db32162 | |
parent | 4d404fd5c51772720e9c72aa3185bd5119bc6e69 (diff) | |
download | op-kernel-dev-ca3259b3603539e72faacc6821050ee889a52103.zip op-kernel-dev-ca3259b3603539e72faacc6821050ee889a52103.tar.gz |
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 1aae8b3..b13bd29 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -24,6 +24,8 @@ struct gpio_led_data { u8 new_level; u8 can_sleep; u8 active_low; + int (*platform_gpio_blink_set)(unsigned gpio, + unsigned long *delay_on, unsigned long *delay_off); }; static void gpio_led_work(struct work_struct *work) @@ -60,6 +62,15 @@ static void gpio_led_set(struct led_classdev *led_cdev, gpio_set_value(led_dat->gpio, level); } +static int gpio_blink_set(struct led_classdev *led_cdev, + unsigned long *delay_on, unsigned long *delay_off) +{ + struct gpio_led_data *led_dat = + container_of(led_cdev, struct gpio_led_data, cdev); + + return led_dat->platform_gpio_blink_set(led_dat->gpio, delay_on, delay_off); +} + static int gpio_led_probe(struct platform_device *pdev) { struct gpio_led_platform_data *pdata = pdev->dev.platform_data; @@ -88,6 +99,10 @@ static int gpio_led_probe(struct platform_device *pdev) led_dat->gpio = cur_led->gpio; led_dat->can_sleep = gpio_cansleep(cur_led->gpio); led_dat->active_low = cur_led->active_low; + if (pdata->gpio_blink_set) { + led_dat->platform_gpio_blink_set = pdata->gpio_blink_set; + led_dat->cdev.blink_set = gpio_blink_set; + } led_dat->cdev.brightness_set = gpio_led_set; led_dat->cdev.brightness = LED_OFF; diff --git a/include/linux/leds.h b/include/linux/leds.h index b07e3d4..c195a67 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h @@ -126,6 +126,9 @@ struct gpio_led { struct gpio_led_platform_data { int num_leds; struct gpio_led *leds; + int (*gpio_blink_set)(unsigned gpio, + unsigned long *delay_on, + unsigned long *delay_off); }; |