return -EAGAIN;
 
        ret = priv->init[adap->id](fe);
-       if (ret)
-               goto err_unlock;
-
-       if (priv->tuner_ops_init[adap->id]) {
-               if (fe->ops.i2c_gate_ctrl)
-                       fe->ops.i2c_gate_ctrl(fe, 1);
-               ret = priv->tuner_ops_init[adap->id](fe);
-               if (fe->ops.i2c_gate_ctrl)
-                       fe->ops.i2c_gate_ctrl(fe, 0);
-       }
 
-err_unlock:
        mutex_unlock(&adap->dev->usb_mutex);
 
        return ret;
        if (mutex_lock_interruptible(&adap->dev->usb_mutex))
                return -EAGAIN;
 
-       if (priv->tuner_ops_sleep[adap->id]) {
-               if (fe->ops.i2c_gate_ctrl)
-                       fe->ops.i2c_gate_ctrl(fe, 1);
-               ret = priv->tuner_ops_sleep[adap->id](fe);
-               if (fe->ops.i2c_gate_ctrl)
-                       fe->ops.i2c_gate_ctrl(fe, 0);
-               if (ret)
-                       goto err_unlock;
-       }
-
        ret = priv->sleep[adap->id](fe);
 
-err_unlock:
        mutex_unlock(&adap->dev->usb_mutex);
 
        return ret;
 }
 
+/* override tuner callbacks for resource locking */
+static int af9015_tuner_init(struct dvb_frontend *fe)
+{
+       int ret;
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
+       struct af9015_state *priv = adap->dev->priv;
+
+       if (mutex_lock_interruptible(&adap->dev->usb_mutex))
+               return -EAGAIN;
+
+       ret = priv->tuner_init[adap->id](fe);
+
+       mutex_unlock(&adap->dev->usb_mutex);
+
+       return ret;
+}
+
+/* override tuner callbacks for resource locking */
+static int af9015_tuner_sleep(struct dvb_frontend *fe)
+{
+       int ret;
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
+       struct af9015_state *priv = adap->dev->priv;
+
+       if (mutex_lock_interruptible(&adap->dev->usb_mutex))
+               return -EAGAIN;
+
+       ret = priv->tuner_sleep[adap->id](fe);
+
+       mutex_unlock(&adap->dev->usb_mutex);
+
+       return ret;
+}
+
+
 static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
 {
        int ret;
                        af9015_af9013_config[adap->id].tuner);
        }
 
-       state->tuner_ops_sleep[adap->id] =
-                               adap->fe_adap[0].fe->ops.tuner_ops.sleep;
-       adap->fe_adap[0].fe->ops.tuner_ops.sleep = 0;
+       if (adap->fe_adap[0].fe->ops.tuner_ops.init) {
+               state->tuner_init[adap->id] =
+                       adap->fe_adap[0].fe->ops.tuner_ops.init;
+               adap->fe_adap[0].fe->ops.tuner_ops.init = af9015_tuner_init;
+       }
+
+       if (adap->fe_adap[0].fe->ops.tuner_ops.sleep) {
+               state->tuner_sleep[adap->id] =
+                       adap->fe_adap[0].fe->ops.tuner_ops.sleep;
+               adap->fe_adap[0].fe->ops.tuner_ops.sleep = af9015_tuner_sleep;
+       }
 
-       state->tuner_ops_init[adap->id] =
-                               adap->fe_adap[0].fe->ops.tuner_ops.init;
-       adap->fe_adap[0].fe->ops.tuner_ops.init = 0;
        return ret;
 }