Browse Source

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: Andrew de Quincey <adq_dvb@lidskialf.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Andrew de Quincey 19 years ago
parent
commit
74aa7a29fe
1 changed files with 44 additions and 27 deletions
  1. 44 27
      drivers/media/dvb/bt8xx/dvb-bt8xx.c

+ 44 - 27
drivers/media/dvb/bt8xx/dvb-bt8xx.c

@@ -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_
 	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
 	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)
 	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)
 
 
 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
 	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
 
 
 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)
 	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
 	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 = {
 	.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
 	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
 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)
 	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
 	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)
 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 = {
 	.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)
 						  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)
 	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)
 		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)
 		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)
 
 
 	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: