Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] [PATCH 4/4] Frontend i2c conversion - nxt6000



Frontend conversion to kernel i2c, please check.

Kenneth

 nxt6000.c |  350 
+++++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 203 insertions(+), 147 deletions(-)
Index: nxt6000.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/nxt6000.c,v
retrieving revision 1.18
diff -u -r1.18 nxt6000.c
--- nxt6000.c	11 Mar 2004 18:40:44 -0000	1.18
+++ nxt6000.c	12 Jul 2004 17:09:37 -0000
@@ -60,42 +60,42 @@
                 FE_CAN_HIERARCHY_AUTO,
 };
 
-struct nxt6000_config {
+struct nxt6000_state {
 	u8 demod_addr;
 	u8 tuner_addr;
 	u8 tuner_type;
 	u8 clock_inversion;
+
+	struct i2c_adapter *i2c;
+	struct dvb_adapter *dvb;
 };
 
 #define TUNER_TYPE_ALP510	0
 #define TUNER_TYPE_SP5659	1
 #define TUNER_TYPE_SP5730	2
 
-#define FE2NXT(fe) ((struct nxt6000_config *)((fe)->data))
 #define FREQ2DIV(freq) ((freq + 36166667) / 166667)
 
 #define dprintk if (debug) printk
 
-static int nxt6000_write(struct dvb_i2c_bus *i2c, u8 addr, u8 reg, u8 data)
+static int nxt6000_write(struct i2c_adapter *i2c, u8 addr, u8 reg, u8 data)
 {
 	u8 buf[] = { reg, data };
 	struct i2c_msg msg = {.addr = addr >> 1,.flags = 0,.buf = buf,.len = 2 };
 	int ret;
 
-	if ((ret = i2c->xfer(i2c, &msg, 1)) != 1)
+	if ((ret = i2c_transfer(i2c, &msg, 1)) != 1)
 		dprintk("nxt6000: nxt6000_write error (.addr = 0x%02X, reg: 0x%02X, data: 0x%02X, ret: %d)\n", addr, reg, data, ret);
 
 	return (ret != 1) ? -EFAULT : 0;
 }
 
-static u8 nxt6000_writereg(struct dvb_frontend *fe, u8 reg, u8 data)
+static u8 nxt6000_writereg(struct nxt6000_state *state, u8 reg, u8 data)
 {
-	struct nxt6000_config *nxt = FE2NXT(fe);
-
-	return nxt6000_write(fe->i2c, nxt->demod_addr, reg, data);
+	return nxt6000_write(state->i2c, state->demod_addr, reg, data);
 }
 
-static u8 nxt6000_read(struct dvb_i2c_bus *i2c, u8 addr, u8 reg)
+static u8 nxt6000_read(struct i2c_adapter *i2c, u8 addr, u8 reg)
 {
 	int ret;
 	u8 b0[] = { reg };
@@ -105,7 +105,7 @@
 		{.addr = addr >> 1,.flags = I2C_M_RD,.buf = b1,.len = 1}
 	};
 
-	ret = i2c->xfer(i2c, msgs, 2);
+	ret = i2c_transfer(i2c, msgs, 2);
 
 	if (ret != 2)
 		dprintk("nxt6000: nxt6000_read error (.addr = 0x%02X, reg: 0x%02X, ret: %d)\n", addr, reg, ret);
@@ -113,33 +113,31 @@
 	return b1[0];
 }
 
-static u8 nxt6000_readreg(struct dvb_frontend *fe, u8 reg)
+static u8 nxt6000_readreg(struct nxt6000_state *state, u8 reg)
 {
-	struct nxt6000_config *nxt = FE2NXT(fe);
-
-	return nxt6000_read(fe->i2c, nxt->demod_addr, reg);
+	return nxt6000_read(state->i2c, state->demod_addr, reg);
 }
 
-static int pll_test(struct dvb_i2c_bus *i2c, u8 demod_addr, u8 tuner_addr)
+static int pll_test(struct i2c_adapter *i2c, u8 demod_addr, u8 tuner_addr)
 {
 	u8 buf [1];
 	struct i2c_msg msg = {.addr = tuner_addr >> 1,.flags = I2C_M_RD,.buf = buf,.len = 1 };
 	int ret;
 
 	nxt6000_write(i2c, demod_addr, ENABLE_TUNER_IIC, 0x01);	/* open i2c bus switch */
-	ret = i2c->xfer(i2c, &msg, 1);
+	ret = i2c_transfer(i2c, &msg, 1);
 	nxt6000_write(i2c, demod_addr, ENABLE_TUNER_IIC, 0x00);	/* close i2c bus switch */
 
 	return (ret != 1) ? -EFAULT : 0;
 }
 
