All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maxime Ripard <maxime.ripard@bootlin.com>
To: Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	linux-media@vger.kernel.org,
	Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
	Mylene Josserand <mylene.josserand@bootlin.com>,
	Hans Verkuil <hans.verkuil@cisco.com>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	Hugues Fruchet <hugues.fruchet@st.com>,
	Maxime Ripard <maxime.ripard@bootlin.com>
Subject: [PATCH v2 11/12] media: ov5640: Add 60 fps support
Date: Mon, 16 Apr 2018 14:37:00 +0200	[thread overview]
Message-ID: <20180416123701.15901-12-maxime.ripard@bootlin.com> (raw)
In-Reply-To: <20180416123701.15901-1-maxime.ripard@bootlin.com>

Now that we have everything in place to compute the clock rate at runtime,
we can enable the 60fps framerate for the mode we tested it with.

Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
---
 drivers/media/i2c/ov5640.c | 33 +++++++++++++++++++++++++--------
 1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index 690ed0238763..c01bbc5f9f34 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c
@@ -112,6 +112,7 @@ enum ov5640_mode_id {
 enum ov5640_frame_rate {
 	OV5640_15_FPS = 0,
 	OV5640_30_FPS,
+	OV5640_60_FPS,
 	OV5640_NUM_FRAMERATES,
 };
 
@@ -140,6 +141,7 @@ MODULE_PARM_DESC(virtual_channel,
 static const int ov5640_framerates[] = {
 	[OV5640_15_FPS] = 15,
 	[OV5640_30_FPS] = 30,
+	[OV5640_60_FPS] = 60,
 };
 
 /* regulator supplies */
@@ -1398,12 +1400,19 @@ ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr,
 				/* try to find another mode */
 				continue;
 
+			/* Only 640x480 can operate at 60fps (for now) */
+			if (fr == OV5640_60_FPS &&
+			    width != 640 && height != 480)
+				/* try to find another mode */
+				continue;
+
 			break;
 		}
 	}
 
+	/* VGA is the only mode that supports all the framerates */
 	if (nearest && i < 0)
-		mode = &ov5640_mode_data[0];
+		mode = &ov5640_mode_data[OV5640_MODE_VGA_640_480];
 
 	return mode;
 }
