These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / media / platform / vivid / vivid-ctrls.c
index 2b90700..f41ac0b 100644 (file)
 #define VIVID_CID_DV_TIMINGS_ASPECT_RATIO      (VIVID_CID_VIVID_BASE + 23)
 #define VIVID_CID_TSTAMP_SRC           (VIVID_CID_VIVID_BASE + 24)
 #define VIVID_CID_COLORSPACE           (VIVID_CID_VIVID_BASE + 25)
-#define VIVID_CID_YCBCR_ENC            (VIVID_CID_VIVID_BASE + 26)
-#define VIVID_CID_QUANTIZATION         (VIVID_CID_VIVID_BASE + 27)
-#define VIVID_CID_LIMITED_RGB_RANGE    (VIVID_CID_VIVID_BASE + 28)
-#define VIVID_CID_ALPHA_MODE           (VIVID_CID_VIVID_BASE + 29)
-#define VIVID_CID_HAS_CROP_CAP         (VIVID_CID_VIVID_BASE + 30)
-#define VIVID_CID_HAS_COMPOSE_CAP      (VIVID_CID_VIVID_BASE + 31)
-#define VIVID_CID_HAS_SCALER_CAP       (VIVID_CID_VIVID_BASE + 32)
-#define VIVID_CID_HAS_CROP_OUT         (VIVID_CID_VIVID_BASE + 33)
-#define VIVID_CID_HAS_COMPOSE_OUT      (VIVID_CID_VIVID_BASE + 34)
-#define VIVID_CID_HAS_SCALER_OUT       (VIVID_CID_VIVID_BASE + 35)
-#define VIVID_CID_LOOP_VIDEO           (VIVID_CID_VIVID_BASE + 36)
-#define VIVID_CID_SEQ_WRAP             (VIVID_CID_VIVID_BASE + 37)
-#define VIVID_CID_TIME_WRAP            (VIVID_CID_VIVID_BASE + 38)
-#define VIVID_CID_MAX_EDID_BLOCKS      (VIVID_CID_VIVID_BASE + 39)
-#define VIVID_CID_PERCENTAGE_FILL      (VIVID_CID_VIVID_BASE + 40)
+#define VIVID_CID_XFER_FUNC            (VIVID_CID_VIVID_BASE + 26)
+#define VIVID_CID_YCBCR_ENC            (VIVID_CID_VIVID_BASE + 27)
+#define VIVID_CID_QUANTIZATION         (VIVID_CID_VIVID_BASE + 28)
+#define VIVID_CID_LIMITED_RGB_RANGE    (VIVID_CID_VIVID_BASE + 29)
+#define VIVID_CID_ALPHA_MODE           (VIVID_CID_VIVID_BASE + 30)
+#define VIVID_CID_HAS_CROP_CAP         (VIVID_CID_VIVID_BASE + 31)
+#define VIVID_CID_HAS_COMPOSE_CAP      (VIVID_CID_VIVID_BASE + 32)
+#define VIVID_CID_HAS_SCALER_CAP       (VIVID_CID_VIVID_BASE + 33)
+#define VIVID_CID_HAS_CROP_OUT         (VIVID_CID_VIVID_BASE + 34)
+#define VIVID_CID_HAS_COMPOSE_OUT      (VIVID_CID_VIVID_BASE + 35)
+#define VIVID_CID_HAS_SCALER_OUT       (VIVID_CID_VIVID_BASE + 36)
+#define VIVID_CID_LOOP_VIDEO           (VIVID_CID_VIVID_BASE + 37)
+#define VIVID_CID_SEQ_WRAP             (VIVID_CID_VIVID_BASE + 38)
+#define VIVID_CID_TIME_WRAP            (VIVID_CID_VIVID_BASE + 39)
+#define VIVID_CID_MAX_EDID_BLOCKS      (VIVID_CID_VIVID_BASE + 40)
+#define VIVID_CID_PERCENTAGE_FILL      (VIVID_CID_VIVID_BASE + 41)
 
 #define VIVID_CID_STD_SIGNAL_MODE      (VIVID_CID_VIVID_BASE + 60)
 #define VIVID_CID_STANDARD             (VIVID_CID_VIVID_BASE + 61)
