mirror of https://gitee.com/openkylin/linux.git
leds: tlc591xx: simplify driver by using the managed led API
Use the managed API of the LED class (devm_led_classdev_register() instead of led_classdev_register()). This allows us to remove the code used to track-and-destroy the LED devices. Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Signed-off-by: Pavel Machek <pavel@ucw.cz>
This commit is contained in:
parent
8b4423d6c5
commit
1ab4531ad1
|
@ -128,54 +128,6 @@ tlc591xx_brightness_set(struct led_classdev *led_cdev,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
tlc591xx_destroy_devices(struct tlc591xx_priv *priv, unsigned int j)
|
|
||||||
{
|
|
||||||
int i = j;
|
|
||||||
|
|
||||||
while (--i >= 0) {
|
|
||||||
if (priv->leds[i].active)
|
|
||||||
led_classdev_unregister(&priv->leds[i].ldev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
tlc591xx_configure(struct device *dev,
|
|
||||||
struct tlc591xx_priv *priv,
|
|
||||||
const struct tlc591xx *tlc591xx)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
err = tlc591xx_set_mode(priv->regmap, MODE2_DIM);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
for (i = 0; i < TLC591XX_MAX_LEDS; i++) {
|
|
||||||
struct tlc591xx_led *led = &priv->leds[i];
|
|
||||||
|
|
||||||
if (!led->active)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
led->priv = priv;
|
|
||||||
led->led_no = i;
|
|
||||||
led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
|
|
||||||
led->ldev.max_brightness = LED_FULL;
|
|
||||||
err = led_classdev_register(dev, &led->ldev);
|
|
||||||
if (err < 0) {
|
|
||||||
dev_err(dev, "couldn't register LED %s\n",
|
|
||||||
led->ldev.name);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
exit:
|
|
||||||
tlc591xx_destroy_devices(priv, i);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct regmap_config tlc591xx_regmap = {
|
static const struct regmap_config tlc591xx_regmap = {
|
||||||
.reg_bits = 8,
|
.reg_bits = 8,
|
||||||
.val_bits = 8,
|
.val_bits = 8,
|
||||||
|
@ -228,7 +180,13 @@ tlc591xx_probe(struct i2c_client *client,
|
||||||
|
|
||||||
i2c_set_clientdata(client, priv);
|
i2c_set_clientdata(client, priv);
|
||||||
|
|
||||||
|
err = tlc591xx_set_mode(priv->regmap, MODE2_DIM);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
for_each_child_of_node(np, child) {
|
for_each_child_of_node(np, child) {
|
||||||
|
struct tlc591xx_led *led;
|
||||||
|
|
||||||
err = of_property_read_u32(child, "reg", ®);
|
err = of_property_read_u32(child, "reg", ®);
|
||||||
if (err) {
|
if (err) {
|
||||||
of_node_put(child);
|
of_node_put(child);
|
||||||
|
@ -239,22 +197,25 @@ tlc591xx_probe(struct i2c_client *client,
|
||||||
of_node_put(child);
|
of_node_put(child);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
priv->leds[reg].active = true;
|
led = &priv->leds[reg];
|
||||||
priv->leds[reg].ldev.name =
|
|
||||||
|
led->active = true;
|
||||||
|
led->ldev.name =
|
||||||
of_get_property(child, "label", NULL) ? : child->name;
|
of_get_property(child, "label", NULL) ? : child->name;
|
||||||
priv->leds[reg].ldev.default_trigger =
|
led->ldev.default_trigger =
|
||||||
of_get_property(child, "linux,default-trigger", NULL);
|
of_get_property(child, "linux,default-trigger", NULL);
|
||||||
|
|
||||||
|
led->priv = priv;
|
||||||
|
led->led_no = reg;
|
||||||
|
led->ldev.brightness_set_blocking = tlc591xx_brightness_set;
|
||||||
|
led->ldev.max_brightness = LED_FULL;
|
||||||
|
err = devm_led_classdev_register(dev, &led->ldev);
|
||||||
|
if (err < 0) {
|
||||||
|
dev_err(dev, "couldn't register LED %s\n",
|
||||||
|
led->ldev.name);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return tlc591xx_configure(dev, priv, tlc591xx);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
tlc591xx_remove(struct i2c_client *client)
|
|
||||||
{
|
|
||||||
struct tlc591xx_priv *priv = i2c_get_clientdata(client);
|
|
||||||
|
|
||||||
tlc591xx_destroy_devices(priv, TLC591XX_MAX_LEDS);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,7 +232,6 @@ static struct i2c_driver tlc591xx_driver = {
|
||||||
.of_match_table = of_match_ptr(of_tlc591xx_leds_match),
|
.of_match_table = of_match_ptr(of_tlc591xx_leds_match),
|
||||||
},
|
},
|
||||||
.probe = tlc591xx_probe,
|
.probe = tlc591xx_probe,
|
||||||
.remove = tlc591xx_remove,
|
|
||||||
.id_table = tlc591xx_id,
|
.id_table = tlc591xx_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue