Skip to content
Snippets Groups Projects
Commit 44577f1d authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

platform/x86: intel_pmc_core: do not create a static struct device


A struct device is a dynamic structure, with reference counting.
"Tricking" the kernel to make a dynamic structure static, by working
around the driver core release detection logic, is not nice.

Because of this, this code has been used as an example for others on
"how to do things", which is just about the worst thing possible to have
happen.

Fix this all up by making the platform device dynamic and providing a
real release function.

Fixes: b02f6a2e ("platform/x86: intel_pmc_core: Attach using APCI HID "INT33A1"")
Cc: Rajneesh Bhardwaj <rajneesh.bhardwaj@intel.com>
Cc: Vishwanath Somayaji <vishwanath.somayaji@intel.com>
Cc: Darren Hart <dvhart@infradead.org>
Cc: Andy Shevchenko <andy@infradead.org>
Reported-by: default avatarMaximilian Luz <luzmaximilian@gmail.com>
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Acked-by: default avatarRajat Jain <rajatja@google.com>
Link: https://lore.kernel.org/r/20200923184803.192265-1-gregkh@linuxfoundation.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6284a6e8
No related branches found
No related tags found
No related merge requests found
......@@ -20,15 +20,10 @@
static void intel_pmc_core_release(struct device *dev)
{
/* Nothing to do. */
kfree(dev);
}
static struct platform_device pmc_core_device = {
.name = "intel_pmc_core",
.dev = {
.release = intel_pmc_core_release,
},
};
static struct platform_device *pmc_core_device;
/*
* intel_pmc_core_platform_ids is the list of platforms where we want to
......@@ -52,6 +47,8 @@ MODULE_DEVICE_TABLE(x86cpu, intel_pmc_core_platform_ids);
static int __init pmc_core_platform_init(void)
{
int retval;
/* Skip creating the platform device if ACPI already has a device */
if (acpi_dev_present("INT33A1", NULL, -1))
return -ENODEV;
......@@ -59,12 +56,23 @@ static int __init pmc_core_platform_init(void)
if (!x86_match_cpu(intel_pmc_core_platform_ids))
return -ENODEV;
return platform_device_register(&pmc_core_device);
pmc_core_device = kzalloc(sizeof(*pmc_core_device), GFP_KERNEL);
if (!pmc_core_device)
return -ENOMEM;
pmc_core_device->name = "intel_pmc_core";
pmc_core_device->dev.release = intel_pmc_core_release;
retval = platform_device_register(pmc_core_device);
if (retval)
kfree(pmc_core_device);
return retval;
}
static void __exit pmc_core_platform_exit(void)
{
platform_device_unregister(&pmc_core_device);
platform_device_unregister(pmc_core_device);
}
module_init(pmc_core_platform_init);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment