summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isp/controls.c29
-rw-r--r--isp/omap3isp.h6
2 files changed, 22 insertions, 13 deletions
diff --git a/isp/controls.c b/isp/controls.c
index 4939ae0..b189f7b 100644
--- a/isp/controls.c
+++ b/isp/controls.c
@@ -380,19 +380,26 @@ int omap3_isp_sensor_set_gain(struct omap3_isp_device *isp, unsigned int gain)
return v4l2_subdev_set_controls(isp->sensor.entity, ARRAY_SIZE(ctrls), ctrls);
}
-int omap3_isp_sensor_set_gains(struct omap3_isp_device *isp, unsigned int red,
- unsigned int green, unsigned int blue)
+int omap3_isp_sensor_set_gains(struct omap3_isp_device *isp,
+ int red, int green, int blue)
{
struct v4l2_ext_control ctrls[4];
+ unsigned int i = 0;
- ctrls[0].id = V4L2_CID_GAIN_RED;
- ctrls[0].value = red;
- ctrls[1].id = V4L2_CID_GAIN_GREEN1;
- ctrls[1].value = green;
- ctrls[2].id = V4L2_CID_GAIN_GREEN2;
- ctrls[2].value = green;
- ctrls[3].id = V4L2_CID_GAIN_BLUE;
- ctrls[3].value = blue;
+ if (red != OMAP3_ISP_SENSOR_GAIN_KEEP) {
+ ctrls[i].id = V4L2_CID_GAIN_RED;
+ ctrls[i++].value = red;
+ }
+ if (green != OMAP3_ISP_SENSOR_GAIN_KEEP) {
+ ctrls[i].id = V4L2_CID_GAIN_GREEN1;
+ ctrls[i++].value = green;
+ ctrls[i].id = V4L2_CID_GAIN_GREEN2;
+ ctrls[i++].value = green;
+ }
+ if (blue != OMAP3_ISP_SENSOR_GAIN_KEEP) {
+ ctrls[i].id = V4L2_CID_GAIN_BLUE;
+ ctrls[i++].value = blue;
+ }
- return v4l2_subdev_set_controls(isp->sensor.entity, ARRAY_SIZE(ctrls), ctrls);
+ return v4l2_subdev_set_controls(isp->sensor.entity, i, ctrls);
}
diff --git a/isp/omap3isp.h b/isp/omap3isp.h
index 1e9489f..545c82c 100644
--- a/isp/omap3isp.h
+++ b/isp/omap3isp.h
@@ -86,12 +86,14 @@ int omap3_isp_preview_set_saturation(struct omap3_isp_device *isp, float value);
int omap3_isp_preview_set_gain(struct omap3_isp_device *isp, float gain);
int omap3_isp_preview_set_white_balance(struct omap3_isp_device *isp, float gains[4]);
+#define OMAP3_ISP_SENSOR_GAIN_KEEP -1
+
int omap3_isp_sensor_get_exposure(struct omap3_isp_device *isp,
unsigned int *exposure);
int omap3_isp_sensor_set_exposure(struct omap3_isp_device *isp,
unsigned int exposure);
int omap3_isp_sensor_set_gain(struct omap3_isp_device *isp, unsigned int gain);
-int omap3_isp_sensor_set_gains(struct omap3_isp_device *isp, unsigned int red,
- unsigned int green, unsigned int blue);
+int omap3_isp_sensor_set_gains(struct omap3_isp_device *isp,
+ int red, int green, int blue);
#endif