diff options
Diffstat (limited to 'arch/arm/mach-ux500/cpu-db8500.c')
-rw-r--r-- | arch/arm/mach-ux500/cpu-db8500.c | 76 |
1 files changed, 72 insertions, 4 deletions
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 1748fbc58530..516126cb357d 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -12,21 +12,21 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/device.h> | 13 | #include <linux/device.h> |
14 | #include <linux/amba/bus.h> | 14 | #include <linux/amba/bus.h> |
15 | #include <linux/interrupt.h> | ||
15 | #include <linux/irq.h> | 16 | #include <linux/irq.h> |
16 | #include <linux/gpio.h> | 17 | #include <linux/gpio.h> |
17 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
18 | #include <linux/io.h> | 19 | #include <linux/io.h> |
19 | 20 | ||
20 | #include <asm/mach/map.h> | 21 | #include <asm/mach/map.h> |
22 | #include <asm/pmu.h> | ||
21 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
22 | #include <mach/setup.h> | 24 | #include <mach/setup.h> |
23 | #include <mach/devices.h> | 25 | #include <mach/devices.h> |
26 | #include <mach/usb.h> | ||
24 | 27 | ||
25 | #include "devices-db8500.h" | 28 | #include "devices-db8500.h" |
26 | 29 | #include "ste-dma40-db8500.h" | |
27 | static struct platform_device *platform_devs[] __initdata = { | ||
28 | &u8500_dma40_device, | ||
29 | }; | ||
30 | 30 | ||
31 | /* minimum static i/o mapping required to boot U8500 platforms */ | 31 | /* minimum static i/o mapping required to boot U8500 platforms */ |
32 | static struct map_desc u8500_uart_io_desc[] __initdata = { | 32 | static struct map_desc u8500_uart_io_desc[] __initdata = { |
@@ -89,6 +89,51 @@ void __init u8500_map_io(void) | |||
89 | iotable_init(u8500_v2_io_desc, ARRAY_SIZE(u8500_v2_io_desc)); | 89 | iotable_init(u8500_v2_io_desc, ARRAY_SIZE(u8500_v2_io_desc)); |
90 | } | 90 | } |
91 | 91 | ||
92 | static struct resource db8500_pmu_resources[] = { | ||
93 | [0] = { | ||
94 | .start = IRQ_DB8500_PMU, | ||
95 | .end = IRQ_DB8500_PMU, | ||
96 | .flags = IORESOURCE_IRQ, | ||
97 | }, | ||
98 | }; | ||
99 | |||
100 | /* | ||
101 | * The PMU IRQ lines of two cores are wired together into a single interrupt. | ||
102 | * Bounce the interrupt to the other core if it's not ours. | ||
103 | */ | ||
104 | static irqreturn_t db8500_pmu_handler(int irq, void *dev, irq_handler_t handler) | ||
105 | { | ||
106 | irqreturn_t ret = handler(irq, dev); | ||
107 | int other = !smp_processor_id(); | ||
108 | |||
109 | if (ret == IRQ_NONE && cpu_online(other)) | ||
110 | irq_set_affinity(irq, cpumask_of(other)); | ||
111 | |||
112 | /* | ||
113 | * We should be able to get away with the amount of IRQ_NONEs we give, | ||
114 | * while still having the spurious IRQ detection code kick in if the | ||
115 | * interrupt really starts hitting spuriously. | ||
116 | */ | ||
117 | return ret; | ||
118 | } | ||
119 | |||
120 | static struct arm_pmu_platdata db8500_pmu_platdata = { | ||
121 | .handle_irq = db8500_pmu_handler, | ||
122 | }; | ||
123 | |||
124 | static struct platform_device db8500_pmu_device = { | ||
125 | .name = "arm-pmu", | ||
126 | .id = ARM_PMU_DEVICE_CPU, | ||
127 | .num_resources = ARRAY_SIZE(db8500_pmu_resources), | ||
128 | .resource = db8500_pmu_resources, | ||
129 | .dev.platform_data = &db8500_pmu_platdata, | ||
130 | }; | ||
131 | |||
132 | static struct platform_device *platform_devs[] __initdata = { | ||
133 | &u8500_dma40_device, | ||
134 | &db8500_pmu_device, | ||
135 | }; | ||
136 | |||
92 | static resource_size_t __initdata db8500_gpio_base[] = { | 137 | static resource_size_t __initdata db8500_gpio_base[] = { |
93 | U8500_GPIOBANK0_BASE, | 138 | U8500_GPIOBANK0_BASE, |
94 | U8500_GPIOBANK1_BASE, | 139 | U8500_GPIOBANK1_BASE, |
@@ -111,6 +156,28 @@ static void __init db8500_add_gpios(void) | |||
111 | IRQ_DB8500_GPIO0, &pdata); | 156 | IRQ_DB8500_GPIO0, &pdata); |
112 | } | 157 | } |
113 | 158 | ||
159 | static int usb_db8500_rx_dma_cfg[] = { | ||
160 | DB8500_DMA_DEV38_USB_OTG_IEP_1_9, | ||
161 | DB8500_DMA_DEV37_USB_OTG_IEP_2_10, | ||
162 | DB8500_DMA_DEV36_USB_OTG_IEP_3_11, | ||
163 | DB8500_DMA_DEV19_USB_OTG_IEP_4_12, | ||
164 | DB8500_DMA_DEV18_USB_OTG_IEP_5_13, | ||
165 | DB8500_DMA_DEV17_USB_OTG_IEP_6_14, | ||
166 | DB8500_DMA_DEV16_USB_OTG_IEP_7_15, | ||
167 | DB8500_DMA_DEV39_USB_OTG_IEP_8 | ||
168 | }; | ||
169 | |||
170 | static int usb_db8500_tx_dma_cfg[] = { | ||
171 | DB8500_DMA_DEV38_USB_OTG_OEP_1_9, | ||
172 | DB8500_DMA_DEV37_USB_OTG_OEP_2_10, | ||
173 | DB8500_DMA_DEV36_USB_OTG_OEP_3_11, | ||
174 | DB8500_DMA_DEV19_USB_OTG_OEP_4_12, | ||
175 | DB8500_DMA_DEV18_USB_OTG_OEP_5_13, | ||
176 | DB8500_DMA_DEV17_USB_OTG_OEP_6_14, | ||
177 | DB8500_DMA_DEV16_USB_OTG_OEP_7_15, | ||
178 | DB8500_DMA_DEV39_USB_OTG_OEP_8 | ||
179 | }; | ||
180 | |||
114 | /* | 181 | /* |
115 | * This function is called from the board init | 182 | * This function is called from the board init |
116 | */ | 183 | */ |
@@ -121,6 +188,7 @@ void __init u8500_init_devices(void) | |||
121 | 188 | ||
122 | db8500_add_rtc(); | 189 | db8500_add_rtc(); |
123 | db8500_add_gpios(); | 190 | db8500_add_gpios(); |
191 | db8500_add_usb(usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); | ||
124 | 192 | ||
125 | platform_device_register_simple("cpufreq-u8500", -1, NULL, 0); | 193 | platform_device_register_simple("cpufreq-u8500", -1, NULL, 0); |
126 | platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); | 194 | platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); |