Skip to content

Commit 835fc89

Browse files
Linus Walleijpavelmachek
authored andcommitted
leds: regulator: Make probeable from device tree
The regulator LED can easily be adapted to probe from the device tree. We switch led_classdev_register() to led_classdev_register_ext() passing some struct led_init_data init_data that we leave NULL save the fwnode if platform data isn't present so that it will be populated from the device tree. If we have platform data we set up the name from the platform data but using init_data instead. Cc: Antonio Ospite <ao2@ao2.it> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Pavel Machek <pavel@ucw.cz>
1 parent 4c350c6 commit 835fc89

1 file changed

Lines changed: 23 additions & 19 deletions

File tree

drivers/leds/leds-regulator.c

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99

1010
#include <linux/module.h>
11+
#include <linux/mod_devicetable.h>
1112
#include <linux/err.h>
1213
#include <linux/slab.h>
1314
#include <linux/leds.h>
@@ -124,34 +125,36 @@ static int regulator_led_probe(struct platform_device *pdev)
124125
struct led_regulator_platform_data *pdata =
125126
dev_get_platdata(&pdev->dev);
126127
struct device *dev = &pdev->dev;
128+
struct led_init_data init_data = {};
127129
struct regulator_led *led;
128130
struct regulator *vcc;
129131
int ret = 0;
130132

131-
if (pdata == NULL) {
132-
dev_err(dev, "no platform data\n");
133-
return -ENODEV;
134-
}
135-
136133
vcc = devm_regulator_get_exclusive(dev, "vled");
137134
if (IS_ERR(vcc)) {
138-
dev_err(dev, "Cannot get vcc for %s\n", pdata->name);
135+
dev_err(dev, "Cannot get vcc\n");
139136
return PTR_ERR(vcc);
140137
}
141138

142139
led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL);
143140
if (led == NULL)
144141
return -ENOMEM;
145142

143+
init_data.fwnode = dev->fwnode;
144+
146145
led->cdev.max_brightness = led_regulator_get_max_brightness(vcc);
147-
if (pdata->brightness > led->cdev.max_brightness) {
148-
dev_err(dev, "Invalid default brightness %d\n",
146+
/* Legacy platform data label assignment */
147+
if (pdata) {
148+
if (pdata->brightness > led->cdev.max_brightness) {
149+
dev_err(dev, "Invalid default brightness %d\n",
149150
pdata->brightness);
150-
return -EINVAL;
151+
return -EINVAL;
152+
}
153+
led->cdev.brightness = pdata->brightness;
154+
init_data.default_label = pdata->name;
151155
}
152156

153157
led->cdev.brightness_set_blocking = regulator_led_brightness_set;
154-
led->cdev.name = pdata->name;
155158
led->cdev.flags |= LED_CORE_SUSPENDRESUME;
156159
led->vcc = vcc;
157160

@@ -163,16 +166,10 @@ static int regulator_led_probe(struct platform_device *pdev)
163166

164167
platform_set_drvdata(pdev, led);
165168

166-
ret = led_classdev_register(dev, &led->cdev);
169+
ret = led_classdev_register_ext(dev, &led->cdev, &init_data);
167170
if (ret < 0)
168171
return ret;
169172

170-
/* to expose the default value to userspace */
171-
led->cdev.brightness = pdata->brightness;
172-
173-
/* Set the default led status */
174-
regulator_led_brightness_set(&led->cdev, led->cdev.brightness);
175-
176173
return 0;
177174
}
178175

@@ -185,10 +182,17 @@ static int regulator_led_remove(struct platform_device *pdev)
185182
return 0;
186183
}
187184

185+
static const struct of_device_id regulator_led_of_match[] = {
186+
{ .compatible = "regulator-led", },
187+
{}
188+
};
189+
MODULE_DEVICE_TABLE(of, regulator_led_of_match);
190+
188191
static struct platform_driver regulator_led_driver = {
189192
.driver = {
190-
.name = "leds-regulator",
191-
},
193+
.name = "leds-regulator",
194+
.of_match_table = regulator_led_of_match,
195+
},
192196
.probe = regulator_led_probe,
193197
.remove = regulator_led_remove,
194198
};

0 commit comments

Comments
 (0)