80 lines
2.6 KiB
Diff
80 lines
2.6 KiB
Diff
From c810e850d830330cf04225a4cff8e981e153f269 Mon Sep 17 00:00:00 2001
|
||
From: David Brownell <david-b@pacbell.net>
|
||
Date: Mon, 23 Feb 2009 14:08:14 -0800
|
||
Subject: [PATCH 124/133] leds-gpio broken with current git?
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=utf-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
On Monday 23 February 2009, David Brownell wrote:
|
||
>
|
||
> > Perhaps something broke with Tony's RC1 merge?
|
||
> > The LEDs are broken for me as well.
|
||
>
|
||
> Still works for me. Â Did you maybe not enable the twl4030
|
||
> GPIO support in Kconfig?
|
||
|
||
Oh, and if you did *not*, please give this patch a try.
|
||
I've been meaning to test it.
|
||
|
||
- Dave
|
||
|
||
==============
|
||
Sometimes it's awkward to make sure that the array in the
|
||
platform_data handed to the leds-gpio driver has only valid
|
||
data ... some leds may not be always available, and coping
|
||
with that currently requires patching or rebuilding the array.
|
||
|
||
This patch fixes that by making it be OK to pass an invalid
|
||
GPIO (such as "-EINVAL") ... such table entries are skipped.
|
||
---
|
||
drivers/leds/leds-gpio.c | 12 +++++++++++-
|
||
1 files changed, 11 insertions(+), 1 deletions(-)
|
||
|
||
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c
|
||
index b13bd29..83737e6 100644
|
||
--- a/drivers/leds/leds-gpio.c
|
||
+++ b/drivers/leds/leds-gpio.c
|
||
@@ -90,13 +90,19 @@ static int gpio_led_probe(struct platform_device *pdev)
|
||
cur_led = &pdata->leds[i];
|
||
led_dat = &leds_data[i];
|
||
|
||
+ /* skip leds that aren't available */
|
||
+ led_dat->gpio = cur_led->gpio;
|
||
+ if (!gpio_is_valid(led_dat->gpio)) {
|
||
+ dev_dbg(&pdev->dev, "skipping %s\n", cur_led->name);
|
||
+ continue;
|
||
+ }
|
||
+
|
||
ret = gpio_request(cur_led->gpio, cur_led->name);
|
||
if (ret < 0)
|
||
goto err;
|
||
|
||
led_dat->cdev.name = cur_led->name;
|
||
led_dat->cdev.default_trigger = cur_led->default_trigger;
|
||
- 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) {
|
||
@@ -124,6 +130,8 @@ static int gpio_led_probe(struct platform_device *pdev)
|
||
err:
|
||
if (i > 0) {
|
||
for (i = i - 1; i >= 0; i--) {
|
||
+ if (!gpio_is_valid(leds_data[i].gpio))
|
||
+ continue;
|
||
led_classdev_unregister(&leds_data[i].cdev);
|
||
cancel_work_sync(&leds_data[i].work);
|
||
gpio_free(leds_data[i].gpio);
|
||
@@ -144,6 +152,8 @@ static int __devexit gpio_led_remove(struct platform_device *pdev)
|
||
leds_data = platform_get_drvdata(pdev);
|
||
|
||
for (i = 0; i < pdata->num_leds; i++) {
|
||
+ if (!gpio_is_valid(leds_data[i].gpio))
|
||
+ continue;
|
||
led_classdev_unregister(&leds_data[i].cdev);
|
||
cancel_work_sync(&leds_data[i].work);
|
||
gpio_free(leds_data[i].gpio);
|
||
--
|
||
1.6.0.4.790.gaa14a
|
||
|