forked from Minki/linux
leds: lm355x: fix attribute-creation race
Use the attribute groups of the led-class to create the indicator-LED attributes during probe in order to avoid racing with userspace. Note that the comment about the pattern attribute only being for LM3554 was incorrect and did not match the code (the original leds-lm3556 driver had the attribute before LM3554 support was added). Signed-off-by: Johan Hovold <johan@kernel.org> Signed-off-by: Bryan Wu <cooloney@gmail.com>
This commit is contained in:
parent
9db9386016
commit
0d25376c32
@ -413,6 +413,12 @@ out:
|
|||||||
|
|
||||||
static DEVICE_ATTR(pattern, S_IWUSR, NULL, lm3556_indicator_pattern_store);
|
static DEVICE_ATTR(pattern, S_IWUSR, NULL, lm3556_indicator_pattern_store);
|
||||||
|
|
||||||
|
static struct attribute *lm355x_indicator_attrs[] = {
|
||||||
|
&dev_attr_pattern.attr,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
ATTRIBUTE_GROUPS(lm355x_indicator);
|
||||||
|
|
||||||
static const struct regmap_config lm355x_regmap = {
|
static const struct regmap_config lm355x_regmap = {
|
||||||
.reg_bits = 8,
|
.reg_bits = 8,
|
||||||
.val_bits = 8,
|
.val_bits = 8,
|
||||||
@ -501,25 +507,18 @@ static int lm355x_probe(struct i2c_client *client,
|
|||||||
else
|
else
|
||||||
chip->cdev_indicator.max_brightness = 8;
|
chip->cdev_indicator.max_brightness = 8;
|
||||||
chip->cdev_indicator.brightness_set = lm355x_indicator_brightness_set;
|
chip->cdev_indicator.brightness_set = lm355x_indicator_brightness_set;
|
||||||
|
/* indicator pattern control only for LM3556 */
|
||||||
|
if (id->driver_data == CHIP_LM3556)
|
||||||
|
chip->cdev_indicator.groups = lm355x_indicator_groups;
|
||||||
err = led_classdev_register((struct device *)
|
err = led_classdev_register((struct device *)
|
||||||
&client->dev, &chip->cdev_indicator);
|
&client->dev, &chip->cdev_indicator);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto err_create_indicator_file;
|
goto err_create_indicator_file;
|
||||||
/* indicator pattern control only for LM3554 */
|
|
||||||
if (id->driver_data == CHIP_LM3556) {
|
|
||||||
err =
|
|
||||||
device_create_file(chip->cdev_indicator.dev,
|
|
||||||
&dev_attr_pattern);
|
|
||||||
if (err < 0)
|
|
||||||
goto err_create_pattern_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_info(&client->dev, "%s is initialized\n",
|
dev_info(&client->dev, "%s is initialized\n",
|
||||||
lm355x_name[id->driver_data]);
|
lm355x_name[id->driver_data]);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_create_pattern_file:
|
|
||||||
led_classdev_unregister(&chip->cdev_indicator);
|
|
||||||
err_create_indicator_file:
|
err_create_indicator_file:
|
||||||
led_classdev_unregister(&chip->cdev_torch);
|
led_classdev_unregister(&chip->cdev_torch);
|
||||||
err_create_torch_file:
|
err_create_torch_file:
|
||||||
@ -534,8 +533,6 @@ static int lm355x_remove(struct i2c_client *client)
|
|||||||
struct lm355x_reg_data *preg = chip->regs;
|
struct lm355x_reg_data *preg = chip->regs;
|
||||||
|
|
||||||
regmap_write(chip->regmap, preg[REG_OPMODE].regno, 0);
|
regmap_write(chip->regmap, preg[REG_OPMODE].regno, 0);
|
||||||
if (chip->type == CHIP_LM3556)
|
|
||||||
device_remove_file(chip->cdev_indicator.dev, &dev_attr_pattern);
|
|
||||||
led_classdev_unregister(&chip->cdev_indicator);
|
led_classdev_unregister(&chip->cdev_indicator);
|
||||||
flush_work(&chip->work_indicator);
|
flush_work(&chip->work_indicator);
|
||||||
led_classdev_unregister(&chip->cdev_torch);
|
led_classdev_unregister(&chip->cdev_torch);
|
||||||
|
Loading…
Reference in New Issue
Block a user