By default, when ACPI tables and FDT coexist for ARM64, current kernel takes precedence over FDT to get device information. This patch increases the way to get information through FDT. Signed-off-by: Peng Hao <peng.hao2@xxxxxxxxxx> --- drivers/misc/pvpanic.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/drivers/misc/pvpanic.c b/drivers/misc/pvpanic.c index bcfefdd..e4b2b40 100644 --- a/drivers/misc/pvpanic.c +++ b/drivers/misc/pvpanic.c @@ -2,6 +2,7 @@ * pvpanic.c - pvpanic Device Support * * Copyright (C) 2013 Fujitsu. + * Copyright (C) 2018 ZTE. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +26,10 @@ #include <linux/init.h> #include <linux/types.h> #include <linux/acpi.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <asm/virt.h> +#include <linux/platform_device.h> MODULE_AUTHOR("Hu Tao <hutao@xxxxxxxxxxxxxx>"); MODULE_DESCRIPTION("pvpanic device driver"); @@ -78,6 +83,37 @@ .priority = 1, /* let this called before broken drm_fb_helper */ }; +static int pvpanic_mmio_probe(struct platform_device *pdev) +{ + struct resource *mem; + + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!mem) + return -EINVAL; + + if (!devm_request_mem_region(&pdev->dev, mem->start, + resource_size(mem), pdev->name)) + return -EBUSY; + + base = devm_ioremap(&pdev->dev, mem->start, + resource_size(mem)); + if (base == NULL) + return -EFAULT; + + atomic_notifier_chain_register(&panic_notifier_list, + &pvpanic_panic_nb); + + return 0; +} + +static int pvpanic_mmio_remove(struct platform_device *pdev) +{ + + atomic_notifier_chain_unregister(&panic_notifier_list, + &pvpanic_panic_nb); + + return 0; +} static acpi_status pvpanic_walk_resources(struct acpi_resource *res, void *context) @@ -135,4 +171,35 @@ static int pvpanic_remove(struct acpi_device *device) return 0; } -module_acpi_driver(pvpanic_driver); +static const struct of_device_id pvpanic_mmio_match[] = { + { .compatible = "qemu,pvpanic-mmio", }, + {}, +}; + +static struct platform_driver pvpanic_mmio_driver = { + .driver = { + .name = "pvpanic-mmio", + .of_match_table = pvpanic_mmio_match, + }, + .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 acpi_bus_register_driver(&pvpanic_driver); +} + +static void __exit pvpanic_mmio_exit(void) +{ + if (acpi_disabled) + platform_driver_unregister(&pvpanic_mmio_driver); + else + acpi_bus_unregister_driver(&pvpanic_driver); +} + +module_init(pvpanic_mmio_init); +module_exit(pvpanic_mmio_exit); -- 1.8.3.1