|
@@ -151,3 +151,46 @@ static int __init register_xen_platform_notifier(void)
|
|
}
|
|
}
|
|
|
|
|
|
arch_initcall(register_xen_platform_notifier);
|
|
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
|