Commit 12db5607 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by Mauro Carvalho Chehab

V4L/DVB (3420): Added iocls to configure VBI on tvp5150

- Added iocls to configure VBI on tvp5150
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 4d0dddb1
...@@ -541,7 +541,7 @@ static struct i2c_vbi_ram_value vbi_ram_default[] = ...@@ -541,7 +541,7 @@ static struct i2c_vbi_ram_value vbi_ram_default[] =
0x69, 0x8c, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 } 0x69, 0x8c, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 }
}, },
{0x110, /* Wide Screen Signal, PAL/SECAM */ {0x110, /* Wide Screen Signal, PAL/SECAM */
{V4L2_SLICED_WSS_625,20,21,1}, {V4L2_SLICED_WSS_625,23,23,1},
{ 0x5b, 0x55, 0xc5, 0xff, 0x00, 0x71, 0x6e, 0x42, { 0x5b, 0x55, 0xc5, 0xff, 0x00, 0x71, 0x6e, 0x42,
0xa6, 0xcd, 0x0f, 0x00, 0x00, 0x00, 0x3a, 0x00 } 0xa6, 0xcd, 0x0f, 0x00, 0x00, 0x00, 0x3a, 0x00 }
}, },
...@@ -649,7 +649,7 @@ static int tvp5150_set_vbi(struct i2c_client *c, ...@@ -649,7 +649,7 @@ static int tvp5150_set_vbi(struct i2c_client *c,
if (std == V4L2_STD_ALL) { if (std == V4L2_STD_ALL) {
tvp5150_err("VBI can't be configured without knowing number of lines\n"); tvp5150_err("VBI can't be configured without knowing number of lines\n");
return -EINVAL; return 0;
} else if (std && V4L2_STD_625_50) { } else if (std && V4L2_STD_625_50) {
/* Don't follow NTSC Line number convension */ /* Don't follow NTSC Line number convension */
line += 3; line += 3;
...@@ -686,6 +686,37 @@ static int tvp5150_set_vbi(struct i2c_client *c, ...@@ -686,6 +686,37 @@ static int tvp5150_set_vbi(struct i2c_client *c,
return type; return type;
} }
static int tvp5150_get_vbi(struct i2c_client *c,
const struct i2c_vbi_ram_value *regs, int line)
{
struct tvp5150 *decoder = i2c_get_clientdata(c);
v4l2_std_id std=decoder->norm;
u8 reg;
int pos, type=0;
if (std == V4L2_STD_ALL) {
tvp5150_err("VBI can't be configured without knowing number of lines\n");
return 0;
} else if (std && V4L2_STD_625_50) {
/* Don't follow NTSC Line number convension */
line += 3;
}
if (line<6||line>27)
return 0;
reg=((line-6)<<1)+TVP5150_LINE_MODE_INI;
pos=tvp5150_read(c, reg)&0x0f;
if (pos<0x0f)
type=regs[pos].type.vbi_type;
pos=tvp5150_read(c, reg+1)&0x0f;
if (pos<0x0f)
type|=regs[pos].type.vbi_type;
return type;
}
static int tvp5150_set_std(struct i2c_client *c, v4l2_std_id std) static int tvp5150_set_std(struct i2c_client *c, v4l2_std_id std)
{ {
struct tvp5150 *decoder = i2c_get_clientdata(c); struct tvp5150 *decoder = i2c_get_clientdata(c);
...@@ -856,9 +887,43 @@ static int tvp5150_command(struct i2c_client *c, ...@@ -856,9 +887,43 @@ static int tvp5150_command(struct i2c_client *c,
vbi_ram_default, vbi_ram_default,
svbi->service_lines[0][i],0xf0,i,3); svbi->service_lines[0][i],0xf0,i,3);
} }
/* Enables FIFO */
tvp5150_write(c, TVP5150_FIFO_OUT_CTRL,1);
} else {
/* Disables FIFO*/
tvp5150_write(c, TVP5150_FIFO_OUT_CTRL,0);
/* Disable Full Field */
tvp5150_write(c, TVP5150_FULL_FIELD_ENA, 0);
/* Disable Line modes */
for (i=TVP5150_LINE_MODE_INI; i<=TVP5150_LINE_MODE_END; i++)
tvp5150_write(c, i, 0xff);
}
break;
}
case VIDIOC_G_FMT:
{
struct v4l2_format *fmt;
struct v4l2_sliced_vbi_format *svbi;
int i, mask=0;
fmt = arg;
if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
return -EINVAL;
svbi = &fmt->fmt.sliced;
memset(svbi, 0, sizeof(*svbi));
for (i = 0; i <= 23; i++) {
svbi->service_lines[0][i]=tvp5150_get_vbi(c,
vbi_ram_default,i);
mask|=svbi->service_lines[0][i];
} }
svbi->service_set=mask;
break; break;
} }
#ifdef CONFIG_VIDEO_ADV_DEBUG #ifdef CONFIG_VIDEO_ADV_DEBUG
case VIDIOC_INT_G_REGISTER: case VIDIOC_INT_G_REGISTER:
{ {
...@@ -883,6 +948,7 @@ static int tvp5150_command(struct i2c_client *c, ...@@ -883,6 +948,7 @@ static int tvp5150_command(struct i2c_client *c,
} }
#endif #endif
case VIDIOC_LOG_STATUS:
case DECODER_DUMP: case DECODER_DUMP:
dump_reg(c); dump_reg(c);
break; break;
......
...@@ -160,7 +160,8 @@ struct msp_matrix { ...@@ -160,7 +160,8 @@ struct msp_matrix {
/* Used to generate VBI signals on a video signal. v4l2_sliced_vbi_data is /* Used to generate VBI signals on a video signal. v4l2_sliced_vbi_data is
filled with the data packets that should be output. Note that if you set filled with the data packets that should be output. Note that if you set
the line field to 0, then that VBI signal is disabled. */ the line field to 0, then that VBI signal is disabled. If no
valid VBI data was found, then the type field is set to 0 on return. */
#define VIDIOC_INT_S_VBI_DATA _IOW ('d', 105, struct v4l2_sliced_vbi_data) #define VIDIOC_INT_S_VBI_DATA _IOW ('d', 105, struct v4l2_sliced_vbi_data)
/* Used to obtain the sliced VBI packet from a readback register. Not all /* Used to obtain the sliced VBI packet from a readback register. Not all
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment