diff options
Diffstat (limited to 'drivers/leds/leds-gpio.c')
| -rw-r--r-- | drivers/leds/leds-gpio.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index d2109054de85..6b06638eb5b4 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c | |||
| @@ -76,7 +76,7 @@ static int __devinit create_gpio_led(const struct gpio_led *template, | |||
| 76 | struct gpio_led_data *led_dat, struct device *parent, | 76 | struct gpio_led_data *led_dat, struct device *parent, |
| 77 | int (*blink_set)(unsigned, unsigned long *, unsigned long *)) | 77 | int (*blink_set)(unsigned, unsigned long *, unsigned long *)) |
| 78 | { | 78 | { |
| 79 | int ret; | 79 | int ret, state; |
| 80 | 80 | ||
| 81 | /* skip leds that aren't available */ | 81 | /* skip leds that aren't available */ |
| 82 | if (!gpio_is_valid(template->gpio)) { | 82 | if (!gpio_is_valid(template->gpio)) { |
| @@ -99,11 +99,15 @@ static int __devinit create_gpio_led(const struct gpio_led *template, | |||
| 99 | led_dat->cdev.blink_set = gpio_blink_set; | 99 | led_dat->cdev.blink_set = gpio_blink_set; |
| 100 | } | 100 | } |
| 101 | led_dat->cdev.brightness_set = gpio_led_set; | 101 | led_dat->cdev.brightness_set = gpio_led_set; |
| 102 | led_dat->cdev.brightness = LED_OFF; | 102 | if (template->default_state == LEDS_GPIO_DEFSTATE_KEEP) |
| 103 | state = !!gpio_get_value(led_dat->gpio) ^ led_dat->active_low; | ||
| 104 | else | ||
| 105 | state = (template->default_state == LEDS_GPIO_DEFSTATE_ON); | ||
| 106 | led_dat->cdev.brightness = state ? LED_FULL : LED_OFF; | ||
| 103 | if (!template->retain_state_suspended) | 107 | if (!template->retain_state_suspended) |
| 104 | led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; | 108 | led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; |
| 105 | 109 | ||
| 106 | ret = gpio_direction_output(led_dat->gpio, led_dat->active_low); | 110 | ret = gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state); |
| 107 | if (ret < 0) | 111 | if (ret < 0) |
| 108 | goto err; | 112 | goto err; |
| 109 | 113 | ||
| @@ -129,7 +133,7 @@ static void delete_gpio_led(struct gpio_led_data *led) | |||
| 129 | } | 133 | } |
| 130 | 134 | ||
| 131 | #ifdef CONFIG_LEDS_GPIO_PLATFORM | 135 | #ifdef CONFIG_LEDS_GPIO_PLATFORM |
| 132 | static int gpio_led_probe(struct platform_device *pdev) | 136 | static int __devinit gpio_led_probe(struct platform_device *pdev) |
| 133 | { | 137 | { |
| 134 | struct gpio_led_platform_data *pdata = pdev->dev.platform_data; | 138 | struct gpio_led_platform_data *pdata = pdev->dev.platform_data; |
| 135 | struct gpio_led_data *leds_data; | 139 | struct gpio_led_data *leds_data; |
| @@ -223,12 +227,22 @@ static int __devinit of_gpio_leds_probe(struct of_device *ofdev, | |||
| 223 | memset(&led, 0, sizeof(led)); | 227 | memset(&led, 0, sizeof(led)); |
| 224 | for_each_child_of_node(np, child) { | 228 | for_each_child_of_node(np, child) { |
| 225 | enum of_gpio_flags flags; | 229 | enum of_gpio_flags flags; |
| 230 | const char *state; | ||
| 226 | 231 | ||
| 227 | led.gpio = of_get_gpio_flags(child, 0, &flags); | 232 | led.gpio = of_get_gpio_flags(child, 0, &flags); |
| 228 | led.active_low = flags & OF_GPIO_ACTIVE_LOW; | 233 | led.active_low = flags & OF_GPIO_ACTIVE_LOW; |
| 229 | led.name = of_get_property(child, "label", NULL) ? : child->name; | 234 | led.name = of_get_property(child, "label", NULL) ? : child->name; |
| 230 | led.default_trigger = | 235 | led.default_trigger = |
| 231 | of_get_property(child, "linux,default-trigger", NULL); | 236 | of_get_property(child, "linux,default-trigger", NULL); |
| 237 | state = of_get_property(child, "default-state", NULL); | ||
| 238 | if (state) { | ||
| 239 | if (!strcmp(state, "keep")) | ||
| 240 | led.default_state = LEDS_GPIO_DEFSTATE_KEEP; | ||
| 241 | else if(!strcmp(state, "on")) | ||
| 242 | led.default_state = LEDS_GPIO_DEFSTATE_ON; | ||
| 243 | else | ||
| 244 | led.default_state = LEDS_GPIO_DEFSTATE_OFF; | ||
| 245 | } | ||
| 232 | 246 | ||
| 233 | ret = create_gpio_led(&led, &pdata->led_data[pdata->num_leds++], | 247 | ret = create_gpio_led(&led, &pdata->led_data[pdata->num_leds++], |
| 234 | &ofdev->dev, NULL); | 248 | &ofdev->dev, NULL); |
