mbox series

[v2,0/5] media: i2c: ov5645 driver enhancements

Message ID 20221014183459.181567-1-prabhakar.mahadev-lad.rj@bp.renesas.com
Headers show
Series media: i2c: ov5645 driver enhancements | expand

Message

Lad, Prabhakar Oct. 14, 2022, 6:34 p.m. UTC
From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

Hi All,

The main aim of this series is to add PM support to the sensor driver.

I had two more patches [0] and [1] which were for ov5645, so instead
sending them separately I have clubbed them as series.

v1-> v2
- patch #1 is infact a v3 [1] no changes
- patch #2 fixed review comments pointed by Sakari
- patch #3 [0] no changes 
- patches #4 and #5 are new

[0] https://patchwork.linuxtv.org/project/linux-media/patch/20220927202005.750621-1-prabhakar.mahadev-lad.rj@bp.renesas.com/
[1] https://patchwork.linuxtv.org/project/linux-media/patch/20220919153540.178732-1-prabhakar.mahadev-lad.rj@bp.renesas.com/

Cheers,
Prabhakar

Lad Prabhakar (5):
  media: dt-bindings: ov5645: Convert OV5645 binding to a schema
  media: i2c: ov5645: Use runtime PM
  media: i2c: ov5645: Drop empty comment
  media: i2c: ov5645: Return zero for s_stream(0)
  media: i2c: ov5645: Call ov5645_entity_init_cfg() before registering
    the subdev

 .../devicetree/bindings/media/i2c/ov5645.txt  |  54 -------
 .../bindings/media/i2c/ovti,ov5645.yaml       | 104 ++++++++++++
 drivers/media/i2c/Kconfig                     |   2 +-
 drivers/media/i2c/ov5645.c                    | 151 +++++++++---------
 4 files changed, 178 insertions(+), 133 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/media/i2c/ov5645.txt
 create mode 100644 Documentation/devicetree/bindings/media/i2c/ovti,ov5645.yaml

Comments

Lad, Prabhakar Oct. 14, 2022, 9:27 p.m. UTC | #1
Hi Rob,

Thank you for the review.

On Fri, Oct 14, 2022 at 10:05 PM Rob Herring <robh+dt@kernel.org> wrote:
>
> On Fri, Oct 14, 2022 at 1:35 PM Prabhakar <prabhakar.csengg@gmail.com> wrote:
> >
> > From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> >
> > Convert the simple OV5645 Device Tree binding to json-schema.
> >
> > The previous binding marked the below properties as required which was a
> > driver requirement and not the device requirement so just drop them from
> > the required list during the conversion.
> > - clock-frequency
> > - enable-gpios
> > - reset-gpios
> >
> > Also drop the "clock-names" property as we have a single clock source for
> > the sensor and the driver has been updated to drop the clk referencing by
> > name.
>
> Driver requirements are the ABI!
>
> This breaks a kernel without the driver change and a DTB that has
> dropped the properties.
>
I already have a patch for the driver [0] which I missed to include
along with the series.

> Also, with 'clock-names' dropped, you've just introduced a bunch of
> warnings on other people's platforms. Are you going to 'fix' all of
> them?
>
Yes I will fix them, once the patch driver patch [0] is merged in.

[0] https://patchwork.kernel.org/project/linux-media/patch/20220919143350.176746-1-prabhakar.mahadev-lad.rj@bp.renesas.com/

Cheers,
Prabhakar
Laurent Pinchart Oct. 15, 2022, 5:54 a.m. UTC | #2
Hi Rob,

