diff options
Diffstat (limited to 'drivers/platform')
-rw-r--r-- | drivers/platform/x86/amd/pmf/acpi.c | 38 | ||||
-rw-r--r-- | drivers/platform/x86/amd/pmf/core.c | 1 | ||||
-rw-r--r-- | drivers/platform/x86/amd/pmf/pmf.h | 1 |
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); |