-static int pll_write(struct dvb_i2c_bus *i2c, u8 demod_addr, u8 tuner_addr, u8 * buf, u8 len)
+static int pll_write(struct i2c_adapter *i2c, u8 demod_addr, u8 tuner_addr, u8 * buf, u8 len)
 {
 	struct i2c_msg msg = {.addr = tuner_addr >> 1,.flags = 0,.buf = buf,.len = len };
 	int ret;
 
 	nxt6000_write(i2c, demod_addr, ENABLE_TUNER_IIC, 0x01);	/* open i2c bus switch */
-	ret = i2c->xfer(i2c, &msg, 1);
+	ret = i2c_transfer(i2c, &msg, 1);
 	nxt6000_write(i2c, demod_addr, ENABLE_TUNER_IIC, 0x00);	/* close i2c bus switch */
 
 	if (ret != 1)
@@ -148,10 +146,9 @@
 	return (ret != 1) ? -EFAULT : 0;
 }
 
-static int sp5659_set_tv_freq(struct dvb_frontend *fe, u32 freq)
+static int sp5659_set_tv_freq(struct nxt6000_state *state, u32 freq)
 {
 	u8 buf[4];
-	struct nxt6000_config *nxt = FE2NXT(fe);
 
 	buf[0] = (FREQ2DIV(freq) >> 8) & 0x7F;
 	buf[1] = FREQ2DIV(freq) & 0xFF;
@@ -166,13 +163,12 @@
 	else
 		return -EINVAL;
 
-	return pll_write(fe->i2c, nxt->demod_addr, nxt->tuner_addr, buf, 4);
+	return pll_write(state->i2c, state->demod_addr, state->tuner_addr, buf, 4);
 }
 
-static int alp510_set_tv_freq(struct dvb_frontend *fe, u32 freq)
+static int alp510_set_tv_freq(struct nxt6000_state *state, u32 freq)
 {
 	u8 buf[4];
-	struct nxt6000_config *nxt = FE2NXT(fe);
 
 	buf[0] = (FREQ2DIV(freq) >> 8) & 0x7F;
 	buf[1] = FREQ2DIV(freq) & 0xFF;
@@ -202,13 +198,12 @@
 		return -EINVAL;
 #endif
 
-	return pll_write(fe->i2c, nxt->demod_addr, nxt->tuner_addr, buf, 4);
+	return pll_write(state->i2c, state->demod_addr, state->tuner_addr, buf, 4);
 }
 
-static int sp5730_set_tv_freq(struct dvb_frontend *fe, u32 freq)
+static int sp5730_set_tv_freq(struct nxt6000_state *state, u32 freq)
 {
 	u8 buf[4];
-	struct nxt6000_config *nxt = FE2NXT(fe);
 
 	buf[0] = (FREQ2DIV(freq) >> 8) & 0x7F;
 	buf[1] = FREQ2DIV(freq) & 0xFF;
@@ -233,20 +228,20 @@
 	else
 		return -EINVAL;
 
-	return pll_write(fe->i2c, nxt->demod_addr, nxt->tuner_addr, buf, 4);
+	return pll_write(state->i2c, state->demod_addr, state->tuner_addr, buf, 4);
 }
 
-static void nxt6000_reset(struct dvb_frontend *fe)
+static void nxt6000_reset(struct nxt6000_state *state)
 {
 	u8 val;
 
-	val = nxt6000_readreg(fe, OFDM_COR_CTL);
+	val = nxt6000_readreg(state, OFDM_COR_CTL);
 
-	nxt6000_writereg(fe, OFDM_COR_CTL, val & ~COREACT);
-	nxt6000_writereg(fe, OFDM_COR_CTL, val | COREACT);
+	nxt6000_writereg(state, OFDM_COR_CTL, val & ~COREACT);
+	nxt6000_writereg(state, OFDM_COR_CTL, val | COREACT);
 }
 
