1
0
mirror of https://github.com/DigitalDevices/dddvb.git synced 2023-10-10 13:37:43 +02:00

stv0910: release lock on gate_ctrl() failure

When write_reg() fails, the mutex_unlock() won't ever be hit especially
when closing the I2C gate. This can lead to deadlock situations, even
(or, especially) if the i2c_gate_ctrl status isn't checked in stv6111.
Fix this possibility by releasing the lock whenever write_reg() fails.
This commit is contained in:
Daniel Scheller 2017-08-27 18:46:53 +02:00
parent 5751c3fb1a
commit 55e7a91c3e

View File

@ -1198,17 +1198,22 @@ static int gate_ctrl(struct dvb_frontend *fe, int enable)
struct stv *state = fe->demodulator_priv; struct stv *state = fe->demodulator_priv;
u8 i2crpt = state->i2crpt & ~0x86; u8 i2crpt = state->i2crpt & ~0x86;
if (enable) if (enable) {
mutex_lock(&state->base->i2c_lock); mutex_lock(&state->base->i2c_lock);
if (enable)
i2crpt |= 0x80; i2crpt |= 0x80;
else } else {
i2crpt |= 0x02; i2crpt |= 0x02;
}
if (write_reg(state, state->nr ? RSTV0910_P2_I2CRPT : if (write_reg(state, state->nr ? RSTV0910_P2_I2CRPT :
RSTV0910_P1_I2CRPT, i2crpt) < 0) RSTV0910_P1_I2CRPT, i2crpt) < 0) {
/* don't hold the I2C bus lock on failure */
mutex_unlock(&state->base->i2c_lock);
dev_err(&state->base->i2c->dev,
"%s() write_reg failure (enable=%d)\n",
__func__, enable);
return -EIO; return -EIO;
}
state->i2crpt = i2crpt; state->i2crpt = i2crpt;