On Mon, Apr 05, 2021 at 10:27:45PM +0200, Hans de Goede wrote: > Some buggy BIOS-es bring up the touchscreen-controller in a stuck > state where it blocks the I2C bus. Specifically this happens on > the Jumper EZpad 7 tablet model. > > After much poking at this problem I have found that the following steps > are necessary to unstuck the chip / bus: > > 1. Turn off the Silead chip. > 2. Try to do an I2C transfer with the chip, this will fail in response to > which the I2C-bus-driver will call: i2c_recover_bus() which will unstuck > the I2C-bus. Note the unstuck-ing of the I2C bus only works if we first > drop the chip of the bus by turning it off. > 3. Turn the chip back on. > > On the x86/ACPI systems were this problem is seen, step 1. and 3. require > making ACPI calls and dealing with ACPI Power Resources. This commit adds > a workaround which runtime-suspends the chip to turn it off, leaving it up > to the ACPI subsystem to deal with all the ACPI specific details. > > There is no good way to detect this bug, so the workaround gets activated > by a new "silead,stuck-controller-bug" boolean device-property. Since this > is only used on x86/ACPI, this will be set by model specific device-props > set by drivers/platform/x86/touchscreen_dmi.c. Therefor this new > device-property is not documented in the DT-bindings. > > Dmesg will contain the following messages on systems where the workaround > is activated: > > [ 54.309029] silead_ts i2c-MSSL1680:00: [Firmware Bug]: Stuck I2C bus: please ignore the next 'controller timed out' error > [ 55.373593] i2c_designware 808622C1:04: controller timed out > [ 55.582186] silead_ts i2c-MSSL1680:00: Silead chip ID: 0x80360000 > > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> Applied, thank you. -- Dmitry