diff options
Diffstat (limited to 'drivers/leds/leds-gpio.c')
| -rw-r--r-- | drivers/leds/leds-gpio.c | 20 | 
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index 76895e69104..6b06638eb5b 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,  	struct gpio_led_data *led_dat, struct device *parent,  	int (*blink_set)(unsigned, unsigned long *, unsigned long *))  { -	int ret; +	int ret, state;  	/* skip leds that aren't available */  	if (!gpio_is_valid(template->gpio)) { @@ -99,11 +99,15 @@ static int __devinit create_gpio_led(const struct gpio_led *template,  		led_dat->cdev.blink_set = gpio_blink_set;  	}  	led_dat->cdev.brightness_set = gpio_led_set; -	led_dat->cdev.brightness = LED_OFF; +	if (template->default_state == LEDS_GPIO_DEFSTATE_KEEP) +		state = !!gpio_get_value(led_dat->gpio) ^ led_dat->active_low; +	else +		state = (template->default_state == LEDS_GPIO_DEFSTATE_ON); +	led_dat->cdev.brightness = state ? LED_FULL : LED_OFF;  	if (!template->retain_state_suspended)  		led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; -	ret = gpio_direction_output(led_dat->gpio, led_dat->active_low); +	ret = gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state);  	if (ret < 0)  		goto err; @@ -223,12 +227,22 @@ static int __devinit of_gpio_leds_probe(struct of_device *ofdev,  	memset(&led, 0, sizeof(led));  	for_each_child_of_node(np, child) {  		enum of_gpio_flags flags; +		const char *state;  		led.gpio = of_get_gpio_flags(child, 0, &flags);  		led.active_low = flags & OF_GPIO_ACTIVE_LOW;  		led.name = of_get_property(child, "label", NULL) ? : child->name;  		led.default_trigger =  			of_get_property(child, "linux,default-trigger", NULL); +		state = of_get_property(child, "default-state", NULL); +		if (state) { +			if (!strcmp(state, "keep")) +				led.default_state = LEDS_GPIO_DEFSTATE_KEEP; +			else if(!strcmp(state, "on")) +				led.default_state = LEDS_GPIO_DEFSTATE_ON; +			else +				led.default_state = LEDS_GPIO_DEFSTATE_OFF; +		}  		ret = create_gpio_led(&led, &pdata->led_data[pdata->num_leds++],  				      &ofdev->dev, NULL);  |