On some architectures (e.g. arm64), it's preferable to use MMIO, since
this can be used standalone. Add MMIO support to the pvpanic driver.

Signed-off-by: Peng Hao <peng.h...@zte.com.cn>
---
 drivers/misc/pvpanic.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/drivers/misc/pvpanic.c b/drivers/misc/pvpanic.c
index c20fdff..c0b787e 100644
--- a/drivers/misc/pvpanic.c
+++ b/drivers/misc/pvpanic.c
@@ -28,7 +28,7 @@
 
 #define PVPANIC_PANICKED       (1 << 0)
 
-static u16 port;
+static void __iomem *base;
 
 static struct acpi_driver pvpanic_driver = {
        .name =         "pvpanic",
@@ -44,7 +44,7 @@
 static void
 pvpanic_send_event(unsigned int event)
 {
-       outb(event, port);
+       iowrite8(event, base);
 }
 
 static int
@@ -66,8 +66,14 @@
 {
        struct resource r;
 
-       if (acpi_dev_resource_io(res, &r) {
-               port = r.start;
+       if (acpi_dev_resource_io(res, &r) ||
+           acpi_dev_resource_memory(res, &r)) {
+               if (r.flags & IORESOURCE_IO)
+                       base = (void __iomem *) ioport_map(r.start,
+                                               r.end - r.start + 1);
+               else
+                       base = ioremap(r.start, r.end - r.start + 1);
+
                return AE_OK;
        }
 
@@ -89,7 +95,7 @@ static int pvpanic_add(struct acpi_device *device)
        acpi_walk_resources(device->handle, METHOD_NAME__CRS,
                            pvpanic_walk_resources, NULL);
 
-       if (!port)
+       if (!base)
                return -ENODEV;
 
        atomic_notifier_chain_register(&panic_notifier_list,
@@ -103,6 +109,8 @@ static int pvpanic_remove(struct acpi_device *device)
 
        atomic_notifier_chain_unregister(&panic_notifier_list,
                                         &pvpanic_panic_nb);
+
+       iounmap(base);
        return 0;
 }
 
-- 
1.8.3.1

Reply via email to