summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Krufky <mkrufky@linuxtv.org>2008-01-08 08:38:10 -0500
committerMichael Krufky <mkrufky@linuxtv.org>2008-01-08 08:38:10 -0500
commit4dce926cdcf69656dea38221d328f1152368ae93 (patch)
treedfc1fb44924f46cb1e5037e649b1093b538285a2
parent5969fce339f2c43345b200da21c1bcf21f6440a7 (diff)
downloadmediapointer-dvb-s2-4dce926cdcf69656dea38221d328f1152368ae93.tar.gz
mediapointer-dvb-s2-4dce926cdcf69656dea38221d328f1152368ae93.tar.bz2
tda18271: add support for fm radio
From: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
-rw-r--r--linux/drivers/media/dvb/frontends/tda18271-fe.c53
-rw-r--r--linux/drivers/media/dvb/frontends/tda18271-tables.c4
-rw-r--r--linux/drivers/media/dvb/frontends/tda18271.h4
3 files changed, 28 insertions, 33 deletions
diff --git a/linux/drivers/media/dvb/frontends/tda18271-fe.c b/linux/drivers/media/dvb/frontends/tda18271-fe.c
index fe8797855..f0f949693 100644
--- a/linux/drivers/media/dvb/frontends/tda18271-fe.c
+++ b/linux/drivers/media/dvb/frontends/tda18271-fe.c
@@ -50,7 +50,8 @@ static int tda18271_ir_cal_init(struct dvb_frontend *fe)
/* ------------------------------------------------------------------ */
static int tda18271_channel_configuration(struct dvb_frontend *fe,
- u32 ifc, u32 freq, u32 bw, u8 std)
+ u32 ifc, u32 freq, u32 bw, u8 std,
+ int radio)
{
struct tda18271_priv *priv = fe->tuner_priv;
unsigned char *regs = priv->tda18271_regs;
@@ -77,7 +78,11 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
regs[R_MPD] |= 0x80; /* IF notch = 1 */
break;
}
- regs[R_EP4] &= ~0x80; /* FM_RFn: turn this bit on only for fm radio */
+
+ if (radio)
+ regs[R_EP4] |= 0x80;
+ else
+ regs[R_EP4] &= ~0x80;
/* update RF_TOP / IF_TOP */
switch (priv->mode) {
@@ -639,7 +644,7 @@ static int tda18271_init(struct dvb_frontend *fe)
}
static int tda18271c2_tune(struct dvb_frontend *fe,
- u32 ifc, u32 freq, u32 bw, u8 std)
+ u32 ifc, u32 freq, u32 bw, u8 std, int radio)
{
struct tda18271_priv *priv = fe->tuner_priv;
@@ -651,7 +656,7 @@ static int tda18271c2_tune(struct dvb_frontend *fe,
tda18271_rf_tracking_filters_correction(fe, freq);
- tda18271_channel_configuration(fe, ifc, freq, bw, std);
+ tda18271_channel_configuration(fe, ifc, freq, bw, std, radio);
mutex_unlock(&priv->lock);
@@ -661,7 +666,7 @@ static int tda18271c2_tune(struct dvb_frontend *fe,
/* ------------------------------------------------------------------ */
static int tda18271c1_tune(struct dvb_frontend *fe,
- u32 ifc, u32 freq, u32 bw, u8 std)
+ u32 ifc, u32 freq, u32 bw, u8 std, int radio)
{
struct tda18271_priv *priv = fe->tuner_priv;
unsigned char *regs = priv->tda18271_regs;
@@ -670,11 +675,6 @@ static int tda18271c1_tune(struct dvb_frontend *fe,
tda18271_init(fe);
mutex_lock(&priv->lock);
-#if 0
- /* FIXME: FM Radio support */
- if (t->mode == V4L2_TUNER_RADIO)
- freq = freq / 1000;
-#endif
tda_dbg("freq = %d, ifc = %d\n", freq, ifc);
@@ -798,7 +798,10 @@ static int tda18271c1_tune(struct dvb_frontend *fe,
break;
}
- regs[R_EP4] &= ~0x80; /* turn this bit on only for fm */
+ if (radio)
+ regs[R_EP4] |= 0x80;
+ else
+ regs[R_EP4] &= ~0x80;
/* image rejection validity */
tda18271_calc_ir_measure(fe, &freq);
@@ -816,17 +819,17 @@ static int tda18271c1_tune(struct dvb_frontend *fe,
}
static inline int tda18271_tune(struct dvb_frontend *fe,
- u32 ifc, u32 freq, u32 bw, u8 std)
+ u32 ifc, u32 freq, u32 bw, u8 std, int radio)
{
struct tda18271_priv *priv = fe->tuner_priv;
int ret = -EINVAL;
switch (priv->id) {
case TDA18271HDC1:
- ret = tda18271c1_tune(fe, ifc, freq, bw, std);
+ ret = tda18271c1_tune(fe, ifc, freq, bw, std, radio);
break;
case TDA18271HDC2:
- ret = tda18271c2_tune(fe, ifc, freq, bw, std);
+ ret = tda18271c2_tune(fe, ifc, freq, bw, std, radio);
break;
}
return ret;
@@ -894,7 +897,7 @@ static int tda18271_set_params(struct dvb_frontend *fe,
return -EINVAL;
}
- ret = tda18271_tune(fe, sgIF * 1000, freq, bw, std);
+ ret = tda18271_tune(fe, sgIF * 1000, freq, bw, std, 0);
if (ret < 0)
goto fail;
@@ -912,14 +915,20 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe,
struct tda18271_priv *priv = fe->tuner_priv;
struct tda18271_std_map *std_map = &priv->std;
char *mode;
- int ret;
+ int ret, radio = 0;
u8 std;
u16 sgIF;
u32 freq = params->frequency * 62500;
priv->mode = TDA18271_ANALOG;
- if (params->std & V4L2_STD_MN) {
+ if (params->mode == V4L2_TUNER_RADIO) {
+ radio = 1;
+ freq = freq / 1000;
+ std = std_map->fm_radio.std_bits;
+ sgIF = std_map->fm_radio.if_freq;
+ mode = "fm";
+ } else if (params->std & V4L2_STD_MN) {
std = std_map->atv_mn.std_bits;
sgIF = std_map->atv_mn.if_freq;
mode = "MN";
@@ -953,13 +962,9 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe,
mode = "xx";
}
-#if 0
- if (params->mode == V4L2_TUNER_RADIO)
- sgIF = std_map->fm_radio.if_freq;
-#endif
tda_dbg("setting tda18271 to system %s\n", mode);
- ret = tda18271_tune(fe, sgIF * 1000, freq, 0, std);
+ ret = tda18271_tune(fe, sgIF * 1000, freq, 0, std, radio);
if (ret < 0)
goto fail;
@@ -1027,9 +1032,7 @@ static int tda18271_dump_std_map(struct dvb_frontend *fe)
struct tda18271_std_map *std = &priv->std;
tda_dbg("========== STANDARD MAP SETTINGS ==========\n");
-#if 0
tda18271_dump_std_item(fm_radio, "fm");
-#endif
tda18271_dump_std_item(atv_b, "pal b");
tda18271_dump_std_item(atv_dk, "pal dk");
tda18271_dump_std_item(atv_gh, "pal gh");
@@ -1056,9 +1059,7 @@ static int tda18271_update_std_map(struct dvb_frontend *fe,
if (!map)
return -EINVAL;
-#if 0
tda18271_update_std(fm_radio, "fm");
-#endif
tda18271_update_std(atv_b, "atv b");
tda18271_update_std(atv_dk, "atv dk");
tda18271_update_std(atv_gh, "atv gh");
diff --git a/linux/drivers/media/dvb/frontends/tda18271-tables.c b/linux/drivers/media/dvb/frontends/tda18271-tables.c
index a39725f7b..e94afcfdc 100644
--- a/linux/drivers/media/dvb/frontends/tda18271-tables.c
+++ b/linux/drivers/media/dvb/frontends/tda18271-tables.c
@@ -1187,9 +1187,7 @@ fail:
/*---------------------------------------------------------------------*/
static struct tda18271_std_map tda18271c1_std_map = {
-#if 0
.fm_radio = { .if_freq = 1250, .std_bits = 0x18 },
-#endif
.atv_b = { .if_freq = 6750, .std_bits = 0x0e },
.atv_dk = { .if_freq = 7750, .std_bits = 0x0f },
.atv_gh = { .if_freq = 7750, .std_bits = 0x0f },
@@ -1206,9 +1204,7 @@ static struct tda18271_std_map tda18271c1_std_map = {
};
static struct tda18271_std_map tda18271c2_std_map = {
-#if 0
.fm_radio = { .if_freq = 1250, .std_bits = 0x18 },
-#endif
.atv_b = { .if_freq = 6000, .std_bits = 0x0d },
.atv_dk = { .if_freq = 6900, .std_bits = 0x0e },
.atv_gh = { .if_freq = 7100, .std_bits = 0x0e },
diff --git a/linux/drivers/media/dvb/frontends/tda18271.h b/linux/drivers/media/dvb/frontends/tda18271.h
index 51bb344c7..24b0e35a2 100644
--- a/linux/drivers/media/dvb/frontends/tda18271.h
+++ b/linux/drivers/media/dvb/frontends/tda18271.h
@@ -30,9 +30,7 @@ struct tda18271_std_map_item {
};
struct tda18271_std_map {
-#if 0
- tda18271_std_map_item fm_radio;
-#endif
+ struct tda18271_std_map_item fm_radio;
struct tda18271_std_map_item atv_b;
struct tda18271_std_map_item atv_dk;
struct tda18271_std_map_item atv_gh;