aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/i2c/mt9v032.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2012-07-23 14:03:34 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-09-13 15:29:31 -0400
commit9ec670e2aad515bbb36c020a6ebdc707ace4f24d (patch)
treed734661805139e394b827a06a546a074a9c9f680 /drivers/media/i2c/mt9v032.c
parente9a50e4c2dd8ca871c20480e49125ef67da84722 (diff)
[media] mt9v032: Export horizontal and vertical blanking as V4L2 controls
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/i2c/mt9v032.c')
-rw-r--r--drivers/media/i2c/mt9v032.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/drivers/media/i2c/mt9v032.c b/drivers/media/i2c/mt9v032.c
index bf591b891a74..e2177405dad2 100644
--- a/drivers/media/i2c/mt9v032.c
+++ b/drivers/media/i2c/mt9v032.c
@@ -52,9 +52,11 @@
52#define MT9V032_WINDOW_WIDTH_MAX 752 52#define MT9V032_WINDOW_WIDTH_MAX 752
53#define MT9V032_HORIZONTAL_BLANKING 0x05 53#define MT9V032_HORIZONTAL_BLANKING 0x05
54#define MT9V032_HORIZONTAL_BLANKING_MIN 43 54#define MT9V032_HORIZONTAL_BLANKING_MIN 43
55#define MT9V032_HORIZONTAL_BLANKING_DEF 94
55#define MT9V032_HORIZONTAL_BLANKING_MAX 1023 56#define MT9V032_HORIZONTAL_BLANKING_MAX 1023
56#define MT9V032_VERTICAL_BLANKING 0x06 57#define MT9V032_VERTICAL_BLANKING 0x06
57#define MT9V032_VERTICAL_BLANKING_MIN 4 58#define MT9V032_VERTICAL_BLANKING_MIN 4
59#define MT9V032_VERTICAL_BLANKING_DEF 45
58#define MT9V032_VERTICAL_BLANKING_MAX 3000 60#define MT9V032_VERTICAL_BLANKING_MAX 3000
59#define MT9V032_CHIP_CONTROL 0x07 61#define MT9V032_CHIP_CONTROL 0x07
60#define MT9V032_CHIP_CONTROL_MASTER_MODE (1 << 3) 62#define MT9V032_CHIP_CONTROL_MASTER_MODE (1 << 3)
@@ -138,6 +140,7 @@ struct mt9v032 {
138 u32 sysclk; 140 u32 sysclk;
139 u16 chip_control; 141 u16 chip_control;
140 u16 aec_agc; 142 u16 aec_agc;
143 u16 hblank;
141}; 144};
142 145
143static struct mt9v032 *to_mt9v032(struct v4l2_subdev *sd) 146static struct mt9v032 *to_mt9v032(struct v4l2_subdev *sd)
@@ -195,6 +198,16 @@ mt9v032_update_aec_agc(struct mt9v032 *mt9v032, u16 which, int enable)
195 return 0; 198 return 0;
196} 199}
197 200
201static int
202mt9v032_update_hblank(struct mt9v032 *mt9v032)
203{
204 struct i2c_client *client = v4l2_get_subdevdata(&mt9v032->subdev);
205 struct v4l2_rect *crop = &mt9v032->crop;
206
207 return mt9v032_write(client, MT9V032_HORIZONTAL_BLANKING,
208 max_t(s32, mt9v032->hblank, 660 - crop->width));
209}
210
198#define EXT_CLK 25000000 211#define EXT_CLK 25000000
199 212
200static int mt9v032_power_on(struct mt9v032 *mt9v032) 213static int mt9v032_power_on(struct mt9v032 *mt9v032)
@@ -329,8 +342,7 @@ static int mt9v032_s_stream(struct v4l2_subdev *subdev, int enable)
329 if (ret < 0) 342 if (ret < 0)
330 return ret; 343 return ret;
331 344
332 ret = mt9v032_write(client, MT9V032_HORIZONTAL_BLANKING, 345 ret = mt9v032_update_hblank(mt9v032);
333 max(43, 660 - crop->width));
334 if (ret < 0) 346 if (ret < 0)
335 return ret; 347 return ret;
336 348
@@ -514,6 +526,14 @@ static int mt9v032_s_ctrl(struct v4l2_ctrl *ctrl)
514 return mt9v032_write(client, MT9V032_TOTAL_SHUTTER_WIDTH, 526 return mt9v032_write(client, MT9V032_TOTAL_SHUTTER_WIDTH,
515 ctrl->val); 527 ctrl->val);
516 528
529 case V4L2_CID_HBLANK:
530 mt9v032->hblank = ctrl->val;
531 return mt9v032_update_hblank(mt9v032);
532
533 case V4L2_CID_VBLANK:
534 return mt9v032_write(client, MT9V032_VERTICAL_BLANKING,
535 ctrl->val);
536
517 case V4L2_CID_PIXEL_RATE: 537 case V4L2_CID_PIXEL_RATE:
518 case V4L2_CID_LINK_FREQ: 538 case V4L2_CID_LINK_FREQ:
519 if (mt9v032->link_freq == NULL) 539 if (mt9v032->link_freq == NULL)
@@ -721,7 +741,7 @@ static int mt9v032_probe(struct i2c_client *client,
721 mutex_init(&mt9v032->power_lock); 741 mutex_init(&mt9v032->power_lock);
722 mt9v032->pdata = pdata; 742 mt9v032->pdata = pdata;
723 743
724 v4l2_ctrl_handler_init(&mt9v032->ctrls, ARRAY_SIZE(mt9v032_ctrls) + 6); 744 v4l2_ctrl_handler_init(&mt9v032->ctrls, ARRAY_SIZE(mt9v032_ctrls) + 8);
725 745
726 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, 746 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
727 V4L2_CID_AUTOGAIN, 0, 1, 1, 1); 747 V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
@@ -735,6 +755,14 @@ static int mt9v032_probe(struct i2c_client *client,
735 V4L2_CID_EXPOSURE, MT9V032_TOTAL_SHUTTER_WIDTH_MIN, 755 V4L2_CID_EXPOSURE, MT9V032_TOTAL_SHUTTER_WIDTH_MIN,
736 MT9V032_TOTAL_SHUTTER_WIDTH_MAX, 1, 756 MT9V032_TOTAL_SHUTTER_WIDTH_MAX, 1,
737 MT9V032_TOTAL_SHUTTER_WIDTH_DEF); 757 MT9V032_TOTAL_SHUTTER_WIDTH_DEF);
758 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
759 V4L2_CID_HBLANK, MT9V032_HORIZONTAL_BLANKING_MIN,
760 MT9V032_HORIZONTAL_BLANKING_MAX, 1,
761 MT9V032_HORIZONTAL_BLANKING_DEF);
762 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
763 V4L2_CID_VBLANK, MT9V032_VERTICAL_BLANKING_MIN,
764 MT9V032_VERTICAL_BLANKING_MAX, 1,
765 MT9V032_VERTICAL_BLANKING_DEF);
738 766
739 mt9v032->pixel_rate = 767 mt9v032->pixel_rate =
740 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, 768 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
@@ -777,6 +805,7 @@ static int mt9v032_probe(struct i2c_client *client,
777 mt9v032->format.colorspace = V4L2_COLORSPACE_SRGB; 805 mt9v032->format.colorspace = V4L2_COLORSPACE_SRGB;
778 806
779 mt9v032->aec_agc = MT9V032_AEC_ENABLE | MT9V032_AGC_ENABLE; 807 mt9v032->aec_agc = MT9V032_AEC_ENABLE | MT9V032_AGC_ENABLE;
808 mt9v032->hblank = MT9V032_HORIZONTAL_BLANKING_DEF;
780 mt9v032->sysclk = MT9V032_SYSCLK_FREQ_DEF; 809 mt9v032->sysclk = MT9V032_SYSCLK_FREQ_DEF;
781 810
782 v4l2_i2c_subdev_init(&mt9v032->subdev, client, &mt9v032_subdev_ops); 811 v4l2_i2c_subdev_init(&mt9v032->subdev, client, &mt9v032_subdev_ops);