in leds-lm3692x.c [377:457]
static int lm3692x_probe_dt(struct lm3692x_led *led)
{
struct fwnode_handle *child = NULL;
struct led_init_data init_data = {};
u32 ovp, max_cur;
int ret;
led->enable_gpio = devm_gpiod_get_optional(&led->client->dev,
"enable", GPIOD_OUT_LOW);
if (IS_ERR(led->enable_gpio)) {
ret = PTR_ERR(led->enable_gpio);
dev_err(&led->client->dev, "Failed to get enable gpio: %d\n",
ret);
return ret;
}
led->regulator = devm_regulator_get_optional(&led->client->dev, "vled");
if (IS_ERR(led->regulator)) {
ret = PTR_ERR(led->regulator);
if (ret != -ENODEV)
return dev_err_probe(&led->client->dev, ret,
"Failed to get vled regulator\n");
led->regulator = NULL;
}
led->boost_ctrl = LM3692X_BOOST_SW_1MHZ |
LM3692X_BOOST_SW_NO_SHIFT |
LM3692X_OCP_PROT_1_5A;
ret = device_property_read_u32(&led->client->dev,
"ti,ovp-microvolt", &ovp);
if (ret) {
led->boost_ctrl |= LM3692X_OVP_29V;
} else {
switch (ovp) {
case 17000000:
break;
case 21000000:
led->boost_ctrl |= LM3692X_OVP_21V;
break;
case 25000000:
led->boost_ctrl |= LM3692X_OVP_25V;
break;
case 29000000:
led->boost_ctrl |= LM3692X_OVP_29V;
break;
default:
dev_err(&led->client->dev, "Invalid OVP %d\n", ovp);
return -EINVAL;
}
}
child = device_get_next_child_node(&led->client->dev, child);
if (!child) {
dev_err(&led->client->dev, "No LED Child node\n");
return -ENODEV;
}
ret = fwnode_property_read_u32(child, "reg", &led->led_enable);
if (ret) {
fwnode_handle_put(child);
dev_err(&led->client->dev, "reg DT property missing\n");
return ret;
}
ret = fwnode_property_read_u32(child, "led-max-microamp", &max_cur);
led->led_dev.max_brightness = ret ? LED_FULL :
lm3692x_max_brightness(led, max_cur);
init_data.fwnode = child;
init_data.devicename = led->client->name;
init_data.default_label = ":";
ret = devm_led_classdev_register_ext(&led->client->dev, &led->led_dev,
&init_data);
if (ret)
dev_err(&led->client->dev, "led register err: %d\n", ret);
fwnode_handle_put(init_data.fwnode);
return ret;
}