On Fri, Oct 14, 2022 at 04:40:29PM -0500, Rob Herring wrote:
> On Fri, Oct 14, 2022 at 10:27:53PM +0100, Lad, Prabhakar wrote:
> > On Fri, Oct 14, 2022 at 10:05 PM Rob Herring <robh+dt@kernel.org> wrote:
> > > On Fri, Oct 14, 2022 at 1:35 PM Prabhakar <prabhakar.csengg@gmail.com> wrote:
> > > >
> > > > From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> > > >
> > > > Convert the simple OV5645 Device Tree binding to json-schema.
> > > >
> > > > The previous binding marked the below properties as required which was a
> > > > driver requirement and not the device requirement so just drop them from
> > > > the required list during the conversion.
> > > > - clock-frequency
> > > > - enable-gpios
> > > > - reset-gpios
> > > >
> > > > Also drop the "clock-names" property as we have a single clock source for
> > > > the sensor and the driver has been updated to drop the clk referencing by
> > > > name.
> > >
> > > Driver requirements are the ABI!
> > >
> > > This breaks a kernel without the driver change and a DTB that has
> > > dropped the properties.
> > >
> > I already have a patch for the driver [0] which I missed to include
> > along with the series.
> 
> You completely miss the point. Read the first sentence again. Changing 
> driver requirements changes the ABI.
> 
> This breaks the ABI. The driver patch does not help that.

I'm not following you here. If the DT binding makes a mandatory property
optional, it doesn't break any existing platform. The only thing that
would not work is a new DT that doesn't contain the now optional
property combined with an older driver that makes it required. That's
not a regression, as it would be a *new* DT.

> > > Also, with 'clock-names' dropped, you've just introduced a bunch of
> > > warnings on other people's platforms. Are you going to 'fix' all of
> > > them?
> > >
> > Yes I will fix them, once the patch driver patch [0] is merged in.
> 
> Why? You are just making extra work. We have enough warnings as-is to 
> fix.

I agree that a DT binding change should patch all in-tree DTS to avoid
introducing new warnings.
Laurent Pinchart Oct. 15, 2022, 6:25 a.m. UTC | #3
Hi Prabhakar,

Thank you for the patch.

On Fri, Oct 14, 2022 at 07:34:58PM +0100, Prabhakar wrote:
> From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> 
> Always return zero while stopping the stream as the caller will ignore the
> return value.
> 
> This patch drops checking the return value of ov5645_write_reg() and
> continues further in the code path while stopping stream. The user anyway
> gets an error message in case ov5645_write_reg() fails.

Continuing all the way to pm_runtime_put() is fine, but I don't think
the function should return 0. It's not up to the driver to decide if a
failure would be useful to signal to the caller or not.

> Suggested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> ---
> v1->v2
> * New patch
> ---
>  drivers/media/i2c/ov5645.c | 11 ++++-------
>  1 file changed, 4 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c
> index a0b9d0c43b78..b3825294aaf1 100644
> --- a/drivers/media/i2c/ov5645.c
> +++ b/drivers/media/i2c/ov5645.c
> @@ -995,14 +995,11 @@ static int ov5645_s_stream(struct v4l2_subdev *subdev, int enable)
>  		if (ret < 0)
>  			goto err_rpm_put;
>  	} else {
> -		ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40);
> -		if (ret < 0)
> -			return ret;
> +		ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40);
> +
> +		ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
> +				 OV5645_SYSTEM_CTRL0_STOP);
>  
> -		ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
> -				       OV5645_SYSTEM_CTRL0_STOP);
> -		if (ret < 0)
> -			return ret;
>  		pm_runtime_put(ov5645->dev);
>  	}
>
Laurent Pinchart Oct. 15, 2022, 6:26 a.m. UTC | #4
Hi Prabhakar,

Thank you for the patch.

On Fri, Oct 14, 2022 at 07:34:59PM +0100, Prabhakar wrote:
> From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> 
> Make sure we call ov5645_entity_init_cfg() before registering the subdev
> to make sure default formats are set up.
> 
> Suggested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

If you have a few spare cycles, it would be even better to convert the
driver to the subdev active state API :-) You could then drop this call
entirely.

