V4L/DVB (7384): tda18271: store FM_RFn setting in struct tda18271_std_map_item
All standard related configuration is stored within struct tda18271_std_map_item. Pass a pointer to this structure rather than its individual members. Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
5555309c9a
commit
c293d0a72e
@@ -37,8 +37,8 @@ static LIST_HEAD(hybrid_tuner_instance_list);
|
|||||||
/*---------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------*/
|
||||||
|
|
||||||
static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
||||||
u32 ifc, u32 freq, u32 bw, u8 std,
|
struct tda18271_std_map_item *map,
|
||||||
int radio)
|
u32 freq, u32 bw)
|
||||||
{
|
{
|
||||||
struct tda18271_priv *priv = fe->tuner_priv;
|
struct tda18271_priv *priv = fe->tuner_priv;
|
||||||
unsigned char *regs = priv->tda18271_regs;
|
unsigned char *regs = priv->tda18271_regs;
|
||||||
@@ -48,7 +48,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
|||||||
|
|
||||||
/* set standard */
|
/* set standard */
|
||||||
regs[R_EP3] &= ~0x1f; /* clear std bits */
|
regs[R_EP3] &= ~0x1f; /* clear std bits */
|
||||||
regs[R_EP3] |= std;
|
regs[R_EP3] |= map->std_bits;
|
||||||
|
|
||||||
/* set cal mode to normal */
|
/* set cal mode to normal */
|
||||||
regs[R_EP4] &= ~0x03;
|
regs[R_EP4] &= ~0x03;
|
||||||
@@ -66,10 +66,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (radio)
|
/* update FM_RFn */
|
||||||
regs[R_EP4] |= 0x80;
|
regs[R_EP4] &= ~0x80;
|
||||||
else
|
regs[R_EP4] |= map->fm_rfn << 7;
|
||||||
regs[R_EP4] &= ~0x80;
|
|
||||||
|
|
||||||
/* update RF_TOP / IF_TOP */
|
/* update RF_TOP / IF_TOP */
|
||||||
switch (priv->mode) {
|
switch (priv->mode) {
|
||||||
@@ -114,7 +113,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
|
|||||||
|
|
||||||
/* --------------------------------------------------------------- */
|
/* --------------------------------------------------------------- */
|
||||||
|
|
||||||
N = freq + ifc;
|
N = map->if_freq * 1000 + freq;
|
||||||
|
|
||||||
/* FIXME: assumes master */
|
/* FIXME: assumes master */
|
||||||
tda18271_calc_main_pll(fe, N);
|
tda18271_calc_main_pll(fe, N);
|
||||||
@@ -728,12 +727,12 @@ static int tda18271_init(struct dvb_frontend *fe)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int tda18271_tune(struct dvb_frontend *fe,
|
static int tda18271_tune(struct dvb_frontend *fe,
|
||||||
u32 ifc, u32 freq, u32 bw, u8 std, int radio)
|
struct tda18271_std_map_item *map, u32 freq, u32 bw)
|
||||||
{
|
{
|
||||||
struct tda18271_priv *priv = fe->tuner_priv;
|
struct tda18271_priv *priv = fe->tuner_priv;
|
||||||
|
|
||||||
tda_dbg("freq = %d, ifc = %d, bw = %d, std = 0x%02x\n",
|
tda_dbg("freq = %d, ifc = %d, bw = %d, std = 0x%02x\n",
|
||||||
freq, ifc, bw, std);
|
freq, map->if_freq, bw, map->std_bits);
|
||||||
|
|
||||||
tda18271_init(fe);
|
tda18271_init(fe);
|
||||||
|
|
||||||
@@ -747,7 +746,7 @@ static int tda18271_tune(struct dvb_frontend *fe,
|
|||||||
tda18271c2_rf_tracking_filters_correction(fe, freq);
|
tda18271c2_rf_tracking_filters_correction(fe, freq);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tda18271_channel_configuration(fe, ifc, freq, bw, std, radio);
|
tda18271_channel_configuration(fe, map, freq, bw);
|
||||||
|
|
||||||
mutex_unlock(&priv->lock);
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
@@ -761,9 +760,8 @@ static int tda18271_set_params(struct dvb_frontend *fe,
|
|||||||
{
|
{
|
||||||
struct tda18271_priv *priv = fe->tuner_priv;
|
struct tda18271_priv *priv = fe->tuner_priv;
|
||||||
struct tda18271_std_map *std_map = &priv->std;
|
struct tda18271_std_map *std_map = &priv->std;
|
||||||
|
struct tda18271_std_map_item *map;
|
||||||
int ret;
|
int ret;
|
||||||
u8 std;
|
|
||||||
u16 sgIF;
|
|
||||||
u32 bw, freq = params->frequency;
|
u32 bw, freq = params->frequency;
|
||||||
|
|
||||||
priv->mode = TDA18271_DIGITAL;
|
priv->mode = TDA18271_DIGITAL;
|
||||||
@@ -772,13 +770,11 @@ static int tda18271_set_params(struct dvb_frontend *fe,
|
|||||||
switch (params->u.vsb.modulation) {
|
switch (params->u.vsb.modulation) {
|
||||||
case VSB_8:
|
case VSB_8:
|
||||||
case VSB_16:
|
case VSB_16:
|
||||||
std = std_map->atsc_6.std_bits;
|
map = &std_map->atsc_6;
|
||||||
sgIF = std_map->atsc_6.if_freq;
|
|
||||||
break;
|
break;
|
||||||
case QAM_64:
|
case QAM_64:
|
||||||
case QAM_256:
|
case QAM_256:
|
||||||
std = std_map->qam_6.std_bits;
|
map = &std_map->qam_6;
|
||||||
sgIF = std_map->qam_6.if_freq;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tda_warn("modulation not set!\n");
|
tda_warn("modulation not set!\n");
|
||||||
@@ -793,18 +789,15 @@ static int tda18271_set_params(struct dvb_frontend *fe,
|
|||||||
switch (params->u.ofdm.bandwidth) {
|
switch (params->u.ofdm.bandwidth) {
|
||||||
case BANDWIDTH_6_MHZ:
|
case BANDWIDTH_6_MHZ:
|
||||||
bw = 6000000;
|
bw = 6000000;
|
||||||
std = std_map->dvbt_6.std_bits;
|
map = &std_map->dvbt_6;
|
||||||
sgIF = std_map->dvbt_6.if_freq;
|
|
||||||
break;
|
break;
|
||||||
case BANDWIDTH_7_MHZ:
|
case BANDWIDTH_7_MHZ:
|
||||||
bw = 7000000;
|
bw = 7000000;
|
||||||
std = std_map->dvbt_7.std_bits;
|
map = &std_map->dvbt_7;
|
||||||
sgIF = std_map->dvbt_7.if_freq;
|
|
||||||
break;
|
break;
|
||||||
case BANDWIDTH_8_MHZ:
|
case BANDWIDTH_8_MHZ:
|
||||||
bw = 8000000;
|
bw = 8000000;
|
||||||
std = std_map->dvbt_8.std_bits;
|
map = &std_map->dvbt_8;
|
||||||
sgIF = std_map->dvbt_8.if_freq;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tda_warn("bandwidth not set!\n");
|
tda_warn("bandwidth not set!\n");
|
||||||
@@ -819,7 +812,7 @@ static int tda18271_set_params(struct dvb_frontend *fe,
|
|||||||
if (fe->ops.analog_ops.standby)
|
if (fe->ops.analog_ops.standby)
|
||||||
fe->ops.analog_ops.standby(fe);
|
fe->ops.analog_ops.standby(fe);
|
||||||
|
|
||||||
ret = tda18271_tune(fe, sgIF * 1000, freq, bw, std, 0);
|
ret = tda18271_tune(fe, map, freq, bw);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -836,57 +829,46 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe,
|
|||||||
{
|
{
|
||||||
struct tda18271_priv *priv = fe->tuner_priv;
|
struct tda18271_priv *priv = fe->tuner_priv;
|
||||||
struct tda18271_std_map *std_map = &priv->std;
|
struct tda18271_std_map *std_map = &priv->std;
|
||||||
|
struct tda18271_std_map_item *map;
|
||||||
char *mode;
|
char *mode;
|
||||||
int ret, radio = 0;
|
int ret;
|
||||||
u8 std;
|
|
||||||
u16 sgIF;
|
|
||||||
u32 freq = params->frequency * 62500;
|
u32 freq = params->frequency * 62500;
|
||||||
|
|
||||||
priv->mode = TDA18271_ANALOG;
|
priv->mode = TDA18271_ANALOG;
|
||||||
|
|
||||||
if (params->mode == V4L2_TUNER_RADIO) {
|
if (params->mode == V4L2_TUNER_RADIO) {
|
||||||
radio = 1;
|
|
||||||
freq = freq / 1000;
|
freq = freq / 1000;
|
||||||
std = std_map->fm_radio.std_bits;
|
map = &std_map->fm_radio;
|
||||||
sgIF = std_map->fm_radio.if_freq;
|
|
||||||
mode = "fm";
|
mode = "fm";
|
||||||
} else if (params->std & V4L2_STD_MN) {
|
} else if (params->std & V4L2_STD_MN) {
|
||||||
std = std_map->atv_mn.std_bits;
|
map = &std_map->atv_mn;
|
||||||
sgIF = std_map->atv_mn.if_freq;
|
|
||||||
mode = "MN";
|
mode = "MN";
|
||||||
} else if (params->std & V4L2_STD_B) {
|
} else if (params->std & V4L2_STD_B) {
|
||||||
std = std_map->atv_b.std_bits;
|
map = &std_map->atv_b;
|
||||||
sgIF = std_map->atv_b.if_freq;
|
|
||||||
mode = "B";
|
mode = "B";
|
||||||
} else if (params->std & V4L2_STD_GH) {
|
} else if (params->std & V4L2_STD_GH) {
|
||||||
std = std_map->atv_gh.std_bits;
|
map = &std_map->atv_gh;
|
||||||
sgIF = std_map->atv_gh.if_freq;
|
|
||||||
mode = "GH";
|
mode = "GH";
|
||||||
} else if (params->std & V4L2_STD_PAL_I) {
|
} else if (params->std & V4L2_STD_PAL_I) {
|
||||||
std = std_map->atv_i.std_bits;
|
map = &std_map->atv_i;
|
||||||
sgIF = std_map->atv_i.if_freq;
|
|
||||||
mode = "I";
|
mode = "I";
|
||||||
} else if (params->std & V4L2_STD_DK) {
|
} else if (params->std & V4L2_STD_DK) {
|
||||||
std = std_map->atv_dk.std_bits;
|
map = &std_map->atv_dk;
|
||||||
sgIF = std_map->atv_dk.if_freq;
|
|
||||||
mode = "DK";
|
mode = "DK";
|
||||||
} else if (params->std & V4L2_STD_SECAM_L) {
|
} else if (params->std & V4L2_STD_SECAM_L) {
|
||||||
std = std_map->atv_l.std_bits;
|
map = &std_map->atv_l;
|
||||||
sgIF = std_map->atv_l.if_freq;
|
|
||||||
mode = "L";
|
mode = "L";
|
||||||
} else if (params->std & V4L2_STD_SECAM_LC) {
|
} else if (params->std & V4L2_STD_SECAM_LC) {
|
||||||
std = std_map->atv_lc.std_bits;
|
map = &std_map->atv_lc;
|
||||||
sgIF = std_map->atv_lc.if_freq;
|
|
||||||
mode = "L'";
|
mode = "L'";
|
||||||
} else {
|
} else {
|
||||||
std = std_map->atv_i.std_bits;
|
map = &std_map->atv_i;
|
||||||
sgIF = std_map->atv_i.if_freq;
|
|
||||||
mode = "xx";
|
mode = "xx";
|
||||||
}
|
}
|
||||||
|
|
||||||
tda_dbg("setting tda18271 to system %s\n", mode);
|
tda_dbg("setting tda18271 to system %s\n", mode);
|
||||||
|
|
||||||
ret = tda18271_tune(fe, sgIF * 1000, freq, 0, std, radio);
|
ret = tda18271_tune(fe, map, freq, 0);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@@ -1187,37 +1187,37 @@ fail:
|
|||||||
/*---------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------*/
|
||||||
|
|
||||||
static struct tda18271_std_map tda18271c1_std_map = {
|
static struct tda18271_std_map tda18271c1_std_map = {
|
||||||
.fm_radio = { .if_freq = 1250, .std_bits = 0x18 },
|
.fm_radio = { .if_freq = 1250, .std_bits = 0x18, .fm_rfn = 1 },
|
||||||
.atv_b = { .if_freq = 6750, .std_bits = 0x0e },
|
.atv_b = { .if_freq = 6750, .std_bits = 0x0e, .fm_rfn = 0 },
|
||||||
.atv_dk = { .if_freq = 7750, .std_bits = 0x0f },
|
.atv_dk = { .if_freq = 7750, .std_bits = 0x0f, .fm_rfn = 0 },
|
||||||
.atv_gh = { .if_freq = 7750, .std_bits = 0x0f },
|
.atv_gh = { .if_freq = 7750, .std_bits = 0x0f, .fm_rfn = 0 },
|
||||||
.atv_i = { .if_freq = 7750, .std_bits = 0x0f },
|
.atv_i = { .if_freq = 7750, .std_bits = 0x0f, .fm_rfn = 0 },
|
||||||
.atv_l = { .if_freq = 7750, .std_bits = 0x0f },
|
.atv_l = { .if_freq = 7750, .std_bits = 0x0f, .fm_rfn = 0 },
|
||||||
.atv_lc = { .if_freq = 1250, .std_bits = 0x0f },
|
.atv_lc = { .if_freq = 1250, .std_bits = 0x0f, .fm_rfn = 0 },
|
||||||
.atv_mn = { .if_freq = 5750, .std_bits = 0x0d },
|
.atv_mn = { .if_freq = 5750, .std_bits = 0x0d, .fm_rfn = 0 },
|
||||||
.atsc_6 = { .if_freq = 3250, .std_bits = 0x1c },
|
.atsc_6 = { .if_freq = 3250, .std_bits = 0x1c, .fm_rfn = 0 },
|
||||||
.dvbt_6 = { .if_freq = 3300, .std_bits = 0x1c },
|
.dvbt_6 = { .if_freq = 3300, .std_bits = 0x1c, .fm_rfn = 0 },
|
||||||
.dvbt_7 = { .if_freq = 3800, .std_bits = 0x1d },
|
.dvbt_7 = { .if_freq = 3800, .std_bits = 0x1d, .fm_rfn = 0 },
|
||||||
.dvbt_8 = { .if_freq = 4300, .std_bits = 0x1e },
|
.dvbt_8 = { .if_freq = 4300, .std_bits = 0x1e, .fm_rfn = 0 },
|
||||||
.qam_6 = { .if_freq = 4000, .std_bits = 0x1d },
|
.qam_6 = { .if_freq = 4000, .std_bits = 0x1d, .fm_rfn = 0 },
|
||||||
.qam_8 = { .if_freq = 5000, .std_bits = 0x1f },
|
.qam_8 = { .if_freq = 5000, .std_bits = 0x1f, .fm_rfn = 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct tda18271_std_map tda18271c2_std_map = {
|
static struct tda18271_std_map tda18271c2_std_map = {
|
||||||
.fm_radio = { .if_freq = 1250, .std_bits = 0x18 },
|
.fm_radio = { .if_freq = 1250, .std_bits = 0x18, .fm_rfn = 1 },
|
||||||
.atv_b = { .if_freq = 6000, .std_bits = 0x0d },
|
.atv_b = { .if_freq = 6000, .std_bits = 0x0d, .fm_rfn = 0 },
|
||||||
.atv_dk = { .if_freq = 6900, .std_bits = 0x0e },
|
.atv_dk = { .if_freq = 6900, .std_bits = 0x0e, .fm_rfn = 0 },
|
||||||
.atv_gh = { .if_freq = 7100, .std_bits = 0x0e },
|
.atv_gh = { .if_freq = 7100, .std_bits = 0x0e, .fm_rfn = 0 },
|
||||||
.atv_i = { .if_freq = 7250, .std_bits = 0x0e },
|
.atv_i = { .if_freq = 7250, .std_bits = 0x0e, .fm_rfn = 0 },
|
||||||
.atv_l = { .if_freq = 6900, .std_bits = 0x0e },
|
.atv_l = { .if_freq = 6900, .std_bits = 0x0e, .fm_rfn = 0 },
|
||||||
.atv_lc = { .if_freq = 1250, .std_bits = 0x0e },
|
.atv_lc = { .if_freq = 1250, .std_bits = 0x0e, .fm_rfn = 0 },
|
||||||
.atv_mn = { .if_freq = 5400, .std_bits = 0x0c },
|
.atv_mn = { .if_freq = 5400, .std_bits = 0x0c, .fm_rfn = 0 },
|
||||||
.atsc_6 = { .if_freq = 3250, .std_bits = 0x1c },
|
.atsc_6 = { .if_freq = 3250, .std_bits = 0x1c, .fm_rfn = 0 },
|
||||||
.dvbt_6 = { .if_freq = 3300, .std_bits = 0x1c },
|
.dvbt_6 = { .if_freq = 3300, .std_bits = 0x1c, .fm_rfn = 0 },
|
||||||
.dvbt_7 = { .if_freq = 3500, .std_bits = 0x1c },
|
.dvbt_7 = { .if_freq = 3500, .std_bits = 0x1c, .fm_rfn = 0 },
|
||||||
.dvbt_8 = { .if_freq = 4000, .std_bits = 0x1d },
|
.dvbt_8 = { .if_freq = 4000, .std_bits = 0x1d, .fm_rfn = 0 },
|
||||||
.qam_6 = { .if_freq = 4000, .std_bits = 0x1d },
|
.qam_6 = { .if_freq = 4000, .std_bits = 0x1d, .fm_rfn = 0 },
|
||||||
.qam_8 = { .if_freq = 5000, .std_bits = 0x1f },
|
.qam_8 = { .if_freq = 5000, .std_bits = 0x1f, .fm_rfn = 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
/*---------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------*/
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
struct tda18271_std_map_item {
|
struct tda18271_std_map_item {
|
||||||
u16 if_freq;
|
u16 if_freq;
|
||||||
u8 std_bits;
|
u8 std_bits;
|
||||||
|
unsigned int fm_rfn:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tda18271_std_map {
|
struct tda18271_std_map {
|
||||||
|
Reference in New Issue
Block a user