int i, tuner_freq, if_freq;
        u32 N;
 
+       dprintk("%s:\n", __FUNCTION__);
        switch (params->u.ofdm.bandwidth) {
        case BANDWIDTH_6_MHZ:
                if_freq = 4000000;
        struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
                               .buf = buf, .len = sizeof(buf) };
 
+       dprintk("%s:\n", __FUNCTION__);
        if (fe->ops.i2c_gate_ctrl)
                fe->ops.i2c_gate_ctrl(fe, 1);
        i2c_transfer(priv->i2c_adap, &msg, 1);
        int i, tuner_freq, if_freq;
        u32 N;
 
+       dprintk("%s:\n", __FUNCTION__);
        if (priv->cfg && priv->cfg->lna_gain)
                priv->cfg->lna_gain(fe, 1);
        msleep(20);
        struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
                               .buf = buf, .len = sizeof(buf) };
 
+       dprintk("%s:\n", __FUNCTION__);
        if (fe->ops.i2c_gate_ctrl)
                fe->ops.i2c_gate_ctrl(fe, 1);
 
 static int tda827x_init(struct dvb_frontend *fe)
 {
        struct tda827x_priv *priv = fe->tuner_priv;
-
+       dprintk("%s:\n", __FUNCTION__);
        if (priv->cfg && priv->cfg->init)
                priv->cfg->init(fe);
 
        return 0;
 }
 
+static int tda827x_probe_version(struct dvb_frontend *fe);
+
+static int tda827x_initial_init(struct dvb_frontend *fe)
+{
+       int ret;
+       ret = tda827x_probe_version(fe);
+       if (ret)
+               return ret;
+       return fe->ops.tuner_ops.init(fe);
+}
+
+static int tda827x_initial_sleep(struct dvb_frontend *fe)
+{
+       int ret;
+       ret = tda827x_probe_version(fe);
+       if (ret)
+               return ret;
+       return fe->ops.tuner_ops.sleep(fe);
+}
 
 static struct dvb_tuner_ops tda827xo_tuner_ops = {
        .info = {
                .frequency_step =    250000
        },
        .release = tda827x_release,
-       .init = tda827x_init,
-       .sleep = tda827xo_sleep,
+       .init = tda827x_initial_init,
+       .sleep = tda827x_initial_sleep,
        .set_params = tda827xo_set_params,
        .get_frequency = tda827x_get_frequency,
        .get_bandwidth = tda827x_get_bandwidth,
        .get_bandwidth = tda827x_get_bandwidth,
 };
 
-struct dvb_frontend *tda827x_attach(struct dvb_frontend *fe, int addr,
-                                   struct i2c_adapter *i2c,
-                                   struct tda827x_config *cfg)
-{
-       struct tda827x_priv *priv = NULL;
-       u8 data;
-       u8 sb_msg[] = { 0x30, 0xd0 };
-       struct i2c_msg msg = { .addr = addr, .flags = I2C_M_RD,
+static int tda827x_probe_version(struct dvb_frontend *fe)
+{      u8 data;
+       struct tda827x_priv *priv = fe->tuner_priv;
+       struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = I2C_M_RD,
                               .buf = &data, .len = 1 };
-       dprintk("%s:\n", __FUNCTION__);
-
        if (fe->ops.i2c_gate_ctrl)
                fe->ops.i2c_gate_ctrl(fe, 1);
-
-       if (i2c_transfer(i2c, &msg, 1) != 1) {
+       if (i2c_transfer(priv->i2c_adap, &msg, 1) != 1) {
                printk("%s: could not read from tuner at addr: 0x%02x\n",
-                      __FUNCTION__, addr << 1);
-               return NULL;
+                      __FUNCTION__, msg.addr << 1);
+               return -EIO;
+       }
+       if ((data & 0x3c) == 0) {
+               dprintk("tda827x tuner found\n");
+               fe->ops.tuner_ops.init  = tda827x_init;
+               fe->ops.tuner_ops.sleep = tda827xo_sleep;
+       } else {
+               dprintk("tda827xa tuner found\n");
+               memcpy(&fe->ops.tuner_ops, &tda827xa_tuner_ops, sizeof(struct dvb_tuner_ops));
        }
+       return 0;
+}
+
+struct dvb_frontend *tda827x_attach(struct dvb_frontend *fe, int addr,
+                                   struct i2c_adapter *i2c,
+                                   struct tda827x_config *cfg)
+{
+       struct tda827x_priv *priv = NULL;
 
+       dprintk("%s:\n", __FUNCTION__);
        priv = kzalloc(sizeof(struct tda827x_priv), GFP_KERNEL);
        if (priv == NULL)
                return NULL;
        priv->i2c_addr = addr;
        priv->i2c_adap = i2c;
        priv->cfg = cfg;
+       memcpy(&fe->ops.tuner_ops, &tda827xo_tuner_ops, sizeof(struct dvb_tuner_ops));
 
-       msg.flags = 0;
-       msg.buf = sb_msg;
-       msg.len = sizeof(sb_msg);
-
-       if ((data & 0x3c) == 0) {
-               dprintk("tda827x tuner found\n");
-               memcpy(&fe->ops.tuner_ops, &tda827xo_tuner_ops, sizeof(struct dvb_tuner_ops));
-       } else {
-               dprintk("tda827xa tuner found\n");
-               memcpy(&fe->ops.tuner_ops, &tda827xa_tuner_ops, sizeof(struct dvb_tuner_ops));
-               sb_msg[1] = 0x90;
-       }
        fe->tuner_priv = priv;
-       if (fe->ops.i2c_gate_ctrl)
-               fe->ops.i2c_gate_ctrl(fe, 1);
-       i2c_transfer(i2c, &msg, 1);
+
        return fe;
 }
+
 EXPORT_SYMBOL(tda827x_attach);
 
 module_param(debug, int, 0644);