> ---
> v1->v2
> * New patch
> ---
>  drivers/media/i2c/ov5645.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c
> index b3825294aaf1..14bcc6e42dd2 100644
> --- a/drivers/media/i2c/ov5645.c
> +++ b/drivers/media/i2c/ov5645.c
> @@ -1212,6 +1212,8 @@ static int ov5645_probe(struct i2c_client *client)
>  		goto err_pm_runtime;
>  	}
>  
> +	ov5645_entity_init_cfg(&ov5645->sd, NULL);
> +
>  	ret = v4l2_async_register_subdev(&ov5645->sd);
>  	if (ret < 0) {
>  		dev_err(dev, "could not register v4l2 device\n");
> @@ -1224,8 +1226,6 @@ static int ov5645_probe(struct i2c_client *client)
>  	pm_runtime_use_autosuspend(dev);
>  	pm_runtime_put_autosuspend(dev);
>  
> -	ov5645_entity_init_cfg(&ov5645->sd, NULL);
> -
>  	return 0;
>  
>  err_pm_runtime:
Krzysztof Kozlowski Oct. 15, 2022, 1:17 p.m. UTC | #5
On 15/10/2022 01:54, Laurent Pinchart wrote:
> Hi Rob,
> 
> On Fri, Oct 14, 2022 at 04:40:29PM -0500, Rob Herring wrote:
>> On Fri, Oct 14, 2022 at 10:27:53PM +0100, Lad, Prabhakar wrote:
>>> On Fri, Oct 14, 2022 at 10:05 PM Rob Herring <robh+dt@kernel.org> wrote:
>>>> On Fri, Oct 14, 2022 at 1:35 PM Prabhakar <prabhakar.csengg@gmail.com> wrote:
>>>>>
>>>>> From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
>>>>>
>>>>> Convert the simple OV5645 Device Tree binding to json-schema.
>>>>>
>>>>> The previous binding marked the below properties as required which was a
>>>>> driver requirement and not the device requirement so just drop them from
>>>>> the required list during the conversion.
>>>>> - clock-frequency
>>>>> - enable-gpios
>>>>> - reset-gpios
>>>>>
>>>>> Also drop the "clock-names" property as we have a single clock source for
>>>>> the sensor and the driver has been updated to drop the clk referencing by
>>>>> name.
>>>>
>>>> Driver requirements are the ABI!
>>>>
>>>> This breaks a kernel without the driver change and a DTB that has
>>>> dropped the properties.
>>>>
>>> I already have a patch for the driver [0] which I missed to include
>>> along with the series.
>>
>> You completely miss the point. Read the first sentence again. Changing 
>> driver requirements changes the ABI.
>>
>> This breaks the ABI. The driver patch does not help that.
> 
> I'm not following you here. If the DT binding makes a mandatory property
> optional, it doesn't break any existing platform. The only thing that
> would not work is a new DT that doesn't contain the now optional
> property combined with an older driver that makes it required. That's
> not a regression, as it would be a *new* DT.

You're right although in-tree DTS are now not compatible with older
kernels. So it is not only about new DTS, it is about our kernel DTS
which requires new kernel to work.

DTS are exported and used by other systems, thus if someone blindly
takes this new DTS without clock-names, his kernel/OS/bootloader might
stop working.

That is however a more relaxed requirement than kernel ABI against old DTS.

> 
>>>> Also, with 'clock-names' dropped, you've just introduced a bunch of
>>>> warnings on other people's platforms. Are you going to 'fix' all of
>>>> them?
>>>>
>>> Yes I will fix them, once the patch driver patch [0] is merged in.
>>
>> Why? You are just making extra work. We have enough warnings as-is to 
>> fix.
> 
> I agree that a DT binding change should patch all in-tree DTS to avoid
> introducing new warnings.

Yes.

Best regards,
Krzysztof
Sakari Ailus Oct. 15, 2022, 9:35 p.m. UTC | #6
Hi Laurent,

On Sat, Oct 15, 2022 at 09:25:37AM +0300, Laurent Pinchart wrote:
> Hi Prabhakar,
> 
> Thank you for the patch.
> 
> On Fri, Oct 14, 2022 at 07:34:58PM +0100, Prabhakar wrote:
> > From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> > 
> > Always return zero while stopping the stream as the caller will ignore the
> > return value.
> > 
> > This patch drops checking the return value of ov5645_write_reg() and
> > continues further in the code path while stopping stream. The user anyway
> > gets an error message in case ov5645_write_reg() fails.
> 
> Continuing all the way to pm_runtime_put() is fine, but I don't think
> the function should return 0. It's not up to the driver to decide if a
> failure would be useful to signal to the caller or not.

If the function returns an error when disabling streaming, what is the
expected power state of the device after this?

The contract between the caller and the callee is that the state is not
changed if there is an error. This is a special case as very few callers
check the return value for streamoff operation and those that do generally
just print something. I've never seen a caller trying to prevent streaming
off in this case, for instance.

Of course we could document that streaming off always counts as succeeded
(e.g. decreasing device's runtime PM usage_count) while it could return an
informational error code. But I wonder if anyone would ever benefit from
that somehow. :-)

> 
> > Suggested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> > ---
> > v1->v2
> > * New patch
> > ---
> >  drivers/media/i2c/ov5645.c | 11 ++++-------
> >  1 file changed, 4 insertions(+), 7 deletions(-)
> > 
> > diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c
> > index a0b9d0c43b78..b3825294aaf1 100644
> > --- a/drivers/media/i2c/ov5645.c
> > +++ b/drivers/media/i2c/ov5645.c
> > @@ -995,14 +995,11 @@ static int ov5645_s_stream(struct v4l2_subdev *subdev, int enable)
> >  		if (ret < 0)
> >  			goto err_rpm_put;
> >  	} else {
> > -		ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40);
> > -		if (ret < 0)
> > -			return ret;
> > +		ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40);
> > +
> > +		ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
> > +				 OV5645_SYSTEM_CTRL0_STOP);
> >  
> > -		ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
> > -				       OV5645_SYSTEM_CTRL0_STOP);
> > -		if (ret < 0)
> > -			return ret;
> >  		pm_runtime_put(ov5645->dev);
> >  	}
> >  
>
Laurent Pinchart Oct. 15, 2022, 11:23 p.m. UTC | #7
Hi Sakari,