-static int nxt6000_set_bandwidth(struct dvb_frontend *fe, fe_bandwidth_t bandwidth)
+static int nxt6000_set_bandwidth(struct nxt6000_state *state, fe_bandwidth_t bandwidth)
 {
 	u16 nominal_rate;
 	int result;
@@ -269,43 +264,43 @@
 		return -EINVAL;
 	}
 
-	if ((result = nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_1, nominal_rate & 0xFF)) < 0)
+	if ((result = nxt6000_writereg(state, OFDM_TRL_NOMINALRATE_1, nominal_rate & 0xFF)) < 0)
 		return result;
 
-	return nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_2, (nominal_rate >> 8) & 0xFF);
+	return nxt6000_writereg(state, OFDM_TRL_NOMINALRATE_2, (nominal_rate >> 8) & 0xFF);
 }
 
-static int nxt6000_set_guard_interval(struct dvb_frontend *fe, fe_guard_interval_t guard_interval)
+static int nxt6000_set_guard_interval(struct nxt6000_state *state, fe_guard_interval_t guard_interval)
 {
 	switch (guard_interval) {
 
 	case GUARD_INTERVAL_1_32:
-		return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, 0x00 | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x03));
+		return nxt6000_writereg(state, OFDM_COR_MODEGUARD, 0x00 | (nxt6000_readreg(state, OFDM_COR_MODEGUARD) & ~0x03));
 
 	case GUARD_INTERVAL_1_16:
-		return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, 0x01 | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x03));
+		return nxt6000_writereg(state, OFDM_COR_MODEGUARD, 0x01 | (nxt6000_readreg(state, OFDM_COR_MODEGUARD) & ~0x03));
 
 	case GUARD_INTERVAL_AUTO:
 	case GUARD_INTERVAL_1_8:
-		return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, 0x02 | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x03));
+		return nxt6000_writereg(state, OFDM_COR_MODEGUARD, 0x02 | (nxt6000_readreg(state, OFDM_COR_MODEGUARD) & ~0x03));
 
 	case GUARD_INTERVAL_1_4:
-		return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, 0x03 | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x03));
+		return nxt6000_writereg(state, OFDM_COR_MODEGUARD, 0x03 | (nxt6000_readreg(state, OFDM_COR_MODEGUARD) & ~0x03));
 
 	default:
 		return -EINVAL;
 	}
 }
 
-static int nxt6000_set_inversion(struct dvb_frontend *fe, fe_spectral_inversion_t inversion)
+static int nxt6000_set_inversion(struct nxt6000_state *state, fe_spectral_inversion_t inversion)
 {
 	switch (inversion) {
 
 	case INVERSION_OFF:
-		return nxt6000_writereg(fe, OFDM_ITB_CTL, 0x00);
+		return nxt6000_writereg(state, OFDM_ITB_CTL, 0x00);
 
 	case INVERSION_ON:
-		return nxt6000_writereg(fe, OFDM_ITB_CTL, ITBINV);
+		return nxt6000_writereg(state, OFDM_ITB_CTL, ITBINV);
 
 	default:
 		return -EINVAL;
@@ -313,24 +308,24 @@
 	}
 }
 
-static int nxt6000_set_transmission_mode(struct dvb_frontend *fe, fe_transmit_mode_t transmission_mode)
+static int nxt6000_set_transmission_mode(struct nxt6000_state *state, fe_transmit_mode_t transmission_mode)
 {
 	int result;
 
 	switch (transmission_mode) {
 
 	case TRANSMISSION_MODE_2K:
-		if ((result = nxt6000_writereg(fe, EN_DMD_RACQ, 0x00 | (nxt6000_readreg(fe, EN_DMD_RACQ) & ~0x03))) < 0)
+		if ((result = nxt6000_writereg(state, EN_DMD_RACQ, 0x00 | (nxt6000_readreg(state, EN_DMD_RACQ) & ~0x03))) < 0)
 			return result;
 
-		return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, (0x00 << 2) | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x04));
+		return nxt6000_writereg(state, OFDM_COR_MODEGUARD, (0x00 << 2) | (nxt6000_readreg(state, OFDM_COR_MODEGUARD) & ~0x04));
 
 	case TRANSMISSION_MODE_8K:
 	case TRANSMISSION_MODE_AUTO:
