--- a/include/linux/amba/bus.h
+++ b/include/linux/amba/bus.h
@@ -94,4 +94,37 @@ void amba_release_regions(struct amba_device *);
 #define amba_manf(d)	AMBA_MANF_BITS((d)->periphid)
 #define amba_part(d)	AMBA_PART_BITS((d)->periphid)
 
+#define __AMBA_DEV(busid, data, mask)              \
+	{                           \
+		.coherent_dma_mask = mask,          \
+		.init_name = busid,             \
+		.platform_data = data,              \
+	}
+
+/*
+ * APB devices do not themselves have the ability to address memory,
+ * so DMA masks should be zero (much like USB peripheral devices.)
+ * The DMA controller DMA masks should be used instead (much like
+ * USB host controllers in conventional PCs.)
+ */
+#define AMBA_APB_DEVICE(name, busid, id, base, irqs, data) \
+struct amba_device name##_device = {               \
+	.dev = __AMBA_DEV(busid, data, 0),          \
+	.res = DEFINE_RES_MEM(base, SZ_4K),         \
+	.irq = irqs,                        \
+	.periphid = id,                     \
+}
+
+/*
+ * AHB devices are DMA capable, so set their DMA masks
+ */
+#define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data) \
+struct amba_device name##_device = {               \
+	.dev = __AMBA_DEV(busid, data, ~0ULL),          \
+	.res = DEFINE_RES_MEM(base, SZ_4K),         \
+	.dma_mask = ~0ULL,                  \
+	.irq = irqs,                        \
+	.periphid = id,                     \
+}
+
 #endif
diff --git a/include/linux/ata_platform.h b/include/linux/ata_platform.h
index 9a26c83..b38ab9c 100644
