Re: [PATCH] media: i2c: adp1653: don't reuse the same node pointer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hans,

Thanks for the patch.

On Fri, Jun 09, 2023 at 11:43:14AM +0200, Hans Verkuil wrote:
> The child device_node pointer was used for two different childs.
> This confused smatch, causing this warning:
> 
> drivers/media/i2c/adp1653.c:444 adp1653_of_init() warn: missing unwind goto?
> 
> Use two different pointers, one for each child node, and add separate
> goto labels for each node as well. This also improves error logging
> since it will now state for which node the property was missing.

It would have been better to fix smatch. :-(

I guess changing the driver isn't wrong either still.

> 
> Signed-off-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx>
> ---
> diff --git a/drivers/media/i2c/adp1653.c b/drivers/media/i2c/adp1653.c
> index 98ca417b8004..04ec465aaa94 100644
> --- a/drivers/media/i2c/adp1653.c
> +++ b/drivers/media/i2c/adp1653.c
> @@ -411,43 +411,43 @@ static int adp1653_of_init(struct i2c_client *client,
>  			   struct device_node *node)
>  {
>  	struct adp1653_platform_data *pd;
> -	struct device_node *child;
> +	struct device_node *node_flash, *node_indicator;
> 
>  	pd = devm_kzalloc(&client->dev, sizeof(*pd), GFP_KERNEL);
>  	if (!pd)
>  		return -ENOMEM;
>  	flash->platform_data = pd;
> 
> -	child = of_get_child_by_name(node, "flash");
> -	if (!child)
> +	node_flash = of_get_child_by_name(node, "flash");
> +	if (!node_flash)
>  		return -EINVAL;
> 
> -	if (of_property_read_u32(child, "flash-timeout-us",
> +	if (of_property_read_u32(node_flash, "flash-timeout-us",
>  				 &pd->max_flash_timeout))
> -		goto err;
> +		goto err_flash;
> 
> -	if (of_property_read_u32(child, "flash-max-microamp",
> +	if (of_property_read_u32(node_flash, "flash-max-microamp",
>  				 &pd->max_flash_intensity))
> -		goto err;
> +		goto err_flash;
> 
>  	pd->max_flash_intensity /= 1000;
> 
> -	if (of_property_read_u32(child, "led-max-microamp",
> +	if (of_property_read_u32(node_flash, "led-max-microamp",
>  				 &pd->max_torch_intensity))
> -		goto err;
> +		goto err_flash;
> 
>  	pd->max_torch_intensity /= 1000;
> -	of_node_put(child);
> +	of_node_put(node_flash);

How about moving this to where the other node is put, and initialise the
nodes to NULL and so continue having a single error label?

> 
> -	child = of_get_child_by_name(node, "indicator");
> -	if (!child)
> +	node_indicator = of_get_child_by_name(node, "indicator");
> +	if (!node_indicator)
>  		return -EINVAL;
> 
> -	if (of_property_read_u32(child, "led-max-microamp",
> +	if (of_property_read_u32(node_indicator, "led-max-microamp",
>  				 &pd->max_indicator_intensity))
> -		goto err;
> +		goto err_indicator;
> 
> -	of_node_put(child);
> +	of_node_put(node_indicator);
> 
>  	pd->enable_gpio = devm_gpiod_get(&client->dev, "enable", GPIOD_OUT_LOW);
>  	if (IS_ERR(pd->enable_gpio)) {
> @@ -456,9 +456,13 @@ static int adp1653_of_init(struct i2c_client *client,
>  	}
> 
>  	return 0;
> -err:
> -	dev_err(&client->dev, "Required property not found\n");
> -	of_node_put(child);
> +err_flash:
> +	dev_err(&client->dev, "Required flash property not found\n");
> +	of_node_put(node_flash);
> +	return -EINVAL;
> +err_indicator:
> +	dev_err(&client->dev, "Required indicator property not found\n");
> +	of_node_put(node_indicator);
>  	return -EINVAL;
>  }
> 

-- 
Kind regards,

Sakari Ailus



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux