forked from Minki/linux
misc: pvpanic: Combine ACPI and platform drivers
There is nothing special in the driver that requires to have a special ACPI driver for it. Combine both into simple platform driver. Cc: Peng Hao <peng.hao2@zte.com.cn> Cc: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20201209203642.27648-4-andriy.shevchenko@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
ebee0cde19
commit
f104060813
@ -8,7 +8,7 @@
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/module.h>
|
||||
@ -49,101 +49,16 @@ static struct notifier_block pvpanic_panic_nb = {
|
||||
.priority = 1, /* let this called before broken drm_fb_helper */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static int pvpanic_add(struct acpi_device *device);
|
||||
static int pvpanic_remove(struct acpi_device *device);
|
||||
|
||||
static const struct acpi_device_id pvpanic_device_ids[] = {
|
||||
{ "QEMU0001", 0 },
|
||||
{ "", 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, pvpanic_device_ids);
|
||||
|
||||
static struct acpi_driver pvpanic_driver = {
|
||||
.name = "pvpanic",
|
||||
.class = "QEMU",
|
||||
.ids = pvpanic_device_ids,
|
||||
.ops = {
|
||||
.add = pvpanic_add,
|
||||
.remove = pvpanic_remove,
|
||||
},
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static acpi_status
|
||||
pvpanic_walk_resources(struct acpi_resource *res, void *context)
|
||||
{
|
||||
struct resource r;
|
||||
|
||||
if (acpi_dev_resource_io(res, &r)) {
|
||||
#ifdef CONFIG_HAS_IOPORT_MAP
|
||||
base = ioport_map(r.start, resource_size(&r));
|
||||
return AE_OK;
|
||||
#else
|
||||
return AE_ERROR;
|
||||
#endif
|
||||
} else if (acpi_dev_resource_memory(res, &r)) {
|
||||
base = ioremap(r.start, resource_size(&r));
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
return AE_ERROR;
|
||||
}
|
||||
|
||||
static int pvpanic_add(struct acpi_device *device)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = acpi_bus_get_status(device);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!device->status.enabled || !device->status.functional)
|
||||
return -ENODEV;
|
||||
|
||||
acpi_walk_resources(device->handle, METHOD_NAME__CRS,
|
||||
pvpanic_walk_resources, NULL);
|
||||
|
||||
if (!base)
|
||||
return -ENODEV;
|
||||
|
||||
atomic_notifier_chain_register(&panic_notifier_list,
|
||||
&pvpanic_panic_nb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pvpanic_remove(struct acpi_device *device)
|
||||
{
|
||||
|
||||
atomic_notifier_chain_unregister(&panic_notifier_list,
|
||||
&pvpanic_panic_nb);
|
||||
iounmap(base);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pvpanic_register_acpi_driver(void)
|
||||
{
|
||||
return acpi_bus_register_driver(&pvpanic_driver);
|
||||
}
|
||||
|
||||
static void pvpanic_unregister_acpi_driver(void)
|
||||
{
|
||||
acpi_bus_unregister_driver(&pvpanic_driver);
|
||||
}
|
||||
#else
|
||||
static int pvpanic_register_acpi_driver(void)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void pvpanic_unregister_acpi_driver(void) {}
|
||||
#endif
|
||||
|
||||
static int pvpanic_mmio_probe(struct platform_device *pdev)
|
||||
{
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
struct device *dev = &pdev->dev;
|
||||
struct resource *res;
|
||||
|
||||
res = platform_get_mem_or_io(pdev, 0);
|
||||
if (res && resource_type(res) == IORESOURCE_IO)
|
||||
base = devm_ioport_map(dev, res->start, resource_size(res));
|
||||
else
|
||||
base = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
|
||||
@ -167,30 +82,19 @@ static const struct of_device_id pvpanic_mmio_match[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct acpi_device_id pvpanic_device_ids[] = {
|
||||
{ "QEMU0001", 0 },
|
||||
{ "", 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, pvpanic_device_ids);
|
||||
|
||||
static struct platform_driver pvpanic_mmio_driver = {
|
||||
.driver = {
|
||||
.name = "pvpanic-mmio",
|
||||
.of_match_table = pvpanic_mmio_match,
|
||||
.acpi_match_table = pvpanic_device_ids,
|
||||
},
|
||||
.probe = pvpanic_mmio_probe,
|
||||
.remove = pvpanic_mmio_remove,
|
||||
};
|
||||
|
||||
static int __init pvpanic_mmio_init(void)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return platform_driver_register(&pvpanic_mmio_driver);
|
||||
else
|
||||
return pvpanic_register_acpi_driver();
|
||||
}
|
||||
|
||||
static void __exit pvpanic_mmio_exit(void)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
platform_driver_unregister(&pvpanic_mmio_driver);
|
||||
else
|
||||
pvpanic_unregister_acpi_driver();
|
||||
}
|
||||
|
||||
module_init(pvpanic_mmio_init);
|
||||
module_exit(pvpanic_mmio_exit);
|
||||
module_platform_driver(pvpanic_mmio_driver);
|
||||
|
Loading…
Reference in New Issue
Block a user