OSDN Git Service

media: ccs: Add support for old-style SMIA digital gain
authorSakari Ailus <sakari.ailus@linux.intel.com>
Wed, 23 Sep 2020 14:38:24 +0000 (16:38 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 12 Jan 2021 16:24:07 +0000 (17:24 +0100)
SMIA only has per-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
drivers/media/i2c/ccs/smiapp-reg-defs.h

index f1fecc7..4b765ac 100644 (file)
@@ -673,7 +673,34 @@ static int ccs_set_ctrl(struct v4l2_ctrl *ctrl)
                break;
 
        case V4L2_CID_DIGITAL_GAIN:
-               rval = ccs_write(sensor, DIGITAL_GAIN_GLOBAL, ctrl->val);
+               if (CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
+                   CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL) {
+                       rval = ccs_write(sensor, DIGITAL_GAIN_GLOBAL,
+                                        ctrl->val);
+                       break;
+               }
+
+               rval = ccs_write_addr(sensor,
+                                     SMIAPP_REG_U16_DIGITAL_GAIN_GREENR,
+                                     ctrl->val);
+               if (rval)
+                       break;
+
+               rval = ccs_write_addr(sensor,
+                                     SMIAPP_REG_U16_DIGITAL_GAIN_RED,
+                                     ctrl->val);
+               if (rval)
+                       break;
+
+               rval = ccs_write_addr(sensor,
+                                     SMIAPP_REG_U16_DIGITAL_GAIN_BLUE,
+                                     ctrl->val);
+               if (rval)
+                       break;
+
+               rval = ccs_write_addr(sensor,
+                                     SMIAPP_REG_U16_DIGITAL_GAIN_GREENB,
+                                     ctrl->val);
 
                break;
        case V4L2_CID_EXPOSURE:
@@ -759,7 +786,9 @@ static int ccs_init_controls(struct ccs_sensor *sensor)
                CCS_LIM(sensor, ANALOG_GAIN_CODE_MIN));
 
        if (CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
-           CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL)
+           CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL ||
+           CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
+           SMIAPP_DIGITAL_GAIN_CAPABILITY_PER_CHANNEL)
                v4l2_ctrl_new_std(&sensor->pixel_array->ctrl_handler,
                                  &ccs_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
                                  CCS_LIM(sensor, DIGITAL_GAIN_MIN),
index e80c110..177e3e5 100644 (file)
 #define SMIAPP_DIGITAL_CROP_CAPABILITY_NONE            0
 #define SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP      1
 
+#define SMIAPP_DIGITAL_GAIN_CAPABILITY_PER_CHANNEL     1
+
 #define SMIAPP_BINNING_CAPABILITY_NO                   0
 #define SMIAPP_BINNING_CAPABILITY_YES                  1