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:
                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),