vserver 2.0 rc7
[linux-2.6.git] / drivers / media / dvb / frontends / ves1820.c
index 3d8e780..70fb44b 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
     VES1820  - Single Chip Cable Channel Receiver driver module
 
     Copyright (C) 1999 Convergence Integrated Media GmbH <ralph@convergence.de>
@@ -16,7 +16,7 @@
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/    
+*/
 
 #include <linux/config.h>
 #include <linux/delay.h>
 
 
 struct ves1820_state {
-
-       struct i2c_adapter *i2c;
-
+       struct i2c_adapter* i2c;
        struct dvb_frontend_ops ops;
-
        /* configuration settings */
        const struct ves1820_config* config;
-
        struct dvb_frontend frontend;
 
        /* private demodulator data */
@@ -64,9 +60,9 @@ static u8 ves1820_inittab[] = {
 
 static int ves1820_writereg(struct ves1820_state *state, u8 reg, u8 data)
 {
-        u8 buf[] = { 0x00, reg, data };
+       u8 buf[] = { 0x00, reg, data };
        struct i2c_msg msg = {.addr = state->config->demod_address,.flags = 0,.buf = buf,.len = 3 };
-        int ret;
+       int ret;
 
        ret = i2c_transfer(state->i2c, &msg, 1);
 
@@ -74,14 +70,13 @@ static int ves1820_writereg(struct ves1820_state *state, u8 reg, u8 data)
                printk("ves1820: %s(): writereg error (reg == 0x%02x,"
                        "val == 0x%02x, ret == %i)\n", __FUNCTION__, reg, data, ret);
 
-       msleep(10);
        return (ret != 1) ? -EREMOTEIO : 0;
 }
 
 static u8 ves1820_readreg(struct ves1820_state *state, u8 reg)
 {
-       u8 b0 [] = { 0x00, reg };
-       u8 b1 [] = { 0 };
+       u8 b0[] = { 0x00, reg };
+       u8 b1[] = { 0 };
        struct i2c_msg msg[] = {
                {.addr = state->config->demod_address,.flags = 0,.buf = b0,.len = 2},
                {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = b1,.len = 1}
@@ -97,23 +92,20 @@ static u8 ves1820_readreg(struct ves1820_state *state, u8 reg)
        return b1[0];
 }
 
-
 static int ves1820_setup_reg0(struct ves1820_state *state, u8 reg0, fe_spectral_inversion_t inversion)
 {
        reg0 |= state->reg0 & 0x62;
-       
+
        if (INVERSION_ON == inversion) {
                if (!state->config->invert) reg0 |= 0x20;
                else reg0 &= ~0x20;
-       
        } else if (INVERSION_OFF == inversion) {
-
-               if (!state->config->invert) reg0 &= ~0x20;
+               if (!state->config->invert) reg0 &= ~0x20;
                else reg0 |= 0x20;
        }
 
-                       ves1820_writereg(state, 0x00, reg0 & 0xfe);
-                       ves1820_writereg(state, 0x00, reg0 | 0x01);
+       ves1820_writereg(state, 0x00, reg0 & 0xfe);
+       ves1820_writereg(state, 0x00, reg0 | 0x01);
 
        state->reg0 = reg0;
 
@@ -122,10 +114,10 @@ static int ves1820_setup_reg0(struct ves1820_state *state, u8 reg0, fe_spectral_
 
 static int ves1820_set_symbolrate(struct ves1820_state *state, u32 symbolrate)
 {
-        s32 BDR; 
-        s32 BDRI;
-        s16 SFIL=0;
-        u16 NDEC = 0;
+       s32 BDR;
+       s32 BDRI;
+       s16 SFIL = 0;
+       u16 NDEC = 0;
        u32 ratio;
        u32 fin;
        u32 tmp;
@@ -136,7 +128,7 @@ static int ves1820_set_symbolrate(struct ves1820_state *state, u32 symbolrate)
                symbolrate = state->config->xin / 2;
 
        if (symbolrate < 500000)
-                symbolrate = 500000;
+               symbolrate = 500000;
 
        if (symbolrate < state->config->xin / 16)
                NDEC = 1;
@@ -168,24 +160,24 @@ static int ves1820_set_symbolrate(struct ves1820_state *state, u32 symbolrate)
        fptmp = fpxin; do_div(fptmp, 984);
        if (symbolrate < fptmp);
                SFIL = 1;
-        
+
        fin = state->config->xin >> 4;
-        symbolrate <<= NDEC;
+       symbolrate <<= NDEC;
        ratio = (symbolrate << 4) / fin;
        tmp = ((symbolrate << 4) % fin) << 8;
        ratio = (ratio << 8) + tmp / fin;
        tmp = (tmp % fin) << 8;
        ratio = (ratio << 8) + (tmp + fin / 2) / fin;
-        
-        BDR = ratio;
+
+       BDR = ratio;
        BDRI = (((state->config->xin << 5) / symbolrate) + 1) / 2;
-        
-        if (BDRI > 0xFF) 
-                BDRI = 0xFF;
-        
-        SFIL = (SFIL << 4) | ves1820_inittab[0x0E];
-        
-        NDEC = (NDEC << 6) | ves1820_inittab[0x03];
+
+       if (BDRI > 0xFF)
+               BDRI = 0xFF;
+
+       SFIL = (SFIL << 4) | ves1820_inittab[0x0E];
+
+       NDEC = (NDEC << 6) | ves1820_inittab[0x03];
 
        ves1820_writereg(state, 0x03, NDEC);
        ves1820_writereg(state, 0x0a, BDR & 0xff);
@@ -195,24 +187,12 @@ static int ves1820_set_symbolrate(struct ves1820_state *state, u32 symbolrate)
        ves1820_writereg(state, 0x0d, BDRI);
        ves1820_writereg(state, 0x0e, SFIL);
 
-        return 0;
+       return 0;
 }
 
-
-
-
-
-
-
-
-
-
-
-
-
 static int ves1820_init(struct dvb_frontend* fe)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
        int i;
        int val;
 
@@ -233,12 +213,12 @@ static int ves1820_init(struct dvb_frontend* fe)
 
 static int ves1820_set_parameters(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
-       static const u8 reg0x00 [] = { 0x00, 0x04, 0x08, 0x0c, 0x10 };
-       static const u8 reg0x01 [] = {  140,  140,  106,  100,   92 };
-       static const u8 reg0x05 [] = {  135,  100,   70,   54,   38 };
-       static const u8 reg0x08 [] = {  162,  116,   67,   52,   35 };
-       static const u8 reg0x09 [] = {  145,  150,  106,  126,  107 };
+       struct ves1820_state* state = fe->demodulator_priv;
+       static const u8 reg0x00[] = { 0x00, 0x04, 0x08, 0x0c, 0x10 };
+       static const u8 reg0x01[] = { 140, 140, 106, 100, 92 };
+       static const u8 reg0x05[] = { 135, 100, 70, 54, 38 };
+       static const u8 reg0x08[] = { 162, 116, 67, 52, 35 };
+       static const u8 reg0x09[] = { 145, 150, 106, 126, 107 };
        int real_qam = p->u.qam.modulation - QAM_16;
 
        if (real_qam < 0 || real_qam > 4)
@@ -260,91 +240,90 @@ static int ves1820_set_parameters(struct dvb_frontend* fe, struct dvb_frontend_p
 
 static int ves1820_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
-               int sync;
+       struct ves1820_state* state = fe->demodulator_priv;
+       int sync;
 
-               *status = 0;
+       *status = 0;
+       sync = ves1820_readreg(state, 0x11);
 
-                       sync = ves1820_readreg(state, 0x11);
+       if (sync & 1)
+               *status |= FE_HAS_SIGNAL;
 
-               if (sync & 1)
-                       *status |= FE_HAS_SIGNAL;
+       if (sync & 2)
+               *status |= FE_HAS_CARRIER;
 
-               if (sync & 2)
-                       *status |= FE_HAS_CARRIER;
+       if (sync & 2)   /* XXX FIXME! */
+               *status |= FE_HAS_VITERBI;
 
-               if (sync & 2)           /* XXX FIXME! */
-                       *status |= FE_HAS_VITERBI;
-               
-               if (sync & 4)
-                       *status |= FE_HAS_SYNC;
+       if (sync & 4)
+               *status |= FE_HAS_SYNC;
 
-               if (sync & 8)
-                       *status |= FE_HAS_LOCK;
+       if (sync & 8)
+               *status |= FE_HAS_LOCK;
 
        return 0;
-       }
+}
 
 static int ves1820_read_ber(struct dvb_frontend* fe, u32* ber)
-       {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+{
+       struct ves1820_state* state = fe->demodulator_priv;
 
        u32 _ber = ves1820_readreg(state, 0x14) |
-                                       (ves1820_readreg(state, 0x15) << 8) |
-                                       ((ves1820_readreg(state, 0x16) & 0x0f) << 16);
+                       (ves1820_readreg(state, 0x15) << 8) |
+                       ((ves1820_readreg(state, 0x16) & 0x0f) << 16);
        *ber = 10 * _ber;
 
        return 0;
-       }
+}
 
 static int ves1820_read_signal_strength(struct dvb_frontend* fe, u16* strength)
-       {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+{
+       struct ves1820_state* state = fe->demodulator_priv;
 
-                       u8 gain = ves1820_readreg(state, 0x17);
+       u8 gain = ves1820_readreg(state, 0x17);
        *strength = (gain << 8) | gain;
 
        return 0;
-       }
+}
 
 static int ves1820_read_snr(struct dvb_frontend* fe, u16* snr)
-       {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+{
+       struct ves1820_state* state = fe->demodulator_priv;
 
-                       u8 quality = ~ves1820_readreg(state, 0x18);
+       u8 quality = ~ves1820_readreg(state, 0x18);
        *snr = (quality << 8) | quality;
 
        return 0;
-       }
+}
 
 static int ves1820_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
 
        *ucblocks = ves1820_readreg(state, 0x13) & 0x7f;
        if (*ucblocks == 0x7f)
                *ucblocks = 0xffffffff;
 
-               /* reset uncorrected block counter */
-               ves1820_writereg(state, 0x10, ves1820_inittab[0x10] & 0xdf);
-               ves1820_writereg(state, 0x10, ves1820_inittab[0x10]);
+       /* reset uncorrected block counter */
+       ves1820_writereg(state, 0x10, ves1820_inittab[0x10] & 0xdf);
+       ves1820_writereg(state, 0x10, ves1820_inittab[0x10]);
 
        return 0;
 }
 
 static int ves1820_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
-       {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
-               int sync;
-               s8 afc = 0;
-                
-                       sync = ves1820_readreg(state, 0x11);
-                       afc = ves1820_readreg(state, 0x19);
-               if (verbose) {
-                       /* AFC only valid when carrier has been recovered */
-                               printk(sync & 2 ? "ves1820: AFC (%d) %dHz\n" :
-                                       "ves1820: [AFC (%d) %dHz]\n", afc, -((s32) p->u.qam.symbol_rate * afc) >> 10);
-               }
+{
+       struct ves1820_state* state = fe->demodulator_priv;
+       int sync;
+       s8 afc = 0;
+
+       sync = ves1820_readreg(state, 0x11);
+       afc = ves1820_readreg(state, 0x19);
+       if (verbose) {
+               /* AFC only valid when carrier has been recovered */
+               printk(sync & 2 ? "ves1820: AFC (%d) %dHz\n" :
+                       "ves1820: [AFC (%d) %dHz]\n", afc, -((s32) p->u.qam.symbol_rate * afc) >> 10);
+       }
 
        if (!state->config->invert) {
                p->inversion = (state->reg0 & 0x20) ? INVERSION_ON : INVERSION_OFF;
@@ -352,20 +331,20 @@ static int ves1820_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
                p->inversion = (!(state->reg0 & 0x20)) ? INVERSION_ON : INVERSION_OFF;
        }
 
-                       p->u.qam.modulation = ((state->reg0 >> 2) & 7) + QAM_16;
+       p->u.qam.modulation = ((state->reg0 >> 2) & 7) + QAM_16;
 
-               p->u.qam.fec_inner = FEC_NONE;
+       p->u.qam.fec_inner = FEC_NONE;
 
-               p->frequency = ((p->frequency + 31250) / 62500) * 62500;
-               if (sync & 2)
-                       p->frequency -= ((s32)p->u.qam.symbol_rate * afc) >> 10;
+       p->frequency = ((p->frequency + 31250) / 62500) * 62500;
+       if (sync & 2)
+               p->frequency -= ((s32) p->u.qam.symbol_rate * afc) >> 10;
 
-        return 0;
-} 
+       return 0;
+}
 
 static int ves1820_sleep(struct dvb_frontend* fe)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
 
        ves1820_writereg(state, 0x1b, 0x02);    /* pdown ADC */
        ves1820_writereg(state, 0x00, 0x80);    /* standby */
@@ -384,7 +363,7 @@ static int ves1820_get_tune_settings(struct dvb_frontend* fe, struct dvb_fronten
 
 static void ves1820_release(struct dvb_frontend* fe)
 {
-       struct ves1820_state* state = (struct ves1820_state*) fe->demodulator_priv;
+       struct ves1820_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -397,7 +376,7 @@ struct dvb_frontend* ves1820_attach(const struct ves1820_config* config,
        struct ves1820_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct ves1820_state*) kmalloc(sizeof(struct ves1820_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct ves1820_state), GFP_KERNEL);
        if (state == NULL)
                goto error;
 
@@ -424,9 +403,9 @@ struct dvb_frontend* ves1820_attach(const struct ves1820_config* config,
        return &state->frontend;
 
 error:
-       if (state) kfree(state);
+       kfree(state);
        return NULL;
-       }
+}
 
 static struct dvb_frontend_ops ves1820_ops = {