@@ -98,6 +99,7 @@
 
 #define VIVID_CID_RADIO_TX_RDS_BLOCKIO (VIVID_CID_VIVID_BASE + 94)
 
+#define VIVID_CID_SDR_CAP_FM_DEVIATION (VIVID_CID_VIVID_BASE + 110)
 
 /* General User Controls */
 
@@ -341,6 +343,7 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
                V4L2_COLORSPACE_SRGB,
                V4L2_COLORSPACE_ADOBERGB,
                V4L2_COLORSPACE_BT2020,
+               V4L2_COLORSPACE_DCI_P3,
                V4L2_COLORSPACE_SMPTE240M,
                V4L2_COLORSPACE_470_SYSTEM_M,
                V4L2_COLORSPACE_470_SYSTEM_BG,
@@ -360,6 +363,13 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
                vivid_send_source_change(dev, HDMI);
                vivid_send_source_change(dev, WEBCAM);
                break;
+       case VIVID_CID_XFER_FUNC:
+               tpg_s_xfer_func(&dev->tpg, ctrl->val);
+               vivid_send_source_change(dev, TV);
+               vivid_send_source_change(dev, SVID);
+               vivid_send_source_change(dev, HDMI);
+               vivid_send_source_change(dev, WEBCAM);
+               break;
        case VIVID_CID_YCBCR_ENC:
                tpg_s_ycbcr_enc(&dev->tpg, ctrl->val);
                vivid_send_source_change(dev, TV);
@@ -540,7 +550,7 @@ static const struct v4l2_ctrl_config vivid_ctrl_osd_mode = {
        .id = VIVID_CID_OSD_TEXT_MODE,
        .name = "OSD Text Mode",
        .type = V4L2_CTRL_TYPE_MENU,
-       .max = 2,
+       .max = ARRAY_SIZE(vivid_ctrl_osd_mode_strings) - 2,
        .qmenu = vivid_ctrl_osd_mode_strings,
 };
 
@@ -632,7 +642,7 @@ static const struct v4l2_ctrl_config vivid_ctrl_tstamp_src = {
        .id = VIVID_CID_TSTAMP_SRC,
        .name = "Timestamp Source",
        .type = V4L2_CTRL_TYPE_MENU,
-       .max = 1,
+       .max = ARRAY_SIZE(vivid_ctrl_tstamp_src_strings) - 2,
        .qmenu = vivid_ctrl_tstamp_src_strings,
 };
 
