Re: [PATCH v2 2/2] media: staging: rkisp1: replace the call to v4l2_async_notifier_parse_fwnode_endpoints_by_port

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

 



Hi Dafna,

On Tue, Mar 17, 2020 at 10:12:22AM -0300, Helen Koike wrote:
> Hi Dafna,
> 
> On 3/12/20 12:46 PM, Dafna Hirschfeld wrote:
> > don't call 'v4l2_async_notifier_parse_fwnode_endpoints_by_port'
> > in order to register async subdevices. Instead call
> > 'v4l2_fwnode_endpoint_parse' to parse the remote endpoints
> > and then register each async subdev with
> > 'v4l2_async_notifier_add_fwnode_remote_subdev'
> > 
> > Also remove the relevant item in the TODO file
> > 
> > Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@xxxxxxxxxxxxx>
> > ---
> 
> It would be nice to have a changelog here as well.
> 
> >  drivers/staging/media/rkisp1/TODO         |  3 -
> >  drivers/staging/media/rkisp1/rkisp1-dev.c | 94 +++++++++++++----------
> >  2 files changed, 55 insertions(+), 42 deletions(-)
> > 
> > diff --git a/drivers/staging/media/rkisp1/TODO b/drivers/staging/media/rkisp1/TODO
> > index 0aa9877dd64a..1aa3bb9fd6cb 100644
> > --- a/drivers/staging/media/rkisp1/TODO
> > +++ b/drivers/staging/media/rkisp1/TODO
> > @@ -1,6 +1,3 @@
> > -* Don't use v4l2_async_notifier_parse_fwnode_endpoints_by_port().
> > -e.g. isp_parse_of_endpoints in drivers/media/platform/omap3isp/isp.c
> > -cio2_parse_firmware in drivers/media/pci/intel/ipu3/ipu3-cio2.c.
> >  * Fix pad format size for statistics and parameters entities.
> >  * Use threaded interrupt for rkisp1_stats_isr(), remove work queue.
> >  * Fix checkpatch errors.
> > diff --git a/drivers/staging/media/rkisp1/rkisp1-dev.c b/drivers/staging/media/rkisp1/rkisp1-dev.c
> > index d2186856bb24..1035a39f3e49 100644
> > --- a/drivers/staging/media/rkisp1/rkisp1-dev.c
> > +++ b/drivers/staging/media/rkisp1/rkisp1-dev.c
> > @@ -233,35 +233,6 @@ static int rkisp1_subdev_notifier_complete(struct v4l2_async_notifier *notifier)
> >  	return 0;
> >  }
> >  
> > -static int rkisp1_fwnode_parse(struct device *dev,
> > -			       struct v4l2_fwnode_endpoint *vep,
> > -			       struct v4l2_async_subdev *asd)
> > -{
> > -	struct rkisp1_sensor_async *s_asd =
> > -			container_of(asd, struct rkisp1_sensor_async, asd);
> > -
> > -	if (vep->bus_type != V4L2_MBUS_CSI2_DPHY) {
> > -		dev_err(dev, "Only CSI2 bus type is currently supported\n");
> > -		return -EINVAL;
> > -	}
> > -
> > -	if (vep->base.port != 0) {
> > -		dev_err(dev, "The ISP has only port 0\n");
> > -		return -EINVAL;
> > -	}
> > -
> > -	s_asd->mbus_type = vep->bus_type;
> > -	s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes;
> > -
> > -	/* Parallel bus is currently not supported */
> > -	s_asd->parallel_bus_flags = 0;
> > -
> > -	if (s_asd->lanes < 1 || s_asd->lanes > 4)
> > -		return -EINVAL;
> > -
> > -	return 0;
> > -}
> > -
> >  static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops = {
> >  	.bound = rkisp1_subdev_notifier_bound,
> >  	.unbind = rkisp1_subdev_notifier_unbind,
> > @@ -271,23 +242,68 @@ static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops =
> >  static int rkisp1_subdev_notifier(struct rkisp1_device *rkisp1)
> >  {
> >  	struct v4l2_async_notifier *ntf = &rkisp1->notifier;
> > -	struct device *dev = rkisp1->dev;
> > +	int next_id = 0;
> 
> This is endpoint id right?
> Maybe just change it to unsigned.
> 
> The scope says it should be u32:
> 
> struct fwnode_handle *
> fwnode_graph_get_endpoint_by_id(const struct fwnode_handle *fwnode,
> 				u32 port, u32 endpoint, unsigned long flags)
> 
> 
> >  	int ret;
> >  
> >  	v4l2_async_notifier_init(ntf);
> >  
> > -	ret = v4l2_async_notifier_parse_fwnode_endpoints_by_port(dev, ntf,
> > -					sizeof(struct rkisp1_sensor_async),
> > -					0, rkisp1_fwnode_parse);
> > -	if (ret)
> > -		return ret;
> > +	while (1) {
> > +		struct v4l2_fwnode_endpoint vep = {
> > +			.bus_type = V4L2_MBUS_CSI2_DPHY
> > +		};
> > +		struct rkisp1_sensor_async *rk_asd = NULL;
> > +		struct fwnode_handle *ep;
> >  
> > -	if (list_empty(&ntf->asd_list))
> > -		return -ENODEV;
> > +		ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(rkisp1->dev),
> > +			0, next_id, FWNODE_GRAPH_ENDPOINT_NEXT);
> >  
> 
> Please, remove this new line, so the error check is near the function which generated it.
> 
> > -	ntf->ops = &rkisp1_subdev_notifier_ops;
> > +		if (!ep)
> > +			break;
> > +
> > +		ret = v4l2_fwnode_endpoint_parse(ep, &vep);
> > +		if (ret)
> > +			goto err_parse;
> > +
> > +		rk_asd = kzalloc(sizeof(*rk_asd), GFP_KERNEL);
> > +		if (!rk_asd) {
> > +			ret = -ENOMEM;
> > +			goto err_parse;
> > +		}
> > +
> > +		rk_asd->lanes = vep.bus.mipi_csi2.num_data_lanes;
> > +		rk_asd->mbus_type = vep.bus_type;
> > +
> > +		/* Parallel bus is currently not supported */
> > +		rk_asd->parallel_bus_flags = 0;
> 
> Please see my comment in previous patch of this series.
> 
> > +		ret = v4l2_async_notifier_add_fwnode_remote_subdev(ntf, ep,
> > +								   &rk_asd->asd);
> > +		if (ret)
> > +			goto err_parse;
> > +
> > +		dev_dbg(rkisp1->dev, "registered ep id %d with %d lanes\n",
> > +			vep.base.id, rk_asd->lanes);
> > +
> > +		next_id = vep.base.id + 1;
> > +
> > +		fwnode_handle_put(ep);
> >  
> > -	return v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf);
> > +		continue;
> > +err_parse:
> > +		fwnode_handle_put(ep);
> > +		kfree(rk_asd);
> > +		v4l2_async_notifier_cleanup(ntf);
> > +		return ret;
> 
> Question:
> 
> If parsing one endpoint fails, should you:
> 
> 1) Parse all the other endpoints and ignore the one which fails?
> 2) Cleanup and free all the other endpoints?
> 
> In any case, this code is just stopping in the first one that fails and not
> cleaning up the previous one, so it is not doing any of the previous
> behaviors.
> 
> I see that ipu3-cio2.c does the same. Sakari, could you comment on this?

v4l2_async_notifier_cleanup() releases the memory allocated above so this
is fine as far as I see.

Alternatively the bad ones could be just ignored (and complained about),
but doing something drastic about such bugs usually gets the deserved
attention.

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