Message ID | 20170509080436.19233-1-hdegoede@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, 9 May 2017, Hans de Goede wrote: > For ACPI devices which do not have a _PSC method, the ACPI subsys cannot > query their initial state at boot, so these devices are assumed to have > been put in D0 by the BIOS, but for touchscreens that is not always true. > > This commit adds a call to acpi_device_fix_up_power to explicitly put > devices without a _PSC method into D0 state (for devices with a _PSC > method it is a nop). Note we only need to do this on probe, after a > resume the ACPI subsys knows the device is in D3 and will properly > put it in D0. > > This fixes the SIS0817 i2c-hid touchscreen on a Peaq C1010 2-in-1 > device failing to probe with a "hid_descr_cmd failed" error. > > Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> > Signed-off-by: Hans de Goede <hdegoede@redhat.com> > --- > Changes in v2: > -Improve commit msg > -Add Benjamin's Acked-by Applied to for-4.12/upstream-fixes, thanks.
diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c index ea3c3546cef7..c716d9605940 100644 --- a/drivers/hid/i2c-hid/i2c-hid.c +++ b/drivers/hid/i2c-hid/i2c-hid.c @@ -960,6 +960,15 @@ static int i2c_hid_acpi_pdata(struct i2c_client *client, return 0; } +static void i2c_hid_acpi_fix_up_power(struct device *dev) +{ + acpi_handle handle = ACPI_HANDLE(dev); + struct acpi_device *adev; + + if (handle && acpi_bus_get_device(handle, &adev) == 0) + acpi_device_fix_up_power(adev); +} + static const struct acpi_device_id i2c_hid_acpi_match[] = { {"ACPI0C50", 0 }, {"PNP0C50", 0 }, @@ -972,6 +981,8 @@ static inline int i2c_hid_acpi_pdata(struct i2c_client *client, { return -ENODEV; } + +static inline void i2c_hid_acpi_fix_up_power(struct device *dev) {} #endif #ifdef CONFIG_OF @@ -1070,6 +1081,8 @@ static int i2c_hid_probe(struct i2c_client *client, if (ret < 0) goto err; + i2c_hid_acpi_fix_up_power(&client->dev); + pm_runtime_get_noresume(&client->dev); pm_runtime_set_active(&client->dev); pm_runtime_enable(&client->dev);