On Sat, Oct 15, 2022 at 09:35:12PM +0000, Sakari Ailus wrote:
> On Sat, Oct 15, 2022 at 09:25:37AM +0300, Laurent Pinchart wrote:
> > On Fri, Oct 14, 2022 at 07:34:58PM +0100, Prabhakar wrote:
> > > From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> > > 
> > > Always return zero while stopping the stream as the caller will ignore the
> > > return value.
> > > 
> > > This patch drops checking the return value of ov5645_write_reg() and
> > > continues further in the code path while stopping stream. The user anyway
> > > gets an error message in case ov5645_write_reg() fails.
> > 
> > Continuing all the way to pm_runtime_put() is fine, but I don't think
> > the function should return 0. It's not up to the driver to decide if a
> > failure would be useful to signal to the caller or not.
> 
> If the function returns an error when disabling streaming, what is the
> expected power state of the device after this?

That's up to us to decide :-)

> The contract between the caller and the callee is that the state is not
> changed if there is an error.

For most APIs, but that's not universal.

> This is a special case as very few callers
> check the return value for streamoff operation and those that do generally
> just print something. I've never seen a caller trying to prevent streaming
> off in this case, for instance.

I think the stream off call should proceed and try to power off the
device even if an error occurs along the way, i.e. it shouldn't return
upon the first detected error.

> Of course we could document that streaming off always counts as succeeded
> (e.g. decreasing device's runtime PM usage_count) while it could return an
> informational error code. But I wonder if anyone would ever benefit from
> that somehow. :-)

I think it could be useful to propagate errors up to inform the user
that something wrong happened. That would involve fixing lots of drivers
along the call chain though, so there's no urgency for the ov5645 to do
so, but isn't it better to propagate the error code instead of hiding
the issue ?

> > > Suggested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > > Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> > > ---
> > > v1->v2
> > > * New patch
> > > ---
> > >  drivers/media/i2c/ov5645.c | 11 ++++-------
> > >  1 file changed, 4 insertions(+), 7 deletions(-)
> > > 
> > > diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c
> > > index a0b9d0c43b78..b3825294aaf1 100644
> > > --- a/drivers/media/i2c/ov5645.c
> > > +++ b/drivers/media/i2c/ov5645.c
> > > @@ -995,14 +995,11 @@ static int ov5645_s_stream(struct v4l2_subdev *subdev, int enable)
> > >  		if (ret < 0)
> > >  			goto err_rpm_put;
> > >  	} else {
> > > -		ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40);
> > > -		if (ret < 0)
> > > -			return ret;
> > > +		ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40);
> > > +
> > > +		ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
> > > +				 OV5645_SYSTEM_CTRL0_STOP);
> > >  
> > > -		ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
> > > -				       OV5645_SYSTEM_CTRL0_STOP);
> > > -		if (ret < 0)
> > > -			return ret;
> > >  		pm_runtime_put(ov5645->dev);
> > >  	}
> > >
Laurent Pinchart Oct. 16, 2022, 9:03 p.m. UTC | #8
Hi Sakari,