-		if ((result = nxt6000_writereg(fe, EN_DMD_RACQ, 0x02 | (nxt6000_readreg(fe, EN_DMD_RACQ) & ~0x03))) < 0)
+		if ((result = nxt6000_writereg(state, EN_DMD_RACQ, 0x02 | (nxt6000_readreg(state, EN_DMD_RACQ) & ~0x03))) < 0)
 			return result;
 
-		return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, (0x01 << 2) | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x04));
+		return nxt6000_writereg(state, OFDM_COR_MODEGUARD, (0x01 << 2) | (nxt6000_readreg(state, OFDM_COR_MODEGUARD) & ~0x04));
 
 	default:
 		return -EINVAL;
@@ -338,60 +333,59 @@
 	}
 }
 
-static void nxt6000_setup(struct dvb_frontend *fe)
+static void nxt6000_setup(struct nxt6000_state *state)
 {
-	struct nxt6000_config *nxt = FE2NXT(fe);
+	nxt6000_writereg(state, RS_COR_SYNC_PARAM, SYNC_PARAM);
+	nxt6000_writereg(state, BER_CTRL, /*(1 << 2) | */ (0x01 << 1) | 0x01);
+	nxt6000_writereg(state, VIT_COR_CTL, VIT_COR_RESYNC);
+	nxt6000_writereg(state, OFDM_COR_CTL, (0x01 << 5) |
+				(nxt6000_readreg(state, OFDM_COR_CTL) & 0x0F));
+	nxt6000_writereg(state, OFDM_COR_MODEGUARD, FORCEMODE8K | 0x02);
+	nxt6000_writereg(state, OFDM_AGC_CTL, AGCLAST | INITIAL_AGC_BW);
+	nxt6000_writereg(state, OFDM_ITB_FREQ_1, 0x06);
+	nxt6000_writereg(state, OFDM_ITB_FREQ_2, 0x31);
+	nxt6000_writereg(state, OFDM_CAS_CTL, (0x01 << 7) | (0x02 << 3) | 0x04);
+	nxt6000_writereg(state, CAS_FREQ, 0xBB);	/* CHECKME */
+	nxt6000_writereg(state, OFDM_SYR_CTL, 1 << 2);
+	nxt6000_writereg(state, OFDM_PPM_CTL_1, PPM256);
+	nxt6000_writereg(state, OFDM_TRL_NOMINALRATE_1, 0x49);
+	nxt6000_writereg(state, OFDM_TRL_NOMINALRATE_2, 0x72);
+	nxt6000_writereg(state, ANALOG_CONTROL_0, 1 << 5);
+	nxt6000_writereg(state, EN_DMD_RACQ, (1 << 7) | (3 << 4) | 2);
+	nxt6000_writereg(state, DIAG_CONFIG, TB_SET);
 
-	nxt6000_writereg(fe, RS_COR_SYNC_PARAM, SYNC_PARAM);
-	nxt6000_writereg(fe, BER_CTRL, /*(1 << 2) | */ (0x01 << 1) | 0x01);
-	nxt6000_writereg(fe, VIT_COR_CTL, VIT_COR_RESYNC);
-	nxt6000_writereg(fe, OFDM_COR_CTL, (0x01 << 5) | (nxt6000_readreg(fe, OFDM_COR_CTL) & 0x0F));
-	nxt6000_writereg(fe, OFDM_COR_MODEGUARD, FORCEMODE8K | 0x02);
-	nxt6000_writereg(fe, OFDM_AGC_CTL, AGCLAST | INITIAL_AGC_BW);
-	nxt6000_writereg(fe, OFDM_ITB_FREQ_1, 0x06);
-	nxt6000_writereg(fe, OFDM_ITB_FREQ_2, 0x31);
-	nxt6000_writereg(fe, OFDM_CAS_CTL, (0x01 << 7) | (0x02 << 3) | 0x04);
-	nxt6000_writereg(fe, CAS_FREQ, 0xBB);	/* CHECKME */
-	nxt6000_writereg(fe, OFDM_SYR_CTL, 1 << 2);
-	nxt6000_writereg(fe, OFDM_PPM_CTL_1, PPM256);
-	nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_1, 0x49);
-	nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_2, 0x72);
-	nxt6000_writereg(fe, ANALOG_CONTROL_0, 1 << 5);
-	nxt6000_writereg(fe, EN_DMD_RACQ, (1 << 7) | (3 << 4) | 2);
-	nxt6000_writereg(fe, DIAG_CONFIG, TB_SET);
-
-	if (nxt->clock_inversion)
-		nxt6000_writereg(fe, SUB_DIAG_MODE_SEL, CLKINVERSION);
+	if (state->clock_inversion)
+		nxt6000_writereg(state, SUB_DIAG_MODE_SEL, CLKINVERSION);
 	else
