media: ccs: Add digital gain support
authorSakari Ailus <sakari.ailus@linux.intel.com>
Wed, 23 Sep 2020 14:26:33 +0000 (16:26 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 12 Jan 2021 16:15:15 +0000 (17:15 +0100)
CCS supports global (all-component) digital gain. Add support for it.

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

index b39ae5f..f1fecc7 100644 (file)
@@ -671,6 +671,11 @@ static int ccs_set_ctrl(struct v4l2_ctrl *ctrl)
                rval = ccs_write(sensor, ANALOG_GAIN_CODE_GLOBAL, ctrl->val);
 
                break;
+
+       case V4L2_CID_DIGITAL_GAIN:
+               rval = ccs_write(sensor, DIGITAL_GAIN_GLOBAL, ctrl->val);
+
+               break;
        case V4L2_CID_EXPOSURE:
                rval = ccs_write(sensor, COARSE_INTEGRATION_TIME, ctrl->val);
 
@@ -739,7 +744,7 @@ static int ccs_init_controls(struct ccs_sensor *sensor)
        struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
        int rval;
 
-       rval = v4l2_ctrl_handler_init(&sensor->pixel_array->ctrl_handler, 12);
+       rval = v4l2_ctrl_handler_init(&sensor->pixel_array->ctrl_handler, 13);
        if (rval)
                return rval;
 
@@ -753,6 +758,16 @@ static int ccs_init_controls(struct ccs_sensor *sensor)
                max(CCS_LIM(sensor, ANALOG_GAIN_CODE_STEP), 1U),
                CCS_LIM(sensor, ANALOG_GAIN_CODE_MIN));
 
+       if (CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
+           CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL)
+               v4l2_ctrl_new_std(&sensor->pixel_array->ctrl_handler,
+                                 &ccs_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
+                                 CCS_LIM(sensor, DIGITAL_GAIN_MIN),
+                                 CCS_LIM(sensor, DIGITAL_GAIN_MAX),
+                                 max(CCS_LIM(sensor, DIGITAL_GAIN_STEP_SIZE),
+                                     1U),
+                                 0x100);
+
        /* Exposure limits will be updated soon, use just something here. */
        sensor->exposure = v4l2_ctrl_new_std(
                &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,