Commit 581733e6 authored by Peter Rosin's avatar Peter Rosin Committed by Wolfram Sang
Browse files

media: tda18271: switch to i2c_lock_bus(..., I2C_LOCK_SEGMENT)



Locking the root adapter for __i2c_transfer will deadlock if the
device sits behind a mux-locked I2C mux. Switch to the finer-grained
i2c_lock_bus with the I2C_LOCK_SEGMENT flag. If the device does not
sit behind a mux-locked mux, the two locking variants are equivalent.

Signed-off-by: default avatarPeter Rosin <peda@axentia.se>
Acked-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent 3e985b3d
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -225,7 +225,7 @@ static int __tda18271_write_regs(struct dvb_frontend *fe, int idx, int len,
	 */
	if (lock_i2c) {
		tda18271_i2c_gate_ctrl(fe, 1);
		i2c_lock_adapter(priv->i2c_props.adap);
		i2c_lock_bus(priv->i2c_props.adap, I2C_LOCK_SEGMENT);
	}
	while (len) {
		if (max > len)
@@ -246,7 +246,7 @@ static int __tda18271_write_regs(struct dvb_frontend *fe, int idx, int len,
		len -= max;
	}
	if (lock_i2c) {
		i2c_unlock_adapter(priv->i2c_props.adap);
		i2c_unlock_bus(priv->i2c_props.adap, I2C_LOCK_SEGMENT);
		tda18271_i2c_gate_ctrl(fe, 0);
	}

@@ -300,7 +300,7 @@ int tda18271_init_regs(struct dvb_frontend *fe)
	 * as those could cause bad things
	 */
	tda18271_i2c_gate_ctrl(fe, 1);
	i2c_lock_adapter(priv->i2c_props.adap);
	i2c_lock_bus(priv->i2c_props.adap, I2C_LOCK_SEGMENT);

	/* initialize registers */
	switch (priv->id) {
@@ -516,7 +516,7 @@ int tda18271_init_regs(struct dvb_frontend *fe)
	/* synchronize */
	__tda18271_write_regs(fe, R_EP1, 1, false);

	i2c_unlock_adapter(priv->i2c_props.adap);
	i2c_unlock_bus(priv->i2c_props.adap, I2C_LOCK_SEGMENT);
	tda18271_i2c_gate_ctrl(fe, 0);

	return 0;