static int as3645a_parse_node()

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;
}