@@ -1083,6 +1083,34 @@ static int af9015_i2c_init(struct dvb_usb_device *d)
return ret;
}
+static int af9015_lock_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
+{
+ int result;
+ struct dvb_usb_adapter *adap = fe->dvb->priv;
+ struct af9015_state *state = adap->dev->priv;
+
+ if (mutex_lock_interruptible(&adap->dev->usb_mutex))
+ return -EAGAIN;
+
+ result = state->fe_ops[adap->id].set_frontend(fe, params);
+ mutex_unlock(&adap->dev->usb_mutex);
+ return result;
+}
+
+static int af9015_lock_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
+{
+ int result;
+ struct dvb_usb_adapter *adap = fe->dvb->priv;
+ struct af9015_state *state = adap->dev->priv;
+
+ if (mutex_lock_interruptible(&adap->dev->usb_mutex))
+ return -EAGAIN;
+
+ result = state->fe_ops[adap->id].get_frontend(fe, params);
+ mutex_unlock(&adap->dev->usb_mutex);
+ return result;
+}
+
static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
{
int ret;
@@ -1116,6 +1144,12 @@ static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
/* attach demodulator */
adap->fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
i2c_adap);
+
+ memcpy(&state->fe_ops[adap->id], &adap->fe->ops, sizeof(struct dvb_frontend_ops));
+ if (adap->fe->ops.set_frontend)
+ adap->fe->ops.set_frontend = af9015_lock_set_frontend;
+ if (adap->fe->ops.get_frontend)
+ adap->fe->ops.get_frontend = af9015_lock_get_frontend;
return adap->fe == NULL ? -ENODEV : 0;
}
@@ -102,6 +102,7 @@ struct af9015_state {
struct i2c_adapter i2c_adap; /* I2C adapter for 2nd FE */
u8 rc_repeat;
u32 rc_keycode;
+ struct dvb_frontend_ops fe_ops[2];
};
struct af9015_config {