Commit 74aa7a29 authored by Andrew de Quincey's avatar Andrew de Quincey Committed by Mauro Carvalho Chehab

V4L/DVB (3887): Convert bt8xx to refactored tuner code

Rename pll calls to appropriate tuner calls.
Remove pll functions from demod structures.
Hook tuner call into tuner_ops.
Attach dvb-pll where possible.
Add pll gate control calls where appropriate.
Signed-off-by: default avatarAndrew de Quincey <adq_dvb@lidskialf.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 272bc4db
...@@ -147,12 +147,15 @@ static int thomson_dtt7579_demod_init(struct dvb_frontend* fe) ...@@ -147,12 +147,15 @@ static int thomson_dtt7579_demod_init(struct dvb_frontend* fe)
return 0; return 0;
} }
static int thomson_dtt7579_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf) static int thomson_dtt7579_tuner_pllbuf(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf, int buf_len)
{ {
u32 div; u32 div;
unsigned char bs = 0; unsigned char bs = 0;
unsigned char cp = 0; unsigned char cp = 0;
if (buf_len < 5)
return -EINVAL;
div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
if (params->frequency < 542000000) if (params->frequency < 542000000)
...@@ -169,27 +172,25 @@ static int thomson_dtt7579_pll_set(struct dvb_frontend* fe, struct dvb_frontend_ ...@@ -169,27 +172,25 @@ static int thomson_dtt7579_pll_set(struct dvb_frontend* fe, struct dvb_frontend_
else else
bs = 0x08; bs = 0x08;
pllbuf[0] = 0xc0; // Note: non-linux standard PLL i2c address pllbuf[0] = 0x60;
pllbuf[1] = div >> 8; pllbuf[1] = div >> 8;
pllbuf[2] = div & 0xff; pllbuf[2] = div & 0xff;
pllbuf[3] = cp; pllbuf[3] = cp;
pllbuf[4] = bs; pllbuf[4] = bs;
return 0; return 5;
} }
static struct mt352_config thomson_dtt7579_config = { static struct mt352_config thomson_dtt7579_config = {
.demod_address = 0x0f, .demod_address = 0x0f,
.demod_init = thomson_dtt7579_demod_init, .demod_init = thomson_dtt7579_demod_init,
.pll_set = thomson_dtt7579_pll_set,
}; };
static struct zl10353_config thomson_dtt7579_zl10353_config = { static struct zl10353_config thomson_dtt7579_zl10353_config = {
.demod_address = 0x0f, .demod_address = 0x0f,
.pll_set = thomson_dtt7579_pll_set,
}; };
static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) static int cx24108_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
{ {
u32 freq = params->frequency; u32 freq = params->frequency;
...@@ -242,7 +243,7 @@ static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_paramete ...@@ -242,7 +243,7 @@ static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_paramete
return 0; return 0;
} }
static int pinnsat_pll_init(struct dvb_frontend* fe) static int pinnsat_tuner_init(struct dvb_frontend* fe)
{ {
struct dvb_bt8xx_card *card = fe->dvb->priv; struct dvb_bt8xx_card *card = fe->dvb->priv;
...@@ -252,7 +253,7 @@ static int pinnsat_pll_init(struct dvb_frontend* fe) ...@@ -252,7 +253,7 @@ static int pinnsat_pll_init(struct dvb_frontend* fe)
return 0; return 0;
} }
static int pinnsat_pll_sleep(struct dvb_frontend* fe) static int pinnsat_tuner_sleep(struct dvb_frontend* fe)
{ {
struct dvb_bt8xx_card *card = fe->dvb->priv; struct dvb_bt8xx_card *card = fe->dvb->priv;
...@@ -263,12 +264,9 @@ static int pinnsat_pll_sleep(struct dvb_frontend* fe) ...@@ -263,12 +264,9 @@ static int pinnsat_pll_sleep(struct dvb_frontend* fe)
static struct cx24110_config pctvsat_config = { static struct cx24110_config pctvsat_config = {
.demod_address = 0x55, .demod_address = 0x55,
.pll_init = pinnsat_pll_init,
.pll_set = cx24108_pll_set,
.pll_sleep = pinnsat_pll_sleep,
}; };
static int microtune_mt7202dtf_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) static int microtune_mt7202dtf_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
{ {
struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv;
u8 cfg, cpump, band_select; u8 cfg, cpump, band_select;
...@@ -302,6 +300,8 @@ static int microtune_mt7202dtf_pll_set(struct dvb_frontend* fe, struct dvb_front ...@@ -302,6 +300,8 @@ static int microtune_mt7202dtf_pll_set(struct dvb_frontend* fe, struct dvb_front
data[2] = ((div >> 10) & 0x60) | cfg; data[2] = ((div >> 10) & 0x60) | cfg;
data[3] = (cpump << 6) | band_select; data[3] = (cpump << 6) | band_select;
if (fe->ops->i2c_gate_ctrl)
fe->ops->i2c_gate_ctrl(fe, 1);
i2c_transfer(card->i2c_adapter, &msg, 1); i2c_transfer(card->i2c_adapter, &msg, 1);
return (div * 166666 - 36000000); return (div * 166666 - 36000000);
} }
...@@ -315,7 +315,6 @@ static int microtune_mt7202dtf_request_firmware(struct dvb_frontend* fe, const s ...@@ -315,7 +315,6 @@ static int microtune_mt7202dtf_request_firmware(struct dvb_frontend* fe, const s
static struct sp887x_config microtune_mt7202dtf_config = { static struct sp887x_config microtune_mt7202dtf_config = {
.demod_address = 0x70, .demod_address = 0x70,
.pll_set = microtune_mt7202dtf_pll_set,
.request_firmware = microtune_mt7202dtf_request_firmware, .request_firmware = microtune_mt7202dtf_request_firmware,
}; };
...@@ -342,12 +341,14 @@ static int advbt771_samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe) ...@@ -342,12 +341,14 @@ static int advbt771_samsung_tdtc9251dh0_demod_init(struct dvb_frontend* fe)
return 0; return 0;
} }
static int advbt771_samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf) static int advbt771_samsung_tdtc9251dh0_tuner_pllbuf(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf, int buf_len)
{ {
u32 div; u32 div;
unsigned char bs = 0; unsigned char bs = 0;
unsigned char cp = 0; unsigned char cp = 0;
if (buf_len < 5) return -EINVAL;
div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
if (params->frequency < 150000000) if (params->frequency < 150000000)
...@@ -388,19 +389,18 @@ static int advbt771_samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct ...@@ -388,19 +389,18 @@ static int advbt771_samsung_tdtc9251dh0_pll_set(struct dvb_frontend* fe, struct
else else
bs = 0x08; bs = 0x08;
pllbuf[0] = 0xc2; // Note: non-linux standard PLL i2c address pllbuf[0] = 0x61;
pllbuf[1] = div >> 8; pllbuf[1] = div >> 8;
pllbuf[2] = div & 0xff; pllbuf[2] = div & 0xff;
pllbuf[3] = cp; pllbuf[3] = cp;
pllbuf[4] = bs; pllbuf[4] = bs;
return 0; return 5;
} }
static struct mt352_config advbt771_samsung_tdtc9251dh0_config = { static struct mt352_config advbt771_samsung_tdtc9251dh0_config = {
.demod_address = 0x0f, .demod_address = 0x0f,
.demod_init = advbt771_samsung_tdtc9251dh0_demod_init, .demod_init = advbt771_samsung_tdtc9251dh0_demod_init,
.pll_set = advbt771_samsung_tdtc9251dh0_pll_set,
}; };
static struct dst_config dst_config = { static struct dst_config dst_config = {
...@@ -460,7 +460,7 @@ static struct or51211_config or51211_config = { ...@@ -460,7 +460,7 @@ static struct or51211_config or51211_config = {
.sleep = or51211_sleep, .sleep = or51211_sleep,
}; };
static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) static int vp3021_alps_tded4_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
{ {
struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv;
u8 buf[4]; u8 buf[4];
...@@ -483,6 +483,8 @@ static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_fronten ...@@ -483,6 +483,8 @@ static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_fronten
else else
return -EINVAL; return -EINVAL;
if (fe->ops->i2c_gate_ctrl)
fe->ops->i2c_gate_ctrl(fe, 1);
i2c_transfer(card->i2c_adapter, &msg, 1); i2c_transfer(card->i2c_adapter, &msg, 1);
return 0; return 0;
} }
...@@ -490,7 +492,6 @@ static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_fronten ...@@ -490,7 +492,6 @@ static int vp3021_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_fronten
static struct nxt6000_config vp3021_alps_tded4_config = { static struct nxt6000_config vp3021_alps_tded4_config = {
.demod_address = 0x0a, .demod_address = 0x0a,
.clock_inversion = 1, .clock_inversion = 1,
.pll_set = vp3021_alps_tded4_pll_set,
}; };
static int digitv_alps_tded4_demod_init(struct dvb_frontend* fe) static int digitv_alps_tded4_demod_init(struct dvb_frontend* fe)
...@@ -511,14 +512,17 @@ static int digitv_alps_tded4_demod_init(struct dvb_frontend* fe) ...@@ -511,14 +512,17 @@ static int digitv_alps_tded4_demod_init(struct dvb_frontend* fe)
return 0; return 0;
} }
static int digitv_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf) static int digitv_alps_tded4_tuner_pllbuf(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u8* pllbuf, int buf_len)
{ {
u32 div; u32 div;
struct dvb_ofdm_parameters *op = &params->u.ofdm; struct dvb_ofdm_parameters *op = &params->u.ofdm;
if (buf_len < 5)
return -EINVAL;
div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6; div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
pllbuf[0] = 0xc2; pllbuf[0] = 0x61;
pllbuf[1] = (div >> 8) & 0x7F; pllbuf[1] = (div >> 8) & 0x7F;
pllbuf[2] = div & 0xFF; pllbuf[2] = div & 0xFF;
pllbuf[3] = 0x85; pllbuf[3] = 0x85;
...@@ -535,7 +539,7 @@ static int digitv_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_fronten ...@@ -535,7 +539,7 @@ static int digitv_alps_tded4_pll_set(struct dvb_frontend* fe, struct dvb_fronten
if (op->bandwidth == 8) if (op->bandwidth == 8)
pllbuf[4] |= 0x04; pllbuf[4] |= 0x04;
return 0; return 5;
} }
static void digitv_alps_tded4_reset(struct dvb_bt8xx_card *bt) static void digitv_alps_tded4_reset(struct dvb_bt8xx_card *bt)
...@@ -562,10 +566,9 @@ static void digitv_alps_tded4_reset(struct dvb_bt8xx_card *bt) ...@@ -562,10 +566,9 @@ static void digitv_alps_tded4_reset(struct dvb_bt8xx_card *bt)
static struct mt352_config digitv_alps_tded4_config = { static struct mt352_config digitv_alps_tded4_config = {
.demod_address = 0x0a, .demod_address = 0x0a,
.demod_init = digitv_alps_tded4_demod_init, .demod_init = digitv_alps_tded4_demod_init,
.pll_set = digitv_alps_tded4_pll_set,
}; };
static int tdvs_tua6034_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) static int tdvs_tua6034_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
{ {
struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv; struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *) fe->dvb->priv;
return lg_h06xf_pll_set(fe, card->i2c_adapter, params); return lg_h06xf_pll_set(fe, card->i2c_adapter, params);
...@@ -575,7 +578,6 @@ static struct lgdt330x_config tdvs_tua6034_config = { ...@@ -575,7 +578,6 @@ static struct lgdt330x_config tdvs_tua6034_config = {
.demod_address = 0x0e, .demod_address = 0x0e,
.demod_chip = LGDT3303, .demod_chip = LGDT3303,
.serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */ .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
.pll_set = tdvs_tua6034_pll_set,
}; };
static void lgdt330x_reset(struct dvb_bt8xx_card *bt) static void lgdt330x_reset(struct dvb_bt8xx_card *bt)
...@@ -605,6 +607,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) ...@@ -605,6 +607,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
card->i2c_adapter); card->i2c_adapter);
if (card->fe != NULL) { if (card->fe != NULL) {
card->fe->ops->tuner_ops.pllbuf = thomson_dtt7579_tuner_pllbuf;
card->fe->ops->info.frequency_min = 174000000; card->fe->ops->info.frequency_min = 174000000;
card->fe->ops->info.frequency_max = 862000000; card->fe->ops->info.frequency_max = 862000000;
} }
...@@ -613,8 +616,10 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) ...@@ -613,8 +616,10 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
case BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE: case BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE:
lgdt330x_reset(card); lgdt330x_reset(card);
card->fe = lgdt330x_attach(&tdvs_tua6034_config, card->i2c_adapter); card->fe = lgdt330x_attach(&tdvs_tua6034_config, card->i2c_adapter);
if (card->fe != NULL) if (card->fe != NULL) {
card->fe->ops->tuner_ops.set_params = tdvs_tua6034_tuner_set_params;
dprintk ("dvb_bt8xx: lgdt330x detected\n"); dprintk ("dvb_bt8xx: lgdt330x detected\n");
}
break; break;
case BTTV_BOARD_NEBULA_DIGITV: case BTTV_BOARD_NEBULA_DIGITV:
...@@ -627,6 +632,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) ...@@ -627,6 +632,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
digitv_alps_tded4_reset(card); digitv_alps_tded4_reset(card);
card->fe = nxt6000_attach(&vp3021_alps_tded4_config, card->i2c_adapter); card->fe = nxt6000_attach(&vp3021_alps_tded4_config, card->i2c_adapter);
if (card->fe != NULL) { if (card->fe != NULL) {
card->fe->ops->tuner_ops.set_params = vp3021_alps_tded4_tuner_set_params;
dprintk ("dvb_bt8xx: an nxt6000 was detected on your digitv card\n"); dprintk ("dvb_bt8xx: an nxt6000 was detected on your digitv card\n");
break; break;
} }
...@@ -635,17 +641,23 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) ...@@ -635,17 +641,23 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
digitv_alps_tded4_reset(card); digitv_alps_tded4_reset(card);
card->fe = mt352_attach(&digitv_alps_tded4_config, card->i2c_adapter); card->fe = mt352_attach(&digitv_alps_tded4_config, card->i2c_adapter);
if (card->fe != NULL) if (card->fe != NULL) {
card->fe->ops->tuner_ops.pllbuf = digitv_alps_tded4_tuner_pllbuf;
dprintk ("dvb_bt8xx: an mt352 was detected on your digitv card\n"); dprintk ("dvb_bt8xx: an mt352 was detected on your digitv card\n");
}
break; break;
case BTTV_BOARD_AVDVBT_761: case BTTV_BOARD_AVDVBT_761:
card->fe = sp887x_attach(&microtune_mt7202dtf_config, card->i2c_adapter); card->fe = sp887x_attach(&microtune_mt7202dtf_config, card->i2c_adapter);
if (card->fe) {
card->fe->ops->tuner_ops.set_params = microtune_mt7202dtf_tuner_set_params;
}
break; break;
case BTTV_BOARD_AVDVBT_771: case BTTV_BOARD_AVDVBT_771:
card->fe = mt352_attach(&advbt771_samsung_tdtc9251dh0_config, card->i2c_adapter); card->fe = mt352_attach(&advbt771_samsung_tdtc9251dh0_config, card->i2c_adapter);
if (card->fe != NULL) { if (card->fe != NULL) {
card->fe->ops->tuner_ops.pllbuf = advbt771_samsung_tdtc9251dh0_tuner_pllbuf;
card->fe->ops->info.frequency_min = 174000000; card->fe->ops->info.frequency_min = 174000000;
card->fe->ops->info.frequency_max = 862000000; card->fe->ops->info.frequency_max = 862000000;
} }
...@@ -674,6 +686,11 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) ...@@ -674,6 +686,11 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
case BTTV_BOARD_PINNACLESAT: case BTTV_BOARD_PINNACLESAT:
card->fe = cx24110_attach(&pctvsat_config, card->i2c_adapter); card->fe = cx24110_attach(&pctvsat_config, card->i2c_adapter);
if (card->fe) {
card->fe->ops->tuner_ops.init = pinnsat_tuner_init;
card->fe->ops->tuner_ops.sleep = pinnsat_tuner_sleep;
card->fe->ops->tuner_ops.set_params = cx24108_tuner_set_params;
}
break; break;
case BTTV_BOARD_PC_HDTV: case BTTV_BOARD_PC_HDTV:
......
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