summaryrefslogtreecommitdiff
path: root/drivers/platform
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/amd/pmf/acpi.c38
-rw-r--r--drivers/platform/x86/amd/pmf/core.c1
-rw-r--r--drivers/platform/x86/amd/pmf/pmf.h1
3 files changed, 24 insertions, 16 deletions
diff --git a/drivers/platform/x86/amd/pmf/acpi.c b/drivers/platform/x86/amd/pmf/acpi.c
index cb46a7252414..b445c91aa52e 100644
--- a/drivers/platform/x86/amd/pmf/acpi.c
+++ b/drivers/platform/x86/amd/pmf/acpi.c
@@ -233,6 +233,28 @@ static int apmf_get_system_params(struct amd_pmf_dev *dev)
return 0;
}
+int apmf_install_handler(struct amd_pmf_dev *pmf_dev)
+{
+ acpi_handle ahandle = ACPI_HANDLE(pmf_dev->dev);
+ acpi_status status;
+
+ /* Install the APMF Notify handler */
+ if (is_apmf_func_supported(pmf_dev, APMF_FUNC_AUTO_MODE) &&
+ is_apmf_func_supported(pmf_dev, APMF_FUNC_SBIOS_REQUESTS)) {
+ status = acpi_install_notify_handler(ahandle, ACPI_ALL_NOTIFY,
+ apmf_event_handler, pmf_dev);
+ if (ACPI_FAILURE(status)) {
+ dev_err(pmf_dev->dev, "failed to install notify handler\n");
+ return -ENODEV;
+ }
+
+ /* Call the handler once manually to catch up with possibly missed notifies. */
+ apmf_event_handler(ahandle, 0, pmf_dev);
+ }
+
+ return 0;
+}
+
void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev)
{
acpi_handle ahandle = ACPI_HANDLE(pmf_dev->dev);
@@ -247,8 +269,6 @@ void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev)
int apmf_acpi_init(struct amd_pmf_dev *pmf_dev)
{
- acpi_handle ahandle = ACPI_HANDLE(pmf_dev->dev);
- acpi_status status;
int ret;
ret = apmf_if_verify_interface(pmf_dev);
@@ -269,20 +289,6 @@ int apmf_acpi_init(struct amd_pmf_dev *pmf_dev)
schedule_delayed_work(&pmf_dev->heart_beat, 0);
}
- /* Install the APMF Notify handler */
- if (is_apmf_func_supported(pmf_dev, APMF_FUNC_AUTO_MODE) &&
- is_apmf_func_supported(pmf_dev, APMF_FUNC_SBIOS_REQUESTS)) {
- status = acpi_install_notify_handler(ahandle,
- ACPI_ALL_NOTIFY,
- apmf_event_handler, pmf_dev);
- if (ACPI_FAILURE(status)) {
- dev_err(pmf_dev->dev, "failed to install notify handler\n");
- return -ENODEV;
- }
- /* Call the handler once manually to catch up with possibly missed notifies. */
- apmf_event_handler(ahandle, 0, pmf_dev);
- }
-
out:
return ret;
}
diff --git a/drivers/platform/x86/amd/pmf/core.c b/drivers/platform/x86/amd/pmf/core.c
index a675ca969331..785d2ba5ec4f 100644
--- a/drivers/platform/x86/amd/pmf/core.c
+++ b/drivers/platform/x86/amd/pmf/core.c
@@ -352,6 +352,7 @@ static int amd_pmf_probe(struct platform_device *pdev)
apmf_acpi_init(dev);
platform_set_drvdata(pdev, dev);
amd_pmf_init_features(dev);
+ apmf_install_handler(dev);
amd_pmf_dbgfs_register(dev);
mutex_init(&dev->lock);
diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/x86/amd/pmf/pmf.h
index 0a72a395c2ef..1ae4c70a18b2 100644
--- a/drivers/platform/x86/amd/pmf/pmf.h
+++ b/drivers/platform/x86/amd/pmf/pmf.h
@@ -301,6 +301,7 @@ int is_apmf_func_supported(struct amd_pmf_dev *pdev, unsigned long index);
int amd_pmf_send_cmd(struct amd_pmf_dev *dev, u8 message, bool get, u32 arg, u32 *data);
int amd_pmf_init_metrics_table(struct amd_pmf_dev *dev);
int amd_pmf_get_power_source(void);
+int apmf_install_handler(struct amd_pmf_dev *pmf_dev);
/* SPS Layer */
int amd_pmf_get_pprof_modes(struct amd_pmf_dev *pmf);