From: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
To: Jacopo Mondi <jacopo+renesas@jmondi.org>,
Hans Verkuil <hverkuil-cisco@xs4all.nl>,
laurent.pinchart+renesas@ideasonboard.com,
niklas.soderlund+renesas@ragnatech.se, geert@linux-m68k.org
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>,
linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
linux-kernel@vger.kernel.org,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Subject: Re: [PATCH v5 10/15] media: i2c: rdacm21: Power up OV10640 before OV490
Date: Thu, 17 Jun 2021 00:47:35 +0100 [thread overview]
Message-ID: <75213041-b4d3-2760-6b21-460ca7885574@ideasonboard.com> (raw)
In-Reply-To: <20210616124616.49249-11-jacopo+renesas@jmondi.org>
Hi Jacopo,
Hrm - this seems to be the only one in this series without my RB tag, so
lets take a look.
On 16/06/2021 13:46, Jacopo Mondi wrote:
> The current RDACM21 initialization routine powers up the OV10640 image
> sensor after the OV490 ISP. The ISP is programmed with a firmare loaded
s/firmare/firmware/
> from an embedded serial flash that (most probably) tries to interact and
> program also the image sensor connected to the ISP.
>
> As described in commit "media: i2c: rdacm21: Fix OV10640 powerup" the
> image sensor powerdown signal is kept high by an internal pull up
> resistor and occasionally fails to startup correctly if the powerdown
> line is not asserted explicitely. Failures in the OV10640 startup causes
s/explicitely/explicitly/
> the OV490 firmware to fail to boot correctly resulting in the camera
> module initialization to fail consequentially.
>
> Fix this by powering up the OV10640 image sensor before testing the
> OV490 firmware boot completion, by splitting the ov10640_initialize()
> function in an ov10640_power_up() one and an ov10640_check_id() one.
>
> Also make sure the OV10640 identification procedure gives enough time to
> the image sensor to resume after the programming phase performed by the
> OV490 firmware by repeating the ID read procedure.
>
> This commit fixes a sporadic start-up error triggered by a failure to
> detect the OV490 firmware boot completion:
> rdacm21 8-0054: Timeout waiting for firmware boot
>
> Fixes: a59f853b3b4b ("media: i2c: Add driver for RDACM21 camera module")
> Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> drivers/media/i2c/rdacm21.c | 46 ++++++++++++++++++++++++++-----------
> 1 file changed, 32 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/media/i2c/rdacm21.c b/drivers/media/i2c/rdacm21.c
> index 7c0a4a84340a..43c41cb800a4 100644
> --- a/drivers/media/i2c/rdacm21.c
> +++ b/drivers/media/i2c/rdacm21.c
> @@ -69,6 +69,7 @@
> #define OV490_ISP_VSIZE_LOW 0x80820062
> #define OV490_ISP_VSIZE_HIGH 0x80820063
>
> +#define OV10640_PID_TIMEOUT 20
> #define OV10640_ID_HIGH 0xa6
> #define OV10640_CHIP_ID 0x300a
> #define OV10640_PIXEL_RATE 55000000
> @@ -329,10 +330,8 @@ static const struct v4l2_subdev_ops rdacm21_subdev_ops = {
> .pad = &rdacm21_subdev_pad_ops,
> };
>
> -static int ov10640_initialize(struct rdacm21_device *dev)
> +static void ov10640_power_up(struct rdacm21_device *dev)
> {
> - u8 val;
> -
> /* Enable GPIO0#0 (reset) and GPIO1#0 (pwdn) as output lines. */
> ov490_write_reg(dev, OV490_GPIO_SEL0, OV490_GPIO0);
> ov490_write_reg(dev, OV490_GPIO_SEL1, OV490_SPWDN0);
> @@ -347,18 +346,35 @@ static int ov10640_initialize(struct rdacm21_device *dev)
> usleep_range(1500, 3000);
> ov490_write_reg(dev, OV490_GPIO_OUTPUT_VALUE0, OV490_GPIO0);
> usleep_range(3000, 5000);
> +}
>
> - /* Read OV10640 ID to test communications. */
> - ov490_write_reg(dev, OV490_SCCB_SLAVE0_DIR, OV490_SCCB_SLAVE_READ);
> - ov490_write_reg(dev, OV490_SCCB_SLAVE0_ADDR_HIGH, OV10640_CHIP_ID >> 8);
> - ov490_write_reg(dev, OV490_SCCB_SLAVE0_ADDR_LOW, OV10640_CHIP_ID & 0xff);
> -
> - /* Trigger SCCB slave transaction and give it some time to complete. */
> - ov490_write_reg(dev, OV490_HOST_CMD, OV490_HOST_CMD_TRIGGER);
> - usleep_range(1000, 1500);
> +static int ov10640_check_id(struct rdacm21_device *dev)
> +{
> + unsigned int i;
> + u8 val;
>
> - ov490_read_reg(dev, OV490_SCCB_SLAVE0_DIR, &val);
> - if (val != OV10640_ID_HIGH) {
> + /* Read OV10640 ID to test communications. */
> + for (i = 0; i < OV10640_PID_TIMEOUT; ++i) {
> + ov490_write_reg(dev, OV490_SCCB_SLAVE0_DIR,
> + OV490_SCCB_SLAVE_READ);
> + ov490_write_reg(dev, OV490_SCCB_SLAVE0_ADDR_HIGH,
> + OV10640_CHIP_ID >> 8);
> + ov490_write_reg(dev, OV490_SCCB_SLAVE0_ADDR_LOW,
> + OV10640_CHIP_ID & 0xff);
> +
> + /*
> + * Trigger SCCB slave transaction and give it some time
> + * to complete.
> + */
> + ov490_write_reg(dev, OV490_HOST_CMD, OV490_HOST_CMD_TRIGGER);
> + usleep_range(1000, 1500);
> +
> + ov490_read_reg(dev, OV490_SCCB_SLAVE0_DIR, &val);
> + if (val == OV10640_ID_HIGH)
> + break;
> + usleep_range(1000, 1500);
> + }
> + if (i == OV10640_PID_TIMEOUT) {
> dev_err(dev->dev, "OV10640 ID mismatch: (0x%02x)\n", val);
> return -ENODEV;
> }
> @@ -374,6 +390,8 @@ static int ov490_initialize(struct rdacm21_device *dev)
> unsigned int i;
> int ret;
>
> + ov10640_power_up(dev);
> +
> /*
> * Read OV490 Id to test communications. Give it up to 40msec to
> * exit from reset.
> @@ -411,7 +429,7 @@ static int ov490_initialize(struct rdacm21_device *dev)
> return -ENODEV;
> }
>
> - ret = ov10640_initialize(dev);
> + ret = ov10640_check_id(dev);
> if (ret)
> return ret;
>
>
next prev parent reply other threads:[~2021-06-16 23:47 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-16 12:46 [PATCH v5 00/15] media: gmsl: Reliability improvements Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 01/15] media: i2c: max9286: Adjust parameters indent Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 02/15] media: i2c: max9286: Rename reverse_channel_mv Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 03/15] media: i2c: max9286: Cache channel amplitude Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 04/15] media: i2c: max9286: Define high " Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 05/15] media: i2c: max9286: Rework comments in .bound() Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 06/15] media: i2c: max9271: Check max9271_write() return Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 07/15] media: i2c: max9271: Introduce wake_up() function Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 08/15] media: i2c: rdacm21: Add delay after OV490 reset Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 09/15] media: i2c: rdacm21: Fix OV10640 powerup Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 10/15] media: i2c: rdacm21: Power up OV10640 before OV490 Jacopo Mondi
2021-06-16 23:47 ` Kieran Bingham [this message]
2021-06-16 12:46 ` [PATCH v5 11/15] media: i2c: rdacm20: Enable noise immunity Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 12/15] media: i2c: rdacm20: Embed 'serializer' field Jacopo Mondi
2021-06-17 0:14 ` Laurent Pinchart
2021-06-17 6:18 ` Hans Verkuil
2021-06-17 7:42 ` Jacopo Mondi
2021-06-17 8:12 ` Hans Verkuil
2021-06-17 8:20 ` Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 13/15] media: i2c: rdacm20: Report camera module name Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 14/15] media: i2c: rdacm20: Check return values Jacopo Mondi
2021-06-16 12:46 ` [PATCH v5 15/15] media: i2c: rdacm20: Re-work ov10635 reset 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=75213041-b4d3-2760-6b21-460ca7885574@ideasonboard.com \
--to=kieran.bingham+renesas@ideasonboard.com \
--cc=geert@linux-m68k.org \
--cc=hverkuil-cisco@xs4all.nl \
--cc=jacopo+renesas@jmondi.org \
--cc=laurent.pinchart+renesas@ideasonboard.com \
--cc=laurent.pinchart@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).