V4L/DVB (4555): Cleanup: removed hardcoded tables
saa7115 module is capable of calculating the proper FIR tables. However, there were 4 hardcoded tables for the standard resolution. Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
Родитель
66ec1193ba
Коммит
59ba915495
|
@ -270,44 +270,6 @@ static const unsigned char saa7115_cfg_reset_scaler[] = {
|
||||||
|
|
||||||
/* ============== SAA7715 VIDEO templates ============= */
|
/* ============== SAA7715 VIDEO templates ============= */
|
||||||
|
|
||||||
/* Used on saa7114 and saa7115 */
|
|
||||||
static const unsigned char saa7115_cfg_60hz_fullres_x[] = {
|
|
||||||
/* hsize = 0x2d0 = 720 */
|
|
||||||
R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH, 0xd0,
|
|
||||||
R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB, 0x02,
|
|
||||||
|
|
||||||
/* Why not in 60hz-Land, too? */
|
|
||||||
R_D0_B_HORIZ_PRESCALING, 0x01, /* downscale = 1 */
|
|
||||||
/* hor lum scaling 0x0400 = 1 */
|
|
||||||
R_D8_B_HORIZ_LUMA_SCALING_INC, 0x00,
|
|
||||||
R_D9_B_HORIZ_LUMA_SCALING_INC_MSB, 0x04,
|
|
||||||
|
|
||||||
/* must be hor lum scaling / 2 */
|
|
||||||
R_DC_B_HORIZ_CHROMA_SCALING, 0x00,
|
|
||||||
R_DD_B_HORIZ_CHROMA_SCALING_MSB, 0x02,
|
|
||||||
|
|
||||||
0x00, 0x00
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Used on saa7114 and saa7115 */
|
|
||||||
static const unsigned char saa7115_cfg_60hz_fullres_y[] = {
|
|
||||||
/* output window size = 248 (but 60hz is 240?) */
|
|
||||||
R_CE_B_VERT_OUTPUT_WINDOW_LENGTH, 0xf8,
|
|
||||||
R_CF_B_VERT_OUTPUT_WINDOW_LENGTH_MSB, 0x00,
|
|
||||||
|
|
||||||
/* Why not in 60hz-Land, too? */
|
|
||||||
R_D5_B_LUMA_CONTRAST_CNTL, 0x40, /* Lum contrast, nominal value = 0x40 */
|
|
||||||
R_D6_B_CHROMA_SATURATION_CNTL, 0x40, /* Chroma satur. nominal value = 0x80 */
|
|
||||||
|
|
||||||
R_E0_B_VERT_LUMA_SCALING_INC, 0x00,
|
|
||||||
R_E1_B_VERT_LUMA_SCALING_INC_MSB, 0x04,
|
|
||||||
|
|
||||||
R_E2_B_VERT_CHROMA_SCALING_INC, 0x00,
|
|
||||||
R_E3_B_VERT_CHROMA_SCALING_INC_MSB, 0x04,
|
|
||||||
|
|
||||||
0x00, 0x00
|
|
||||||
};
|
|
||||||
|
|
||||||
static const unsigned char saa7115_cfg_60hz_video[] = {
|
static const unsigned char saa7115_cfg_60hz_video[] = {
|
||||||
R_80_GLOBAL_CNTL_1, 0x00, /* reset tasks */
|
R_80_GLOBAL_CNTL_1, 0x00, /* reset tasks */
|
||||||
R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
|
R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
|
||||||
|
@ -386,38 +348,6 @@ static const unsigned char saa7115_cfg_60hz_video[] = {
|
||||||
0x00, 0x00
|
0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned char saa7115_cfg_50hz_fullres_x[] = {
|
|
||||||
/* hsize low (output), 720 same as 60hz */
|
|
||||||
R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH, 0xd0,
|
|
||||||
R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB, 0x02,
|
|
||||||
|
|
||||||
R_D0_B_HORIZ_PRESCALING, 0x01, /* down scale = 1 */
|
|
||||||
R_D8_B_HORIZ_LUMA_SCALING_INC, 0x00, /* hor lum scaling 0x0400 = 1 */
|
|
||||||
R_D9_B_HORIZ_LUMA_SCALING_INC_MSB, 0x04,
|
|
||||||
|
|
||||||
/* must be hor lum scaling / 2 */
|
|
||||||
R_DC_B_HORIZ_CHROMA_SCALING, 0x00,
|
|
||||||
R_DD_B_HORIZ_CHROMA_SCALING_MSB, 0x02,
|
|
||||||
|
|
||||||
0x00, 0x00
|
|
||||||
};
|
|
||||||
static const unsigned char saa7115_cfg_50hz_fullres_y[] = {
|
|
||||||
/* vsize low (output), 0x0120 = 288 */
|
|
||||||
R_CE_B_VERT_OUTPUT_WINDOW_LENGTH, 0x20,
|
|
||||||
R_CF_B_VERT_OUTPUT_WINDOW_LENGTH_MSB, 0x01,
|
|
||||||
|
|
||||||
R_D5_B_LUMA_CONTRAST_CNTL, 0x40, /* Lum contrast, nominal value = 0x40 */
|
|
||||||
R_D6_B_CHROMA_SATURATION_CNTL, 0x40, /* Chroma satur. nominal value = 0x80 */
|
|
||||||
|
|
||||||
R_E0_B_VERT_LUMA_SCALING_INC, 0x00,
|
|
||||||
R_E1_B_VERT_LUMA_SCALING_INC_MSB, 0x04,
|
|
||||||
|
|
||||||
R_E2_B_VERT_CHROMA_SCALING_INC, 0x00,
|
|
||||||
R_E3_B_VERT_CHROMA_SCALING_INC_MSB, 0x04,
|
|
||||||
|
|
||||||
0x00, 0x00
|
|
||||||
};
|
|
||||||
|
|
||||||
static const unsigned char saa7115_cfg_50hz_video[] = {
|
static const unsigned char saa7115_cfg_50hz_video[] = {
|
||||||
R_80_GLOBAL_CNTL_1, 0x00,
|
R_80_GLOBAL_CNTL_1, 0x00,
|
||||||
R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
|
R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
|
||||||
|
@ -920,6 +850,8 @@ static void saa711x_set_v4lstd(struct i2c_client *client, v4l2_std_id std)
|
||||||
011 NTSC N (3.58MHz) PAL M (3.58MHz)
|
011 NTSC N (3.58MHz) PAL M (3.58MHz)
|
||||||
100 reserved NTSC-Japan (3.58MHz)
|
100 reserved NTSC-Japan (3.58MHz)
|
||||||
*/
|
*/
|
||||||
|
state->std = std;
|
||||||
|
|
||||||
if (state->ident == V4L2_IDENT_SAA7111 ||
|
if (state->ident == V4L2_IDENT_SAA7111 ||
|
||||||
state->ident == V4L2_IDENT_SAA7113) {
|
state->ident == V4L2_IDENT_SAA7113) {
|
||||||
u8 reg = saa711x_read(client, R_0E_CHROMA_CNTL_1) & 0x8f;
|
u8 reg = saa711x_read(client, R_0E_CHROMA_CNTL_1) & 0x8f;
|
||||||
|
@ -945,8 +877,6 @@ static void saa711x_set_v4lstd(struct i2c_client *client, v4l2_std_id std)
|
||||||
/* switch audio mode too! */
|
/* switch audio mode too! */
|
||||||
saa711x_set_audio_clock_freq(client, state->audclk_freq);
|
saa711x_set_audio_clock_freq(client, state->audclk_freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
state->std = std;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static v4l2_std_id saa711x_get_v4lstd(struct i2c_client *client)
|
static v4l2_std_id saa711x_get_v4lstd(struct i2c_client *client)
|
||||||
|
@ -1116,71 +1046,71 @@ static int saa711x_get_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int saa711x_set_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
|
static int saa711x_set_size(struct i2c_client *client, int width, int height)
|
||||||
{
|
{
|
||||||
struct saa711x_state *state = i2c_get_clientdata(client);
|
struct saa711x_state *state = i2c_get_clientdata(client);
|
||||||
struct v4l2_pix_format *pix;
|
|
||||||
int HPSC, HFSC;
|
int HPSC, HFSC;
|
||||||
int VSCY;
|
int VSCY;
|
||||||
|
int res;
|
||||||
int is_50hz = state->std & V4L2_STD_625_50;
|
int is_50hz = state->std & V4L2_STD_625_50;
|
||||||
int Vsrc = is_50hz ? 576 : 480;
|
int Vsrc = is_50hz ? 576 : 480;
|
||||||
|
|
||||||
if (fmt->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
|
v4l_dbg(1, debug, client, "decoder set size to %ix%i\n",width,height);
|
||||||
saa711x_set_lcr(client, &fmt->fmt.sliced);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
pix = &(fmt->fmt.pix);
|
|
||||||
|
|
||||||
v4l_dbg(1, debug, client, "decoder set size\n");
|
|
||||||
|
|
||||||
/* FIXME need better bounds checking here */
|
/* FIXME need better bounds checking here */
|
||||||
if ((pix->width < 1) || (pix->width > 1440))
|
if ((width < 1) || (width > 1440))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if ((pix->height < 1) || (pix->height > 960))
|
if ((height < 1) || (height > 960))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!saa711x_has_reg(state->ident,R_D0_B_HORIZ_PRESCALING)) {
|
if (!saa711x_has_reg(state->ident,R_D0_B_HORIZ_PRESCALING)) {
|
||||||
/* Decoder only supports 720 columns and 480 or 576 lines */
|
/* Decoder only supports 720 columns and 480 or 576 lines */
|
||||||
if (pix->width != 720)
|
if (width != 720)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (pix->height != Vsrc)
|
if (height != Vsrc)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!saa711x_has_reg(state->ident,R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* probably have a valid size, let's set it */
|
/* probably have a valid size, let's set it */
|
||||||
/* Set output width/height */
|
/* Set output width/height */
|
||||||
/* width */
|
/* width */
|
||||||
|
|
||||||
if (!saa711x_has_reg(state->ident,R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH)) {
|
|
||||||
saa711x_write(client, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH,
|
saa711x_write(client, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH,
|
||||||
(u8) (pix->width & 0xff));
|
(u8) (width & 0xff));
|
||||||
saa711x_write(client, R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB,
|
saa711x_write(client, R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB,
|
||||||
(u8) ((pix->width >> 8) & 0xff));
|
(u8) ((width >> 8) & 0xff));
|
||||||
|
|
||||||
|
if (height == Vsrc) {
|
||||||
|
/*FIXME: This code seems weird, however, this is how it is
|
||||||
|
working right now.
|
||||||
|
*/
|
||||||
|
res=height/2;
|
||||||
|
if (!is_50hz)
|
||||||
|
res+=8;
|
||||||
|
} else
|
||||||
|
res=height;
|
||||||
|
|
||||||
/* height */
|
/* height */
|
||||||
saa711x_write(client, R_CE_B_VERT_OUTPUT_WINDOW_LENGTH,
|
saa711x_write(client, R_CE_B_VERT_OUTPUT_WINDOW_LENGTH,
|
||||||
(u8) (pix->height & 0xff));
|
(u8) (res & 0xff));
|
||||||
saa711x_write(client, R_CF_B_VERT_OUTPUT_WINDOW_LENGTH_MSB,
|
saa711x_write(client, R_CF_B_VERT_OUTPUT_WINDOW_LENGTH_MSB,
|
||||||
(u8) ((pix->height >> 8) & 0xff));
|
(u8) (res & 0xff));
|
||||||
}
|
|
||||||
|
|
||||||
/* Scaling settings */
|
/* Scaling settings */
|
||||||
/* Hprescaler is floor(inres/outres) */
|
/* Hprescaler is floor(inres/outres) */
|
||||||
/* FIXME hardcoding input res */
|
HPSC = (int)(720 / width);
|
||||||
if (pix->width != 720) {
|
|
||||||
HPSC = (int)(720 / pix->width);
|
|
||||||
/* 0 is not allowed (div. by zero) */
|
/* 0 is not allowed (div. by zero) */
|
||||||
HPSC = HPSC ? HPSC : 1;
|
HPSC = HPSC ? HPSC : 1;
|
||||||
HFSC = (int)((1024 * 720) / (HPSC * pix->width));
|
HFSC = (int)((1024 * 720) / (HPSC * width));
|
||||||
|
|
||||||
v4l_dbg(1, debug, client, "Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC, HFSC);
|
|
||||||
/* FIXME hardcodes to "Task B"
|
/* FIXME hardcodes to "Task B"
|
||||||
* write H prescaler integer */
|
* write H prescaler integer */
|
||||||
saa711x_write(client, R_D0_B_HORIZ_PRESCALING,
|
saa711x_write(client, R_D0_B_HORIZ_PRESCALING,
|
||||||
(u8) (HPSC & 0x3f));
|
(u8) (HPSC & 0x3f));
|
||||||
|
|
||||||
|
v4l_dbg(1, debug, client, "Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC, HFSC);
|
||||||
/* write H fine-scaling (luminance) */
|
/* write H fine-scaling (luminance) */
|
||||||
saa711x_write(client, R_D8_B_HORIZ_LUMA_SCALING_INC,
|
saa711x_write(client, R_D8_B_HORIZ_LUMA_SCALING_INC,
|
||||||
(u8) (HFSC & 0xff));
|
(u8) (HFSC & 0xff));
|
||||||
|
@ -1192,18 +1122,8 @@ static int saa711x_set_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt
|
||||||
(u8) ((HFSC >> 1) & 0xff));
|
(u8) ((HFSC >> 1) & 0xff));
|
||||||
saa711x_write(client, R_DD_B_HORIZ_CHROMA_SCALING_MSB,
|
saa711x_write(client, R_DD_B_HORIZ_CHROMA_SCALING_MSB,
|
||||||
(u8) ((HFSC >> 9) & 0xff));
|
(u8) ((HFSC >> 9) & 0xff));
|
||||||
} else {
|
|
||||||
if (is_50hz) {
|
|
||||||
v4l_dbg(1, debug, client, "Setting full 50hz width\n");
|
|
||||||
saa711x_writeregs(client, saa7115_cfg_50hz_fullres_x);
|
|
||||||
} else {
|
|
||||||
v4l_dbg(1, debug, client, "Setting full 60hz width\n");
|
|
||||||
saa711x_writeregs(client, saa7115_cfg_60hz_fullres_x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pix->height != Vsrc) {
|
VSCY = (int)((1024 * Vsrc) / height);
|
||||||
VSCY = (int)((1024 * Vsrc) / pix->height);
|
|
||||||
v4l_dbg(1, debug, client, "Vsrc: %d, Vscy: 0x%05x\n", Vsrc, VSCY);
|
v4l_dbg(1, debug, client, "Vsrc: %d, Vscy: 0x%05x\n", Vsrc, VSCY);
|
||||||
|
|
||||||
/* Correct Contrast and Luminance */
|
/* Correct Contrast and Luminance */
|
||||||
|
@ -1222,21 +1142,24 @@ static int saa711x_set_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt
|
||||||
(u8) (VSCY & 0xff));
|
(u8) (VSCY & 0xff));
|
||||||
saa711x_write(client, R_E3_B_VERT_CHROMA_SCALING_INC_MSB,
|
saa711x_write(client, R_E3_B_VERT_CHROMA_SCALING_INC_MSB,
|
||||||
(u8) ((VSCY >> 8) & 0xff));
|
(u8) ((VSCY >> 8) & 0xff));
|
||||||
} else {
|
|
||||||
if (is_50hz) {
|
|
||||||
v4l_dbg(1, debug, client, "Setting full 50Hz height\n");
|
|
||||||
saa711x_writeregs(client, saa7115_cfg_50hz_fullres_y);
|
|
||||||
} else {
|
|
||||||
v4l_dbg(1, debug, client, "Setting full 60hz height\n");
|
|
||||||
saa711x_writeregs(client, saa7115_cfg_60hz_fullres_y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
saa711x_writeregs(client, saa7115_cfg_reset_scaler);
|
saa711x_writeregs(client, saa7115_cfg_reset_scaler);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int saa711x_set_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
|
||||||
|
{
|
||||||
|
if (fmt->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
|
||||||
|
saa711x_set_lcr(client, &fmt->fmt.sliced);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return saa711x_set_size(client,fmt->fmt.pix.width,fmt->fmt.pix.height);
|
||||||
|
}
|
||||||
|
|
||||||
/* Decode the sliced VBI data stream as created by the saa7115.
|
/* Decode the sliced VBI data stream as created by the saa7115.
|
||||||
The format is described in the saa7115 datasheet in Tables 25 and 26
|
The format is described in the saa7115 datasheet in Tables 25 and 26
|
||||||
and in Figure 33.
|
and in Figure 33.
|
||||||
|
@ -1284,7 +1207,7 @@ static void saa711x_decode_vbi_line(struct i2c_client *client,
|
||||||
vbi->type = V4L2_SLICED_TELETEXT_B;
|
vbi->type = V4L2_SLICED_TELETEXT_B;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if (!saa711x_odd_parity(p[0]) || !saa7115_odd_parity(p[1]))
|
if (!saa711x_odd_parity(p[0]) || !saa711x_odd_parity(p[1]))
|
||||||
return;
|
return;
|
||||||
vbi->type = V4L2_SLICED_CAPTION_525;
|
vbi->type = V4L2_SLICED_CAPTION_525;
|
||||||
break;
|
break;
|
||||||
|
@ -1570,7 +1493,6 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind)
|
||||||
kfree(client);
|
kfree(client);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
state->std = V4L2_STD_NTSC;
|
|
||||||
state->input = -1;
|
state->input = -1;
|
||||||
state->enable = 1;
|
state->enable = 1;
|
||||||
state->radio = 0;
|
state->radio = 0;
|
||||||
|
@ -1614,8 +1536,8 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind)
|
||||||
saa711x_writeregs(client, saa7115_init_auto_input);
|
saa711x_writeregs(client, saa7115_init_auto_input);
|
||||||
}
|
}
|
||||||
saa711x_writeregs(client, saa7115_init_misc);
|
saa711x_writeregs(client, saa7115_init_misc);
|
||||||
saa711x_writeregs(client, saa7115_cfg_60hz_fullres_x);
|
state->std = V4L2_STD_NTSC;
|
||||||
saa711x_writeregs(client, saa7115_cfg_60hz_fullres_y);
|
saa711x_set_size(client, 720, 480);
|
||||||
saa711x_writeregs(client, saa7115_cfg_60hz_video);
|
saa711x_writeregs(client, saa7115_cfg_60hz_video);
|
||||||
saa711x_set_audio_clock_freq(client, state->audclk_freq);
|
saa711x_set_audio_clock_freq(client, state->audclk_freq);
|
||||||
saa711x_writeregs(client, saa7115_cfg_reset_scaler);
|
saa711x_writeregs(client, saa7115_cfg_reset_scaler);
|
||||||
|
@ -1623,7 +1545,7 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind)
|
||||||
i2c_attach_client(client);
|
i2c_attach_client(client);
|
||||||
|
|
||||||
v4l_dbg(1, debug, client, "status: (1E) 0x%02x, (1F) 0x%02x\n",
|
v4l_dbg(1, debug, client, "status: (1E) 0x%02x, (1F) 0x%02x\n",
|
||||||
saa711x_read(client, R_1E_STATUS_BYTE_1_VD_DEC), saa7115_read(client, R_1F_STATUS_BYTE_2_VD_DEC));
|
saa711x_read(client, R_1E_STATUS_BYTE_1_VD_DEC), saa711x_read(client, R_1F_STATUS_BYTE_2_VD_DEC));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче