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

Commit abe41184 authored by Wolfram Sang's avatar Wolfram Sang Committed by Wolfram Sang
Browse files

i2c: recovery: if possible send STOP with recovery pulses



I2C clients may misunderstand recovery pulses if they can't read SDA to
bail out early. In the worst case, as a write operation. To avoid that
and if we can write SDA, try to send STOP to avoid the
misinterpretation.

Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: default avatarPeter Rosin <peda@axentia.se>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
Cc: stable@kernel.org
parent 54836e2d
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -198,7 +198,16 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap)

		val = !val;
		bri->set_scl(adap, val);
		ndelay(RECOVERY_NDELAY);

		/*
		 * If we can set SDA, we will always create STOP here to ensure
		 * the additional pulses will do no harm. This is achieved by
		 * letting SDA follow SCL half a cycle later.
		 */
		ndelay(RECOVERY_NDELAY / 2);
		if (bri->set_sda)
			bri->set_sda(adap, val);
		ndelay(RECOVERY_NDELAY / 2);
	}

	/* check if recovery actually succeeded */