Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12db5607 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

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
Loading
Loading
Loading
Loading
+68 −2
Original line number Diff line number Diff line
@@ -541,7 +541,7 @@ static struct i2c_vbi_ram_value vbi_ram_default[] =
		  0x69, 0x8c, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 }
	},
	{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,
		  0xa6, 0xcd, 0x0f, 0x00, 0x00, 0x00, 0x3a, 0x00 }
	},
@@ -649,7 +649,7 @@ static int tvp5150_set_vbi(struct i2c_client *c,

	if (std == V4L2_STD_ALL) {
		tvp5150_err("VBI can't be configured without knowing number of lines\n");
		return -EINVAL;
		return 0;
	} else if (std && V4L2_STD_625_50) {
		/* Don't follow NTSC Line number convension */
		line += 3;
@@ -686,6 +686,37 @@ static int tvp5150_set_vbi(struct i2c_client *c,
	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)
{
	struct tvp5150 *decoder = i2c_get_clientdata(c);
@@ -856,9 +887,43 @@ static int tvp5150_command(struct i2c_client *c,
					 vbi_ram_default,
					 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;
	}

#ifdef CONFIG_VIDEO_ADV_DEBUG
	case VIDIOC_INT_G_REGISTER:
	{
@@ -883,6 +948,7 @@ static int tvp5150_command(struct i2c_client *c,
	}
#endif

	case VIDIOC_LOG_STATUS:
	case DECODER_DUMP:
		dump_reg(c);
		break;
+2 −1
Original line number Diff line number Diff line
@@ -160,7 +160,8 @@ struct msp_matrix {

/* 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
   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)

/* Used to obtain the sliced VBI packet from a readback register. Not all