commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=fbd72c27a5ede743bffab7d5070a415ecebdb7d7
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk

Signed-off-by: Scott Jiang <[email protected]>
---
 drivers/media/video/mt9m114.c |   52 ++++++++++++++++++++++++++++++++++++----
 1 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/drivers/media/video/mt9m114.c b/drivers/media/video/mt9m114.c
index 0d52b9d..9035743 100644
--- a/drivers/media/video/mt9m114.c
+++ b/drivers/media/video/mt9m114.c
@@ -133,6 +133,7 @@
 #define MT9M114_SET_STATE_RESULT_EINVAL			0x0c
 #define MT9M114_SET_STATE_RESULT_ENOSPC			0x0d
 
+#define MAX_FRAME_RATE 30
 
 struct mt9m114 {
 	struct v4l2_subdev sd;
@@ -334,8 +335,6 @@ static const struct mt9m114_reg mt9m114_regs_qvga[] = {
 	{ MT9M114_CAM_OUTPUT_WIDTH,                      0x0140, 2 },
 	{ MT9M114_CAM_OUTPUT_HEIGHT,                     0x00F0, 2 },
 	{ MT9M114_CAM_AET_AEMODE,                        0x00,   1 },
-	{ MT9M114_CAM_AET_MAX_FRAME_RATE,                0x1E00, 2 },
-	{ MT9M114_CAM_AET_MIN_FRAME_RATE,                0x1E00, 2 },
 	{ MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART,       0x0000, 2 },
 	{ MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART,       0x0000, 2 },
 	{ MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND,         0x013F, 2 },
@@ -369,8 +368,6 @@ static const struct mt9m114_reg mt9m114_regs_vga[] = {
 	{ MT9M114_CAM_OUTPUT_WIDTH,                      0x0280, 2 },
 	{ MT9M114_CAM_OUTPUT_HEIGHT,                     0x01E0, 2 },
 	{ MT9M114_CAM_AET_AEMODE,                        0x00,   1 },
-	{ MT9M114_CAM_AET_MAX_FRAME_RATE,                0x1E00, 2 },
-	{ MT9M114_CAM_AET_MIN_FRAME_RATE,                0x1E00, 2 },
 	{ MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART,       0x0000, 2 },
 	{ MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART,       0x0000, 2 },
 	{ MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND,         0x027F, 2 },
@@ -404,8 +401,6 @@ static const struct mt9m114_reg mt9m114_regs_wvga[] = {
 	{ MT9M114_CAM_OUTPUT_WIDTH,                      0x0320, 2 },
 	{ MT9M114_CAM_OUTPUT_HEIGHT,                     0x01E0, 2 },
 	{ MT9M114_CAM_AET_AEMODE,                        0x00,   1 },
-	{ MT9M114_CAM_AET_MAX_FRAME_RATE,                0x1E00, 2 },
-	{ MT9M114_CAM_AET_MIN_FRAME_RATE,                0x1E00, 2 },
 	{ MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART,       0x0000, 2 },
 	{ MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART,       0x0000, 2 },
 	{ MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND,         0x031F, 2 },
@@ -795,6 +790,49 @@ static int mt9m114_g_mbus_fmt(struct v4l2_subdev *sd,
 	return 0;
 }
 
+static int mt9m114_g_parm(struct v4l2_subdev *sd,
+				struct v4l2_streamparm *parms)
+{
+	struct i2c_client *client = v4l2_get_subdevdata(sd);
+	struct v4l2_captureparm *cp = &parms->parm.capture;
+	u16 frame_rate;
+
+	if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+		return -EINVAL;
+
+	memset(cp, 0, sizeof(*cp));
+	cp->capability = V4L2_CAP_TIMEPERFRAME;
+	cp->timeperframe.numerator = 1;
+	mt9m114_read16(client, MT9M114_CAM_AET_MAX_FRAME_RATE, &frame_rate);
+	cp->timeperframe.denominator = frame_rate >> 8;
+	return 0;
+}
+
+static int mt9m114_s_parm(struct v4l2_subdev *sd,
+				struct v4l2_streamparm *parms)
+{
+	struct i2c_client *client = v4l2_get_subdevdata(sd);
+	struct v4l2_captureparm *cp = &parms->parm.capture;
+	struct v4l2_fract *tpf = &cp->timeperframe;
+	u16 frame_rate;
+
+	if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+		return -EINVAL;
+	if (cp->extendedmode != 0)
+		return -EINVAL;
+
+	if (tpf->numerator == 0 || tpf->denominator == 0
+		|| (tpf->denominator > tpf->numerator * MAX_FRAME_RATE)) {
+		/* reset to max frame rate */
+		tpf->numerator = 1;
+		tpf->denominator = MAX_FRAME_RATE;
+	}
+	frame_rate = (tpf->denominator / tpf->numerator) << 8;
+	mt9m114_write16(client, MT9M114_CAM_AET_MAX_FRAME_RATE, frame_rate);
+	mt9m114_write16(client, MT9M114_CAM_AET_MIN_FRAME_RATE, frame_rate);
+	return 0;
+}
+
 static int mt9m114_s_stream(struct v4l2_subdev *sd, int enable)
 {
 	struct i2c_client *client = v4l2_get_subdevdata(sd);
@@ -839,6 +877,8 @@ static const struct v4l2_subdev_video_ops mt9m114_video_ops = {
 	.try_mbus_fmt = mt9m114_try_mbus_fmt,
 	.s_mbus_fmt = mt9m114_s_mbus_fmt,
 	.g_mbus_fmt = mt9m114_g_mbus_fmt,
+	.s_parm = mt9m114_s_parm,
+	.g_parm = mt9m114_g_parm,
 	.s_stream = mt9m114_s_stream,
 };
 
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to