static int lm3692x_probe_dt()

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