Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d535bd8 authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab
Browse files

[media] af9015: fix i2c failures for dual-tuner devices - part 2



Some changes for previous patch I liked to do.
Just move tuner init and sleep to own functions from the demod
init and sleep functions.  Functionality remains still almost the same.

Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent be4a5e7f
Loading
Loading
Loading
Loading
+46 −28
Original line number Diff line number Diff line
@@ -1141,18 +1141,7 @@ static int af9015_af9013_init(struct dvb_frontend *fe)
		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;
@@ -1168,24 +1157,48 @@ static int af9015_af9013_sleep(struct dvb_frontend *fe)
	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);

	mutex_unlock(&adap->dev->usb_mutex);

	return ret;
}

	ret = priv->sleep[adap->id](fe);
/* 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);

err_unlock:
	mutex_unlock(&adap->dev->usb_mutex);

	return ret;
}


static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
{
	int ret;
@@ -1364,13 +1377,18 @@ static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
			af9015_af9013_config[adap->id].tuner);
	}

	state->tuner_ops_sleep[adap->id] =
	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 = 0;
		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;
}

+2 −2
Original line number Diff line number Diff line
@@ -108,8 +108,8 @@ struct af9015_state {
	int (*read_status[2]) (struct dvb_frontend *fe, fe_status_t *status);
	int (*init[2]) (struct dvb_frontend *fe);
	int (*sleep[2]) (struct dvb_frontend *fe);
	int (*tuner_ops_init[2]) (struct dvb_frontend *fe);
	int (*tuner_ops_sleep[2]) (struct dvb_frontend *fe);
	int (*tuner_init[2]) (struct dvb_frontend *fe);
	int (*tuner_sleep[2]) (struct dvb_frontend *fe);
};

struct af9015_config {