aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/tvp5150.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/tvp5150.c')
-rw-r--r--drivers/media/video/tvp5150.c70
1 files changed, 68 insertions, 2 deletions
diff --git a/drivers/media/video/tvp5150.c b/drivers/media/video/tvp5150.c
index df7f304416c9..20e63593e441 100644
--- a/drivers/media/video/tvp5150.c
+++ b/drivers/media/video/tvp5150.c
@@ -541,7 +541,7 @@ static struct i2c_vbi_ram_value vbi_ram_default[] =
541 0x69, 0x8c, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 } 541 0x69, 0x8c, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 }
542 }, 542 },
543 {0x110, /* Wide Screen Signal, PAL/SECAM */ 543 {0x110, /* Wide Screen Signal, PAL/SECAM */
544 {V4L2_SLICED_WSS_625,20,21,1}, 544 {V4L2_SLICED_WSS_625,23,23,1},
545 { 0x5b, 0x55, 0xc5, 0xff, 0x00, 0x71, 0x6e, 0x42, 545 { 0x5b, 0x55, 0xc5, 0xff, 0x00, 0x71, 0x6e, 0x42,
546 0xa6, 0xcd, 0x0f, 0x00, 0x00, 0x00, 0x3a, 0x00 } 546 0xa6, 0xcd, 0x0f, 0x00, 0x00, 0x00, 0x3a, 0x00 }
547 }, 547 },
@@ -649,7 +649,7 @@ static int tvp5150_set_vbi(struct i2c_client *c,
649 649
650 if (std == V4L2_STD_ALL) { 650 if (std == V4L2_STD_ALL) {
651 tvp5150_err("VBI can't be configured without knowing number of lines\n"); 651 tvp5150_err("VBI can't be configured without knowing number of lines\n");
652 return -EINVAL; 652 return 0;
653 } else if (std && V4L2_STD_625_50) { 653 } else if (std && V4L2_STD_625_50) {
654 /* Don't follow NTSC Line number convension */ 654 /* Don't follow NTSC Line number convension */
655 line += 3; 655 line += 3;
@@ -686,6 +686,37 @@ static int tvp5150_set_vbi(struct i2c_client *c,
686 return type; 686 return type;
687} 687}
688 688
689static int tvp5150_get_vbi(struct i2c_client *c,
690 const struct i2c_vbi_ram_value *regs, int line)
691{
692 struct tvp5150 *decoder = i2c_get_clientdata(c);
693 v4l2_std_id std=decoder->norm;
694 u8 reg;
695 int pos, type=0;
696
697 if (std == V4L2_STD_ALL) {
698 tvp5150_err("VBI can't be configured without knowing number of lines\n");
699 return 0;
700 } else if (std && V4L2_STD_625_50) {
701 /* Don't follow NTSC Line number convension */
702 line += 3;
703 }
704
705 if (line<6||line>27)
706 return 0;
707
708 reg=((line-6)<<1)+TVP5150_LINE_MODE_INI;
709
710 pos=tvp5150_read(c, reg)&0x0f;
711 if (pos<0x0f)
712 type=regs[pos].type.vbi_type;
713
714 pos=tvp5150_read(c, reg+1)&0x0f;
715 if (pos<0x0f)
716 type|=regs[pos].type.vbi_type;
717
718 return type;
719}
689static int tvp5150_set_std(struct i2c_client *c, v4l2_std_id std) 720static int tvp5150_set_std(struct i2c_client *c, v4l2_std_id std)
690{ 721{
691 struct tvp5150 *decoder = i2c_get_clientdata(c); 722 struct tvp5150 *decoder = i2c_get_clientdata(c);
@@ -856,9 +887,43 @@ static int tvp5150_command(struct i2c_client *c,
856 vbi_ram_default, 887 vbi_ram_default,
857 svbi->service_lines[0][i],0xf0,i,3); 888 svbi->service_lines[0][i],0xf0,i,3);
858 } 889 }
890 /* Enables FIFO */
891 tvp5150_write(c, TVP5150_FIFO_OUT_CTRL,1);
892 } else {
893 /* Disables FIFO*/
894 tvp5150_write(c, TVP5150_FIFO_OUT_CTRL,0);
895
896 /* Disable Full Field */
897 tvp5150_write(c, TVP5150_FULL_FIELD_ENA, 0);
898
899 /* Disable Line modes */
900 for (i=TVP5150_LINE_MODE_INI; i<=TVP5150_LINE_MODE_END; i++)
901 tvp5150_write(c, i, 0xff);
902 }
903 break;
904 }
905 case VIDIOC_G_FMT:
906 {
907 struct v4l2_format *fmt;
908 struct v4l2_sliced_vbi_format *svbi;
909
910 int i, mask=0;
911
912 fmt = arg;
913 if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
914 return -EINVAL;
915 svbi = &fmt->fmt.sliced;
916 memset(svbi, 0, sizeof(*svbi));
917
918 for (i = 0; i <= 23; i++) {
919 svbi->service_lines[0][i]=tvp5150_get_vbi(c,
920 vbi_ram_default,i);
921 mask|=svbi->service_lines[0][i];
859 } 922 }
923 svbi->service_set=mask;
860 break; 924 break;
861 } 925 }
926
862#ifdef CONFIG_VIDEO_ADV_DEBUG 927#ifdef CONFIG_VIDEO_ADV_DEBUG
863 case VIDIOC_INT_G_REGISTER: 928 case VIDIOC_INT_G_REGISTER:
864 { 929 {
@@ -883,6 +948,7 @@ static int tvp5150_command(struct i2c_client *c,
883 } 948 }
884#endif 949#endif
885 950
951 case VIDIOC_LOG_STATUS:
886 case DECODER_DUMP: 952 case DECODER_DUMP:
887 dump_reg(c); 953 dump_reg(c);
888 break; 954 break;