@@ -1848,12 +1857,13 @@ static int ov5640_try_frame_interval(struct ov5640_dev *sensor,
 	int ret;
 
 	minfps = ov5640_framerates[OV5640_15_FPS];
-	maxfps = ov5640_framerates[OV5640_30_FPS];
+	maxfps = ov5640_framerates[OV5640_60_FPS];
 
 	if (fi->numerator == 0) {
 		fi->denominator = maxfps;
 		fi->numerator = 1;
-		return OV5640_30_FPS;
+		ret = OV5640_60_FPS;
+		goto find_mode;
 	}
 
 	fps = DIV_ROUND_CLOSEST(fi->denominator, fi->numerator);
@@ -1865,11 +1875,15 @@ static int ov5640_try_frame_interval(struct ov5640_dev *sensor,
 		fi->denominator = minfps;
 	else if (2 * fps >= 2 * minfps + (maxfps - minfps))
 		fi->denominator = maxfps;
+
+	if (fi->denominator == minfps)
+		ret = OV5640_15_FPS;
+	else if (fi->denominator == maxfps)
+		ret = OV5640_60_FPS;
 	else
-		fi->denominator = minfps;
-
-	ret = (fi->denominator == minfps) ? OV5640_15_FPS : OV5640_30_FPS;
+		ret = OV5640_30_FPS;
 
+find_mode:
 	mode = ov5640_find_mode(sensor, ret, width, height, false);
 	return mode ? ret : -EINVAL;
 }
@@ -2458,8 +2472,11 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
 
 	frame_rate = ov5640_try_frame_interval(sensor, &fi->interval,
 					       mode->hact, mode->vact);
-	if (frame_rate < 0)
-		frame_rate = OV5640_15_FPS;
+	if (frame_rate < 0) {
+		/* Always return a valid frame interval value */
+		fi->interval = sensor->frame_interval;
+		goto out;
+	}
 
 	sensor->current_fr = frame_rate;
 	sensor->frame_interval = fi->interval;
-- 
2.17.0

  parent reply	other threads:[~2018-04-16 12:37 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-16 12:36 [PATCH v2 00/12] media: ov5640: Misc cleanup and improvements Maxime Ripard
2018-04-16 12:36 ` [PATCH v2 01/12] media: ov5640: Add auto-focus feature Maxime Ripard
2018-04-19 10:36   ` Laurent Pinchart
2018-04-20 19:10     ` Maxime Ripard
2018-04-16 12:36 ` [PATCH v2 02/12] media: ov5640: Add light frequency control Maxime Ripard
2018-04-19  9:44   ` Laurent Pinchart
2018-04-20 19:04     ` Maxime Ripard
2018-04-24 11:55       ` Sakari Ailus
2018-04-16 12:36 ` [PATCH v2 03/12] media: ov5640: Don't force the auto exposure state at start time Maxime Ripard
2018-04-16 12:36 ` [PATCH v2 04/12] media: ov5640: Init properly the SCLK dividers Maxime Ripard
2018-04-16 12:36 ` [PATCH v2 05/12] media: ov5640: Change horizontal and vertical resolutions name Maxime Ripard
2018-04-16 12:36 ` [PATCH v2 06/12] media: ov5640: Add horizontal and vertical totals Maxime Ripard
2018-04-16 12:36 ` [PATCH v2 07/12] media: ov5640: Program the visible resolution Maxime Ripard
2018-04-16 12:36 ` [PATCH v2 08/12] media: ov5640: Adjust the clock based on the expected rate Maxime Ripard
2018-04-24  7:21   ` Sakari Ailus
2018-04-24 19:36     ` Maxime Ripard
2018-05-02 21:44       ` Sakari Ailus
2018-04-16 12:36 ` [PATCH v2 09/12] media: ov5640: Compute the clock rate at runtime Maxime Ripard
2018-04-16 12:36 ` [PATCH v2 10/12] media: ov5640: Enhance FPS handling Maxime Ripard
2018-04-16 12:37 ` Maxime Ripard [this message]
2018-05-15 13:33   ` [PATCH v2 11/12] media: ov5640: Add 60 fps support Hugues FRUCHET
2018-05-17  8:52     ` Maxime Ripard
2018-05-17 13:29       ` Hugues FRUCHET
2018-05-18  9:05         ` Maxime Ripard
2018-04-16 12:37 ` [PATCH v2 12/12] media: ov5640: Remove duplicate auto-exposure setup Maxime Ripard
2018-04-16 23:22 ` [PATCH v2 00/12] media: ov5640: Misc cleanup and improvements Samuel Bobrowicz
2018-04-17 16:01   ` Maxime Ripard
2018-04-18 23:39     ` Samuel Bobrowicz
2018-04-19 12:32       ` Maxime Ripard
2018-04-24 22:11         ` Sam Bobrowicz
2018-04-25 19:53           ` Maxime Ripard
2018-04-27  9:27           ` Laurent Pinchart
2018-05-02 18:11             ` Sam Bobrowicz
2018-05-03 15:16               ` Maxime Ripard
2018-05-04 10:01                 ` Loic Poulain
2018-05-04 21:13                   ` Sam Bobrowicz
2018-05-07  8:10                     ` Maxime Ripard
2018-05-04  7:26               ` Loic Poulain
2018-05-04 21:26                 ` Sam Bobrowicz
2018-05-08  1:00 ` Sam Bobrowicz
2018-05-17  8:50   ` Maxime Ripard

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=20180416123701.15901-12-maxime.ripard@bootlin.com \
    --to=maxime.ripard@bootlin.com \
    --cc=hans.verkuil@cisco.com \
    --cc=hugues.fruchet@st.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=mylene.josserand@bootlin.com \
    --cc=sakari.ailus@linux.intel.com \
    --cc=thomas.petazzoni@bootlin.com \
    /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.