OSDN Git Service

media: ccs: Add shading correction and luminance correction level controls
authorSakari Ailus <sakari.ailus@linux.intel.com>
Fri, 25 Sep 2020 08:30:32 +0000 (10:30 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 12 Jan 2021 16:32:15 +0000 (17:32 +0100)
Add controls for supporting lens shading correction, including colour
shading and luminance correction level.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/i2c/ccs/ccs-core.c
drivers/media/i2c/ccs/ccs.h

index 7591a52..12c30fb 100644 (file)
@@ -757,6 +757,19 @@ static int ccs_set_ctrl(struct v4l2_ctrl *ctrl)
                rval = ccs_write(sensor, TEST_DATA_GREENB, ctrl->val);
 
                break;
+       case V4L2_CID_CCS_SHADING_CORRECTION:
+               rval = ccs_write(sensor, SHADING_CORRECTION_EN,
+                                ctrl->val ? CCS_SHADING_CORRECTION_EN_ENABLE :
+                                0);
+
+               if (!rval && sensor->luminance_level)
+                       v4l2_ctrl_activate(sensor->luminance_level, ctrl->val);
+
+               break;
+       case V4L2_CID_CCS_LUMINANCE_CORRECTION_LEVEL:
+               rval = ccs_write(sensor, LUMINANCE_CORRECTION_LEVEL, ctrl->val);
+
+               break;
        case V4L2_CID_PIXEL_RATE:
                /* For v4l2_ctrl_s_ctrl_int64() used internally. */
                rval = 0;
@@ -877,6 +890,39 @@ static int ccs_init_controls(struct ccs_sensor *sensor)
        }
        }
 
+       if (CCS_LIM(sensor, SHADING_CORRECTION_CAPABILITY) &
+           (CCS_SHADING_CORRECTION_CAPABILITY_COLOR_SHADING |
+            CCS_SHADING_CORRECTION_CAPABILITY_LUMINANCE_CORRECTION)) {
+               const struct v4l2_ctrl_config ctrl_cfg = {
+                       .name = "Shading Correction",
+                       .type = V4L2_CTRL_TYPE_BOOLEAN,
+                       .id = V4L2_CID_CCS_SHADING_CORRECTION,
+                       .ops = &ccs_ctrl_ops,
+                       .max = 1,
+                       .step = 1,
+               };
+
+               v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
+                                    &ctrl_cfg, NULL);
+       }
+
+       if (CCS_LIM(sensor, SHADING_CORRECTION_CAPABILITY) &
+           CCS_SHADING_CORRECTION_CAPABILITY_LUMINANCE_CORRECTION) {
+               const struct v4l2_ctrl_config ctrl_cfg = {
+                       .name = "Luminance Correction Level",
+                       .type = V4L2_CTRL_TYPE_BOOLEAN,
+                       .id = V4L2_CID_CCS_LUMINANCE_CORRECTION_LEVEL,
+                       .ops = &ccs_ctrl_ops,
+                       .max = 255,
+                       .step = 1,
+                       .def = 128,
+               };
+
+               sensor->luminance_level =
+                       v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
+                                            &ctrl_cfg, NULL);
+       }
+
        if (CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
            CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL ||
            CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
index 9fc3333..cc33c9b 100644 (file)
@@ -268,6 +268,7 @@ struct ccs_sensor {
        struct v4l2_ctrl *vblank;
        struct v4l2_ctrl *hblank;
        struct v4l2_ctrl *pixel_rate_parray;
+       struct v4l2_ctrl *luminance_level;
        /* src controls */
        struct v4l2_ctrl *link_freq;
        struct v4l2_ctrl *pixel_rate_csi;