platform/x86/amd/pmf: Ensure mutexes are initialized before use
authorHans de Goede <hdegoede@redhat.com>
Mon, 30 Jan 2023 13:25:54 +0000 (14:25 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Feb 2023 10:28:07 +0000 (11:28 +0100)
[ Upstream commit e0c40529ff942a985eb0f3dacf18d35ee4dbb03d ]

As soon as the first handler or sysfs file is registered
the mutex may get used.

Move the initialization to before any handler registration /
sysfs file creation.

Likewise move the destruction of the mutex to after all
the de-initialization is done.

Fixes: da5ce22df5fe ("platform/x86/amd/pmf: Add support for PMF core layer")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20230130132554.696025-1-hdegoede@redhat.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/platform/x86/amd/pmf/core.c

index c9f7bce..da23639 100644 (file)
@@ -385,6 +385,9 @@ static int amd_pmf_probe(struct platform_device *pdev)
        if (!dev->regbase)
                return -ENOMEM;
 
+       mutex_init(&dev->lock);
+       mutex_init(&dev->update_mutex);
+
        apmf_acpi_init(dev);
        platform_set_drvdata(pdev, dev);
        amd_pmf_init_features(dev);
@@ -394,8 +397,6 @@ static int amd_pmf_probe(struct platform_device *pdev)
        dev->pwr_src_notifier.notifier_call = amd_pmf_pwr_src_notify_call;
        power_supply_reg_notifier(&dev->pwr_src_notifier);
 
-       mutex_init(&dev->lock);
-       mutex_init(&dev->update_mutex);
        dev_info(dev->dev, "registered PMF device successfully\n");
 
        return 0;
@@ -406,11 +407,11 @@ static int amd_pmf_remove(struct platform_device *pdev)
        struct amd_pmf_dev *dev = platform_get_drvdata(pdev);
 
        power_supply_unreg_notifier(&dev->pwr_src_notifier);
-       mutex_destroy(&dev->lock);
-       mutex_destroy(&dev->update_mutex);
        amd_pmf_deinit_features(dev);
        apmf_acpi_deinit(dev);
        amd_pmf_dbgfs_unregister(dev);
+       mutex_destroy(&dev->lock);
+       mutex_destroy(&dev->update_mutex);
        kfree(dev->buf);
        return 0;
 }