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:
Jean-Jacques Hiblot 2019-09-20 13:58:05 +02:00 committed by Pavel
parent 8b4423d6c5
commit 1ab4531ad1
1 changed files with 22 additions and 62 deletions

View File

@ -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", &reg); err = of_property_read_u32(child, "reg", &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,
}; };