Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2539020imu; Thu, 29 Nov 2018 06:35:31 -0800 (PST) X-Google-Smtp-Source: AFSGD/WYo3CL1HdLmgQu9f68KQVQElVU22dZCWt3RWxVK5t+iXLsdXBfYZBZ/U3QNYcpQYy8pVSS X-Received: by 2002:a17:902:720c:: with SMTP id ba12mr1706234plb.79.1543502131325; Thu, 29 Nov 2018 06:35:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543502131; cv=none; d=google.com; s=arc-20160816; b=yEm+t0oKX/8PA0/mTX/BOhYPQs2bQXAL39OOvo4Lq1VP1P70o7vQJuG2dIWVPP8BgV KjSLY3NTIcQXPRw/6SKfbgTeGlUDntwAkS73k0+SaxWoPX18ZFZxxjVW/ujP6jwyXdMQ rNbA/0dlhIrmC0+9TymGlfsjTOGCHtGAjn5AZoPCSFpF5GIgFQf+lqClURMS9opRA5Gl gy7SL35R475z8ZKSbQrDo621hInK1hWtrjSxEPQlff7sUtexoa1OXEl8f6jEFkSql2Ds CNGZwjnONVqJqxloKOF76VW3yG0dtund7j3MlnVc+FwztbktasokJQO2KkeV8rmxHUnJ j09A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=WwjdyrEBJUj8Td6obb8SSAKY2XKEf9budYhbFtxYtFM=; b=aDt2GN+MpK8VbiQUor1hD26CdZJXysbJFZtEe8geC8irjm9KdL8OjUAf3H0sTnQO1a JKkPUxSvcAzxihEhU5evZB4h9AJHmbwBUvvlF/mj/y7AHMs7EjvA1bh15Blkj3XvWg4J X6bNrFEJ6mOlbq8eQyL5eP1ogkJM/J+f6PSk/20Fe+SMzGrbD7bhxvK5AdHyFMiZM9fA oQyR093nhWaRk30TrnjRr5LHcO5g4tLU9NI/dgcqC2Ks8pLbW0FjWIuYPg/NYSPrN7cm +gRi+5Ar6zhWKiZiBZLjdwzWyfmOR/AIdA4XA1a+ehhn8GMzMbr0D2HqyQyZU4HAyvxf Oz7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=OqfUSyDf; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id cd16si2619822plb.47.2018.11.29.06.35.15; Thu, 29 Nov 2018 06:35:31 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=OqfUSyDf; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389471AbeK3Bh6 (ORCPT + 99 others); Thu, 29 Nov 2018 20:37:58 -0500 Received: from mail.kernel.org ([198.145.29.99]:41216 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389450AbeK3Bh6 (ORCPT ); Thu, 29 Nov 2018 20:37:58 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 47645214C1; Thu, 29 Nov 2018 14:32:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1543501944; bh=hsL57PSzPb0icCVt8Nhtl1CfIqJ3TuJphvjussWfR1c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OqfUSyDfXijCfJ3opO2P5tFP6Jwz+xMjOVWCszZvQemuPJyHbmgdgGO5F/j2w83Di 88GhNIX0XA+ihhcWf0IXgz4ScOdu6chm8tEywtz/KQT1ILC3ScwtEpyizlqEXkwPJ6 m+uMp3Vclj8dF9UtG7NIArFM39n54dPablAObR/o= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Samuel Bobrowicz , Maxime Ripard , Jacopo Mondi , Sakari Ailus , Mauro Carvalho Chehab , Adam Ford Subject: [PATCH 4.19 106/110] media: ov5640: Fix timings setup code Date: Thu, 29 Nov 2018 15:13:17 +0100 Message-Id: <20181129135925.551220583@linuxfoundation.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181129135921.231283053@linuxfoundation.org> References: <20181129135921.231283053@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ From: Jacopo Mondi commit bad1774ed41e98a43074e50e7d5ac9e1e848d99a upstream. As of: commit 476dec012f4c ("media: ov5640: Add horizontal and vertical totals") the timings parameters gets programmed separately from the static register values array. When changing capture mode, the vertical and horizontal totals gets inspected by the set_mode_exposure_calc() functions, and only later programmed with the new values. This means exposure, light banding filter and shutter gain are calculated using the previous timings, and are thus not correct. Fix this by programming timings right after the static register value table has been sent to the sensor in the ov5640_load_regs() function. Fixes: 476dec012f4c ("media: ov5640: Add horizontal and vertical totals") Tested-by: Steve Longerbeam # i.MX6q SabreSD, CSI-2 Tested-by: Loic Poulain # Dragonboard-410c, CSI-2 Signed-off-by: Samuel Bobrowicz Signed-off-by: Maxime Ripard Signed-off-by: Jacopo Mondi Signed-off-by: Sakari Ailus Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Adam Ford Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ov5640.c | 50 ++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 29 deletions(-) --- a/drivers/media/i2c/ov5640.c +++ b/drivers/media/i2c/ov5640.c @@ -910,6 +910,26 @@ static int ov5640_mod_reg(struct ov5640_ } /* download ov5640 settings to sensor through i2c */ +static int ov5640_set_timings(struct ov5640_dev *sensor, + const struct ov5640_mode_info *mode) +{ + int ret; + + ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPHO, mode->hact); + if (ret < 0) + return ret; + + ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPVO, mode->vact); + if (ret < 0) + return ret; + + ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HTS, mode->htot); + if (ret < 0) + return ret; + + return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, mode->vtot); +} + static int ov5640_load_regs(struct ov5640_dev *sensor, const struct ov5640_mode_info *mode) { @@ -937,7 +957,7 @@ static int ov5640_load_regs(struct ov564 usleep_range(1000 * delay_ms, 1000 * delay_ms + 100); } - return ret; + return ov5640_set_timings(sensor, mode); } /* read exposure, in number of line periods */ @@ -1400,30 +1420,6 @@ static int ov5640_set_virtual_channel(st return ov5640_write_reg(sensor, OV5640_REG_DEBUG_MODE, temp); } -static int ov5640_set_timings(struct ov5640_dev *sensor, - const struct ov5640_mode_info *mode) -{ - int ret; - - ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPHO, mode->hact); - if (ret < 0) - return ret; - - ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPVO, mode->vact); - if (ret < 0) - return ret; - - ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HTS, mode->htot); - if (ret < 0) - return ret; - - ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, mode->vtot); - if (ret < 0) - return ret; - - return 0; -} - static const struct ov5640_mode_info * ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr, int width, int height, bool nearest) @@ -1667,10 +1663,6 @@ static int ov5640_set_mode(struct ov5640 if (ret < 0) return ret; - ret = ov5640_set_timings(sensor, mode); - if (ret < 0) - return ret; - ret = ov5640_set_binning(sensor, dn_mode != SCALING); if (ret < 0) return ret;