diff options
author | Shannon Zhao <shannon.zhao@linaro.org> | 2016-04-07 14:03:24 +0200 |
---|---|---|
committer | David Vrabel <david.vrabel@citrix.com> | 2016-07-06 11:34:43 +0200 |
commit | 5789afeb0efb4b4eb914ee10c12b597044cf1d22 (patch) | |
tree | c3e110218b791b30469e4d2c15465b1c1296c4d0 /drivers/xen/arm-device.c | |
parent | Xen: ARM: Add support for mapping platform device mmio (diff) | |
download | linux-5789afeb0efb4b4eb914ee10c12b597044cf1d22.tar.xz linux-5789afeb0efb4b4eb914ee10c12b597044cf1d22.zip |
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/arm-device.c')
-rw-r--r-- | drivers/xen/arm-device.c | 43 |
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 |