]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
v4l: xilinx: sdirxss: Detect mode based on capability
authorVishal Sagar <vishal.sagar@xilinx.com>
Mon, 28 Aug 2017 06:06:10 +0000 (11:36 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Mon, 28 Aug 2017 08:09:25 +0000 (10:09 +0200)
Set the mode detection based on IP configuration.
If the IP is configured for 3G mode then don't allow detection for
6G and 12G Integral/Fractional modes.
If the IP is configured for 6G mode then don't allow detection for 12G
Integral/Fractional modes.

Signed-off-by: Vishal Sagar <vsagar@xilinx.com>
Reviewed-by: Hyun Kwon <hyun.kwon@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/media/platform/xilinx/xilinx-sdirxss.c

index 39eb912d22511d81646f784928d728226f346e35..b56fc4c7b9bd2d250c717980fc4d8b5d9d71647d 100644 (file)
@@ -271,6 +271,8 @@ static int xsdirx_set_modedetect(struct xsdirxss_core *core, u16 mask)
                return -EINVAL;
        }
 
+       dev_dbg(core->dev, "mask = 0x%x\n", mask);
+
        val = xsdirxss_read(core, XSDIRX_MDL_CTRL_REG);
        val &= ~(XSDIRX_MDL_CTRL_MODE_DET_EN_MASK);
        val &= ~(XSDIRX_MDL_CTRL_MODE_AUTO_DET_MASK);
@@ -579,6 +581,7 @@ static int xsdirxss_unsubscribe_event(struct v4l2_subdev *sd,
  */
 static int xsdirxss_s_ctrl(struct v4l2_ctrl *ctrl)
 {
+       int ret = 0;
        struct xsdirxss_state *xsdirxss =
                container_of(ctrl->handler,
                             struct xsdirxss_state, ctrl_handler);
@@ -605,7 +608,20 @@ static int xsdirxss_s_ctrl(struct v4l2_ctrl *ctrl)
                break;
        case V4L2_CID_XILINX_SDIRX_SEARCH_MODES:
                if (ctrl->val) {
-                       xsdirx_set_modedetect(core, ctrl->val);
+                       if (core->mode == XSDIRXSS_SDI_STD_3G) {
+                               dev_dbg(core->dev, "Upto 3G supported\n");
+                               ctrl->val &= ~(BIT(XSDIRX_MODE_6G_OFFSET) |
+                                              BIT(XSDIRX_MODE_12GI_OFFSET) |
+                                              BIT(XSDIRX_MODE_12GF_OFFSET));
+                       }
+
+                       if (core->mode == XSDIRXSS_SDI_STD_6G) {
+                               dev_dbg(core->dev, "Upto 6G supported\n");
+                               ctrl->val &= ~(BIT(XSDIRX_MODE_12GI_OFFSET) |
+                                              BIT(XSDIRX_MODE_12GF_OFFSET));
+                       }
+
+                       ret = xsdirx_set_modedetect(core, ctrl->val);
                } else {
                        dev_err(core->dev, "Select at least one mode!\n");
                        return -EINVAL;
@@ -617,7 +633,7 @@ static int xsdirxss_s_ctrl(struct v4l2_ctrl *ctrl)
                return -EINVAL;
        }
        xsdirx_core_enable(core);
-       return 0;
+       return ret;
 }
 
 /**