All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Jacopo Mondi <jacopo+renesas@jmondi.org>
Cc: kieran.bingham+renesas@ideasonboard.com,
	niklas.soderlund+renesas@ragnatech.se, geert@linux-m68k.org,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 19/19] media: i2c: rdacm20: Re-work ov10635 reset
Date: Sat, 20 Mar 2021 18:24:09 +0200	[thread overview]
Message-ID: <YFYhqXnxXIFJTYTM@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20210319164148.199192-20-jacopo+renesas@jmondi.org>

Hi Jacopo,

Thank you for the patch.

On Fri, Mar 19, 2021 at 05:41:48PM +0100, Jacopo Mondi wrote:
> The OV10635 image sensor embedded in the camera module is currently
> reset after the MAX9271 initialization with two long delays that were
> most probably not correctly characterized.
> 
> Re-work the image sensor reset procedure by holding the chip in reset
> during the MAX9271 configuration, removing the long sleep delays and
> only wait after the chip exits from reset for 350-500 microseconds
> interval, which is larger than the minimum (2048 * (1 / XVCLK)) timeout
> characterized in the chip manual.
> 
> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
> ---
>  drivers/media/i2c/rdacm20.c | 29 +++++++++++++++++------------
>  1 file changed, 17 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/media/i2c/rdacm20.c b/drivers/media/i2c/rdacm20.c
> index 7ed3866b5335..7ba2d0249da8 100644
> --- a/drivers/media/i2c/rdacm20.c
> +++ b/drivers/media/i2c/rdacm20.c
> @@ -454,6 +454,19 @@ static int rdacm20_init(struct v4l2_subdev *sd, unsigned int val)
>  	if (ret)
>  		return ret;
>  
> +	/*
> +	 * Hold OV10635 in reset during max9271 configuration. The reset signal
> +	 * has to be asserted for at least 200 microseconds.
> +	 */
> +	ret = max9271_enable_gpios(&dev->serializer, MAX9271_GPIO1OUT);
> +	if (ret)
> +		return ret;
> +
> +	ret = max9271_clear_gpios(&dev->serializer, MAX9271_GPIO1OUT);

enable and clear is very cnonfusing. How about mimicking the GPIO API,
with direction_input(), direction_output() and set_value() functions ?
It would also be nice if the polarity could be handled in a nicer way.
There's no GPIO request API here, but maybe a max9271_gpio_set_flags() ?

> +	if (ret)
> +		return ret;
> +	usleep_range(200, 500);
> +
>  	ret = max9271_configure_gmsl_link(&dev->serializer);
>  	if (ret)
>  		return ret;
> @@ -468,22 +481,14 @@ static int rdacm20_init(struct v4l2_subdev *sd, unsigned int val)
>  	dev->serializer.client->addr = dev->addrs[0];
>  
>  	/*
> -	 * Reset the sensor by cycling the OV10635 reset signal connected to the
> -	 * MAX9271 GPIO1 and verify communication with the OV10635.
> +	 * Release ov10635 from reset and initialize it. The image sensor
> +	 * requires at least 2048 XVCLK cycles (85 micro-seconds at 24MHz)
> +	 * before being available. Stay safe and wait up to 500 micro-seconds.
>  	 */
> -	ret = max9271_enable_gpios(&dev->serializer, MAX9271_GPIO1OUT);
> -	if (ret)
> -		return ret;
> -
> -	ret = max9271_clear_gpios(&dev->serializer, MAX9271_GPIO1OUT);
> -	if (ret)
> -		return ret;
> -	usleep_range(10000, 15000);
> -
>  	ret = max9271_set_gpios(&dev->serializer, MAX9271_GPIO1OUT);
>  	if (ret)
>  		return ret;
> -	usleep_range(10000, 15000);
> +	usleep_range(100, 500);
>  
>  	for (i = 0; i < OV10635_PID_TIMEOUT; ++i) {
>  		ret = ov10635_read16(dev, OV10635_PID);

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2021-03-20 16:25 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-19 16:41 [PATCH v3 00/19] media: gmsl: Reliability improvement Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 01/19] media: i2c: max9286: Adjust parameters indent Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 02/19] media: i2c: max9286: Rename reverse_channel_mv Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 03/19] media: i2c: max9286: Cache channel amplitude Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 04/19] media: i2c: max9286: Define high " Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 05/19] media: v4l2-subdev: De-deprecate init() subdev op Jacopo Mondi
2021-03-20 15:42   ` Laurent Pinchart
2021-03-21 20:52     ` Sakari Ailus
2021-03-22 12:51       ` Jacopo Mondi
2021-03-26 11:37         ` Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 06/19] media: gmsl: Reimplement initialization sequence Jacopo Mondi
2021-03-20 15:46   ` Laurent Pinchart
2021-03-19 16:41 ` [PATCH v3 07/19] media: i2c: max9286: Rework comments in .bound() Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 08/19] media: i2c: max9271: Check max9271_write() return Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 09/19] media: i2c: max9271: Introduce wake_up() function Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 10/19] media: i2c: rdamc21: Fix warning on u8 cast Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 11/19] media: i2c: rdacm21: Add dealy after OV490 reset Jacopo Mondi
2021-03-19 16:49   ` Kieran Bingham
2021-03-20 15:52     ` Laurent Pinchart
2021-03-26 11:22       ` Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 12/19] media: i2c: rdacm21: Fix OV10640 powerup Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 13/19] media: i2c: rdacm21: Power up OV10640 before OV490 Jacopo Mondi
2021-03-20 16:14   ` Laurent Pinchart
2021-03-26 11:07     ` Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 14/19] media: i2c: rdacm20: Enable noise immunity Jacopo Mondi
2021-03-20 16:16   ` Laurent Pinchart
2021-03-19 16:41 ` [PATCH v3 15/19] media: i2c: rdacm20: Embed 'serializer' field Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 16/19] media: i2c: rdacm20: Replace goto with a loop Jacopo Mondi
2021-03-20 16:17   ` Laurent Pinchart
2021-03-19 16:41 ` [PATCH v3 17/19] media: i2c: rdacm20: Report camera module name Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 18/19] media: i2c: rdacm20: Check return values Jacopo Mondi
2021-03-19 16:41 ` [PATCH v3 19/19] media: i2c: rdacm20: Re-work ov10635 reset Jacopo Mondi
2021-03-20 16:24   ` Laurent Pinchart [this message]
2021-03-26 11:11     ` Jacopo Mondi

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=YFYhqXnxXIFJTYTM@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=geert@linux-m68k.org \
    --cc=jacopo+renesas@jmondi.org \
    --cc=kieran.bingham+renesas@ideasonboard.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=niklas.soderlund+renesas@ragnatech.se \
    /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.