Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / media / dvb / frontends / dib3000mc.c
index 26e640c..3b303db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Frontend driver for mobile DVB-T demodulator DiBcom 3000-MC/P
+ * Frontend driver for mobile DVB-T demodulator DiBcom 3000P/M-C
  * DiBcom (http://www.dibcom.fr/)
  *
  * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
  */
 #include <linux/config.h>
 #include <linux/kernel.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/delay.h>
+#include <linux/string.h>
+#include <linux/slab.h>
 
 #include "dib3000-common.h"
 #include "dib3000mc_priv.h"
@@ -34,7 +35,7 @@
 
 /* Version information */
 #define DRIVER_VERSION "0.1"
-#define DRIVER_DESC "DiBcom 3000-MC DVB-T demodulator driver"
+#define DRIVER_DESC "DiBcom 3000M-C DVB-T demodulator"
 #define DRIVER_AUTHOR "Patrick Boettcher, patrick.boettcher@desy.de"
 
 #ifdef CONFIG_DVB_DIBCOM_DEBUG
@@ -48,8 +49,6 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info,2=xfer,4=setfe,8=getfe,16=s
 #define deb_getf(args...) dprintk(0x08,args)
 #define deb_stat(args...) dprintk(0x10,args)
 
-static int dib3000mc_tuner_pass_ctrl(struct dvb_frontend *fe, int onoff, u8 pll_addr);
-
 static int dib3000mc_set_impulse_noise(struct dib3000_state * state, int mode,
        fe_transmit_mode_t transmission_mode, fe_bandwidth_t bandwidth)
 {
@@ -189,13 +188,13 @@ static int dib3000mc_init_auto_scan(struct dib3000_state *state, fe_bandwidth_t
 static int dib3000mc_set_adp_cfg(struct dib3000_state *state, fe_modulation_t con)
 {
        switch (con) {
-               case QAM_64: 
+               case QAM_64:
                        wr_foreach(dib3000mc_reg_adp_cfg,dib3000mc_adp_cfg[2]);
                        break;
-               case QAM_16: 
+               case QAM_16:
                        wr_foreach(dib3000mc_reg_adp_cfg,dib3000mc_adp_cfg[1]);
                        break;
-               case QPSK: 
+               case QPSK:
                        wr_foreach(dib3000mc_reg_adp_cfg,dib3000mc_adp_cfg[0]);
                        break;
                case QAM_AUTO:
@@ -223,13 +222,13 @@ static int dib3000mc_set_general_cfg(struct dib3000_state *state, struct dvb_fro
        switch (ofdm->guard_interval) {
                case GUARD_INTERVAL_1_32: guard = DIB3000_GUARD_TIME_1_32; break;
                case GUARD_INTERVAL_1_16: guard = DIB3000_GUARD_TIME_1_16; break;
-               case GUARD_INTERVAL_1_8: guard = DIB3000_GUARD_TIME_1_8; break;
-               case GUARD_INTERVAL_1_4: guard = DIB3000_GUARD_TIME_1_4; break;
+               case GUARD_INTERVAL_1_8:  guard = DIB3000_GUARD_TIME_1_8; break;
+               case GUARD_INTERVAL_1_4:  guard = DIB3000_GUARD_TIME_1_4; break;
                case GUARD_INTERVAL_AUTO: break;
                default: return -EINVAL;
        }
        switch (ofdm->constellation) {
-               case QPSK: qam = DIB3000_CONSTELLATION_QPSK; break;
+               case QPSK:   qam = DIB3000_CONSTELLATION_QPSK; break;
                case QAM_16: qam = DIB3000_CONSTELLATION_16QAM; break;
                case QAM_64: qam = DIB3000_CONSTELLATION_64QAM; break;
                case QAM_AUTO: break;
@@ -244,13 +243,13 @@ static int dib3000mc_set_general_cfg(struct dib3000_state *state, struct dvb_fro
                default: return -EINVAL;
        }
        if (ofdm->hierarchy_information == HIERARCHY_NONE) {
-               hrch = DIB3000_HRCH_OFF;
+               hrch   = DIB3000_HRCH_OFF;
                sel_hp = DIB3000_SELECT_HP;
-               fe_cr = ofdm->code_rate_HP;
+               fe_cr  = ofdm->code_rate_HP;
        } else if (ofdm->hierarchy_information != HIERARCHY_AUTO) {
-               hrch = DIB3000_HRCH_ON;
+               hrch   = DIB3000_HRCH_ON;
                sel_hp = DIB3000_SELECT_LP;
-               fe_cr = ofdm->code_rate_LP;
+               fe_cr  = ofdm->code_rate_LP;
        }
        switch (fe_cr) {
                case FEC_1_2: cr = DIB3000_FEC_1_2; break;
@@ -286,10 +285,10 @@ static int dib3000mc_set_general_cfg(struct dib3000_state *state, struct dvb_fro
        deb_setf("seq? %d\n", seq);
        wr(DIB3000MC_REG_SEQ_TPS,DIB3000MC_SEQ_TPS(seq,1));
        *auto_val = ofdm->constellation == QAM_AUTO ||
-               ofdm->hierarchy_information == HIERARCHY_AUTO ||
-               ofdm->guard_interval == GUARD_INTERVAL_AUTO ||
-               ofdm->transmission_mode == TRANSMISSION_MODE_AUTO ||
-               fe_cr == FEC_AUTO ||
+                       ofdm->hierarchy_information == HIERARCHY_AUTO ||
+                       ofdm->guard_interval == GUARD_INTERVAL_AUTO ||
+                       ofdm->transmission_mode == TRANSMISSION_MODE_AUTO ||
+                       fe_cr == FEC_AUTO ||
                        fep->inversion == INVERSION_AUTO;
        return 0;
 }
@@ -297,7 +296,7 @@ static int dib3000mc_set_general_cfg(struct dib3000_state *state, struct dvb_fro
 static int dib3000mc_get_frontend(struct dvb_frontend* fe,
                                  struct dvb_frontend_parameters *fep)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        struct dvb_ofdm_parameters *ofdm = &fep->u.ofdm;
        fe_code_rate_t *cr;
        u16 tps_val,cr_val;
@@ -334,7 +333,7 @@ static int dib3000mc_get_frontend(struct dvb_frontend* fe,
 
        fep->frequency = state->last_tuned_freq;
        fep->u.ofdm.bandwidth= state->last_tuned_bw;
-       
+
        tps_val = rd(DIB3000MC_REG_TUNING_PARM);
 
        switch (DIB3000MC_TP_QAM(tps_val)) {
@@ -353,7 +352,7 @@ static int dib3000mc_get_frontend(struct dvb_frontend* fe,
                default:
                        err("Unexpected constellation returned by TPS (%d)", tps_val);
                        break;
-       }
+       }
 
        if (DIB3000MC_TP_HRCH(tps_val)) {
                deb_getf("HRCH ON ");
@@ -458,16 +457,14 @@ static int dib3000mc_get_frontend(struct dvb_frontend* fe,
 static int dib3000mc_set_frontend(struct dvb_frontend* fe,
                                  struct dvb_frontend_parameters *fep, int tuner)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        struct dvb_ofdm_parameters *ofdm = &fep->u.ofdm;
        int search_state,auto_val;
        u16 val;
-       
-       if (tuner) { /* initial call from dvb */
-               dib3000mc_tuner_pass_ctrl(fe,1,state->config.pll_addr(fe));
-               state->config.pll_set(fe,fep,NULL);
-               dib3000mc_tuner_pass_ctrl(fe,0,state->config.pll_addr(fe));
-               
+
+       if (tuner && state->config.pll_set) { /* initial call from dvb */
+               state->config.pll_set(fe,fep);
+
                state->last_tuned_freq = fep->frequency;
        //      if (!scanboost) {
                        dib3000mc_set_timing(state,0,ofdm->transmission_mode,ofdm->bandwidth);
@@ -477,7 +474,7 @@ static int dib3000mc_set_frontend(struct dvb_frontend* fe,
                        wr_foreach(dib3000mc_reg_agc_bandwidth,dib3000mc_agc_bandwidth);
                        wr(DIB3000MC_REG_RESTART,DIB3000MC_RESTART_AGC);
                        wr(DIB3000MC_REG_RESTART,DIB3000MC_RESTART_OFF);
-                       
+
                        /* Default cfg isi offset adp */
                        wr_foreach(dib3000mc_reg_offset,dib3000mc_offset[0]);
 
@@ -495,7 +492,7 @@ static int dib3000mc_set_frontend(struct dvb_frontend* fe,
                        auto_val = 0;
                        dib3000mc_set_general_cfg(state,fep,&auto_val);
                        dib3000mc_set_impulse_noise(state,0,ofdm->constellation,ofdm->bandwidth);
-               
+
                        val = rd(DIB3000MC_REG_DEMOD_PARM);
                        wr(DIB3000MC_REG_DEMOD_PARM,val|DIB3000MC_DEMOD_RST_DEMOD_ON);
                        wr(DIB3000MC_REG_DEMOD_PARM,val);
@@ -507,17 +504,17 @@ static int dib3000mc_set_frontend(struct dvb_frontend* fe,
                        int as_count=0;
 
                        deb_setf("autosearch enabled.\n");
-                       
+
                        val = rd(DIB3000MC_REG_DEMOD_PARM);
                        wr(DIB3000MC_REG_DEMOD_PARM,val | DIB3000MC_DEMOD_RST_AUTO_SRCH_ON);
                        wr(DIB3000MC_REG_DEMOD_PARM,val);
 
                        while ((search_state = dib3000_search_status(
-                                               rd(DIB3000MC_REG_AS_IRQ),1)) < 0 && as_count++ < 100) 
+                                               rd(DIB3000MC_REG_AS_IRQ),1)) < 0 && as_count++ < 100)
                                msleep(10);
-                       
+
                        deb_info("search_state after autosearch %d after %d checks\n",search_state,as_count);
-                       
+
                        if (search_state == 1) {
                                struct dvb_frontend_parameters feps;
                                if (dib3000mc_get_frontend(fe, &feps) == 0) {
@@ -529,66 +526,62 @@ static int dib3000mc_set_frontend(struct dvb_frontend* fe,
                        dib3000mc_set_impulse_noise(state,0,ofdm->transmission_mode,ofdm->bandwidth);
                        wr(DIB3000MC_REG_ISI,DIB3000MC_ISI_DEFAULT|DIB3000MC_ISI_ACTIVATE);
                        dib3000mc_set_adp_cfg(state,ofdm->constellation);
-                       
+
                        /* set_offset_cfg */
                        wr_foreach(dib3000mc_reg_offset,
                                        dib3000mc_offset[(ofdm->transmission_mode == TRANSMISSION_MODE_8K)+1]);
                }
        } else { /* second call, after autosearch (fka: set_WithKnownParams) */
 //             dib3000mc_set_timing(state,1,ofdm->transmission_mode,ofdm->bandwidth);
-               
+
                auto_val = 0;
                dib3000mc_set_general_cfg(state,fep,&auto_val);
                if (auto_val)
                        deb_info("auto_val is true, even though an auto search was already performed.\n");
 
                dib3000mc_set_impulse_noise(state,0,ofdm->constellation,ofdm->bandwidth);
-               
+
                val = rd(DIB3000MC_REG_DEMOD_PARM);
                wr(DIB3000MC_REG_DEMOD_PARM,val | DIB3000MC_DEMOD_RST_AUTO_SRCH_ON);
                wr(DIB3000MC_REG_DEMOD_PARM,val);
-               
+
                msleep(30);
-               
+
                wr(DIB3000MC_REG_ISI,DIB3000MC_ISI_DEFAULT|DIB3000MC_ISI_ACTIVATE);
                        dib3000mc_set_adp_cfg(state,ofdm->constellation);
                wr_foreach(dib3000mc_reg_offset,
                                dib3000mc_offset[(ofdm->transmission_mode == TRANSMISSION_MODE_8K)+1]);
-               
-                               
        }
        return 0;
 }
 
 static int dib3000mc_fe_init(struct dvb_frontend* fe, int mobile_mode)
 {
-       struct dib3000_state *state;
-
+       struct dib3000_state *state = fe->demodulator_priv;
        deb_info("init start\n");
 
-       state = fe->demodulator_priv;
        state->timing_offset = 0;
        state->timing_offset_comp_done = 0;
-       
+
        wr(DIB3000MC_REG_RESTART,DIB3000MC_RESTART_CONFIG);
        wr(DIB3000MC_REG_RESTART,DIB3000MC_RESTART_OFF);
        wr(DIB3000MC_REG_CLK_CFG_1,DIB3000MC_CLK_CFG_1_POWER_UP);
        wr(DIB3000MC_REG_CLK_CFG_2,DIB3000MC_CLK_CFG_2_PUP_MOBILE);
        wr(DIB3000MC_REG_CLK_CFG_3,DIB3000MC_CLK_CFG_3_POWER_UP);
        wr(DIB3000MC_REG_CLK_CFG_7,DIB3000MC_CLK_CFG_7_INIT);
-       
+
        wr(DIB3000MC_REG_RST_UNC,DIB3000MC_RST_UNC_OFF);
        wr(DIB3000MC_REG_UNK_19,DIB3000MC_UNK_19);
 
        wr(33,5);
        wr(36,81);
-       wr(DIB3000MC_REG_UNK_88,DIB3000MC_UNK_88);                                
-       
+       wr(DIB3000MC_REG_UNK_88,DIB3000MC_UNK_88);
+
        wr(DIB3000MC_REG_UNK_99,DIB3000MC_UNK_99);
        wr(DIB3000MC_REG_UNK_111,DIB3000MC_UNK_111_PH_N_MODE_0); /* phase noise algo off */
 
        /* mobile mode - portable reception */
-       wr_foreach(dib3000mc_reg_mobile_mode,dib3000mc_mobile_mode[1]); 
+       wr_foreach(dib3000mc_reg_mobile_mode,dib3000mc_mobile_mode[1]);
 
 /* TUNER_PANASONIC_ENV57H12D5: */
        wr_foreach(dib3000mc_reg_agc_bandwidth,dib3000mc_agc_bandwidth);
@@ -601,24 +594,24 @@ static int dib3000mc_fe_init(struct dvb_frontend* fe, int mobile_mode)
        wr(DIB3000MC_REG_UNK_2,DIB3000MC_UNK_2);
        wr(DIB3000MC_REG_UNK_3,DIB3000MC_UNK_3);
        wr(DIB3000MC_REG_SEQ_TPS,DIB3000MC_SEQ_TPS_DEFAULT);
-       
+
        wr_foreach(dib3000mc_reg_bandwidth,dib3000mc_bandwidth_8mhz);
        wr_foreach(dib3000mc_reg_bandwidth_general,dib3000mc_bandwidth_general);
-       
+
        wr(DIB3000MC_REG_UNK_4,DIB3000MC_UNK_4);
 
        wr(DIB3000MC_REG_SET_DDS_FREQ_MSB,DIB3000MC_DDS_FREQ_MSB_INV_OFF);
        wr(DIB3000MC_REG_SET_DDS_FREQ_LSB,DIB3000MC_DDS_FREQ_LSB);
 
-       dib3000mc_set_timing(state,0,TRANSMISSION_MODE_8K,BANDWIDTH_8_MHZ); 
+       dib3000mc_set_timing(state,0,TRANSMISSION_MODE_8K,BANDWIDTH_8_MHZ);
 //     wr_foreach(dib3000mc_reg_timing_freq,dib3000mc_timing_freq[3]);
-       
+
        wr(DIB3000MC_REG_UNK_120,DIB3000MC_UNK_120);
        wr(DIB3000MC_REG_UNK_134,DIB3000MC_UNK_134);
        wr(DIB3000MC_REG_FEC_CFG,DIB3000MC_FEC_CFG);
-       
+
        wr(DIB3000MC_REG_DIVERSITY3,DIB3000MC_DIVERSITY3_IN_OFF);
-       
+
        dib3000mc_set_impulse_noise(state,0,TRANSMISSION_MODE_8K,BANDWIDTH_8_MHZ);
 
 /* output mode control, just the MPEG2_SLAVE */
@@ -634,13 +627,13 @@ static int dib3000mc_fe_init(struct dvb_frontend* fe, int mobile_mode)
                        rd(DIB3000MC_REG_OUTMODE)));
 
        wr(DIB3000MC_REG_SMO_MODE,
-                       DIB3000MC_SMO_MODE_DEFAULT | 
+                       DIB3000MC_SMO_MODE_DEFAULT |
                        DIB3000MC_SMO_MODE_188);
 
        wr(DIB3000MC_REG_FIFO_THRESHOLD,DIB3000MC_FIFO_THRESHOLD_DEFAULT);
        wr(DIB3000MC_REG_ELEC_OUT,DIB3000MC_ELEC_OUT_DIV_OUT_ON);
 */
-       
+
 /* diversity */
        wr(DIB3000MC_REG_DIVERSITY1,DIB3000MC_DIVERSITY1_DEFAULT);
        wr(DIB3000MC_REG_DIVERSITY2,DIB3000MC_DIVERSITY2_DEFAULT);
@@ -649,17 +642,15 @@ static int dib3000mc_fe_init(struct dvb_frontend* fe, int mobile_mode)
 
        set_or(DIB3000MC_REG_CLK_CFG_7,DIB3000MC_CLK_CFG_7_DIV_IN_OFF);
 
-/*     if (state->config->pll_init) {
-               dib3000mc_tuner_pass_ctrl(fe,1,state->config.pll_addr(fe));
-               state->config->pll_init(fe,NULL);
-               dib3000mc_tuner_pass_ctrl(fe,0,state->config.pll_addr(fe));
-       }*/
+       if (state->config.pll_init)
+               state->config.pll_init(fe);
+
        deb_info("init end\n");
        return 0;
 }
 static int dib3000mc_read_status(struct dvb_frontend* fe, fe_status_t *stat)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        u16 lock = rd(DIB3000MC_REG_LOCKING);
 
        *stat = 0;
@@ -679,23 +670,23 @@ static int dib3000mc_read_status(struct dvb_frontend* fe, fe_status_t *stat)
 
 static int dib3000mc_read_ber(struct dvb_frontend* fe, u32 *ber)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        *ber = ((rd(DIB3000MC_REG_BER_MSB) << 16) | rd(DIB3000MC_REG_BER_LSB));
        return 0;
 }
 
 static int dib3000mc_read_unc_blocks(struct dvb_frontend* fe, u32 *unc)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
 
-       *unc = rd(DIB3000MC_REG_PACKET_ERROR_COUNT);
+       *unc = rd(DIB3000MC_REG_PACKET_ERRORS);
        return 0;
 }
 
 /* see dib3000mb.c for calculation comments */
 static int dib3000mc_read_signal_strength(struct dvb_frontend* fe, u16 *strength)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        u16 val = rd(DIB3000MC_REG_SIGNAL_NOISE_LSB);
        *strength = (((val >> 6) & 0xff) << 8) + (val & 0x3f);
 
@@ -706,7 +697,7 @@ static int dib3000mc_read_signal_strength(struct dvb_frontend* fe, u16 *strength
 /* see dib3000mb.c for calculation comments */
 static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
        u16 val = rd(DIB3000MC_REG_SIGNAL_NOISE_LSB),
                val2 = rd(DIB3000MC_REG_SIGNAL_NOISE_MSB);
        u16 sig,noise;
@@ -726,7 +717,7 @@ static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr)
 
 static int dib3000mc_sleep(struct dvb_frontend* fe)
 {
-       struct dib3000_state* state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state* state = fe->demodulator_priv;
 
        set_or(DIB3000MC_REG_CLK_CFG_7,DIB3000MC_CLK_CFG_7_PWR_DOWN);
        wr(DIB3000MC_REG_CLK_CFG_1,DIB3000MC_CLK_CFG_1_POWER_DOWN);
@@ -737,10 +728,7 @@ static int dib3000mc_sleep(struct dvb_frontend* fe)
 
 static int dib3000mc_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune)
 {
-       tune->min_delay_ms = 2000;
-       tune->step_size = 166667;
-       tune->max_drift = 166667 * 2;
-
+       tune->min_delay_ms = 1000;
        return 0;
 }
 
@@ -756,7 +744,7 @@ static int dib3000mc_set_frontend_and_tuner(struct dvb_frontend* fe, struct dvb_
 
 static void dib3000mc_release(struct dvb_frontend* fe)
 {
-       struct dib3000_state *state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state *state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -765,17 +753,17 @@ static int dib3000mc_pid_control(struct dvb_frontend *fe,int index, int pid,int
 {
        struct dib3000_state *state = fe->demodulator_priv;
        pid = (onoff ? pid | DIB3000_ACTIVATE_PID_FILTERING : 0);
-               wr(index+DIB3000MC_REG_FIRST_PID,pid);
+       wr(index+DIB3000MC_REG_FIRST_PID,pid);
        return 0;
 }
 
 static int dib3000mc_fifo_control(struct dvb_frontend *fe, int onoff)
 {
-       struct dib3000_state *state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state *state = fe->demodulator_priv;
        u16 tmp = rd(DIB3000MC_REG_SMO_MODE);
-       
+
        deb_xfer("%s fifo\n",onoff ? "enabling" : "disabling");
-       
+
        if (onoff) {
                deb_xfer("%d %x\n",tmp & DIB3000MC_SMO_MODE_FIFO_UNFLUSH,tmp & DIB3000MC_SMO_MODE_FIFO_UNFLUSH);
                wr(DIB3000MC_REG_SMO_MODE,tmp & DIB3000MC_SMO_MODE_FIFO_UNFLUSH);
@@ -790,14 +778,12 @@ static int dib3000mc_pid_parse(struct dvb_frontend *fe, int onoff)
 {
        struct dib3000_state *state = fe->demodulator_priv;
        u16 tmp = rd(DIB3000MC_REG_SMO_MODE);
-       
+
        deb_xfer("%s pid parsing\n",onoff ? "enabling" : "disabling");
-       
+
        if (onoff) {
-               deb_xfer("%d %x\n",tmp | DIB3000MC_SMO_MODE_PID_PARSE,tmp | DIB3000MC_SMO_MODE_PID_PARSE);
                wr(DIB3000MC_REG_SMO_MODE,tmp | DIB3000MC_SMO_MODE_PID_PARSE);
        } else {
-               deb_xfer("%d %x\n",tmp & DIB3000MC_SMO_MODE_NO_PID_PARSE,tmp & DIB3000MC_SMO_MODE_NO_PID_PARSE);
                wr(DIB3000MC_REG_SMO_MODE,tmp & DIB3000MC_SMO_MODE_NO_PID_PARSE);
        }
        return 0;
@@ -805,7 +791,7 @@ static int dib3000mc_pid_parse(struct dvb_frontend *fe, int onoff)
 
 static int dib3000mc_tuner_pass_ctrl(struct dvb_frontend *fe, int onoff, u8 pll_addr)
 {
-       struct dib3000_state *state = (struct dib3000_state*) fe->demodulator_priv;
+       struct dib3000_state *state = fe->demodulator_priv;
        if (onoff) {
                wr(DIB3000MC_REG_TUNER, DIB3000_TUNER_WRITE_ENABLE(pll_addr));
        } else {
@@ -814,7 +800,7 @@ static int dib3000mc_tuner_pass_ctrl(struct dvb_frontend *fe, int onoff, u8 pll_
        return 0;
 }
 
-static int dib3000mc_demod_init(struct dib3000_state *state) 
+static int dib3000mc_demod_init(struct dib3000_state *state)
 {
        u16 default_addr = 0x0a;
        /* first init */
@@ -822,13 +808,13 @@ static int dib3000mc_demod_init(struct dib3000_state *state)
                deb_info("initializing the demod the first time. Setting demod addr to 0x%x\n",default_addr);
                wr(DIB3000MC_REG_ELEC_OUT,DIB3000MC_ELEC_OUT_DIV_OUT_ON);
                wr(DIB3000MC_REG_OUTMODE,DIB3000MC_OM_PAR_CONT_CLK);
-               
+
                wr(DIB3000MC_REG_RST_I2C_ADDR,
                        DIB3000MC_DEMOD_ADDR(default_addr) |
                        DIB3000MC_DEMOD_ADDR_ON);
-       
+
                state->config.demod_address = default_addr;
-               
+
                wr(DIB3000MC_REG_RST_I2C_ADDR,
                        DIB3000MC_DEMOD_ADDR(default_addr));
        } else
@@ -846,7 +832,7 @@ struct dvb_frontend* dib3000mc_attach(const struct dib3000_config* config,
        u16 devid;
 
        /* allocate memory for the internal state */
-       state = (struct dib3000_state*) kmalloc(sizeof(struct dib3000_state), GFP_KERNEL);
+       state = kzalloc(sizeof(struct dib3000_state), GFP_KERNEL);
        if (state == NULL)
                goto error;
 
@@ -865,10 +851,10 @@ struct dvb_frontend* dib3000mc_attach(const struct dib3000_config* config,
 
        switch (devid) {
                case DIB3000MC_DEVICE_ID:
-                       info("Found a DiBcom 3000-MC, interesting...");
+                       info("Found a DiBcom 3000M-C, interesting...");
                        break;
                case DIB3000P_DEVICE_ID:
-                       info("Found a DiBcom 3000-P.");
+                       info("Found a DiBcom 3000P.");
                        break;
        }
 
@@ -887,18 +873,17 @@ struct dvb_frontend* dib3000mc_attach(const struct dib3000_config* config,
        return &state->frontend;
 
 error:
-       if (state)
-               kfree(state);
+       kfree(state);
        return NULL;
 }
 
 static struct dvb_frontend_ops dib3000mc_ops = {
 
        .info = {
-               .name                   = "DiBcom 3000-MC/P DVB-T",
-               .type                   = FE_OFDM,
-               .frequency_min          = 44250000,
-               .frequency_max          = 867250000,
+               .name                   = "DiBcom 3000P/M-C DVB-T",
+               .type                   = FE_OFDM,
+               .frequency_min          = 44250000,
+               .frequency_max          = 867250000,
                .frequency_stepsize     = 62500,
                .caps = FE_CAN_INVERSION_AUTO |
                                FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |