Commit ab17de60 authored by Even Xu's avatar Even Xu Committed by Greg Kroah-Hartman

HID: intel_ish-hid: ipc: register more pm callbacks to support hibernation

commit ebeaa367 upstream.

Current ISH driver only registers suspend/resume PM callbacks which don't
support hibernation (suspend to disk). Basically after hiberation, the ISH
can't resume properly and user may not see sensor events (for example: screen
		rotation may not work).

User will not see a crash or panic or anything except the following message
in log:

	hid-sensor-hub 001F:8086:22D8.0001: timeout waiting for response from ISHTP device

So this patch adds support for S4/hiberbation to ISH by using the
SIMPLE_DEV_PM_OPS() MACRO instead of struct dev_pm_ops directly. The suspend
and resume functions will now be used for both suspend to RAM and hibernation.

If power management is disabled, SIMPLE_DEV_PM_OPS will do nothing, the suspend
and resume related functions won't be used, so mark them as __maybe_unused to
clarify that this is the intended behavior, and remove #ifdefs for power
management.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarEven Xu <even.xu@intel.com>
Acked-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e3e6bd6a
...@@ -204,8 +204,7 @@ static void ish_remove(struct pci_dev *pdev) ...@@ -204,8 +204,7 @@ static void ish_remove(struct pci_dev *pdev)
kfree(ishtp_dev); kfree(ishtp_dev);
} }
#ifdef CONFIG_PM static struct device __maybe_unused *ish_resume_device;
static struct device *ish_resume_device;
/* 50ms to get resume response */ /* 50ms to get resume response */
#define WAIT_FOR_RESUME_ACK_MS 50 #define WAIT_FOR_RESUME_ACK_MS 50
...@@ -219,7 +218,7 @@ static struct device *ish_resume_device; ...@@ -219,7 +218,7 @@ static struct device *ish_resume_device;
* in that case a simple resume message is enough, others we need * in that case a simple resume message is enough, others we need
* a reset sequence. * a reset sequence.
*/ */
static void ish_resume_handler(struct work_struct *work) static void __maybe_unused ish_resume_handler(struct work_struct *work)
{ {
struct pci_dev *pdev = to_pci_dev(ish_resume_device); struct pci_dev *pdev = to_pci_dev(ish_resume_device);
struct ishtp_device *dev = pci_get_drvdata(pdev); struct ishtp_device *dev = pci_get_drvdata(pdev);
...@@ -261,7 +260,7 @@ static void ish_resume_handler(struct work_struct *work) ...@@ -261,7 +260,7 @@ static void ish_resume_handler(struct work_struct *work)
* *
* Return: 0 to the pm core * Return: 0 to the pm core
*/ */
static int ish_suspend(struct device *device) static int __maybe_unused ish_suspend(struct device *device)
{ {
struct pci_dev *pdev = to_pci_dev(device); struct pci_dev *pdev = to_pci_dev(device);
struct ishtp_device *dev = pci_get_drvdata(pdev); struct ishtp_device *dev = pci_get_drvdata(pdev);
...@@ -287,7 +286,7 @@ static int ish_suspend(struct device *device) ...@@ -287,7 +286,7 @@ static int ish_suspend(struct device *device)
return 0; return 0;
} }
static DECLARE_WORK(resume_work, ish_resume_handler); static __maybe_unused DECLARE_WORK(resume_work, ish_resume_handler);
/** /**
* ish_resume() - ISH resume callback * ish_resume() - ISH resume callback
* @device: device pointer * @device: device pointer
...@@ -296,7 +295,7 @@ static DECLARE_WORK(resume_work, ish_resume_handler); ...@@ -296,7 +295,7 @@ static DECLARE_WORK(resume_work, ish_resume_handler);
* *
* Return: 0 to the pm core * Return: 0 to the pm core
*/ */
static int ish_resume(struct device *device) static int __maybe_unused ish_resume(struct device *device)
{ {
struct pci_dev *pdev = to_pci_dev(device); struct pci_dev *pdev = to_pci_dev(device);
struct ishtp_device *dev = pci_get_drvdata(pdev); struct ishtp_device *dev = pci_get_drvdata(pdev);
...@@ -310,21 +309,14 @@ static int ish_resume(struct device *device) ...@@ -310,21 +309,14 @@ static int ish_resume(struct device *device)
return 0; return 0;
} }
static const struct dev_pm_ops ish_pm_ops = { static SIMPLE_DEV_PM_OPS(ish_pm_ops, ish_suspend, ish_resume);
.suspend = ish_suspend,
.resume = ish_resume,
};
#define ISHTP_ISH_PM_OPS (&ish_pm_ops)
#else
#define ISHTP_ISH_PM_OPS NULL
#endif /* CONFIG_PM */
static struct pci_driver ish_driver = { static struct pci_driver ish_driver = {
.name = KBUILD_MODNAME, .name = KBUILD_MODNAME,
.id_table = ish_pci_tbl, .id_table = ish_pci_tbl,
.probe = ish_probe, .probe = ish_probe,
.remove = ish_remove, .remove = ish_remove,
.driver.pm = ISHTP_ISH_PM_OPS, .driver.pm = &ish_pm_ops,
}; };
module_pci_driver(ish_driver); module_pci_driver(ish_driver);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment