platform/x86/dell: dell-pc: Create platform device
authorMario Limonciello <mario.limonciello@amd.com>
Fri, 6 Dec 2024 03:18:58 +0000 (21:18 -0600)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 10 Dec 2024 17:17:48 +0000 (19:17 +0200)
In order to have a device for the platform profile core to reference
create a platform device for dell-pc.

While doing this change the memory allocation for the thermal handler
to be device managed to follow the lifecycle of that device.

Reviewed-by: Armin Wolf <W_Armin@gmx.de>
Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://lore.kernel.org/r/20241206031918.1537-3-mario.limonciello@amd.com
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/dell/dell-pc.c

index 3cf79e55e3129d82e00f977b845602feaa2c0d20..c0dbbd3b2306541ac84c698a3f1a2dbd38fc369a 100644 (file)
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/platform_profile.h>
+#include <linux/platform_device.h>
 #include <linux/slab.h>
 
 #include "dell-smbios.h"
 
+static struct platform_device *platform_device;
+
 static const struct dmi_system_id dell_device_table[] __initconst = {
        {
                .ident = "Dell Inc.",
@@ -244,9 +247,15 @@ static int thermal_init(void)
        if (!supported_modes)
                return 0;
 
-       thermal_handler = kzalloc(sizeof(*thermal_handler), GFP_KERNEL);
-       if (!thermal_handler)
-               return -ENOMEM;
+       platform_device = platform_device_register_simple("dell-pc", PLATFORM_DEVID_NONE, NULL, 0);
+       if (IS_ERR(platform_device))
+               return PTR_ERR(platform_device);
+
+       thermal_handler = devm_kzalloc(&platform_device->dev, sizeof(*thermal_handler), GFP_KERNEL);
+       if (!thermal_handler) {
+               ret = -ENOMEM;
+               goto cleanup_platform_device;
+       }
        thermal_handler->name = "dell-pc";
        thermal_handler->profile_get = thermal_platform_profile_get;
        thermal_handler->profile_set = thermal_platform_profile_set;
@@ -262,20 +271,25 @@ static int thermal_init(void)
 
        /* Clean up if failed */
        ret = platform_profile_register(thermal_handler);
-       if (ret) {
-               kfree(thermal_handler);
-               thermal_handler = NULL;
-       }
+       if (ret)
+               goto cleanup_thermal_handler;
+
+       return 0;
+
+cleanup_thermal_handler:
+       thermal_handler = NULL;
+
+cleanup_platform_device:
+       platform_device_unregister(platform_device);
 
        return ret;
 }
 
 static void thermal_cleanup(void)
 {
-       if (thermal_handler) {
+       if (thermal_handler)
                platform_profile_remove();
-               kfree(thermal_handler);
-       }
+       platform_device_unregister(platform_device);
 }
 
 static int __init dell_init(void)