diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2017-03-30 12:30:22 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@armlinux.org.uk> | 2020-10-18 23:30:31 +0100 |
commit | aa3482eb57a8074858cbdbc5410ffedde10ed91d (patch) | |
tree | 592574db03eb0f28b0d659b9a191e9272d8d4549 /drivers/staging | |
parent | 2144f7ace6d4e72b5077f56928c3a03810bcbcc4 (diff) |
media: staging/imx: add frame intervals back in
We need frame interval support present in every subdev to prevent
media-ctl failing, for example:
Enumerating pads and links
Setting up format SRGGB8_1X8 816x616 on pad imx219 0-0010/0
Format set: SRGGB8_1X8 816x616
Setting up frame interval 1/25 on pad imx219 0-0010/0
Frame interval set: 1/25
Setting up format SRGGB8_1X8 816x616 on pad imx6-mipi-csi2/0
Format set: SRGGB8_1X8 816x616
Setting up frame interval 1/25 on pad imx6-mipi-csi2/0
Unable to set frame interval: Inappropriate ioctl for device (-25)Unable to setup formats: Inappropriate ioctl for device (25)
This causes media-ctl to exit with a non-zero code, which is
indistinguishable from (eg) a failure to set the format. This means
setup scripts have no way to tell whether the failure was due to a
real failure, or whether it's due to something not being supported.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/media/imx/imx6-mipi-csi2.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c index 94d87d27d389..65354cec4142 100644 --- a/drivers/staging/media/imx/imx6-mipi-csi2.c +++ b/drivers/staging/media/imx/imx6-mipi-csi2.c @@ -48,6 +48,7 @@ struct csi2_dev { struct mutex lock; struct v4l2_mbus_framefmt format_mbus; + struct v4l2_fract frame_interval; int stream_count; struct v4l2_subdev *src_sd; @@ -504,6 +505,35 @@ out: return ret; } +static int csi2_g_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_frame_interval *fi) +{ + struct csi2_dev *csi2 = sd_to_dev(sd); + + mutex_lock(&csi2->lock); + fi->interval = csi2->frame_interval; + mutex_unlock(&csi2->lock); + + return 0; +} + +static int csi2_s_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_frame_interval *fi) +{ + struct csi2_dev *csi2 = sd_to_dev(sd); + + mutex_lock(&csi2->lock); + + /* Output pads mirror active input pad, no limits on input pads */ + if (fi->pad != CSI2_SINK_PAD) + fi->interval = csi2->frame_interval; + + csi2->frame_interval = fi->interval; + + mutex_unlock(&csi2->lock); + return 0; +} + static int csi2_registered(struct v4l2_subdev *sd) { struct csi2_dev *csi2 = sd_to_dev(sd); @@ -521,6 +551,8 @@ static const struct media_entity_operations csi2_entity_ops = { static const struct v4l2_subdev_video_ops csi2_video_ops = { .s_stream = csi2_s_stream, + .g_frame_interval = csi2_g_frame_interval, + .s_frame_interval = csi2_s_frame_interval, }; static const struct v4l2_subdev_pad_ops csi2_pad_ops = { @@ -628,6 +660,10 @@ static int csi2_probe(struct platform_device *pdev) csi2->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; csi2->sd.grp_id = IMX_MEDIA_GRP_ID_CSI2; + /* init default frame interval */ + csi2->frame_interval.numerator = 1; + csi2->frame_interval.denominator = 30; + for (i = 0; i < CSI2_NUM_PADS; i++) { csi2->pad[i].flags = (i == CSI2_SINK_PAD) ? MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE; |