media: rcar-vin: cache video standard
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Sat, 14 Apr 2018 11:57:10 +0000 (07:57 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Fri, 20 Apr 2018 13:58:50 +0000 (09:58 -0400)
At stream on time the driver should not query the subdevice for which
standard are used. Instead it should be cached when userspace sets the
standard and used at stream on time.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/platform/rcar-vin/rcar-core.c
drivers/media/platform/rcar-vin/rcar-dma.c
drivers/media/platform/rcar-vin/rcar-v4l2.c
drivers/media/platform/rcar-vin/rcar-vin.h

index be49d8968f0a0cef571b2a71d4ecb26e38998b8f..8c251687e81b345b20bc6caafba83dae20d86764 100644 (file)
@@ -96,6 +96,12 @@ static int rvin_digital_subdevice_attach(struct rvin_dev *vin,
        if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
                return ret;
 
+       /* Read standard */
+       vin->std = V4L2_STD_UNKNOWN;
+       ret = v4l2_subdev_call(subdev, video, g_std, &vin->std);
+       if (ret < 0 && ret != -ENOIOCTLCMD)
+               return ret;
+
        /* Add the controls */
        ret = v4l2_ctrl_handler_init(&vin->ctrl_handler, 16);
        if (ret < 0)
index 9233924e5b52de5f646f3c5805c92b2ce5474042..79f4074b931b5aeb44c7b2bbc19e8312b3b43863 100644 (file)
@@ -592,7 +592,6 @@ void rvin_crop_scale_comp(struct rvin_dev *vin)
 static int rvin_setup(struct rvin_dev *vin)
 {
        u32 vnmc, dmr, dmr2, interrupts;
-       v4l2_std_id std;
        bool progressive = false, output_is_yuv = false, input_is_yuv = false;
 
        switch (vin->format.field) {
@@ -606,10 +605,8 @@ static int rvin_setup(struct rvin_dev *vin)
                /* Default to TB */
                vnmc = VNMC_IM_FULL;
                /* Use BT if video standard can be read and is 60 Hz format */
-               if (!v4l2_subdev_call(vin_to_source(vin), video, g_std, &std)) {
-                       if (std & V4L2_STD_525_60)
-                               vnmc = VNMC_IM_FULL | VNMC_FOC;
-               }
+               if (vin->std & V4L2_STD_525_60)
+                       vnmc = VNMC_IM_FULL | VNMC_FOC;
                break;
        case V4L2_FIELD_INTERLACED_TB:
                vnmc = VNMC_IM_FULL;
index 84cad5d8c93a27deafda27d1f8b8cb7cd3c2aa7d..9cdd00391c5c03a0f82ef2a9da464e3ce542c4e0 100644 (file)
@@ -475,6 +475,8 @@ static int rvin_s_std(struct file *file, void *priv, v4l2_std_id a)
        if (ret < 0)
                return ret;
 
+       vin->std = a;
+
        /* Changing the standard will change the width/height */
        return rvin_reset_format(vin);
 }
@@ -482,9 +484,13 @@ static int rvin_s_std(struct file *file, void *priv, v4l2_std_id a)
 static int rvin_g_std(struct file *file, void *priv, v4l2_std_id *a)
 {
        struct rvin_dev *vin = video_drvdata(file);
-       struct v4l2_subdev *sd = vin_to_source(vin);
 
-       return v4l2_subdev_call(sd, video, g_std, a);
+       if (v4l2_subdev_has_op(vin_to_source(vin), pad, dv_timings_cap))
+               return -ENOIOCTLCMD;
+
+       *a = vin->std;
+
+       return 0;
 }
 
 static int rvin_subscribe_event(struct v4l2_fh *fh,
index e940366d7e8d0e7665a64ba25b56056940873d68..06cec4f8e5ffaf2b306e837bf2056a9cacf0cbd0 100644 (file)
@@ -118,6 +118,7 @@ struct rvin_info {
  * @crop:              active cropping
  * @compose:           active composing
  * @source:            active size of the video source
+ * @std:               active video standard of the video source
  */
 struct rvin_dev {
        struct device *dev;
@@ -146,6 +147,7 @@ struct rvin_dev {
        struct v4l2_rect crop;
        struct v4l2_rect compose;
        struct v4l2_rect source;
+       v4l2_std_id std;
 };
 
 #define vin_to_source(vin)             ((vin)->digital->subdev)