@@ -693,6 +703,7 @@ static const char * const vivid_ctrl_colorspace_strings[] = {
        "sRGB",
        "AdobeRGB",
        "BT.2020",
+       "DCI-P3",
        "SMPTE 240M",
        "470 System M",
        "470 System BG",
@@ -704,11 +715,32 @@ static const struct v4l2_ctrl_config vivid_ctrl_colorspace = {
        .id = VIVID_CID_COLORSPACE,
        .name = "Colorspace",
        .type = V4L2_CTRL_TYPE_MENU,
-       .max = 7,
+       .max = ARRAY_SIZE(vivid_ctrl_colorspace_strings) - 2,
        .def = 2,
        .qmenu = vivid_ctrl_colorspace_strings,
 };
 
+static const char * const vivid_ctrl_xfer_func_strings[] = {
+       "Default",
+       "Rec. 709",
+       "sRGB",
+       "AdobeRGB",
+       "SMPTE 240M",
+       "None",
+       "DCI-P3",
+       "SMPTE 2084",
+       NULL,
+};
+
+static const struct v4l2_ctrl_config vivid_ctrl_xfer_func = {
+       .ops = &vivid_vid_cap_ctrl_ops,
+       .id = VIVID_CID_XFER_FUNC,
+       .name = "Transfer Function",
+       .type = V4L2_CTRL_TYPE_MENU,
+       .max = ARRAY_SIZE(vivid_ctrl_xfer_func_strings) - 2,
+       .qmenu = vivid_ctrl_xfer_func_strings,
+};
+
 static const char * const vivid_ctrl_ycbcr_enc_strings[] = {
        "Default",
        "ITU-R 601",
@@ -727,7 +759,7 @@ static const struct v4l2_ctrl_config vivid_ctrl_ycbcr_enc = {
        .id = VIVID_CID_YCBCR_ENC,
        .name = "Y'CbCr Encoding",
        .type = V4L2_CTRL_TYPE_MENU,
-       .max = 8,
+       .max = ARRAY_SIZE(vivid_ctrl_ycbcr_enc_strings) - 2,
        .qmenu = vivid_ctrl_ycbcr_enc_strings,
 };
 
@@ -743,7 +775,7 @@ static const struct v4l2_ctrl_config vivid_ctrl_quantization = {
        .id = VIVID_CID_QUANTIZATION,
        .name = "Quantization",
        .type = V4L2_CTRL_TYPE_MENU,
-       .max = 2,
+       .max = ARRAY_SIZE(vivid_ctrl_quantization_strings) - 2,
        .qmenu = vivid_ctrl_quantization_strings,
 };
 
@@ -766,6 +798,37 @@ static const struct v4l2_ctrl_config vivid_ctrl_limited_rgb_range = {
 };
 
 
+/* Video Loop Control */
+
+static int vivid_loop_cap_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+       struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_loop_cap);
+
+       switch (ctrl->id) {
+       case VIVID_CID_LOOP_VIDEO:
+               dev->loop_video = ctrl->val;
+               vivid_update_quality(dev);
+               vivid_send_source_change(dev, SVID);
+               vivid_send_source_change(dev, HDMI);
+               break;
+       }
+       return 0;
+}
+
+static const struct v4l2_ctrl_ops vivid_loop_cap_ctrl_ops = {
+       .s_ctrl = vivid_loop_cap_s_ctrl,
+};
+
+static const struct v4l2_ctrl_config vivid_ctrl_loop_video = {
+       .ops = &vivid_loop_cap_ctrl_ops,
+       .id = VIVID_CID_LOOP_VIDEO,
+       .name = "Loop Video",
+       .type = V4L2_CTRL_TYPE_BOOLEAN,
+       .max = 1,
+       .step = 1,
+};
+
+
 /* VBI Capture Control */
 
 static int vivid_vbi_cap_s_ctrl(struct v4l2_ctrl *ctrl)
@@ -1030,7 +1093,7 @@ static const struct v4l2_ctrl_config vivid_ctrl_std_signal_mode = {
        .id = VIVID_CID_STD_SIGNAL_MODE,
        .name = "Standard Signal Mode",
        .type = V4L2_CTRL_TYPE_MENU,
-       .max = 5,
+       .max = ARRAY_SIZE(vivid_ctrl_std_signal_mode_strings) - 2,
        .menu_skip_mask = 1 << 3,
        .qmenu = vivid_ctrl_std_signal_mode_strings,
 };
@@ -1199,35 +1262,33 @@ static const struct v4l2_ctrl_config vivid_ctrl_radio_tx_rds_blockio = {
 };
 
 
+/* SDR Capture Controls */
 
-/* Video Loop Control */
-
-static int vivid_loop_out_s_ctrl(struct v4l2_ctrl *ctrl)
+static int vivid_sdr_cap_s_ctrl(struct v4l2_ctrl *ctrl)
 {
-       struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_loop_out);
+       struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_sdr_cap);
 
        switch (ctrl->id) {
-       case VIVID_CID_LOOP_VIDEO:
-               dev->loop_video = ctrl->val;
-               vivid_update_quality(dev);
-               vivid_send_source_change(dev, SVID);
-               vivid_send_source_change(dev, HDMI);
+       case VIVID_CID_SDR_CAP_FM_DEVIATION:
+               dev->sdr_fm_deviation = ctrl->val;
                break;
        }
        return 0;
 }
 
