aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/mt9v022.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/mt9v022.c')
-rw-r--r--drivers/media/video/mt9v022.c62
1 files changed, 39 insertions, 23 deletions
diff --git a/drivers/media/video/mt9v022.c b/drivers/media/video/mt9v022.c
index 6eb4b3a818d7..3871d4a2d8ff 100644
--- a/drivers/media/video/mt9v022.c
+++ b/drivers/media/video/mt9v022.c
@@ -340,32 +340,11 @@ static unsigned long mt9v022_query_bus_param(struct soc_camera_device *icd)
340 width_flag; 340 width_flag;
341} 341}
342 342
343static int mt9v022_set_fmt(struct soc_camera_device *icd, 343static int mt9v022_set_crop(struct soc_camera_device *icd,
344 __u32 pixfmt, struct v4l2_rect *rect) 344 struct v4l2_rect *rect)
345{ 345{
346 struct mt9v022 *mt9v022 = container_of(icd, struct mt9v022, icd);
347 int ret; 346 int ret;
348 347
349 /* The caller provides a supported format, as verified per call to
350 * icd->try_fmt(), datawidth is from our supported format list */
351 switch (pixfmt) {
352 case V4L2_PIX_FMT_GREY:
353 case V4L2_PIX_FMT_Y16:
354 if (mt9v022->model != V4L2_IDENT_MT9V022IX7ATM)
355 return -EINVAL;
356 break;
357 case V4L2_PIX_FMT_SBGGR8:
358 case V4L2_PIX_FMT_SBGGR16:
359 if (mt9v022->model != V4L2_IDENT_MT9V022IX7ATC)
360 return -EINVAL;
361 break;
362 case 0:
363 /* No format change, only geometry */
364 break;
365 default:
366 return -EINVAL;
367 }
368
369 /* Like in example app. Contradicts the datasheet though */ 348 /* Like in example app. Contradicts the datasheet though */
370 ret = reg_read(icd, MT9V022_AEC_AGC_ENABLE); 349 ret = reg_read(icd, MT9V022_AEC_AGC_ENABLE);
371 if (ret >= 0) { 350 if (ret >= 0) {
@@ -403,6 +382,42 @@ static int mt9v022_set_fmt(struct soc_camera_device *icd,
403 return 0; 382 return 0;
404} 383}
405 384
385static int mt9v022_set_fmt(struct soc_camera_device *icd,
386 struct v4l2_format *f)
387{
388 struct mt9v022 *mt9v022 = container_of(icd, struct mt9v022, icd);
389 struct v4l2_pix_format *pix = &f->fmt.pix;
390 struct v4l2_rect rect = {
391 .left = icd->x_current,
392 .top = icd->y_current,
393 .width = pix->width,
394 .height = pix->height,
395 };
396
397 /* The caller provides a supported format, as verified per call to
398 * icd->try_fmt(), datawidth is from our supported format list */
399 switch (pix->pixelformat) {
400 case V4L2_PIX_FMT_GREY:
401 case V4L2_PIX_FMT_Y16:
402 if (mt9v022->model != V4L2_IDENT_MT9V022IX7ATM)
403 return -EINVAL;
404 break;
405 case V4L2_PIX_FMT_SBGGR8:
406 case V4L2_PIX_FMT_SBGGR16:
407 if (mt9v022->model != V4L2_IDENT_MT9V022IX7ATC)
408 return -EINVAL;
409 break;
410 case 0:
411 /* No format change, only geometry */
412 break;
413 default:
414 return -EINVAL;
415 }
416
417 /* No support for scaling on this camera, just crop. */
418 return mt9v022_set_crop(icd, &rect);
419}
420
406static int mt9v022_try_fmt(struct soc_camera_device *icd, 421static int mt9v022_try_fmt(struct soc_camera_device *icd,
407 struct v4l2_format *f) 422 struct v4l2_format *f)
408{ 423{
@@ -544,6 +559,7 @@ static struct soc_camera_ops mt9v022_ops = {
544 .release = mt9v022_release, 559 .release = mt9v022_release,
545 .start_capture = mt9v022_start_capture, 560 .start_capture = mt9v022_start_capture,
546 .stop_capture = mt9v022_stop_capture, 561 .stop_capture = mt9v022_stop_capture,
562 .set_crop = mt9v022_set_crop,
547 .set_fmt = mt9v022_set_fmt, 563 .set_fmt = mt9v022_set_fmt,
548 .try_fmt = mt9v022_try_fmt, 564 .try_fmt = mt9v022_try_fmt,
549 .set_bus_param = mt9v022_set_bus_param, 565 .set_bus_param = mt9v022_set_bus_param,