summaryrefslogtreecommitdiff
path: root/drivers/xen
diff options
context:
space:
mode:
authorShannon Zhao <shannon.zhao@linaro.org>2016-04-07 20:03:24 +0800
committerDavid Vrabel <david.vrabel@citrix.com>2016-07-06 10:34:43 +0100
commit5789afeb0efb4b4eb914ee10c12b597044cf1d22 (patch)
treec3e110218b791b30469e4d2c15465b1c1296c4d0 /drivers/xen
parent4ba04bec3755b765bb10b21943afbee60c33288d (diff)
Xen: ARM: Add support for mapping AMBA device mmio
Add a bus_notifier for AMBA bus device in order to map the device mmio regions when DOM0 booting with ACPI. Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Reviewed-by: Julien Grall <julien.grall@arm.com> Tested-by: Julien Grall <julien.grall@arm.com>
Diffstat (limited to 'drivers/xen')
-rw-r--r--drivers/xen/arm-device.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/xen/arm-device.c b/drivers/xen/arm-device.c
index b918e8ed5084..778acf80aacb 100644
--- a/drivers/xen/arm-device.c
+++ b/drivers/xen/arm-device.c
@@ -151,3 +151,46 @@ static int __init register_xen_platform_notifier(void)
}
arch_initcall(register_xen_platform_notifier);
+
+#ifdef CONFIG_ARM_AMBA
+#include <linux/amba/bus.h>
+
+static int xen_amba_notifier(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct amba_device *adev = to_amba_device(data);
+ int r = 0;
+
+ switch (action) {
+ case BUS_NOTIFY_ADD_DEVICE:
+ r = xen_map_device_mmio(&adev->res, 1);
+ break;
+ case BUS_NOTIFY_DEL_DEVICE:
+ r = xen_unmap_device_mmio(&adev->res, 1);
+ break;
+ default:
+ return NOTIFY_DONE;
+ }
+ if (r)
+ dev_err(&adev->dev, "AMBA: Failed to %s device %s MMIO!\n",
+ action == BUS_NOTIFY_ADD_DEVICE ? "map" :
+ (action == BUS_NOTIFY_DEL_DEVICE ? "unmap" : "?"),
+ adev->dev.init_name);
+
+ return NOTIFY_OK;
+}
+
+static struct notifier_block amba_device_nb = {
+ .notifier_call = xen_amba_notifier,
+};
+
+static int __init register_xen_amba_notifier(void)
+{
+ if (!xen_initial_domain() || acpi_disabled)
+ return 0;
+
+ return bus_register_notifier(&amba_bustype, &amba_device_nb);
+}
+
+arch_initcall(register_xen_amba_notifier);
+#endif