diff options
author | Shannon Zhao <shannon.zhao@linaro.org> | 2016-04-07 08:03:24 -0400 |
---|---|---|
committer | David Vrabel <david.vrabel@citrix.com> | 2016-07-06 05:34:43 -0400 |
commit | 5789afeb0efb4b4eb914ee10c12b597044cf1d22 (patch) | |
tree | c3e110218b791b30469e4d2c15465b1c1296c4d0 /drivers/xen/arm-device.c | |
parent | 4ba04bec3755b765bb10b21943afbee60c33288d (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/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) | |||
151 | } | 151 | } |
152 | 152 | ||
153 | arch_initcall(register_xen_platform_notifier); | 153 | arch_initcall(register_xen_platform_notifier); |
154 | |||
155 | #ifdef CONFIG_ARM_AMBA | ||
156 | #include <linux/amba/bus.h> | ||
157 | |||
158 | static int xen_amba_notifier(struct notifier_block *nb, | ||
159 | unsigned long action, void *data) | ||
160 | { | ||
161 | struct amba_device *adev = to_amba_device(data); | ||
162 | int r = 0; | ||
163 | |||
164 | switch (action) { | ||
165 | case BUS_NOTIFY_ADD_DEVICE: | ||
166 | r = xen_map_device_mmio(&adev->res, 1); | ||
167 | break; | ||
168 | case BUS_NOTIFY_DEL_DEVICE: | ||
169 | r = xen_unmap_device_mmio(&adev->res, 1); | ||
170 | break; | ||
171 | default: | ||
172 | return NOTIFY_DONE; | ||
173 | } | ||
174 | if (r) | ||
175 | dev_err(&adev->dev, "AMBA: Failed to %s device %s MMIO!\n", | ||
176 | action == BUS_NOTIFY_ADD_DEVICE ? "map" : | ||
177 | (action == BUS_NOTIFY_DEL_DEVICE ? "unmap" : "?"), | ||
178 | adev->dev.init_name); | ||
179 | |||
180 | return NOTIFY_OK; | ||
181 | } | ||
182 | |||
183 | static struct notifier_block amba_device_nb = { | ||
184 | .notifier_call = xen_amba_notifier, | ||
185 | }; | ||
186 | |||
187 | static int __init register_xen_amba_notifier(void) | ||
188 | { | ||
189 | if (!xen_initial_domain() || acpi_disabled) | ||
190 | return 0; | ||
191 | |||
192 | return bus_register_notifier(&amba_bustype, &amba_device_nb); | ||
193 | } | ||
194 | |||
195 | arch_initcall(register_xen_amba_notifier); | ||
196 | #endif | ||