-		nxt6000_writereg(fe, SUB_DIAG_MODE_SEL, 0);
+		nxt6000_writereg(state, SUB_DIAG_MODE_SEL, 0);
 
-	nxt6000_writereg(fe, TS_FORMAT, 0);
+	nxt6000_writereg(state, TS_FORMAT, 0);
 }
 
-static void nxt6000_dump_status(struct dvb_frontend *fe)
+static void nxt6000_dump_status(struct nxt6000_state *state)
 {
 	u8 val;
 
 /*
-	printk("RS_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, RS_COR_STAT));
-	printk("VIT_SYNC_STATUS: 0x%02X\n", nxt6000_readreg(fe, VIT_SYNC_STATUS));
-	printk("OFDM_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_COR_STAT));
-	printk("OFDM_SYR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_SYR_STAT));
-	printk("OFDM_TPS_RCVD_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_1));
-	printk("OFDM_TPS_RCVD_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_2));
-	printk("OFDM_TPS_RCVD_3: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_3));
-	printk("OFDM_TPS_RCVD_4: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_4));
-	printk("OFDM_TPS_RESERVED_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_1));
-	printk("OFDM_TPS_RESERVED_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_2));
+	printk("RS_COR_STAT: 0x%02X\n", nxt6000_readreg(state, RS_COR_STAT));
+	printk("VIT_SYNC_STATUS: 0x%02X\n", nxt6000_readreg(state, VIT_SYNC_STATUS));
+	printk("OFDM_COR_STAT: 0x%02X\n", nxt6000_readreg(state, OFDM_COR_STAT));
+	printk("OFDM_SYR_STAT: 0x%02X\n", nxt6000_readreg(state, OFDM_SYR_STAT));
+	printk("OFDM_TPS_RCVD_1: 0x%02X\n", nxt6000_readreg(state, OFDM_TPS_RCVD_1));
+	printk("OFDM_TPS_RCVD_2: 0x%02X\n", nxt6000_readreg(state, OFDM_TPS_RCVD_2));
+	printk("OFDM_TPS_RCVD_3: 0x%02X\n", nxt6000_readreg(state, OFDM_TPS_RCVD_3));
+	printk("OFDM_TPS_RCVD_4: 0x%02X\n", nxt6000_readreg(state, OFDM_TPS_RCVD_4));
+	printk("OFDM_TPS_RESERVED_1: 0x%02X\n", nxt6000_readreg(state, OFDM_TPS_RESERVED_1));
+	printk("OFDM_TPS_RESERVED_2: 0x%02X\n", nxt6000_readreg(state, OFDM_TPS_RESERVED_2));
 */
 	printk("NXT6000 status:");
 
-	val = nxt6000_readreg(fe, RS_COR_STAT);
+	val = nxt6000_readreg(state, RS_COR_STAT);
 
 	printk(" DATA DESCR LOCK: %d,", val & 0x01);
 	printk(" DATA SYNC LOCK: %d,", (val >> 1) & 0x01);
 
-	val = nxt6000_readreg(fe, VIT_SYNC_STATUS);
+	val = nxt6000_readreg(state, VIT_SYNC_STATUS);
 
 	printk(" VITERBI LOCK: %d,", (val >> 7) & 0x01);
 
@@ -422,7 +416,7 @@
 
 	}
 
-	val = nxt6000_readreg(fe, OFDM_COR_STAT);
+	val = nxt6000_readreg(state, OFDM_COR_STAT);
 
 	printk(" CHCTrack: %d,", (val >> 7) & 0x01);
 	printk(" TPSLock: %d,", (val >> 6) & 0x01);
@@ -464,7 +458,7 @@
 
 	}
 
-	val = nxt6000_readreg(fe, OFDM_SYR_STAT);
+	val = nxt6000_readreg(state, OFDM_SYR_STAT);
 
 	printk(" SYRLock: %d,", (val >> 4) & 0x01);
 	printk(" SYRMode: %s,", (val >> 2) & 0x01 ? "8K" : "2K");