On Sun, Oct 16, 2022 at 08:19:40PM +0000, Sakari Ailus wrote:
> On Sun, Oct 16, 2022 at 02:23:13AM +0300, Laurent Pinchart wrote:
> > On Sat, Oct 15, 2022 at 09:35:12PM +0000, Sakari Ailus wrote:
> > > On Sat, Oct 15, 2022 at 09:25:37AM +0300, Laurent Pinchart wrote:
> > > > On Fri, Oct 14, 2022 at 07:34:58PM +0100, Prabhakar wrote:
> > > > > From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> > > > > 
> > > > > Always return zero while stopping the stream as the caller will ignore the
> > > > > return value.
> > > > > 
> > > > > This patch drops checking the return value of ov5645_write_reg() and
> > > > > continues further in the code path while stopping stream. The user anyway
> > > > > gets an error message in case ov5645_write_reg() fails.
> > > > 
> > > > Continuing all the way to pm_runtime_put() is fine, but I don't think
> > > > the function should return 0. It's not up to the driver to decide if a
> > > > failure would be useful to signal to the caller or not.
> > > 
> > > If the function returns an error when disabling streaming, what is the
> > > expected power state of the device after this?
> > 
> > That's up to us to decide :-)
> > 
> > > The contract between the caller and the callee is that the state is not
> > > changed if there is an error.
> > 
> > For most APIs, but that's not universal.
> > 
> > > This is a special case as very few callers
> > > check the return value for streamoff operation and those that do generally
> > > just print something. I've never seen a caller trying to prevent streaming
> > > off in this case, for instance.
> > 
> > I think the stream off call should proceed and try to power off the
> > device even if an error occurs along the way, i.e. it shouldn't return
> > upon the first detected error.
> > 
> > > Of course we could document that streaming off always counts as succeeded
> > > (e.g. decreasing device's runtime PM usage_count) while it could return an
> > > informational error code. But I wonder if anyone would ever benefit from
> > > that somehow. :-)
> > 
> > I think it could be useful to propagate errors up to inform the user
> > that something wrong happened. That would involve fixing lots of drivers
> > along the call chain though, so there's no urgency for the ov5645 to do
> > so, but isn't it better to propagate the error code instead of hiding
> > the issue ?
> 
> I also don't think hiding the issue would be the best thing to do, but that
> wouldn't likely be a big problem either.
> 
> How about printing a warning in the wrapper while returning zero to the
> original caller? This would keep the API intact while still leaving a trace
> on something failing. Of course the driver is also free to print whatever
> messages it likes.

While I think error propagation could be more useful in the long run,
printing a message in the wrapper is a good idea. I like centralized
error handling, it has a tendency to go wrong when left to individual
drivers.
Lad, Prabhakar Oct. 26, 2022, 11:59 a.m. UTC | #9
Hi Laurent,

Thank you for the review.

On Sat, Oct 15, 2022 at 7:26 AM Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> Hi Prabhakar,
>
> Thank you for the patch.
>
> On Fri, Oct 14, 2022 at 07:34:59PM +0100, Prabhakar wrote:
> > From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> >
> > Make sure we call ov5645_entity_init_cfg() before registering the subdev
> > to make sure default formats are set up.
> >
> > Suggested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>
> If you have a few spare cycles, it would be even better to convert the
> driver to the subdev active state API :-) You could then drop this call
> entirely.
>
For v3 I did think of it, but it looks like I'll need to spend more
time on the subdev state for this driver (as this driver does cropping
which makes use of TRY/ACTIVE). So for v3 I'll keep this patch as and
will work on the subdev state switch in parallel and post when
complete. (Its just I dont want to miss the v6.2 window for RZ/G2L CRU
driver ;-))

Cheers,
Prabhakar