in flash/leds-sgm3140.c [182:279]
static int sgm3140_probe(struct platform_device *pdev)
{
struct sgm3140 *priv;
struct led_classdev *led_cdev;
struct led_classdev_flash *fled_cdev;
struct led_init_data init_data = {};
struct fwnode_handle *child_node;
struct v4l2_flash_config v4l2_sd_cfg = {};
int ret;
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
priv->flash_gpio = devm_gpiod_get(&pdev->dev, "flash", GPIOD_OUT_LOW);
ret = PTR_ERR_OR_ZERO(priv->flash_gpio);
if (ret)
return dev_err_probe(&pdev->dev, ret,
"Failed to request flash gpio\n");
priv->enable_gpio = devm_gpiod_get(&pdev->dev, "enable", GPIOD_OUT_LOW);
ret = PTR_ERR_OR_ZERO(priv->enable_gpio);
if (ret)
return dev_err_probe(&pdev->dev, ret,
"Failed to request enable gpio\n");
priv->vin_regulator = devm_regulator_get(&pdev->dev, "vin");
ret = PTR_ERR_OR_ZERO(priv->vin_regulator);
if (ret)
return dev_err_probe(&pdev->dev, ret,
"Failed to request regulator\n");
child_node = fwnode_get_next_available_child_node(pdev->dev.fwnode,
NULL);
if (!child_node) {
dev_err(&pdev->dev,
"No fwnode child node found for connected LED.\n");
return -EINVAL;
}
ret = fwnode_property_read_u32(child_node, "flash-max-timeout-us",
&priv->max_timeout);
if (ret) {
priv->max_timeout = FLASH_MAX_TIMEOUT_DEFAULT;
dev_warn(&pdev->dev,
"flash-max-timeout-us property missing\n");
}
/*
* Set default timeout to FLASH_DEFAULT_TIMEOUT except if max_timeout
* from DT is lower.
*/
priv->timeout = min(priv->max_timeout, FLASH_TIMEOUT_DEFAULT);
timer_setup(&priv->powerdown_timer, sgm3140_powerdown_timer, 0);
fled_cdev = &priv->fled_cdev;
led_cdev = &fled_cdev->led_cdev;
fled_cdev->ops = &sgm3140_flash_ops;
led_cdev->brightness_set_blocking = sgm3140_brightness_set;
led_cdev->max_brightness = LED_ON;
led_cdev->flags |= LED_DEV_CAP_FLASH;
sgm3140_init_flash_timeout(priv);
init_data.fwnode = child_node;
platform_set_drvdata(pdev, priv);
/* Register in the LED subsystem */
ret = devm_led_classdev_flash_register_ext(&pdev->dev,
fled_cdev, &init_data);
if (ret) {
dev_err(&pdev->dev, "Failed to register flash device: %d\n",
ret);
goto err;
}
sgm3140_init_v4l2_flash_config(priv, &v4l2_sd_cfg);
/* Create V4L2 Flash subdev */
priv->v4l2_flash = v4l2_flash_init(&pdev->dev,
child_node,
fled_cdev, NULL,
&v4l2_sd_cfg);
if (IS_ERR(priv->v4l2_flash)) {
ret = PTR_ERR(priv->v4l2_flash);
goto err;
}
return ret;
err:
fwnode_handle_put(child_node);
return ret;
}