@@ -488,7 +482,7 @@
 		break;
 	}
 
-	val = nxt6000_readreg(fe, OFDM_TPS_RCVD_3);
+	val = nxt6000_readreg(state, OFDM_TPS_RCVD_3);
 
 	switch ((val >> 4) & 0x07) {
 
@@ -544,7 +538,7 @@
 
 	}
 
-	val = nxt6000_readreg(fe, OFDM_TPS_RCVD_4);
+	val = nxt6000_readreg(state, OFDM_TPS_RCVD_4);
 
 	printk(" TPSMode: %s,", val & 0x01 ? "8K" : "2K");
 
@@ -569,9 +563,9 @@
 	}
 
 	/* Strange magic required to gain access to RF_AGC_STATUS */
-	nxt6000_readreg(fe, RF_AGC_VAL_1);
-	val = nxt6000_readreg(fe, RF_AGC_STATUS);
-	val = nxt6000_readreg(fe, RF_AGC_STATUS);
+	nxt6000_readreg(state, RF_AGC_VAL_1);
+	val = nxt6000_readreg(state, RF_AGC_STATUS);
+	val = nxt6000_readreg(state, RF_AGC_STATUS);
 
 	printk(" RF AGC LOCK: %d,", (val >> 4) & 0x01);
 	printk("\n");
