From b336af7ccc70d05e695b4eee55a8e03645d21348 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 21 Jun 2012 14:40:10 +0200 Subject: sensor: Support setting gains selectively Setting a gain value to OMAP3_ISP_SENSOR_GAIN_KEEP will prevent that gain from being set. Signed-off-by: Laurent Pinchart --- isp/controls.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'isp/controls.c') 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); } -- cgit v1.2.3