diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2012-07-23 14:03:34 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-09-13 15:29:31 -0400 |
commit | 9ec670e2aad515bbb36c020a6ebdc707ace4f24d (patch) | |
tree | d734661805139e394b827a06a546a074a9c9f680 /drivers/media/i2c/mt9v032.c | |
parent | e9a50e4c2dd8ca871c20480e49125ef67da84722 (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.c | 35 |
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 | ||
143 | static struct mt9v032 *to_mt9v032(struct v4l2_subdev *sd) | 146 | static 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 | ||
201 | static int | ||
202 | mt9v032_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 | ||
200 | static int mt9v032_power_on(struct mt9v032 *mt9v032) | 213 | static 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); |