Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2835429pxv; Mon, 12 Jul 2021 03:07:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzanMKK6b/S2EU09Fq3gULlkwLECmRYV2i8rxgx97GMa+AQLh49+07M4Q+l1tLqBT++ivkE X-Received: by 2002:a05:6602:179e:: with SMTP id y30mr25580946iox.0.1626084458186; Mon, 12 Jul 2021 03:07:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626084458; cv=none; d=google.com; s=arc-20160816; b=vb9SbKJdv5QiHILqDAIUOZxi5O8dDPLWrpVv4n0YmkdqY6hJ7nEbzXiG2+WNZ2gdQf z48Id1dp0r5yrpXQSDysdtSIV4YT3ol8q08LWhKIiPsDvjrIuMZ/tfnkjRBxQLRYe8OW ekOZ/EOXFU7R4E+luisZW6+yMUZ6MzqFgQjEUHIViO4FHE3XcUMCR7V3Pp7rpy5Mj+QM VK8OKti5JIq/odRXnuqvi0jlCkWjLQEhqTIY7k6CnVLYS1LY6Ky+oQ3mw6VT5PtTnhuR T9q2NH6sIa+MCf7Ylcv236SWm+Mn1R7neMW6FoW5vXPLLAcyz1Yb9d909SvSqLXhyR8G 8y2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=h448CRUmIp0R90alo7R+2J7kr6R+wK3JqQmA9VccJi0=; b=FpCwBrMNxu/pYLw7espQPPlH5Gd1C3CJA54WzY9DtaBUH7dlW81hI18NMd5+8bgXxN xk/DcVO7byMvpOBlzKZow1bMI/Xzv+fc8GGcKAOsQJ/RMjNDYWeq3RWS6NoOIsa3vnE6 fSzH+avUy/psSZxjVSFnOfWtaMVV49FgzIOvJMv6pgUIaODRInNAgeS2bSGEFKjWq5xk L609xk47BS9CNRqYgi6f2wJbrjxPjac0YsKsdq6FPpn9xQEy3s/sBbpsfl5AymfeY6uo 4PZ5qiT+5MI7sC9g+VwdCJbBjg7bQEyitVNqTL6Fwahro3IxlhoNt4ZdLGWg9Sc9qMCB LlRQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=rkMVroL4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w13si16613084jar.0.2021.07.12.03.07.27; Mon, 12 Jul 2021 03:07:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=rkMVroL4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348404AbhGLHk7 (ORCPT + 99 others); Mon, 12 Jul 2021 03:40:59 -0400 Received: from mail.kernel.org ([198.145.29.99]:43002 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244165AbhGLHK2 (ORCPT ); Mon, 12 Jul 2021 03:10:28 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8850561205; Mon, 12 Jul 2021 07:06:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626073593; bh=9UUc3f9+EGkY5PHSfYXsv9G80kacFjvDyph61i1Qs/Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rkMVroL4ce0Goaoi8ER62k9iG+Ro4KSdo+wSv/PLvFZ4H4cfi4n9duwUh35Rl7vFD iNFDEV6tKolJnuiXUAvYVrjuy54chdCgd/+mtO3/SZ+IHQ8gbaVISA3CuQvyYzT5M6 NvdOno+SzwEdkGlqnpsQlRlS78pSBfy1L8doGJSc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jacopo Mondi , Laurent Pinchart , Kieran Bingham , Hans Verkuil , Mauro Carvalho Chehab , Sasha Levin Subject: [PATCH 5.12 293/700] media: i2c: rdacm21: Power up OV10640 before OV490 Date: Mon, 12 Jul 2021 08:06:16 +0200 Message-Id: <20210712061007.434002777@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060924.797321836@linuxfoundation.org> References: <20210712060924.797321836@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jacopo Mondi [ Upstream commit 2b821698dc73c00719e3dc367db712f727bbda85 ] The current RDACM21 initialization routine powers up the OV10640 image sensor after the OV490 ISP. The ISP is programmed with a firmware loaded 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 explicitly. Failures in the OV10640 startup causes 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 [hverkuil: fixed two typos in commit log] Fixes: a59f853b3b4b ("media: i2c: Add driver for RDACM21 camera module") Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart Reviewed-by: Kieran Bingham Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- 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 4b0dfd0a75e1..50e2af522760 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; -- 2.30.2