| From 9106c6a2e872cbddd4499c266e5490cf28a925f7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 25 Oct 2023 16:55:11 +1300 |
| Subject: HID: mcp2221: Allow IO to start during probe |
| |
| From: Hamish Martin <hamish.martin@alliedtelesis.co.nz> |
| |
| [ Upstream commit 73ce9f1f2741a38f5d27393e627702ae2c46e6f2 ] |
| |
| During the probe we add an I2C adapter and as soon as we add that adapter |
| it may be used for a transfer (e.g via the code in i2cdetect()). |
| Those transfers are not able to complete and time out. This is because the |
| HID raw_event callback (mcp2221_raw_event) will not be invoked until the |
| HID device's 'driver_input_lock' is marked up at the completion of the |
| probe in hid_device_probe(). This starves the driver of the responses it |
| is waiting for. |
| In order to allow the I2C transfers to complete while we are still in the |
| probe, start the IO once we have completed init of the HID device. |
| |
| This issue seems to have been seen before and a patch was submitted but |
| it seems it was never accepted. See: |
| https://lore.kernel.org/all/20221103222714.21566-3-Enrik.Berkhan@inka.de/ |
| |
| Signed-off-by: Hamish Martin <hamish.martin@alliedtelesis.co.nz> |
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/hid/hid-mcp2221.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/drivers/hid/hid-mcp2221.c b/drivers/hid/hid-mcp2221.c |
| index b95f31cf0fa21..aef0785c91cc2 100644 |
| --- a/drivers/hid/hid-mcp2221.c |
| +++ b/drivers/hid/hid-mcp2221.c |
| @@ -1142,6 +1142,8 @@ static int mcp2221_probe(struct hid_device *hdev, |
| if (ret) |
| return ret; |
| |
| + hid_device_io_start(hdev); |
| + |
| /* Set I2C bus clock diviser */ |
| if (i2c_clk_freq > 400) |
| i2c_clk_freq = 400; |
| -- |
| 2.43.0 |
| |