Commit 59ba9154 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

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: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 66ec1193
...@@ -270,44 +270,6 @@ static const unsigned char saa7115_cfg_reset_scaler[] = { ...@@ -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[] = { ...@@ -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) ...@@ -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) ...@@ -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,127 +1046,120 @@ static int saa711x_get_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt ...@@ -1116,127 +1046,120 @@ 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) (width & 0xff));
(u8) (pix->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) ((width >> 8) & 0xff));
(u8) ((pix->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) { /* 0 is not allowed (div. by zero) */
HPSC = (int)(720 / pix->width); HPSC = HPSC ? HPSC : 1;
/* 0 is not allowed (div. by zero) */ HFSC = (int)((1024 * 720) / (HPSC * width));
HPSC = HPSC ? HPSC : 1; /* FIXME hardcodes to "Task B"
HFSC = (int)((1024 * 720) / (HPSC * pix->width)); * write H prescaler integer */
saa711x_write(client, R_D0_B_HORIZ_PRESCALING,
v4l_dbg(1, debug, client, "Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC, HFSC); (u8) (HPSC & 0x3f));
/* FIXME hardcodes to "Task B"
* write H prescaler integer */ v4l_dbg(1, debug, client, "Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC, HFSC);
saa711x_write(client, R_D0_B_HORIZ_PRESCALING, /* write H fine-scaling (luminance) */
(u8) (HPSC & 0x3f)); saa711x_write(client, R_D8_B_HORIZ_LUMA_SCALING_INC,
(u8) (HFSC & 0xff));
/* write H fine-scaling (luminance) */ saa711x_write(client, R_D9_B_HORIZ_LUMA_SCALING_INC_MSB,
saa711x_write(client, R_D8_B_HORIZ_LUMA_SCALING_INC, (u8) ((HFSC >> 8) & 0xff));
(u8) (HFSC & 0xff)); /* write H fine-scaling (chrominance)
saa711x_write(client, R_D9_B_HORIZ_LUMA_SCALING_INC_MSB, * must be lum/2, so i'll just bitshift :) */
(u8) ((HFSC >> 8) & 0xff)); saa711x_write(client, R_DC_B_HORIZ_CHROMA_SCALING,
/* write H fine-scaling (chrominance) (u8) ((HFSC >> 1) & 0xff));
* must be lum/2, so i'll just bitshift :) */ saa711x_write(client, R_DD_B_HORIZ_CHROMA_SCALING_MSB,
saa711x_write(client, R_DC_B_HORIZ_CHROMA_SCALING, (u8) ((HFSC >> 9) & 0xff));
(u8) ((HFSC >> 1) & 0xff));
saa711x_write(client, R_DD_B_HORIZ_CHROMA_SCALING_MSB, VSCY = (int)((1024 * Vsrc) / height);
(u8) ((HFSC >> 9) & 0xff)); v4l_dbg(1, debug, client, "Vsrc: %d, Vscy: 0x%05x\n", Vsrc, VSCY);
} else {
if (is_50hz) { /* Correct Contrast and Luminance */
v4l_dbg(1, debug, client, "Setting full 50hz width\n"); saa711x_write(client, R_D5_B_LUMA_CONTRAST_CNTL,
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) / pix->height);
v4l_dbg(1, debug, client, "Vsrc: %d, Vscy: 0x%05x\n", Vsrc, VSCY);
/* Correct Contrast and Luminance */
saa711x_write(client, R_D5_B_LUMA_CONTRAST_CNTL,
(u8) (64 * 1024 / VSCY)); (u8) (64 * 1024 / VSCY));
saa711x_write(client, R_D6_B_CHROMA_SATURATION_CNTL, saa711x_write(client, R_D6_B_CHROMA_SATURATION_CNTL,
(u8) (64 * 1024 / VSCY)); (u8) (64 * 1024 / VSCY));
/* write V fine-scaling (luminance) */ /* write V fine-scaling (luminance) */
saa711x_write(client, R_E0_B_VERT_LUMA_SCALING_INC, saa711x_write(client, R_E0_B_VERT_LUMA_SCALING_INC,
(u8) (VSCY & 0xff)); (u8) (VSCY & 0xff));
saa711x_write(client, R_E1_B_VERT_LUMA_SCALING_INC_MSB, saa711x_write(client, R_E1_B_VERT_LUMA_SCALING_INC_MSB,
(u8) ((VSCY >> 8) & 0xff)); (u8) ((VSCY >> 8) & 0xff));
/* write V fine-scaling (chrominance) */ /* write V fine-scaling (chrominance) */
saa711x_write(client, R_E2_B_VERT_CHROMA_SCALING_INC, saa711x_write(client, R_E2_B_VERT_CHROMA_SCALING_INC,
(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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
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