Commit 4965e2c7 authored by Benjamin Tissoires's avatar Benjamin Tissoires
Browse files

Merge branch 'for-6.18/i2c-hid' into for-linus

- Resolve touchpad issues on Dell systems during S4 by invoking the _DSM
  on resume from hibernate (Mario Limonciello)
parents f6c53923 7d62beb1
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -76,6 +76,13 @@ static int i2c_hid_acpi_get_descriptor(struct i2c_hid_acpi *ihid_acpi)
	return hid_descriptor_address;
}

static void i2c_hid_acpi_restore_sequence(struct i2chid_ops *ops)
{
	struct i2c_hid_acpi *ihid_acpi = container_of(ops, struct i2c_hid_acpi, ops);

	i2c_hid_acpi_get_descriptor(ihid_acpi);
}

static void i2c_hid_acpi_shutdown_tail(struct i2chid_ops *ops)
{
	struct i2c_hid_acpi *ihid_acpi = container_of(ops, struct i2c_hid_acpi, ops);
@@ -96,6 +103,7 @@ static int i2c_hid_acpi_probe(struct i2c_client *client)

	ihid_acpi->adev = ACPI_COMPANION(dev);
	ihid_acpi->ops.shutdown_tail = i2c_hid_acpi_shutdown_tail;
	ihid_acpi->ops.restore_sequence = i2c_hid_acpi_restore_sequence;

	ret = i2c_hid_acpi_get_descriptor(ihid_acpi);
	if (ret < 0)
+27 −1
Original line number Diff line number Diff line
@@ -961,6 +961,14 @@ static void i2c_hid_core_shutdown_tail(struct i2c_hid *ihid)
	ihid->ops->shutdown_tail(ihid->ops);
}

static void i2c_hid_core_restore_sequence(struct i2c_hid *ihid)
{
	if (!ihid->ops->restore_sequence)
		return;

	ihid->ops->restore_sequence(ihid->ops);
}

static int i2c_hid_core_suspend(struct i2c_hid *ihid, bool force_poweroff)
{
	struct i2c_client *client = ihid->client;
@@ -1360,8 +1368,26 @@ static int i2c_hid_core_pm_resume(struct device *dev)
	return i2c_hid_core_resume(ihid);
}

static int i2c_hid_core_pm_restore(struct device *dev)
{
	struct i2c_client *client = to_i2c_client(dev);
	struct i2c_hid *ihid = i2c_get_clientdata(client);

	if (ihid->is_panel_follower)
		return 0;

	i2c_hid_core_restore_sequence(ihid);

	return i2c_hid_core_resume(ihid);
}

const struct dev_pm_ops i2c_hid_core_pm = {
	SYSTEM_SLEEP_PM_OPS(i2c_hid_core_pm_suspend, i2c_hid_core_pm_resume)
	.suspend = pm_sleep_ptr(i2c_hid_core_pm_suspend),
	.resume = pm_sleep_ptr(i2c_hid_core_pm_resume),
	.freeze = pm_sleep_ptr(i2c_hid_core_pm_suspend),
	.thaw = pm_sleep_ptr(i2c_hid_core_pm_resume),
	.poweroff = pm_sleep_ptr(i2c_hid_core_pm_suspend),
	.restore = pm_sleep_ptr(i2c_hid_core_pm_restore),
};
EXPORT_SYMBOL_GPL(i2c_hid_core_pm);

+2 −0
Original line number Diff line number Diff line
@@ -27,11 +27,13 @@ static inline u32 i2c_hid_get_dmi_quirks(const u16 vendor, const u16 product)
 * @power_up: do sequencing to power up the device.
 * @power_down: do sequencing to power down the device.
 * @shutdown_tail: called at the end of shutdown.
 * @restore_sequence: hibernation restore sequence.
 */
struct i2chid_ops {
	int (*power_up)(struct i2chid_ops *ops);
	void (*power_down)(struct i2chid_ops *ops);
	void (*shutdown_tail)(struct i2chid_ops *ops);
	void (*restore_sequence)(struct i2chid_ops *ops);
};

int i2c_hid_core_probe(struct i2c_client *client, struct i2chid_ops *ops,