-static const struct v4l2_ctrl_ops vivid_loop_out_ctrl_ops = {
-       .s_ctrl = vivid_loop_out_s_ctrl,
+static const struct v4l2_ctrl_ops vivid_sdr_cap_ctrl_ops = {
+       .s_ctrl = vivid_sdr_cap_s_ctrl,
 };
 
-static const struct v4l2_ctrl_config vivid_ctrl_loop_video = {
-       .ops = &vivid_loop_out_ctrl_ops,
-       .id = VIVID_CID_LOOP_VIDEO,
-       .name = "Loop Video",
-       .type = V4L2_CTRL_TYPE_BOOLEAN,
-       .max = 1,
-       .step = 1,
+static const struct v4l2_ctrl_config vivid_ctrl_sdr_cap_fm_deviation = {
+       .ops = &vivid_sdr_cap_ctrl_ops,
+       .id = VIVID_CID_SDR_CAP_FM_DEVIATION,
+       .name = "FM Deviation",
+       .type = V4L2_CTRL_TYPE_INTEGER,
+       .min =    100,
+       .max = 200000,
+       .def =  75000,
+       .step =     1,
 };
 
 
@@ -1248,7 +1309,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
        struct v4l2_ctrl_handler *hdl_user_aud = &dev->ctrl_hdl_user_aud;
        struct v4l2_ctrl_handler *hdl_streaming = &dev->ctrl_hdl_streaming;
        struct v4l2_ctrl_handler *hdl_sdtv_cap = &dev->ctrl_hdl_sdtv_cap;
-       struct v4l2_ctrl_handler *hdl_loop_out = &dev->ctrl_hdl_loop_out;
+       struct v4l2_ctrl_handler *hdl_loop_cap = &dev->ctrl_hdl_loop_cap;
        struct v4l2_ctrl_handler *hdl_vid_cap = &dev->ctrl_hdl_vid_cap;
        struct v4l2_ctrl_handler *hdl_vid_out = &dev->ctrl_hdl_vid_out;
        struct v4l2_ctrl_handler *hdl_vbi_cap = &dev->ctrl_hdl_vbi_cap;
@@ -1274,8 +1335,8 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
        v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_class, NULL);
        v4l2_ctrl_handler_init(hdl_sdtv_cap, 2);
        v4l2_ctrl_new_custom(hdl_sdtv_cap, &vivid_ctrl_class, NULL);
-       v4l2_ctrl_handler_init(hdl_loop_out, 1);
-       v4l2_ctrl_new_custom(hdl_loop_out, &vivid_ctrl_class, NULL);
+       v4l2_ctrl_handler_init(hdl_loop_cap, 1);
+       v4l2_ctrl_new_custom(hdl_loop_cap, &vivid_ctrl_class, NULL);
        v4l2_ctrl_handler_init(hdl_vid_cap, 55);
        v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_class, NULL);
        v4l2_ctrl_handler_init(hdl_vid_out, 26);
@@ -1288,7 +1349,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
        v4l2_ctrl_new_custom(hdl_radio_rx, &vivid_ctrl_class, NULL);
        v4l2_ctrl_handler_init(hdl_radio_tx, 17);
        v4l2_ctrl_new_custom(hdl_radio_tx, &vivid_ctrl_class, NULL);
-       v4l2_ctrl_handler_init(hdl_sdr_cap, 18);
+       v4l2_ctrl_handler_init(hdl_sdr_cap, 19);
        v4l2_ctrl_new_custom(hdl_sdr_cap, &vivid_ctrl_class, NULL);
 
        /* User Controls */
@@ -1365,6 +1426,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
                v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_tstamp_src, NULL);
                dev->colorspace = v4l2_ctrl_new_custom(hdl_vid_cap,
                        &vivid_ctrl_colorspace, NULL);
+               v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_xfer_func, NULL);
                v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_ycbcr_enc, NULL);
                v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_quantization, NULL);
                v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_alpha_mode, NULL);
@@ -1445,7 +1507,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
        }
        if ((dev->has_vid_cap && dev->has_vid_out) ||
            (dev->has_vbi_cap && dev->has_vbi_out))