@@ -579,6 +573,8 @@
 
 static int nxt6000_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
 {
+	struct nxt6000_state *state = fe->data;
+
 	switch (cmd) {
 
 	case FE_GET_INFO:
@@ -593,25 +589,25 @@
 
 			*status = 0;
 
-			core_status = nxt6000_readreg(fe, OFDM_COR_STAT);
+			core_status = nxt6000_readreg(state, OFDM_COR_STAT);
 
 			if (core_status & AGCLOCKED)
 				*status |= FE_HAS_SIGNAL;
 
-			if (nxt6000_readreg(fe, OFDM_SYR_STAT) & GI14_SYR_LOCK)
+			if (nxt6000_readreg(state, OFDM_SYR_STAT) & GI14_SYR_LOCK)
 				*status |= FE_HAS_CARRIER;
 
-			if (nxt6000_readreg(fe, VIT_SYNC_STATUS) & VITINSYNC)
+			if (nxt6000_readreg(state, VIT_SYNC_STATUS) & VITINSYNC)
 				*status |= FE_HAS_VITERBI;
 
-			if (nxt6000_readreg(fe, RS_COR_STAT) & RSCORESTATUS)
+			if (nxt6000_readreg(state, RS_COR_STAT) & RSCORESTATUS)
 				*status |= FE_HAS_SYNC;
 
 			if ((core_status & TPSLOCKED) && (*status == (FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC)))
 				*status |= FE_HAS_LOCK;
 
 			if (debug)
-				nxt6000_dump_status(fe);
+				nxt6000_dump_status(state);
 
 			return 0;
 
@@ -658,30 +654,29 @@
 		}
 
 	case FE_INIT:
-		nxt6000_reset(fe);
-		nxt6000_setup(fe);
+		nxt6000_reset(state);
+		nxt6000_setup(state);
 		break;
 
 	case FE_SET_FRONTEND:
 		{
-			struct nxt6000_config *nxt = FE2NXT(fe);
 			struct dvb_frontend_parameters *param = (struct dvb_frontend_parameters *) arg;
 			int result;
 
-			switch (nxt->tuner_type) {
+			switch (state->tuner_type) {
 
 			case TUNER_TYPE_ALP510:
-				if ((result = alp510_set_tv_freq(fe, param->frequency)) < 0)
+				if ((result = alp510_set_tv_freq(state, param->frequency)) < 0)
 					return result;
 				break;
 
 			case TUNER_TYPE_SP5659:
-				if ((result = sp5659_set_tv_freq(fe, param->frequency)) < 0)
+				if ((result = sp5659_set_tv_freq(state, param->frequency)) < 0)
 					return result;
 				break;
 
 			case TUNER_TYPE_SP5730:
-				if ((result = sp5730_set_tv_freq(fe, param->frequency)) < 0)
+				if ((result = sp5730_set_tv_freq(state, param->frequency)) < 0)
 					return result;
 				break;
 
@@ -690,13 +685,13 @@
 
 			}
 
-			if ((result = nxt6000_set_bandwidth(fe, param->u.ofdm.bandwidth)) < 0)
+			if ((result = nxt6000_set_bandwidth(state, param->u.ofdm.bandwidth)) < 0)
 				return result;
-			if ((result = nxt6000_set_guard_interval(fe, param->u.ofdm.guard_interval)) < 0)
+			if ((result = nxt6000_set_guard_interval(state, param->u.ofdm.guard_interval)) < 0)
 				return result;
-			if ((result = nxt6000_set_transmission_mode(fe, param->u.ofdm.transmission_mode)) < 0)
+			if ((result = nxt6000_set_transmission_mode(state, param->u.ofdm.transmission_mode)) < 0)
 				return result;
-			if ((result = nxt6000_set_inversion(fe, param->inversion)) < 0)
+			if ((result = nxt6000_set_inversion(state, param->inversion)) < 0)
 				return result;
 
 			break;
@@ -709,91 +704,152 @@
 	return 0;
 }
 
-static u8 demod_addr_tbl[] = { 0x14, 0x18, 0x24, 0x28 };
+static struct i2c_client client_template;
 
-static int nxt6000_attach(struct dvb_i2c_bus *i2c, void **data)
+static int nxt6000_attach_adapter(struct i2c_adapter *i2c)
 {
+	struct nxt6000_state *state;
+	struct i2c_client *client;
+	static u8 demod_addr_tbl[] = { 0x14, 0x18, 0x24, 0x28 };
 	u8 addr_nr;
-	u8 fe_count = 0;
-	struct nxt6000_config *pnxt;
+	int ret;
 
 	dprintk("nxt6000: attach\n");
 
-	pnxt = kmalloc(sizeof(demod_addr_tbl)*sizeof(struct nxt6000_config), GFP_KERNEL);
-	if (NULL == pnxt) {
-		dprintk("nxt6000: no memory for private data.\n");
+	if (!(state = kmalloc(sizeof(struct nxt6000_state), GFP_KERNEL))) {
 		return -ENOMEM;
 	}
-	*data = pnxt;
 
-	for (addr_nr = 0; addr_nr < sizeof(demod_addr_tbl); addr_nr++) {
-		struct nxt6000_config *nxt = &pnxt[addr_nr];
+	memset(state, 0, sizeof(struct nxt6000_state));
 
+	for (addr_nr = 0; addr_nr < sizeof(demod_addr_tbl); addr_nr++) {
 		if (nxt6000_read(i2c, demod_addr_tbl[addr_nr], OFDM_MSC_REV) != NXT6000ASICDEVICE)
 			continue;
 
 		if (pll_test(i2c, demod_addr_tbl[addr_nr], 0xC0) == 0) {
-			nxt->tuner_addr = 0xC0;
-			nxt->tuner_type = TUNER_TYPE_ALP510;
-			nxt->clock_inversion = 1;
+			state->tuner_addr = 0xC0;
+			state->tuner_type = TUNER_TYPE_ALP510;
+			state->clock_inversion = 1;
 
-			dprintk("nxt6000: detected TI ALP510 tuner at 0x%02X\n", nxt->tuner_addr);
+			dprintk("nxt6000: detected TI ALP510 tuner at 0x%02X\n", state->tuner_addr);
 
 		} else if (pll_test(i2c, demod_addr_tbl[addr_nr], 0xC2) == 0) {
-			nxt->tuner_addr = 0xC2;
-			nxt->tuner_type = TUNER_TYPE_SP5659;
-			nxt->clock_inversion = 0;
+			state->tuner_addr = 0xC2;
+			state->tuner_type = TUNER_TYPE_SP5659;
+			state->clock_inversion = 0;
 
-			dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", nxt->tuner_addr);
+			dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", state->tuner_addr);
 
 		} else if (pll_test(i2c, demod_addr_tbl[addr_nr], 0xC0) == 0) {
-			nxt->tuner_addr = 0xC0;
-			nxt->tuner_type = TUNER_TYPE_SP5730;
-			nxt->clock_inversion = 0;
+			state->tuner_addr = 0xC0;
+			state->tuner_type = TUNER_TYPE_SP5730;
+			state->clock_inversion = 0;
 
-			dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", nxt->tuner_addr);
+			dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", state->tuner_addr);
 
 		} else {
 			printk("nxt6000: unable to detect tuner\n");
 			continue;
 		}
 
-		nxt->demod_addr = demod_addr_tbl[addr_nr];
-
-		dprintk("nxt6000: attached at %d:%d\n", i2c->adapter->num, i2c->id);
+		state->demod_addr = demod_addr_tbl[addr_nr];
+		break;
+	}
 
-		dvb_register_frontend(nxt6000_ioctl, i2c, (void *)nxt, &nxt6000_info);
+	if (!state->demod_addr) {
+		kfree(state);
+		return -ENODEV;
+	}
 
-		fe_count++;
+	if (!(client = kmalloc(sizeof(struct nxt6000_state), GFP_KERNEL))) {
+		kfree(state);
+		return -ENOMEM;
 	}
 
-	if (fe_count == 0) {
-		kfree(pnxt);
-		return -ENODEV;
+	memcpy(client, &client_template, sizeof(struct i2c_client));
+	client->adapter = i2c;
+	client->addr = state->tuner_addr; //XXX
+
+	if ((ret = i2c_attach_client(client))) {
+		kfree(client);
+		kfree(state);
+		return ret;
+	}
+
+	BUG_ON(state->dvb);
+
+	if ((ret = dvb_register_frontend_new(nxt6000_ioctl, state->dvb, state,
+					&nxt6000_info, THIS_MODULE))) {
+		kfree(client);
+		kfree(state);
+		return ret;
 	}
 
 	return 0;
 }
 
-static void nxt6000_detach(struct dvb_i2c_bus *i2c, void *data)
+static int nxt6000_detach_client(struct i2c_client *client)
 {
-	struct nxt6000_config *pnxt = (struct nxt6000_config *)data;
+	struct nxt6000_state *state = i2c_get_clientdata(client);
+
 	dprintk("nxt6000: detach\n");
-	dvb_unregister_frontend(nxt6000_ioctl, i2c);
-	kfree(pnxt);
+	dvb_unregister_frontend_new(nxt6000_ioctl, state->dvb);
+	i2c_detach_client(client);
+	BUG_ON(state->dvb);
+	kfree(client);
+	kfree(state);
+
+	return 0;
 }
 
-static __init int nxt6000_init(void)
+static int nxt6000_command(struct i2c_client *client, unsigned int cmd, void *arg)
+{
+	struct nxt6000_state *state = i2c_get_clientdata(client);
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	switch (cmd) {
+	case FE_REGISTER:
+		state->dvb = arg;
+		break;
+	case FE_UNREGISTER:
+		state->dvb = NULL;
+		break;
+	default:
+		return -EOPNOTSUPP;
+	}
+	return 0;
+}
+
+static struct i2c_driver driver = {
+	.owner 		= THIS_MODULE,
+	.name 		= "dvbfe_nxt6000",
+	.id 		= I2C_DRIVERID_DVBFE_NXT6000,
+	.flags 		= I2C_DF_NOTIFY,
+	.attach_adapter = nxt6000_attach_adapter,
+	.detach_client 	= nxt6000_detach_client,
+	.command 	= nxt6000_command,
+};
+
+static struct i2c_client client_template = {
+	I2C_DEVNAME("dvbfe_nxt6000"),
+	.flags 		= I2C_CLIENT_ALLOW_USE,
+	.driver  	= &driver,
+};
+
+static __init int nxt6000_module_init(void)
 {
 	dprintk("nxt6000: init\n");
-	return dvb_register_i2c_device(THIS_MODULE, nxt6000_attach, nxt6000_detach);
+	return i2c_add_driver(&driver);
 }
 
-static __exit void nxt6000_exit(void)
+static __exit void nxt6000_module_exit(void)
 {
 	dprintk("nxt6000: cleanup\n");
-	dvb_unregister_i2c_device(nxt6000_attach);
+	if (i2c_del_driver(&driver))
+		printk(KERN_ERR "nxt6000: driver deregistration failed.\n");
 }
 
-module_init(nxt6000_init);
-module_exit(nxt6000_exit);
+module_init(nxt6000_module_init);
+module_exit(nxt6000_module_exit);
+

Home | Main Index | Thread Index