diff options
Diffstat (limited to 'drivers/leds/led-class.c')
| -rw-r--r-- | drivers/leds/led-class.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c index b0e2d55acbd6..3c7e3487b373 100644 --- a/drivers/leds/led-class.c +++ b/drivers/leds/led-class.c @@ -260,10 +260,14 @@ int of_led_classdev_register(struct device *parent, struct device_node *np,  	if (ret < 0)  		return ret; +	mutex_init(&led_cdev->led_access); +	mutex_lock(&led_cdev->led_access);  	led_cdev->dev = device_create_with_groups(leds_class, parent, 0,  				led_cdev, led_cdev->groups, "%s", name); -	if (IS_ERR(led_cdev->dev)) +	if (IS_ERR(led_cdev->dev)) { +		mutex_unlock(&led_cdev->led_access);  		return PTR_ERR(led_cdev->dev); +	}  	led_cdev->dev->of_node = np;  	if (ret) @@ -274,6 +278,7 @@ int of_led_classdev_register(struct device *parent, struct device_node *np,  		ret = led_add_brightness_hw_changed(led_cdev);  		if (ret) {  			device_unregister(led_cdev->dev); +			mutex_unlock(&led_cdev->led_access);  			return ret;  		}  	} @@ -285,7 +290,6 @@ int of_led_classdev_register(struct device *parent, struct device_node *np,  #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED  	led_cdev->brightness_hw_changed = -1;  #endif -	mutex_init(&led_cdev->led_access);  	/* add to the list of leds */  	down_write(&leds_list_lock);  	list_add_tail(&led_cdev->node, &leds_list); @@ -302,6 +306,8 @@ int of_led_classdev_register(struct device *parent, struct device_node *np,  	led_trigger_set_default(led_cdev);  #endif +	mutex_unlock(&led_cdev->led_access); +  	dev_dbg(parent, "Registered led device: %s\n",  			led_cdev->name);  |