Commit 3dd6b560 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

media: Don't let tvp5150_get_vbi() go out of vbi_ram_default array

As pointed by Dan, possible values for bits[3:0] of te Line Mode Registers
can range from 0x0 to 0xf, but the check logic allow values ranging
from 0x0 to 0xe.

As static arrays are initialized with zero, using a value without
an explicit initializer at the array won't cause any harm.
Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent fdbeb962
...@@ -505,80 +505,77 @@ static struct i2c_vbi_ram_value vbi_ram_default[] = ...@@ -505,80 +505,77 @@ static struct i2c_vbi_ram_value vbi_ram_default[] =
/* FIXME: Current api doesn't handle all VBI types, those not /* FIXME: Current api doesn't handle all VBI types, those not
yet supported are placed under #if 0 */ yet supported are placed under #if 0 */
#if 0 #if 0
{0x010, /* Teletext, SECAM, WST System A */ [0] = {0x010, /* Teletext, SECAM, WST System A */
{V4L2_SLICED_TELETEXT_SECAM,6,23,1}, {V4L2_SLICED_TELETEXT_SECAM,6,23,1},
{ 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x26, { 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x26,
0xe6, 0xb4, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00 } 0xe6, 0xb4, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00 }
}, },
#endif #endif
{0x030, /* Teletext, PAL, WST System B */ [1] = {0x030, /* Teletext, PAL, WST System B */
{V4L2_SLICED_TELETEXT_B,6,22,1}, {V4L2_SLICED_TELETEXT_B,6,22,1},
{ 0xaa, 0xaa, 0xff, 0xff, 0x27, 0x2e, 0x20, 0x2b, { 0xaa, 0xaa, 0xff, 0xff, 0x27, 0x2e, 0x20, 0x2b,
0xa6, 0x72, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00 } 0xa6, 0x72, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00 }
}, },
#if 0 #if 0
{0x050, /* Teletext, PAL, WST System C */ [2] = {0x050, /* Teletext, PAL, WST System C */
{V4L2_SLICED_TELETEXT_PAL_C,6,22,1}, {V4L2_SLICED_TELETEXT_PAL_C,6,22,1},
{ 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x22, { 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x22,
0xa6, 0x98, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 } 0xa6, 0x98, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 }
}, },
{0x070, /* Teletext, NTSC, WST System B */ [3] = {0x070, /* Teletext, NTSC, WST System B */
{V4L2_SLICED_TELETEXT_NTSC_B,10,21,1}, {V4L2_SLICED_TELETEXT_NTSC_B,10,21,1},
{ 0xaa, 0xaa, 0xff, 0xff, 0x27, 0x2e, 0x20, 0x23, { 0xaa, 0xaa, 0xff, 0xff, 0x27, 0x2e, 0x20, 0x23,
0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 } 0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 }
}, },
{0x090, /* Tetetext, NTSC NABTS System C */ [4] = {0x090, /* Tetetext, NTSC NABTS System C */
{V4L2_SLICED_TELETEXT_NTSC_C,10,21,1}, {V4L2_SLICED_TELETEXT_NTSC_C,10,21,1},
{ 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x22, { 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x22,
0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x15, 0x00 } 0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x15, 0x00 }
}, },
{0x0b0, /* Teletext, NTSC-J, NABTS System D */ [5] = {0x0b0, /* Teletext, NTSC-J, NABTS System D */
{V4L2_SLICED_TELETEXT_NTSC_D,10,21,1}, {V4L2_SLICED_TELETEXT_NTSC_D,10,21,1},
{ 0xaa, 0xaa, 0xff, 0xff, 0xa7, 0x2e, 0x20, 0x23, { 0xaa, 0xaa, 0xff, 0xff, 0xa7, 0x2e, 0x20, 0x23,
0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 } 0x69, 0x93, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00 }
}, },
{0x0d0, /* Closed Caption, PAL/SECAM */ [6] = {0x0d0, /* Closed Caption, PAL/SECAM */
{V4L2_SLICED_CAPTION_625,22,22,1}, {V4L2_SLICED_CAPTION_625,22,22,1},
{ 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02, { 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02,
0xa6, 0x7b, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 } 0xa6, 0x7b, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 }
}, },
#endif #endif
{0x0f0, /* Closed Caption, NTSC */ [7] = {0x0f0, /* Closed Caption, NTSC */
{V4L2_SLICED_CAPTION_525,21,21,1}, {V4L2_SLICED_CAPTION_525,21,21,1},
{ 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02, { 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02,
0x69, 0x8c, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 } 0x69, 0x8c, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 }
}, },
{0x110, /* Wide Screen Signal, PAL/SECAM */ [8] = {0x110, /* Wide Screen Signal, PAL/SECAM */
{V4L2_SLICED_WSS_625,23,23,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 }
}, },
#if 0 #if 0
{0x130, /* Wide Screen Signal, NTSC C */ [9] = {0x130, /* Wide Screen Signal, NTSC C */
{V4L2_SLICED_WSS_525,20,20,1}, {V4L2_SLICED_WSS_525,20,20,1},
{ 0x38, 0x00, 0x3f, 0x00, 0x00, 0x71, 0x6e, 0x43, { 0x38, 0x00, 0x3f, 0x00, 0x00, 0x71, 0x6e, 0x43,
0x69, 0x7c, 0x08, 0x00, 0x00, 0x00, 0x39, 0x00 } 0x69, 0x7c, 0x08, 0x00, 0x00, 0x00, 0x39, 0x00 }
}, },
{0x150, /* Vertical Interval Timecode (VITC), PAL/SECAM */ [10] = {0x150, /* Vertical Interval Timecode (VITC), PAL/SECAM */
{V4l2_SLICED_VITC_625,6,22,0}, {V4l2_SLICED_VITC_625,6,22,0},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0x49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0x49,
0xa6, 0x85, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00 } 0xa6, 0x85, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00 }
}, },
{0x170, /* Vertical Interval Timecode (VITC), NTSC */ [11] = {0x170, /* Vertical Interval Timecode (VITC), NTSC */
{V4l2_SLICED_VITC_525,10,20,0}, {V4l2_SLICED_VITC_525,10,20,0},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0x49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0x49,
0x69, 0x94, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00 } 0x69, 0x94, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00 }
}, },
#endif #endif
{0x190, /* Video Program System (VPS), PAL */ [12] = {0x190, /* Video Program System (VPS), PAL */
{V4L2_SLICED_VPS,16,16,0}, {V4L2_SLICED_VPS,16,16,0},
{ 0xaa, 0xaa, 0xff, 0xff, 0xba, 0xce, 0x2b, 0x0d, { 0xaa, 0xaa, 0xff, 0xff, 0xba, 0xce, 0x2b, 0x0d,
0xa6, 0xda, 0x0b, 0x00, 0x00, 0x00, 0x60, 0x00 } 0xa6, 0xda, 0x0b, 0x00, 0x00, 0x00, 0x60, 0x00 }
}, },
/* 0x1d0 User programmable */ /* 0x1d0 User programmable */
/* End of struct */
{ (u16)-1 }
}; };
static int tvp5150_write_inittab(struct v4l2_subdev *sd, static int tvp5150_write_inittab(struct v4l2_subdev *sd,
...@@ -591,10 +588,10 @@ static int tvp5150_write_inittab(struct v4l2_subdev *sd, ...@@ -591,10 +588,10 @@ static int tvp5150_write_inittab(struct v4l2_subdev *sd,
return 0; return 0;
} }
static int tvp5150_vdp_init(struct v4l2_subdev *sd, static int tvp5150_vdp_init(struct v4l2_subdev *sd)
const struct i2c_vbi_ram_value *regs)
{ {
unsigned int i; unsigned int i;
int j;
/* Disable Full Field */ /* Disable Full Field */
tvp5150_write(sd, TVP5150_FULL_FIELD_ENA, 0); tvp5150_write(sd, TVP5150_FULL_FIELD_ENA, 0);
...@@ -604,14 +601,17 @@ static int tvp5150_vdp_init(struct v4l2_subdev *sd, ...@@ -604,14 +601,17 @@ static int tvp5150_vdp_init(struct v4l2_subdev *sd,
tvp5150_write(sd, i, 0xff); tvp5150_write(sd, i, 0xff);
/* Load Ram Table */ /* Load Ram Table */
while (regs->reg != (u16)-1) { for (j = 0; j < ARRAY_SIZE(vbi_ram_default); j++) {
const struct i2c_vbi_ram_value *regs = &vbi_ram_default[j];
if (!regs->type.vbi_type)
continue;
tvp5150_write(sd, TVP5150_CONF_RAM_ADDR_HIGH, regs->reg >> 8); tvp5150_write(sd, TVP5150_CONF_RAM_ADDR_HIGH, regs->reg >> 8);
tvp5150_write(sd, TVP5150_CONF_RAM_ADDR_LOW, regs->reg); tvp5150_write(sd, TVP5150_CONF_RAM_ADDR_LOW, regs->reg);
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
tvp5150_write(sd, TVP5150_VDP_CONF_RAM_DATA, regs->values[i]); tvp5150_write(sd, TVP5150_VDP_CONF_RAM_DATA, regs->values[i]);
regs++;
} }
return 0; return 0;
} }
...@@ -620,19 +620,23 @@ static int tvp5150_vdp_init(struct v4l2_subdev *sd, ...@@ -620,19 +620,23 @@ static int tvp5150_vdp_init(struct v4l2_subdev *sd,
static int tvp5150_g_sliced_vbi_cap(struct v4l2_subdev *sd, static int tvp5150_g_sliced_vbi_cap(struct v4l2_subdev *sd,
struct v4l2_sliced_vbi_cap *cap) struct v4l2_sliced_vbi_cap *cap)
{ {
const struct i2c_vbi_ram_value *regs = vbi_ram_default; int line, i;
int line;
dev_dbg_lvl(sd->dev, 1, debug, "g_sliced_vbi_cap\n"); dev_dbg_lvl(sd->dev, 1, debug, "g_sliced_vbi_cap\n");
memset(cap, 0, sizeof *cap); memset(cap, 0, sizeof *cap);
while (regs->reg != (u16)-1 ) { for (i = 0; i < ARRAY_SIZE(vbi_ram_default); i++) {
for (line=regs->type.ini_line;line<=regs->type.end_line;line++) { const struct i2c_vbi_ram_value *regs = &vbi_ram_default[i];
if (!regs->type.vbi_type)
continue;
for (line = regs->type.ini_line;
line <= regs->type.end_line;
line++) {
cap->service_lines[0][line] |= regs->type.vbi_type; cap->service_lines[0][line] |= regs->type.vbi_type;
} }
cap->service_set |= regs->type.vbi_type; cap->service_set |= regs->type.vbi_type;
regs++;
} }
return 0; return 0;
} }
...@@ -651,14 +655,13 @@ static int tvp5150_g_sliced_vbi_cap(struct v4l2_subdev *sd, ...@@ -651,14 +655,13 @@ static int tvp5150_g_sliced_vbi_cap(struct v4l2_subdev *sd,
* MSB = field2 * MSB = field2
*/ */
static int tvp5150_set_vbi(struct v4l2_subdev *sd, static int tvp5150_set_vbi(struct v4l2_subdev *sd,
const struct i2c_vbi_ram_value *regs,
unsigned int type,u8 flags, int line, unsigned int type,u8 flags, int line,
const int fields) const int fields)
{ {
struct tvp5150 *decoder = to_tvp5150(sd); struct tvp5150 *decoder = to_tvp5150(sd);
v4l2_std_id std = decoder->norm; v4l2_std_id std = decoder->norm;
u8 reg; u8 reg;
int pos = 0; int i, pos = 0;
if (std == V4L2_STD_ALL) { if (std == V4L2_STD_ALL) {
dev_err(sd->dev, "VBI can't be configured without knowing number of lines\n"); dev_err(sd->dev, "VBI can't be configured without knowing number of lines\n");
...@@ -671,19 +674,19 @@ static int tvp5150_set_vbi(struct v4l2_subdev *sd, ...@@ -671,19 +674,19 @@ static int tvp5150_set_vbi(struct v4l2_subdev *sd,
if (line < 6 || line > 27) if (line < 6 || line > 27)
return 0; return 0;
while (regs->reg != (u16)-1) { for (i = 0; i < ARRAY_SIZE(vbi_ram_default); i++) {
const struct i2c_vbi_ram_value *regs = &vbi_ram_default[i];
if (!regs->type.vbi_type)
continue;
if ((type & regs->type.vbi_type) && if ((type & regs->type.vbi_type) &&
(line >= regs->type.ini_line) && (line >= regs->type.ini_line) &&
(line <= regs->type.end_line)) (line <= regs->type.end_line))
break; break;
regs++;
pos++; pos++;
} }
if (regs->reg == (u16)-1)
return 0;
type = pos | (flags & 0xf0); type = pos | (flags & 0xf0);
reg = ((line - 6) << 1) + TVP5150_LINE_MODE_INI; reg = ((line - 6) << 1) + TVP5150_LINE_MODE_INI;
...@@ -696,8 +699,7 @@ static int tvp5150_set_vbi(struct v4l2_subdev *sd, ...@@ -696,8 +699,7 @@ static int tvp5150_set_vbi(struct v4l2_subdev *sd,
return type; return type;
} }
static int tvp5150_get_vbi(struct v4l2_subdev *sd, static int tvp5150_get_vbi(struct v4l2_subdev *sd, int line)
const struct i2c_vbi_ram_value *regs, int line)
{ {
struct tvp5150 *decoder = to_tvp5150(sd); struct tvp5150 *decoder = to_tvp5150(sd);
v4l2_std_id std = decoder->norm; v4l2_std_id std = decoder->norm;
...@@ -726,8 +728,8 @@ static int tvp5150_get_vbi(struct v4l2_subdev *sd, ...@@ -726,8 +728,8 @@ static int tvp5150_get_vbi(struct v4l2_subdev *sd,
return 0; return 0;
} }
pos = ret & 0x0f; pos = ret & 0x0f;
if (pos < 0x0f) if (pos < ARRAY_SIZE(vbi_ram_default))
type |= regs[pos].type.vbi_type; type |= vbi_ram_default[pos].type.vbi_type;
} }
return type; return type;
...@@ -788,7 +790,7 @@ static int tvp5150_reset(struct v4l2_subdev *sd, u32 val) ...@@ -788,7 +790,7 @@ static int tvp5150_reset(struct v4l2_subdev *sd, u32 val)
tvp5150_write_inittab(sd, tvp5150_init_default); tvp5150_write_inittab(sd, tvp5150_init_default);
/* Initializes VDP registers */ /* Initializes VDP registers */
tvp5150_vdp_init(sd, vbi_ram_default); tvp5150_vdp_init(sd);
/* Selects decoder input */ /* Selects decoder input */
tvp5150_selmux(sd); tvp5150_selmux(sd);
...@@ -1121,8 +1123,8 @@ static int tvp5150_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_f ...@@ -1121,8 +1123,8 @@ static int tvp5150_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_f
for (i = 0; i <= 23; i++) { for (i = 0; i <= 23; i++) {
svbi->service_lines[1][i] = 0; svbi->service_lines[1][i] = 0;
svbi->service_lines[0][i] = svbi->service_lines[0][i] =
tvp5150_set_vbi(sd, vbi_ram_default, tvp5150_set_vbi(sd, svbi->service_lines[0][i],
svbi->service_lines[0][i], 0xf0, i, 3); 0xf0, i, 3);
} }
/* Enables FIFO */ /* Enables FIFO */
tvp5150_write(sd, TVP5150_FIFO_OUT_CTRL, 1); tvp5150_write(sd, TVP5150_FIFO_OUT_CTRL, 1);
...@@ -1148,7 +1150,7 @@ static int tvp5150_g_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_f ...@@ -1148,7 +1150,7 @@ static int tvp5150_g_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_f
for (i = 0; i <= 23; i++) { for (i = 0; i <= 23; i++) {
svbi->service_lines[0][i] = svbi->service_lines[0][i] =
tvp5150_get_vbi(sd, vbi_ram_default, i); tvp5150_get_vbi(sd, i);
mask |= svbi->service_lines[0][i]; mask |= svbi->service_lines[0][i];
} }
svbi->service_set = mask; svbi->service_set = mask;
......
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