Hi, On Mon, Nov 20, 2023 at 11:33 AM Hans de Goede <hdegoede@xxxxxxxxxx> wrote: > > @@ -482,21 +442,50 @@ static int i2c_hid_hwreset(struct i2c_hid *ihid) > > ret = i2c_hid_set_power(ihid, I2C_HID_PWR_ON); > if (ret) > - goto out_unlock; > + goto err_unlock; > > - ret = i2c_hid_execute_reset(ihid); > + /* Prepare reset command. Command register goes first. */ > + *(__le16 *)ihid->cmdbuf = ihid->hdesc.wCommandRegister; > + length += sizeof(__le16); > + /* Next is RESET command itself */ > + length += i2c_hid_encode_command(ihid->cmdbuf + length, > + I2C_HID_OPCODE_RESET, 0, 0); > + > + set_bit(I2C_HID_RESET_PENDING, &ihid->flags); > + > + ret = i2c_hid_xfer(ihid, ihid->cmdbuf, length, NULL, 0); > if (ret) { > dev_err(&ihid->client->dev, > "failed to reset device: %d\n", ret); > - i2c_hid_set_power(ihid, I2C_HID_PWR_SLEEP); > - goto out_unlock; > + goto err_clear_reset; > } > > + i2c_hid_dbg(ihid, "%s: waiting...\n", __func__); > + > + if (ihid->quirks & I2C_HID_QUIRK_NO_IRQ_AFTER_RESET) { > + msleep(100); > + clear_bit(I2C_HID_RESET_PENDING, &ihid->flags); > + } > + > + if (!wait_event_timeout(ihid->wait, optional: as mentioned in v1, I probably would have made the above an "else if" to make it clear that it's not ever true if you ran the "I2C_HID_QUIRK_NO_IRQ_AFTER_RESET" logic.