in flash/leds-mt6360.c [520:604]
static int mt6360_led_register(struct device *parent, struct mt6360_led *led,
struct led_init_data *init_data)
{
struct mt6360_priv *priv = led->priv;
struct v4l2_flash_config v4l2_config = {0};
int ret;
if ((led->led_no == MT6360_LED_ISNK1 ||
led->led_no == MT6360_VIRTUAL_MULTICOLOR) &&
(priv->leds_active & BIT(MT6360_LED_ISNK1))) {
/*
* Change isink1 to SW control mode, disconnect it with
* charger state
*/
ret = regmap_update_bits(priv->regmap, MT6360_REG_RGBEN,
MT6360_CHRINDSEL_MASK,
MT6360_CHRINDSEL_MASK);
if (ret) {
dev_err(parent, "Failed to config ISNK1 to SW mode\n");
return ret;
}
}
switch (led->led_no) {
case MT6360_VIRTUAL_MULTICOLOR:
ret = mt6360_mc_brightness_set(&led->mc.led_cdev, LED_OFF);
if (ret) {
dev_err(parent,
"Failed to init multicolor brightness\n");
return ret;
}
ret = devm_led_classdev_multicolor_register_ext(parent,
&led->mc, init_data);
if (ret) {
dev_err(parent, "Couldn't register multicolor\n");
return ret;
}
break;
case MT6360_LED_ISNK1 ... MT6360_LED_ISNKML:
ret = mt6360_isnk_init_default_state(led);
if (ret) {
dev_err(parent, "Failed to init %d isnk state\n",
led->led_no);
return ret;
}
ret = devm_led_classdev_register_ext(parent, &led->isnk,
init_data);
if (ret) {
dev_err(parent, "Couldn't register isink %d\n",
led->led_no);
return ret;
}
break;
default:
ret = mt6360_flash_init_default_state(led);
if (ret) {
dev_err(parent, "Failed to init %d flash state\n",
led->led_no);
return ret;
}
ret = devm_led_classdev_flash_register_ext(parent, &led->flash,
init_data);
if (ret) {
dev_err(parent, "Couldn't register flash %d\n",
led->led_no);
return ret;
}
mt6360_init_v4l2_flash_config(led, &v4l2_config);
led->v4l2_flash = v4l2_flash_init(parent, init_data->fwnode,
&led->flash,
&v4l2_flash_ops,
&v4l2_config);
if (IS_ERR(led->v4l2_flash)) {
dev_err(parent, "Failed to register %d v4l2 sd\n",
led->led_no);
return PTR_ERR(led->v4l2_flash);
}
}
return 0;
}