Merge tag 'for-linus-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw...
[linux-2.6-microblaze.git] / drivers / leds / leds-lm3697.c
index 0249830..7d216cd 100644 (file)
@@ -78,6 +78,7 @@ struct lm3697 {
        struct mutex lock;
 
        int bank_cfg;
+       int num_banks;
 
        struct lm3697_led leds[];
 };
@@ -115,6 +116,7 @@ static int lm3697_brightness_set(struct led_classdev *led_cdev,
        struct lm3697_led *led = container_of(led_cdev, struct lm3697_led,
                                              led_dev);
        int ctrl_en_val = (1 << led->control_bank);
+       struct device *dev = led->priv->dev;
        int ret;
 
        mutex_lock(&led->priv->lock);
@@ -123,7 +125,7 @@ static int lm3697_brightness_set(struct led_classdev *led_cdev,
                ret = regmap_update_bits(led->priv->regmap, LM3697_CTRL_ENABLE,
                                         ctrl_en_val, ~ctrl_en_val);
                if (ret) {
-                       dev_err(&led->priv->client->dev, "Cannot write ctrl register\n");
+                       dev_err(dev, "Cannot write ctrl register\n");
                        goto brightness_out;
                }
 
@@ -131,8 +133,7 @@ static int lm3697_brightness_set(struct led_classdev *led_cdev,
        } else {
                ret = ti_lmu_common_set_brightness(&led->lmu_data, brt_val);
                if (ret) {
-                       dev_err(&led->priv->client->dev,
-                               "Cannot write brightness\n");
+                       dev_err(dev, "Cannot write brightness\n");
                        goto brightness_out;
                }
 
@@ -141,8 +142,7 @@ static int lm3697_brightness_set(struct led_classdev *led_cdev,
                                                 LM3697_CTRL_ENABLE,
                                                 ctrl_en_val, ctrl_en_val);
                        if (ret) {
-                               dev_err(&led->priv->client->dev,
-                                       "Cannot enable the device\n");
+                               dev_err(dev, "Cannot enable the device\n");
                                goto brightness_out;
                        }
 
@@ -157,6 +157,7 @@ brightness_out:
 
 static int lm3697_init(struct lm3697 *priv)
 {
+       struct device *dev = priv->dev;
        struct lm3697_led *led;
        int i, ret;
 
@@ -165,26 +166,26 @@ static int lm3697_init(struct lm3697 *priv)
        } else {
                ret = regmap_write(priv->regmap, LM3697_RESET, LM3697_SW_RESET);
                if (ret) {
-                       dev_err(&priv->client->dev, "Cannot reset the device\n");
+                       dev_err(dev, "Cannot reset the device\n");
                        goto out;
                }
        }
 
        ret = regmap_write(priv->regmap, LM3697_CTRL_ENABLE, 0x0);
        if (ret) {
-               dev_err(&priv->client->dev, "Cannot write ctrl enable\n");
+               dev_err(dev, "Cannot write ctrl enable\n");
                goto out;
        }
 
        ret = regmap_write(priv->regmap, LM3697_OUTPUT_CONFIG, priv->bank_cfg);
        if (ret)
-               dev_err(&priv->client->dev, "Cannot write OUTPUT config\n");
+               dev_err(dev, "Cannot write OUTPUT config\n");
 
-       for (i = 0; i < LM3697_MAX_CONTROL_BANKS; i++) {
+       for (i = 0; i < priv->num_banks; i++) {
                led = &priv->leds[i];
                ret = ti_lmu_common_set_ramp(&led->lmu_data);
                if (ret)
-                       dev_err(&priv->client->dev, "Setting the ramp rate failed\n");
+                       dev_err(dev, "Setting the ramp rate failed\n");
        }
 out:
        return ret;
@@ -193,36 +194,37 @@ out:
 static int lm3697_probe_dt(struct lm3697 *priv)
 {
        struct fwnode_handle *child = NULL;
+       struct device *dev = priv->dev;
        struct lm3697_led *led;
-       const char *name;
+       int ret = -EINVAL;
        int control_bank;
        size_t i = 0;
-       int ret = -EINVAL;
        int j;
 
-       priv->enable_gpio = devm_gpiod_get_optional(&priv->client->dev,
-                                                  "enable", GPIOD_OUT_LOW);
+       priv->enable_gpio = devm_gpiod_get_optional(dev, "enable",
+                                                   GPIOD_OUT_LOW);
        if (IS_ERR(priv->enable_gpio)) {
                ret = PTR_ERR(priv->enable_gpio);
-               dev_err(&priv->client->dev, "Failed to get enable gpio: %d\n",
-                       ret);
+               dev_err(dev, "Failed to get enable gpio: %d\n", ret);
                return ret;
        }
 
-       priv->regulator = devm_regulator_get(&priv->client->dev, "vled");
+       priv->regulator = devm_regulator_get(dev, "vled");
        if (IS_ERR(priv->regulator))
                priv->regulator = NULL;
 
-       device_for_each_child_node(priv->dev, child) {
+       device_for_each_child_node(dev, child) {
+               struct led_init_data init_data = {};
+
                ret = fwnode_property_read_u32(child, "reg", &control_bank);
                if (ret) {
-                       dev_err(&priv->client->dev, "reg property missing\n");
+                       dev_err(dev, "reg property missing\n");
                        fwnode_handle_put(child);
                        goto child_out;
                }
 
                if (control_bank > LM3697_CONTROL_B) {
-                       dev_err(&priv->client->dev, "reg property is invalid\n");
+                       dev_err(dev, "reg property is invalid\n");
                        ret = -EINVAL;
                        fwnode_handle_put(child);
                        goto child_out;
@@ -230,10 +232,10 @@ static int lm3697_probe_dt(struct lm3697 *priv)
 
                led = &priv->leds[i];
 
-               ret = ti_lmu_common_get_brt_res(&priv->client->dev,
-                                               child, &led->lmu_data);
+               ret = ti_lmu_common_get_brt_res(dev, child, &led->lmu_data);
                if (ret)
-                       dev_warn(&priv->client->dev, "brightness resolution property missing\n");
+                       dev_warn(dev,
+                                "brightness resolution property missing\n");
 
                led->control_bank = control_bank;
                led->lmu_data.regmap = priv->regmap;
@@ -246,7 +248,7 @@ static int lm3697_probe_dt(struct lm3697 *priv)
 
                led->num_leds = fwnode_property_count_u32(child, "led-sources");
                if (led->num_leds > LM3697_MAX_LED_STRINGS) {
-                       dev_err(&priv->client->dev, "Too many LED strings defined\n");
+                       dev_err(dev, "Too many LED strings defined\n");
                        continue;
                }
 
@@ -254,7 +256,7 @@ static int lm3697_probe_dt(struct lm3697 *priv)
                                                    led->hvled_strings,
                                                    led->num_leds);
                if (ret) {
-                       dev_err(&priv->client->dev, "led-sources property missing\n");
+                       dev_err(dev, "led-sources property missing\n");
                        fwnode_handle_put(child);
                        goto child_out;
                }
@@ -263,31 +265,23 @@ static int lm3697_probe_dt(struct lm3697 *priv)
                        priv->bank_cfg |=
                                (led->control_bank << led->hvled_strings[j]);
 
-               ret = ti_lmu_common_get_ramp_params(&priv->client->dev,
-                                                   child, &led->lmu_data);
+               ret = ti_lmu_common_get_ramp_params(dev, child, &led->lmu_data);
                if (ret)
-                       dev_warn(&priv->client->dev, "runtime-ramp properties missing\n");
+                       dev_warn(dev, "runtime-ramp properties missing\n");
 
-               fwnode_property_read_string(child, "linux,default-trigger",
-                                           &led->led_dev.default_trigger);
-
-               ret = fwnode_property_read_string(child, "label", &name);
-               if (ret)
-                       snprintf(led->label, sizeof(led->label),
-                               "%s::", priv->client->name);
-               else
-                       snprintf(led->label, sizeof(led->label),
-                                "%s:%s", priv->client->name, name);
+               init_data.fwnode = child;
+               init_data.devicename = priv->client->name;
+               /* for backwards compatibility if `label` is not present */
+               init_data.default_label = ":";
 
                led->priv = priv;
-               led->led_dev.name = led->label;
                led->led_dev.max_brightness = led->lmu_data.max_brightness;
                led->led_dev.brightness_set_blocking = lm3697_brightness_set;
 
-               ret = devm_led_classdev_register(priv->dev, &led->led_dev);
+               ret = devm_led_classdev_register_ext(dev, &led->led_dev,
+                                                    &init_data);
                if (ret) {
-                       dev_err(&priv->client->dev, "led register err: %d\n",
-                               ret);
+                       dev_err(dev, "led register err: %d\n", ret);
                        fwnode_handle_put(child);
                        goto child_out;
                }
@@ -302,18 +296,18 @@ child_out:
 static int lm3697_probe(struct i2c_client *client,
                        const struct i2c_device_id *id)
 {
+       struct device *dev = &client->dev;
        struct lm3697 *led;
        int count;
        int ret;
 
-       count = device_get_child_node_count(&client->dev);
-       if (!count) {
-               dev_err(&client->dev, "LEDs are not defined in device tree!");
+       count = device_get_child_node_count(dev);
+       if (!count || count > LM3697_MAX_CONTROL_BANKS) {
+               dev_err(dev, "Strange device tree!");
                return -ENODEV;
        }
 
-       led = devm_kzalloc(&client->dev, struct_size(led, leds, count),
-                          GFP_KERNEL);
+       led = devm_kzalloc(dev, struct_size(led, leds, count), GFP_KERNEL);
        if (!led)
                return -ENOMEM;
 
@@ -321,12 +315,12 @@ static int lm3697_probe(struct i2c_client *client,
        i2c_set_clientdata(client, led);
 
        led->client = client;
-       led->dev = &client->dev;
+       led->dev = dev;
+       led->num_banks = count;
        led->regmap = devm_regmap_init_i2c(client, &lm3697_regmap_config);
        if (IS_ERR(led->regmap)) {
                ret = PTR_ERR(led->regmap);
-               dev_err(&client->dev, "Failed to allocate register map: %d\n",
-                       ret);
+               dev_err(dev, "Failed to allocate register map: %d\n", ret);
                return ret;
        }
 
@@ -340,12 +334,13 @@ static int lm3697_probe(struct i2c_client *client,
 static int lm3697_remove(struct i2c_client *client)
 {
        struct lm3697 *led = i2c_get_clientdata(client);
+       struct device *dev = &led->client->dev;
        int ret;
 
        ret = regmap_update_bits(led->regmap, LM3697_CTRL_ENABLE,
                                 LM3697_CTRL_A_B_EN, 0);
        if (ret) {
-               dev_err(&led->client->dev, "Failed to disable the device\n");
+               dev_err(dev, "Failed to disable the device\n");
                return ret;
        }
 
@@ -355,8 +350,7 @@ static int lm3697_remove(struct i2c_client *client)
        if (led->regulator) {
                ret = regulator_disable(led->regulator);
                if (ret)
-                       dev_err(&led->client->dev,
-                               "Failed to disable regulator\n");
+                       dev_err(dev, "Failed to disable regulator\n");
        }
 
        mutex_destroy(&led->lock);