diff options
-rw-r--r-- | drivers/media/video/ov772x.c | 121 |
1 files changed, 48 insertions, 73 deletions
diff --git a/drivers/media/video/ov772x.c b/drivers/media/video/ov772x.c index 4d54e1899571..702e61a9c02b 100644 --- a/drivers/media/video/ov772x.c +++ b/drivers/media/video/ov772x.c | |||
@@ -271,11 +271,13 @@ | |||
271 | #define SLCT_QVGA 0x40 /* 1 : QVGA */ | 271 | #define SLCT_QVGA 0x40 /* 1 : QVGA */ |
272 | #define ITU656_ON_OFF 0x20 /* ITU656 protocol ON/OFF selection */ | 272 | #define ITU656_ON_OFF 0x20 /* ITU656 protocol ON/OFF selection */ |
273 | /* RGB output format control */ | 273 | /* RGB output format control */ |
274 | #define FMT_MASK 0x0c /* Mask of color format */ | ||
274 | #define FMT_GBR422 0x00 /* 00 : GBR 4:2:2 */ | 275 | #define FMT_GBR422 0x00 /* 00 : GBR 4:2:2 */ |
275 | #define FMT_RGB565 0x04 /* 01 : RGB 565 */ | 276 | #define FMT_RGB565 0x04 /* 01 : RGB 565 */ |
276 | #define FMT_RGB555 0x08 /* 10 : RGB 555 */ | 277 | #define FMT_RGB555 0x08 /* 10 : RGB 555 */ |
277 | #define FMT_RGB444 0x0c /* 11 : RGB 444 */ | 278 | #define FMT_RGB444 0x0c /* 11 : RGB 444 */ |
278 | /* Output format control */ | 279 | /* Output format control */ |
280 | #define OFMT_MASK 0x03 /* Mask of output format */ | ||
279 | #define OFMT_YUV 0x00 /* 00 : YUV */ | 281 | #define OFMT_YUV 0x00 /* 00 : YUV */ |
280 | #define OFMT_P_BRAW 0x01 /* 01 : Processed Bayer RAW */ | 282 | #define OFMT_P_BRAW 0x01 /* 01 : Processed Bayer RAW */ |
281 | #define OFMT_RGB 0x02 /* 10 : RGB */ | 283 | #define OFMT_RGB 0x02 /* 10 : RGB */ |
@@ -299,7 +301,7 @@ | |||
299 | #define GAIN_2x 0x00 /* 000 : 2x */ | 301 | #define GAIN_2x 0x00 /* 000 : 2x */ |
300 | #define GAIN_4x 0x10 /* 001 : 4x */ | 302 | #define GAIN_4x 0x10 /* 001 : 4x */ |
301 | #define GAIN_8x 0x20 /* 010 : 8x */ | 303 | #define GAIN_8x 0x20 /* 010 : 8x */ |
302 | #define GAIN_16x 0x30 /* 011 : 16x */ | 304 | #define GAIN_16x 0x30 /* 011 : 16x */ |
303 | #define GAIN_32x 0x40 /* 100 : 32x */ | 305 | #define GAIN_32x 0x40 /* 100 : 32x */ |
304 | #define GAIN_64x 0x50 /* 101 : 64x */ | 306 | #define GAIN_64x 0x50 /* 101 : 64x */ |
305 | #define GAIN_128x 0x60 /* 110 : 128x */ | 307 | #define GAIN_128x 0x60 /* 110 : 128x */ |
@@ -356,13 +358,6 @@ | |||
356 | #define VOSZ_QVGA 0x78 | 358 | #define VOSZ_QVGA 0x78 |
357 | 359 | ||
358 | /* | 360 | /* |
359 | * bit configure (32 bit) | ||
360 | * this is used in struct ov772x_color_format :: option | ||
361 | */ | ||
362 | #define OP_UV 0x00000001 | ||
363 | #define OP_SWAP_RGB 0x00000002 | ||
364 | |||
365 | /* | ||
366 | * ID | 361 | * ID |
367 | */ | 362 | */ |
368 | #define OV7720 0x7720 | 363 | #define OV7720 0x7720 |
@@ -380,8 +375,9 @@ struct regval_list { | |||
380 | struct ov772x_color_format { | 375 | struct ov772x_color_format { |
381 | char *name; | 376 | char *name; |
382 | __u32 fourcc; | 377 | __u32 fourcc; |
383 | const struct regval_list *regs; | 378 | u8 dsp3; |
384 | unsigned int option; | 379 | u8 com3; |
380 | u8 com7; | ||
385 | }; | 381 | }; |
386 | 382 | ||
387 | struct ov772x_win_size { | 383 | struct ov772x_win_size { |
@@ -404,34 +400,6 @@ struct ov772x_priv { | |||
404 | #define ENDMARKER { 0xff, 0xff } | 400 | #define ENDMARKER { 0xff, 0xff } |
405 | 401 | ||
406 | /* | 402 | /* |
407 | * register setting for color format | ||
408 | */ | ||
409 | static const struct regval_list ov772x_RGB555_regs[] = { | ||
410 | { COM3, 0x00 }, | ||
411 | { COM7, FMT_RGB555 | OFMT_RGB }, | ||
412 | ENDMARKER, | ||
413 | }; | ||
414 | |||
415 | static const struct regval_list ov772x_RGB565_regs[] = { | ||
416 | { COM3, 0x00 }, | ||
417 | { COM7, FMT_RGB565 | OFMT_RGB }, | ||
418 | ENDMARKER, | ||
419 | }; | ||
420 | |||
421 | static const struct regval_list ov772x_YYUV_regs[] = { | ||
422 | { COM3, SWAP_YUV }, | ||
423 | { COM7, OFMT_YUV }, | ||
424 | ENDMARKER, | ||
425 | }; | ||
426 | |||
427 | static const struct regval_list ov772x_UVYY_regs[] = { | ||
428 | { COM3, 0x00 }, | ||
429 | { COM7, OFMT_YUV }, | ||
430 | ENDMARKER, | ||
431 | }; | ||
432 | |||
433 | |||
434 | /* | ||
435 | * register setting for window size | 403 | * register setting for window size |
436 | */ | 404 | */ |
437 | static const struct regval_list ov772x_qvga_regs[] = { | 405 | static const struct regval_list ov772x_qvga_regs[] = { |
@@ -503,34 +471,45 @@ static const struct soc_camera_data_format ov772x_fmt_lists[] = { | |||
503 | static const struct ov772x_color_format ov772x_cfmts[] = { | 471 | static const struct ov772x_color_format ov772x_cfmts[] = { |
504 | { | 472 | { |
505 | SETFOURCC(YUYV), | 473 | SETFOURCC(YUYV), |
506 | .regs = ov772x_YYUV_regs, | 474 | .dsp3 = 0x0, |
475 | .com3 = SWAP_YUV, | ||
476 | .com7 = OFMT_YUV, | ||
507 | }, | 477 | }, |
508 | { | 478 | { |
509 | SETFOURCC(YVYU), | 479 | SETFOURCC(YVYU), |
510 | .regs = ov772x_YYUV_regs, | 480 | .dsp3 = UV_ON, |
511 | .option = OP_UV, | 481 | .com3 = SWAP_YUV, |
482 | .com7 = OFMT_YUV, | ||
512 | }, | 483 | }, |
513 | { | 484 | { |
514 | SETFOURCC(UYVY), | 485 | SETFOURCC(UYVY), |
515 | .regs = ov772x_UVYY_regs, | 486 | .dsp3 = 0x0, |
487 | .com3 = 0x0, | ||
488 | .com7 = OFMT_YUV, | ||
516 | }, | 489 | }, |
517 | { | 490 | { |
518 | SETFOURCC(RGB555), | 491 | SETFOURCC(RGB555), |
519 | .regs = ov772x_RGB555_regs, | 492 | .dsp3 = 0x0, |
520 | .option = OP_SWAP_RGB, | 493 | .com3 = SWAP_RGB, |
494 | .com7 = FMT_RGB555 | OFMT_RGB, | ||
521 | }, | 495 | }, |
522 | { | 496 | { |
523 | SETFOURCC(RGB555X), | 497 | SETFOURCC(RGB555X), |
524 | .regs = ov772x_RGB555_regs, | 498 | .dsp3 = 0x0, |
499 | .com3 = 0x0, | ||
500 | .com7 = FMT_RGB555 | OFMT_RGB, | ||
525 | }, | 501 | }, |
526 | { | 502 | { |
527 | SETFOURCC(RGB565), | 503 | SETFOURCC(RGB565), |
528 | .regs = ov772x_RGB565_regs, | 504 | .dsp3 = 0x0, |
529 | .option = OP_SWAP_RGB, | 505 | .com3 = SWAP_RGB, |
506 | .com7 = FMT_RGB565 | OFMT_RGB, | ||
530 | }, | 507 | }, |
531 | { | 508 | { |
532 | SETFOURCC(RGB565X), | 509 | SETFOURCC(RGB565X), |
533 | .regs = ov772x_RGB565_regs, | 510 | .dsp3 = 0x0, |
511 | .com3 = 0x0, | ||
512 | .com7 = FMT_RGB565 | OFMT_RGB, | ||
534 | }, | 513 | }, |
535 | }; | 514 | }; |
536 | 515 | ||
@@ -738,6 +717,7 @@ static int ov772x_set_fmt(struct soc_camera_device *icd, | |||
738 | { | 717 | { |
739 | struct ov772x_priv *priv = container_of(icd, struct ov772x_priv, icd); | 718 | struct ov772x_priv *priv = container_of(icd, struct ov772x_priv, icd); |
740 | int ret = -EINVAL; | 719 | int ret = -EINVAL; |
720 | u8 val; | ||
741 | int i; | 721 | int i; |
742 | 722 | ||
743 | /* | 723 | /* |
@@ -764,13 +744,6 @@ static int ov772x_set_fmt(struct soc_camera_device *icd, | |||
764 | ov772x_reset(priv->client); | 744 | ov772x_reset(priv->client); |
765 | 745 | ||
766 | /* | 746 | /* |
767 | * set color format | ||
768 | */ | ||
769 | ret = ov772x_write_array(priv->client, priv->fmt->regs); | ||
770 | if (ret < 0) | ||
771 | goto ov772x_set_fmt_error; | ||
772 | |||
773 | /* | ||
774 | * set size format | 747 | * set size format |
775 | */ | 748 | */ |
776 | ret = ov772x_write_array(priv->client, priv->win->regs); | 749 | ret = ov772x_write_array(priv->client, priv->win->regs); |
@@ -778,32 +751,34 @@ static int ov772x_set_fmt(struct soc_camera_device *icd, | |||
778 | goto ov772x_set_fmt_error; | 751 | goto ov772x_set_fmt_error; |
779 | 752 | ||
780 | /* | 753 | /* |
781 | * set COM7 bit ( QVGA or VGA ) | 754 | * set DSP_CTRL3 |
782 | */ | 755 | */ |
783 | ret = ov772x_mask_set(priv->client, | 756 | val = priv->fmt->dsp3; |
784 | COM7, SLCT_MASK, priv->win->com7_bit); | 757 | if (val) { |
785 | if (ret < 0) | ||
786 | goto ov772x_set_fmt_error; | ||
787 | |||
788 | /* | ||
789 | * set UV setting | ||
790 | */ | ||
791 | if (priv->fmt->option & OP_UV) { | ||
792 | ret = ov772x_mask_set(priv->client, | 758 | ret = ov772x_mask_set(priv->client, |
793 | DSP_CTRL3, UV_MASK, UV_ON); | 759 | DSP_CTRL3, UV_MASK, val); |
794 | if (ret < 0) | 760 | if (ret < 0) |
795 | goto ov772x_set_fmt_error; | 761 | goto ov772x_set_fmt_error; |
796 | } | 762 | } |
797 | 763 | ||
798 | /* | 764 | /* |
799 | * set SWAP setting | 765 | * set COM3 |
800 | */ | 766 | */ |
801 | if (priv->fmt->option & OP_SWAP_RGB) { | 767 | val = priv->fmt->com3; |
802 | ret = ov772x_mask_set(priv->client, | 768 | ret = ov772x_mask_set(priv->client, |
803 | COM3, SWAP_MASK, SWAP_RGB); | 769 | COM3, SWAP_MASK, val); |
804 | if (ret < 0) | 770 | if (ret < 0) |
805 | goto ov772x_set_fmt_error; | 771 | goto ov772x_set_fmt_error; |
806 | } | 772 | |
773 | /* | ||
774 | * set COM7 | ||
775 | */ | ||
776 | val = priv->win->com7_bit | priv->fmt->com7; | ||
777 | ret = ov772x_mask_set(priv->client, | ||
778 | COM7, (SLCT_MASK | FMT_MASK | OFMT_MASK), | ||
779 | val); | ||
780 | if (ret < 0) | ||
781 | goto ov772x_set_fmt_error; | ||
807 | 782 | ||
808 | return ret; | 783 | return ret; |
809 | 784 | ||