-               v4l2_ctrl_new_custom(hdl_loop_out, &vivid_ctrl_loop_video, NULL);
+               v4l2_ctrl_new_custom(hdl_loop_cap, &vivid_ctrl_loop_video, NULL);
 
        if (dev->has_fb)
                v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_clear_fb, NULL);
@@ -1518,6 +1580,10 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
                        &vivid_radio_tx_ctrl_ops,
                        V4L2_CID_RDS_TX_MUSIC_SPEECH, 0, 1, 1, 1);
        }
+       if (dev->has_sdr_cap) {
+               v4l2_ctrl_new_custom(hdl_sdr_cap,
+                       &vivid_ctrl_sdr_cap_fm_deviation, NULL);
+       }
        if (hdl_user_gen->error)
                return hdl_user_gen->error;
        if (hdl_user_vid->error)
@@ -1528,8 +1594,8 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
                return hdl_streaming->error;
        if (hdl_sdr_cap->error)
                return hdl_sdr_cap->error;
-       if (hdl_loop_out->error)
-               return hdl_loop_out->error;
+       if (hdl_loop_cap->error)
+               return hdl_loop_cap->error;
 
        if (dev->autogain)
                v4l2_ctrl_auto_cluster(2, &dev->autogain, 0, true);
@@ -1540,6 +1606,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
                v4l2_ctrl_add_handler(hdl_vid_cap, hdl_user_aud, NULL);
                v4l2_ctrl_add_handler(hdl_vid_cap, hdl_streaming, NULL);
                v4l2_ctrl_add_handler(hdl_vid_cap, hdl_sdtv_cap, NULL);
+               v4l2_ctrl_add_handler(hdl_vid_cap, hdl_loop_cap, NULL);
                if (hdl_vid_cap->error)
                        return hdl_vid_cap->error;
                dev->vid_cap_dev.ctrl_handler = hdl_vid_cap;
@@ -1548,7 +1615,6 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
                v4l2_ctrl_add_handler(hdl_vid_out, hdl_user_gen, NULL);
                v4l2_ctrl_add_handler(hdl_vid_out, hdl_user_aud, NULL);
                v4l2_ctrl_add_handler(hdl_vid_out, hdl_streaming, NULL);
-               v4l2_ctrl_add_handler(hdl_vid_out, hdl_loop_out, NULL);
                if (hdl_vid_out->error)
                        return hdl_vid_out->error;
                dev->vid_out_dev.ctrl_handler = hdl_vid_out;
@@ -1557,6 +1623,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
                v4l2_ctrl_add_handler(hdl_vbi_cap, hdl_user_gen, NULL);
                v4l2_ctrl_add_handler(hdl_vbi_cap, hdl_streaming, NULL);
                v4l2_ctrl_add_handler(hdl_vbi_cap, hdl_sdtv_cap, NULL);
+               v4l2_ctrl_add_handler(hdl_vbi_cap, hdl_loop_cap, NULL);
                if (hdl_vbi_cap->error)
                        return hdl_vbi_cap->error;
                dev->vbi_cap_dev.ctrl_handler = hdl_vbi_cap;
@@ -1564,7 +1631,6 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
        if (dev->has_vbi_out) {
                v4l2_ctrl_add_handler(hdl_vbi_out, hdl_user_gen, NULL);
                v4l2_ctrl_add_handler(hdl_vbi_out, hdl_streaming, NULL);
-               v4l2_ctrl_add_handler(hdl_vbi_out, hdl_loop_out, NULL);
                if (hdl_vbi_out->error)
                        return hdl_vbi_out->error;
                dev->vbi_out_dev.ctrl_handler = hdl_vbi_out;
@@ -1607,5 +1673,5 @@ void vivid_free_controls(struct vivid_dev *dev)
        v4l2_ctrl_handler_free(&dev->ctrl_hdl_user_aud);
        v4l2_ctrl_handler_free(&dev->ctrl_hdl_streaming);
        v4l2_ctrl_handler_free(&dev->ctrl_hdl_sdtv_cap);
-       v4l2_ctrl_handler_free(&dev->ctrl_hdl_loop_out);
+       v4l2_ctrl_handler_free(&dev->ctrl_hdl_loop_cap);
 }