All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Stein <alexander.stein@ew.tq-group.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: linux-media@vger.kernel.org, Sakari Ailus <sakari.ailus@iki.fi>,
	Manivannan Sadhasivam <mani@kernel.org>,
	Dave Stevenson <dave.stevenson@raspberrypi.com>
Subject: Re: [PATCH v2 08/17] media: i2c: imx290: Factor out DT parsing to separate function
Date: Mon, 16 Jan 2023 12:19:06 +0100	[thread overview]
Message-ID: <22935401.6Emhk5qWAg@steina-w> (raw)
In-Reply-To: <Y8UrfCfELkwfJX/4@pendragon.ideasonboard.com>

Hi Laurent,

Am Montag, 16. Januar 2023, 11:48:28 CET schrieb Laurent Pinchart:
> Hi Alexander,
> 
> On Mon, Jan 16, 2023 at 11:33:47AM +0100, Alexander Stein wrote:
> > Am Samstag, 14. Januar 2023, 18:17:53 CET schrieb Laurent Pinchart:
> > > Make the probe() function more readable by factoring out the DT parsing
> > > code to a separate function. No functional change intended.
> > > 
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > ---
> > > 
> > >  drivers/media/i2c/imx290.c | 95 +++++++++++++++++++++-----------------
> > >  1 file changed, 52 insertions(+), 43 deletions(-)
> > > 
> > > diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c
> > > index 0dc536893ebf..18c1e5c429a2 100644
> > > --- a/drivers/media/i2c/imx290.c
> > > +++ b/drivers/media/i2c/imx290.c
> > > @@ -1144,111 +1144,124 @@ static s64 imx290_check_link_freqs(const
> > > struct
> > > imx290 *imx290, return 0;
> > > 
> > >  }
> > > 
> > > -static int imx290_probe(struct i2c_client *client)
> > > +static int imx290_parse_dt(struct imx290 *imx290)
> > > 
> > >  {
> > > 
> > > -	struct device *dev = &client->dev;
> > > -	struct fwnode_handle *endpoint;
> > > 
> > >  	/* Only CSI2 is supported for now: */
> > >  	struct v4l2_fwnode_endpoint ep = {
> > >  	
> > >  		.bus_type = V4L2_MBUS_CSI2_DPHY
> > >  	
> > >  	};
> > > 
> > > -	struct imx290 *imx290;
> > > -	u32 xclk_freq;
> > > +	struct fwnode_handle *endpoint;
> > > +	int ret;
> > > 
> > >  	s64 fq;
> > > 
> > > -	int ret;
> > > 
> > > -	imx290 = devm_kzalloc(dev, sizeof(*imx290), GFP_KERNEL);
> > > -	if (!imx290)
> > > -		return -ENOMEM;
> > > -
> > > -	imx290->dev = dev;
> > > -	imx290->regmap = devm_regmap_init_i2c(client, 
&imx290_regmap_config);
> > > -	if (IS_ERR(imx290->regmap)) {
> > > -		dev_err(dev, "Unable to initialize I2C\n");
> > > -		return -ENODEV;
> > > -	}
> > > -
> > > -	endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(dev), NULL);
> > > +	endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(imx290->dev),
> > > NULL);
> > > 
> > >  	if (!endpoint) {
> > > 
> > > -		dev_err(dev, "Endpoint node not found\n");
> > > +		dev_err(imx290->dev, "Endpoint node not found\n");
> > > 
> > >  		return -EINVAL;
> > >  	
> > >  	}
> > >  	
> > >  	ret = v4l2_fwnode_endpoint_alloc_parse(endpoint, &ep);
> > >  	fwnode_handle_put(endpoint);
> > >  	if (ret == -ENXIO) {
> > > 
> > > -		dev_err(dev, "Unsupported bus type, should be CSI2\n");
> > > -		goto err_endpoint;
> > > +		dev_err(imx290->dev, "Unsupported bus type, should be 
CSI2\n");
> > > +		goto done;
> > > 
> > >  	} else if (ret) {
> > > 
> > > -		dev_err(dev, "Parsing endpoint node failed\n");
> > > -		goto err_endpoint;
> > > +		dev_err(imx290->dev, "Parsing endpoint node failed\n");
> > > +		goto done;
> > > 
> > >  	}
> > >  	
> > >  	/* Get number of data lanes */
> > >  	imx290->nlanes = ep.bus.mipi_csi2.num_data_lanes;
> > >  	if (imx290->nlanes != 2 && imx290->nlanes != 4) {
> > > 
> > > -		dev_err(dev, "Invalid data lanes: %d\n", imx290->nlanes);
> > > +		dev_err(imx290->dev, "Invalid data lanes: %d\n", imx290-
> > >
> > >nlanes);
> > >
> > >  		ret = -EINVAL;
> > > 
> > > -		goto err_endpoint;
> > > +		goto done;
> > > 
> > >  	}
> > > 
> > > -	dev_dbg(dev, "Using %u data lanes\n", imx290->nlanes);
> > > +	dev_dbg(imx290->dev, "Using %u data lanes\n", imx290->nlanes);
> > > 
> > >  	if (!ep.nr_of_link_frequencies) {
> > > 
> > > -		dev_err(dev, "link-frequency property not found in DT\n");
> > > +		dev_err(imx290->dev, "link-frequency property not found in 
DT\n");
> > > 
> > >  		ret = -EINVAL;
> > > 
> > > -		goto err_endpoint;
> > > +		goto done;
> > > 
> > >  	}
> > >  	
> > >  	/* Check that link frequences for all the modes are in device tree 
*/
> > >  	fq = imx290_check_link_freqs(imx290, &ep);
> > >  	if (fq) {
> > > 
> > > -		dev_err(dev, "Link frequency of %lld is not supported\n", 
fq);
> > > +		dev_err(imx290->dev, "Link frequency of %lld is not 
supported\n",
> > > +			fq);
> > > 
> > >  		ret = -EINVAL;
> > > 
> > > -		goto err_endpoint;
> > > +		goto done;
> > > 
> > >  	}
> > > 
> > > +	ret = 0;
> > > +
> > > +done:
> > > +	v4l2_fwnode_endpoint_free(&ep);
> > > +	return ret;
> > > +}
> > > +
> > > +static int imx290_probe(struct i2c_client *client)
> > > +{
> > > +	struct device *dev = &client->dev;
> > > +	struct imx290 *imx290;
> > > +	u32 xclk_freq;
> > > +	int ret;
> > > +
> > > +	imx290 = devm_kzalloc(dev, sizeof(*imx290), GFP_KERNEL);
> > > +	if (!imx290)
> > > +		return -ENOMEM;
> > > +
> > > +	imx290->dev = dev;
> > > +	imx290->regmap = devm_regmap_init_i2c(client, 
&imx290_regmap_config);
> > > +	if (IS_ERR(imx290->regmap)) {
> > > +		dev_err(dev, "Unable to initialize I2C\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	ret = imx290_parse_dt(imx290);
> > > +	if (ret)
> > > +		return ret;
> > > +
> > > 
> > >  	/* get system clock (xclk) */
> > >  	imx290->xclk = devm_clk_get(dev, "xclk");
> > >  	if (IS_ERR(imx290->xclk)) {
> > >  	
> > >  		dev_err(dev, "Could not get xclk");
> > > 
> > > -		ret = PTR_ERR(imx290->xclk);
> > > -		goto err_endpoint;
> > > +		return PTR_ERR(imx290->xclk);
> > 
> > Please use dev_err_probe() here.
> 
> It's done in the next patch in this series, which converts the driver to
> dev_err_probe(). This patch only factors out code.

I just noticed :-/
Reviewed-by: Alexander Stein <alexander.stein@ew.tq-group.com>

> > >  	}
> > >  	
> > >  	ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
> > >  	
> > >  				       &xclk_freq);
> > >  	
> > >  	if (ret) {
> > >  	
> > >  		dev_err(dev, "Could not get xclk frequency\n");
> > > 
> > > -		goto err_endpoint;
> > > +		return ret;
> > > 
> > >  	}
> > >  	
> > >  	/* external clock must be 37.125 MHz */
> > >  	if (xclk_freq != 37125000) {
> > >  	
> > >  		dev_err(dev, "External clock frequency %u is not 
supported\n",
> > >  		
> > >  			xclk_freq);
> > > 
> > > -		ret = -EINVAL;
> > > -		goto err_endpoint;
> > > +		return -EINVAL;
> > > 
> > >  	}
> > >  	
> > >  	ret = clk_set_rate(imx290->xclk, xclk_freq);
> > >  	if (ret) {
> > >  	
> > >  		dev_err(dev, "Could not set xclk frequency\n");
> > > 
> > > -		goto err_endpoint;
> > > +		return ret;
> > > 
> > >  	}
> > >  	
> > >  	ret = imx290_get_regulators(dev, imx290);
> > >  	if (ret < 0) {
> > >  	
> > >  		dev_err(dev, "Cannot get regulators\n");
> > > 
> > > -		goto err_endpoint;
> > > +		return ret;
> > 
> > Please use dev_err_probe() here.
> > 
> > >  	}
> > >  	
> > >  	imx290->rst_gpio = devm_gpiod_get_optional(dev, "reset",
> > >  	
> > >  						   
GPIOD_OUT_HIGH);
> > >  	
> > >  	if (IS_ERR(imx290->rst_gpio)) {
> > >  	
> > >  		dev_err(dev, "Cannot get reset gpio\n");
> > > 
> > > -		ret = PTR_ERR(imx290->rst_gpio);
> > > -		goto err_endpoint;
> > > +		return PTR_ERR(imx290->rst_gpio);
> > > 
> > >  	}
> > >  	
> > >  	mutex_init(&imx290->lock);
> > > 
> > > @@ -1274,16 +1287,12 @@ static int imx290_probe(struct i2c_client
> > > *client)
> > > 
> > >  	pm_runtime_enable(dev);
> > >  	pm_runtime_idle(dev);
> > > 
> > > -	v4l2_fwnode_endpoint_free(&ep);
> > > -
> > > 
> > >  	return 0;
> > >  
> > >  err_subdev:
> > >  	imx290_subdev_cleanup(imx290);
> > >  
> > >  err_mutex:
> > >  	mutex_destroy(&imx290->lock);
> > > 
> > > -err_endpoint:
> > > -	v4l2_fwnode_endpoint_free(&ep);
> > > 
> > >  	return ret;
> > >  
> > >  }





  reply	other threads:[~2023-01-16 11:19 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-14 17:17 [PATCH v2 00/17] media: i2c: imx290: Miscellaneous improvements Laurent Pinchart
2023-01-14 17:17 ` [PATCH v2 01/17] media: i2c: imx290: Group functions in sections Laurent Pinchart
2023-01-14 17:17   ` [PATCH v2 02/17] media: i2c: imx290: Factor out subdev init and cleanup to functions Laurent Pinchart
2023-01-16  8:09     ` Alexander Stein
2023-01-14 17:17   ` [PATCH v2 03/17] media: i2c: imx290: Factor out control update code to a function Laurent Pinchart
2023-01-16  9:20     ` Alexander Stein
2023-01-14 17:17   ` [PATCH v2 04/17] media: i2c: imx290: Access link_freq_index directly Laurent Pinchart
2023-01-14 17:17   ` [PATCH v2 05/17] media: i2c: imx290: Pass format and mode to imx290_calc_pixel_rate() Laurent Pinchart
2023-01-16 10:22     ` Alexander Stein
2023-01-16 10:52       ` Laurent Pinchart
2023-01-14 17:17   ` [PATCH v2 06/17] media: i2c: imx290: Compute pixel rate and blanking in one place Laurent Pinchart
2023-01-14 17:17   ` [PATCH v2 07/17] media: i2c: imx290: Factor out black level setting to a function Laurent Pinchart
2023-01-14 17:17   ` [PATCH v2 08/17] media: i2c: imx290: Factor out DT parsing to separate function Laurent Pinchart
2023-01-16 10:33     ` Alexander Stein
2023-01-16 10:48       ` Laurent Pinchart
2023-01-16 11:19         ` Alexander Stein [this message]
2023-01-14 17:17   ` [PATCH v2 09/17] media: i2c: imx290: Use dev_err_probe() Laurent Pinchart
2023-01-14 17:17   ` [PATCH v2 10/17] media: i2c: imx290: Factor out clock initialization to separate function Laurent Pinchart
2023-01-14 17:17   ` [PATCH v2 11/17] media: i2c: imx290: Use V4L2 subdev active state Laurent Pinchart
2023-01-16 11:04     ` Alexander Stein
2023-01-16 11:58       ` Laurent Pinchart
2023-01-16 14:07         ` Laurent Pinchart
2023-01-14 17:17   ` [PATCH v2 12/17] media: i2c: imx290: Rename, extend and expand usage of imx290_pixfmt Laurent Pinchart
2023-01-14 17:17   ` [PATCH v2 13/17] media: i2c: imx290: Use runtime PM autosuspend Laurent Pinchart
2023-01-16 11:11     ` Alexander Stein
2023-01-14 17:17   ` [PATCH v2 14/17] media: i2c: imx290: Initialize runtime PM before subdev Laurent Pinchart
2023-01-16 11:14     ` Alexander Stein
2023-01-16 11:49       ` Laurent Pinchart
2023-01-16 12:29         ` Alexander Stein
2023-01-14 17:18   ` [PATCH v2 15/17] media: i2c: imx290: Configure data lanes at start time Laurent Pinchart
2023-01-14 17:18   ` [PATCH v2 16/17] media: i2c: imx290: Simplify imx290_set_data_lanes() Laurent Pinchart
2023-01-16 11:16     ` Alexander Stein
2023-01-14 17:18   ` [PATCH v2 17/17] media: i2c: imx290: Handle error from imx290_set_data_lanes() Laurent Pinchart
2023-01-16 11:17     ` Alexander Stein

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=22935401.6Emhk5qWAg@steina-w \
    --to=alexander.stein@ew.tq-group.com \
    --cc=dave.stevenson@raspberrypi.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=mani@kernel.org \
    --cc=sakari.ailus@iki.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.