diff options
| author | Johan Hovold <johan@kernel.org> | 2014-06-25 10:08:56 -0700 | 
|---|---|---|
| committer | Bryan Wu <cooloney@gmail.com> | 2014-06-27 13:44:05 -0700 | 
| commit | 44a1255b03aeedb56cbe7cf27461458bd4513049 (patch) | |
| tree | 2203921e8ef397ac30e509be9808a762876318ff | |
| parent | 660216bf82e0cd65603c0935193c1f7c4aca04fb (diff) | |
leds: lp55xx-common: fix attribute-creation race
Use the attribute groups of the led-class to create the LED attributes
during probe in order to avoid racing with userspace.
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
| -rw-r--r-- | drivers/leds/leds-lp55xx-common.c | 22 | 
1 files changed, 3 insertions, 19 deletions
| diff --git a/drivers/leds/leds-lp55xx-common.c b/drivers/leds/leds-lp55xx-common.c index 3fbfb31602c7..77c26bc32eed 100644 --- a/drivers/leds/leds-lp55xx-common.c +++ b/drivers/leds/leds-lp55xx-common.c @@ -127,15 +127,12 @@ static DEVICE_ATTR(led_current, S_IRUGO | S_IWUSR, lp55xx_show_current,  		lp55xx_store_current);  static DEVICE_ATTR(max_current, S_IRUGO , lp55xx_show_max_current, NULL); -static struct attribute *lp55xx_led_attributes[] = { +static struct attribute *lp55xx_led_attrs[] = {  	&dev_attr_led_current.attr,  	&dev_attr_max_current.attr,  	NULL,  }; - -static struct attribute_group lp55xx_led_attr_group = { -	.attrs = lp55xx_led_attributes -}; +ATTRIBUTE_GROUPS(lp55xx_led);  static void lp55xx_set_brightness(struct led_classdev *cdev,  			     enum led_brightness brightness) @@ -176,6 +173,7 @@ static int lp55xx_init_led(struct lp55xx_led *led,  	}  	led->cdev.brightness_set = lp55xx_set_brightness; +	led->cdev.groups = lp55xx_led_groups;  	if (pdata->led_config[chan].name) {  		led->cdev.name = pdata->led_config[chan].name; @@ -185,24 +183,12 @@ static int lp55xx_init_led(struct lp55xx_led *led,  		led->cdev.name = name;  	} -	/* -	 * register led class device for each channel and -	 * add device attributes -	 */ -  	ret = led_classdev_register(dev, &led->cdev);  	if (ret) {  		dev_err(dev, "led register err: %d\n", ret);  		return ret;  	} -	ret = sysfs_create_group(&led->cdev.dev->kobj, &lp55xx_led_attr_group); -	if (ret) { -		dev_err(dev, "led sysfs err: %d\n", ret); -		led_classdev_unregister(&led->cdev); -		return ret; -	} -  	return 0;  } @@ -520,8 +506,6 @@ void lp55xx_unregister_leds(struct lp55xx_led *led, struct lp55xx_chip *chip)  	for (i = 0; i < chip->num_leds; i++) {  		each = led + i; -		sysfs_remove_group(&each->cdev.dev->kobj, -						&lp55xx_led_attr_group);  		led_classdev_unregister(&each->cdev);  		flush_work(&each->brightness_work);  	} | 
