in flash/leds-as3645a.c [481:569]
static int as3645a_parse_node(struct as3645a *flash,
struct fwnode_handle *fwnode)
{
struct as3645a_config *cfg = &flash->cfg;
struct fwnode_handle *child;
int rval;
fwnode_for_each_child_node(fwnode, child) {
u32 id = 0;
fwnode_property_read_u32(child, "reg", &id);
switch (id) {
case AS_LED_FLASH:
flash->flash_node = child;
fwnode_handle_get(child);
break;
case AS_LED_INDICATOR:
flash->indicator_node = child;
fwnode_handle_get(child);
break;
default:
dev_warn(&flash->client->dev,
"unknown LED %u encountered, ignoring\n", id);
break;
}
}
if (!flash->flash_node) {
dev_err(&flash->client->dev, "can't find flash node\n");
return -ENODEV;
}
rval = fwnode_property_read_u32(flash->flash_node, "flash-timeout-us",
&cfg->flash_timeout_us);
if (rval < 0) {
dev_err(&flash->client->dev,
"can't read flash-timeout-us property for flash\n");
goto out_err;
}
rval = fwnode_property_read_u32(flash->flash_node, "flash-max-microamp",
&cfg->flash_max_ua);
if (rval < 0) {
dev_err(&flash->client->dev,
"can't read flash-max-microamp property for flash\n");
goto out_err;
}
rval = fwnode_property_read_u32(flash->flash_node, "led-max-microamp",
&cfg->assist_max_ua);
if (rval < 0) {
dev_err(&flash->client->dev,
"can't read led-max-microamp property for flash\n");
goto out_err;
}
fwnode_property_read_u32(flash->flash_node, "voltage-reference",
&cfg->voltage_reference);
fwnode_property_read_u32(flash->flash_node, "ams,input-max-microamp",
&cfg->peak);
cfg->peak = AS_PEAK_mA_TO_REG(cfg->peak);
if (!flash->indicator_node) {
dev_warn(&flash->client->dev,
"can't find indicator node\n");
rval = -ENODEV;
goto out_err;
}
rval = fwnode_property_read_u32(flash->indicator_node,
"led-max-microamp",
&cfg->indicator_max_ua);
if (rval < 0) {
dev_err(&flash->client->dev,
"can't read led-max-microamp property for indicator\n");
goto out_err;
}
return 0;
out_err:
fwnode_handle_put(flash->flash_node);
fwnode_handle_put(flash->indicator_node);
return rval;
}