diff options
Diffstat (limited to 'arch/arm/mach-orion5x/common.c')
-rw-r--r-- | arch/arm/mach-orion5x/common.c | 307 |
1 files changed, 172 insertions, 135 deletions
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 4f13fd037f04..faf4e3211918 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -39,25 +39,22 @@ static struct map_desc orion5x_io_desc[] __initdata = { | |||
39 | .virtual = ORION5X_REGS_VIRT_BASE, | 39 | .virtual = ORION5X_REGS_VIRT_BASE, |
40 | .pfn = __phys_to_pfn(ORION5X_REGS_PHYS_BASE), | 40 | .pfn = __phys_to_pfn(ORION5X_REGS_PHYS_BASE), |
41 | .length = ORION5X_REGS_SIZE, | 41 | .length = ORION5X_REGS_SIZE, |
42 | .type = MT_DEVICE | 42 | .type = MT_DEVICE, |
43 | }, | 43 | }, { |
44 | { | ||
45 | .virtual = ORION5X_PCIE_IO_VIRT_BASE, | 44 | .virtual = ORION5X_PCIE_IO_VIRT_BASE, |
46 | .pfn = __phys_to_pfn(ORION5X_PCIE_IO_PHYS_BASE), | 45 | .pfn = __phys_to_pfn(ORION5X_PCIE_IO_PHYS_BASE), |
47 | .length = ORION5X_PCIE_IO_SIZE, | 46 | .length = ORION5X_PCIE_IO_SIZE, |
48 | .type = MT_DEVICE | 47 | .type = MT_DEVICE, |
49 | }, | 48 | }, { |
50 | { | ||
51 | .virtual = ORION5X_PCI_IO_VIRT_BASE, | 49 | .virtual = ORION5X_PCI_IO_VIRT_BASE, |
52 | .pfn = __phys_to_pfn(ORION5X_PCI_IO_PHYS_BASE), | 50 | .pfn = __phys_to_pfn(ORION5X_PCI_IO_PHYS_BASE), |
53 | .length = ORION5X_PCI_IO_SIZE, | 51 | .length = ORION5X_PCI_IO_SIZE, |
54 | .type = MT_DEVICE | 52 | .type = MT_DEVICE, |
55 | }, | 53 | }, { |
56 | { | ||
57 | .virtual = ORION5X_PCIE_WA_VIRT_BASE, | 54 | .virtual = ORION5X_PCIE_WA_VIRT_BASE, |
58 | .pfn = __phys_to_pfn(ORION5X_PCIE_WA_PHYS_BASE), | 55 | .pfn = __phys_to_pfn(ORION5X_PCIE_WA_PHYS_BASE), |
59 | .length = ORION5X_PCIE_WA_SIZE, | 56 | .length = ORION5X_PCIE_WA_SIZE, |
60 | .type = MT_DEVICE | 57 | .type = MT_DEVICE, |
61 | }, | 58 | }, |
62 | }; | 59 | }; |
63 | 60 | ||
@@ -66,101 +63,32 @@ void __init orion5x_map_io(void) | |||
66 | iotable_init(orion5x_io_desc, ARRAY_SIZE(orion5x_io_desc)); | 63 | iotable_init(orion5x_io_desc, ARRAY_SIZE(orion5x_io_desc)); |
67 | } | 64 | } |
68 | 65 | ||
66 | |||
69 | /***************************************************************************** | 67 | /***************************************************************************** |
70 | * UART | 68 | * EHCI |
71 | ****************************************************************************/ | 69 | ****************************************************************************/ |
72 | 70 | static struct orion_ehci_data orion5x_ehci_data = { | |
73 | static struct resource orion5x_uart_resources[] = { | 71 | .dram = &orion5x_mbus_dram_info, |
74 | { | ||
75 | .start = UART0_PHYS_BASE, | ||
76 | .end = UART0_PHYS_BASE + 0xff, | ||
77 | .flags = IORESOURCE_MEM, | ||
78 | }, | ||
79 | { | ||
80 | .start = IRQ_ORION5X_UART0, | ||
81 | .end = IRQ_ORION5X_UART0, | ||
82 | .flags = IORESOURCE_IRQ, | ||
83 | }, | ||
84 | { | ||
85 | .start = UART1_PHYS_BASE, | ||
86 | .end = UART1_PHYS_BASE + 0xff, | ||
87 | .flags = IORESOURCE_MEM, | ||
88 | }, | ||
89 | { | ||
90 | .start = IRQ_ORION5X_UART1, | ||
91 | .end = IRQ_ORION5X_UART1, | ||
92 | .flags = IORESOURCE_IRQ, | ||
93 | }, | ||
94 | }; | ||
95 | |||
96 | static struct plat_serial8250_port orion5x_uart_data[] = { | ||
97 | { | ||
98 | .mapbase = UART0_PHYS_BASE, | ||
99 | .membase = (char *)UART0_VIRT_BASE, | ||
100 | .irq = IRQ_ORION5X_UART0, | ||
101 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | ||
102 | .iotype = UPIO_MEM, | ||
103 | .regshift = 2, | ||
104 | .uartclk = ORION5X_TCLK, | ||
105 | }, | ||
106 | { | ||
107 | .mapbase = UART1_PHYS_BASE, | ||
108 | .membase = (char *)UART1_VIRT_BASE, | ||
109 | .irq = IRQ_ORION5X_UART1, | ||
110 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | ||
111 | .iotype = UPIO_MEM, | ||
112 | .regshift = 2, | ||
113 | .uartclk = ORION5X_TCLK, | ||
114 | }, | ||
115 | { }, | ||
116 | }; | 72 | }; |
117 | 73 | ||
118 | static struct platform_device orion5x_uart = { | 74 | static u64 ehci_dmamask = 0xffffffffUL; |
119 | .name = "serial8250", | ||
120 | .id = PLAT8250_DEV_PLATFORM, | ||
121 | .dev = { | ||
122 | .platform_data = orion5x_uart_data, | ||
123 | }, | ||
124 | .resource = orion5x_uart_resources, | ||
125 | .num_resources = ARRAY_SIZE(orion5x_uart_resources), | ||
126 | }; | ||
127 | 75 | ||
128 | /******************************************************************************* | ||
129 | * USB Controller - 2 interfaces | ||
130 | ******************************************************************************/ | ||
131 | 76 | ||
77 | /***************************************************************************** | ||
78 | * EHCI0 | ||
79 | ****************************************************************************/ | ||
132 | static struct resource orion5x_ehci0_resources[] = { | 80 | static struct resource orion5x_ehci0_resources[] = { |
133 | { | 81 | { |
134 | .start = ORION5X_USB0_PHYS_BASE, | 82 | .start = ORION5X_USB0_PHYS_BASE, |
135 | .end = ORION5X_USB0_PHYS_BASE + SZ_4K - 1, | 83 | .end = ORION5X_USB0_PHYS_BASE + SZ_4K - 1, |
136 | .flags = IORESOURCE_MEM, | 84 | .flags = IORESOURCE_MEM, |
137 | }, | 85 | }, { |
138 | { | ||
139 | .start = IRQ_ORION5X_USB0_CTRL, | 86 | .start = IRQ_ORION5X_USB0_CTRL, |
140 | .end = IRQ_ORION5X_USB0_CTRL, | 87 | .end = IRQ_ORION5X_USB0_CTRL, |
141 | .flags = IORESOURCE_IRQ, | 88 | .flags = IORESOURCE_IRQ, |
142 | }, | 89 | }, |
143 | }; | 90 | }; |
144 | 91 | ||
145 | static struct resource orion5x_ehci1_resources[] = { | ||
146 | { | ||
147 | .start = ORION5X_USB1_PHYS_BASE, | ||
148 | .end = ORION5X_USB1_PHYS_BASE + SZ_4K - 1, | ||
149 | .flags = IORESOURCE_MEM, | ||
150 | }, | ||
151 | { | ||
152 | .start = IRQ_ORION5X_USB1_CTRL, | ||
153 | .end = IRQ_ORION5X_USB1_CTRL, | ||
154 | .flags = IORESOURCE_IRQ, | ||
155 | }, | ||
156 | }; | ||
157 | |||
158 | static struct orion_ehci_data orion5x_ehci_data = { | ||
159 | .dram = &orion5x_mbus_dram_info, | ||
160 | }; | ||
161 | |||
162 | static u64 ehci_dmamask = 0xffffffffUL; | ||
163 | |||
164 | static struct platform_device orion5x_ehci0 = { | 92 | static struct platform_device orion5x_ehci0 = { |
165 | .name = "orion-ehci", | 93 | .name = "orion-ehci", |
166 | .id = 0, | 94 | .id = 0, |
@@ -173,6 +101,27 @@ static struct platform_device orion5x_ehci0 = { | |||
173 | .num_resources = ARRAY_SIZE(orion5x_ehci0_resources), | 101 | .num_resources = ARRAY_SIZE(orion5x_ehci0_resources), |
174 | }; | 102 | }; |
175 | 103 | ||
104 | void __init orion5x_ehci0_init(void) | ||
105 | { | ||
106 | platform_device_register(&orion5x_ehci0); | ||
107 | } | ||
108 | |||
109 | |||
110 | /***************************************************************************** | ||
111 | * EHCI1 | ||
112 | ****************************************************************************/ | ||
113 | static struct resource orion5x_ehci1_resources[] = { | ||
114 | { | ||
115 | .start = ORION5X_USB1_PHYS_BASE, | ||
116 | .end = ORION5X_USB1_PHYS_BASE + SZ_4K - 1, | ||
117 | .flags = IORESOURCE_MEM, | ||
118 | }, { | ||
119 | .start = IRQ_ORION5X_USB1_CTRL, | ||
120 | .end = IRQ_ORION5X_USB1_CTRL, | ||
121 | .flags = IORESOURCE_IRQ, | ||
122 | }, | ||
123 | }; | ||
124 | |||
176 | static struct platform_device orion5x_ehci1 = { | 125 | static struct platform_device orion5x_ehci1 = { |
177 | .name = "orion-ehci", | 126 | .name = "orion-ehci", |
178 | .id = 1, | 127 | .id = 1, |
@@ -185,11 +134,15 @@ static struct platform_device orion5x_ehci1 = { | |||
185 | .num_resources = ARRAY_SIZE(orion5x_ehci1_resources), | 134 | .num_resources = ARRAY_SIZE(orion5x_ehci1_resources), |
186 | }; | 135 | }; |
187 | 136 | ||
137 | void __init orion5x_ehci1_init(void) | ||
138 | { | ||
139 | platform_device_register(&orion5x_ehci1); | ||
140 | } | ||
141 | |||
142 | |||
188 | /***************************************************************************** | 143 | /***************************************************************************** |
189 | * Gigabit Ethernet port | 144 | * GigE |
190 | * (The Orion and Discovery (MV643xx) families use the same Ethernet driver) | ||
191 | ****************************************************************************/ | 145 | ****************************************************************************/ |
192 | |||
193 | struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = { | 146 | struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = { |
194 | .dram = &orion5x_mbus_dram_info, | 147 | .dram = &orion5x_mbus_dram_info, |
195 | .t_clk = ORION5X_TCLK, | 148 | .t_clk = ORION5X_TCLK, |
@@ -219,7 +172,7 @@ static struct resource orion5x_eth_resources[] = { | |||
219 | .start = IRQ_ORION5X_ETH_SUM, | 172 | .start = IRQ_ORION5X_ETH_SUM, |
220 | .end = IRQ_ORION5X_ETH_SUM, | 173 | .end = IRQ_ORION5X_ETH_SUM, |
221 | .flags = IORESOURCE_IRQ, | 174 | .flags = IORESOURCE_IRQ, |
222 | } | 175 | }, |
223 | }; | 176 | }; |
224 | 177 | ||
225 | static struct platform_device orion5x_eth = { | 178 | static struct platform_device orion5x_eth = { |
@@ -238,11 +191,10 @@ void __init orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data) | |||
238 | platform_device_register(&orion5x_eth); | 191 | platform_device_register(&orion5x_eth); |
239 | } | 192 | } |
240 | 193 | ||
194 | |||
241 | /***************************************************************************** | 195 | /***************************************************************************** |
242 | * I2C controller | 196 | * I2C |
243 | * (The Orion and Discovery (MV643xx) families share the same I2C controller) | ||
244 | ****************************************************************************/ | 197 | ****************************************************************************/ |
245 | |||
246 | static struct mv64xxx_i2c_pdata orion5x_i2c_pdata = { | 198 | static struct mv64xxx_i2c_pdata orion5x_i2c_pdata = { |
247 | .freq_m = 8, /* assumes 166 MHz TCLK */ | 199 | .freq_m = 8, /* assumes 166 MHz TCLK */ |
248 | .freq_n = 3, | 200 | .freq_n = 3, |
@@ -251,16 +203,15 @@ static struct mv64xxx_i2c_pdata orion5x_i2c_pdata = { | |||
251 | 203 | ||
252 | static struct resource orion5x_i2c_resources[] = { | 204 | static struct resource orion5x_i2c_resources[] = { |
253 | { | 205 | { |
254 | .name = "i2c base", | 206 | .name = "i2c base", |
255 | .start = I2C_PHYS_BASE, | 207 | .start = I2C_PHYS_BASE, |
256 | .end = I2C_PHYS_BASE + 0x20 -1, | 208 | .end = I2C_PHYS_BASE + 0x1f, |
257 | .flags = IORESOURCE_MEM, | 209 | .flags = IORESOURCE_MEM, |
258 | }, | 210 | }, { |
259 | { | 211 | .name = "i2c irq", |
260 | .name = "i2c irq", | 212 | .start = IRQ_ORION5X_I2C, |
261 | .start = IRQ_ORION5X_I2C, | 213 | .end = IRQ_ORION5X_I2C, |
262 | .end = IRQ_ORION5X_I2C, | 214 | .flags = IORESOURCE_IRQ, |
263 | .flags = IORESOURCE_IRQ, | ||
264 | }, | 215 | }, |
265 | }; | 216 | }; |
266 | 217 | ||
@@ -270,36 +221,41 @@ static struct platform_device orion5x_i2c = { | |||
270 | .num_resources = ARRAY_SIZE(orion5x_i2c_resources), | 221 | .num_resources = ARRAY_SIZE(orion5x_i2c_resources), |
271 | .resource = orion5x_i2c_resources, | 222 | .resource = orion5x_i2c_resources, |
272 | .dev = { | 223 | .dev = { |
273 | .platform_data = &orion5x_i2c_pdata, | 224 | .platform_data = &orion5x_i2c_pdata, |
274 | }, | 225 | }, |
275 | }; | 226 | }; |
276 | 227 | ||
228 | void __init orion5x_i2c_init(void) | ||
229 | { | ||
230 | platform_device_register(&orion5x_i2c); | ||
231 | } | ||
232 | |||
233 | |||
277 | /***************************************************************************** | 234 | /***************************************************************************** |
278 | * Sata port | 235 | * SATA |
279 | ****************************************************************************/ | 236 | ****************************************************************************/ |
280 | static struct resource orion5x_sata_resources[] = { | 237 | static struct resource orion5x_sata_resources[] = { |
281 | { | ||
282 | .name = "sata base", | ||
283 | .start = ORION5X_SATA_PHYS_BASE, | ||
284 | .end = ORION5X_SATA_PHYS_BASE + 0x5000 - 1, | ||
285 | .flags = IORESOURCE_MEM, | ||
286 | }, | ||
287 | { | 238 | { |
288 | .name = "sata irq", | 239 | .name = "sata base", |
289 | .start = IRQ_ORION5X_SATA, | 240 | .start = ORION5X_SATA_PHYS_BASE, |
290 | .end = IRQ_ORION5X_SATA, | 241 | .end = ORION5X_SATA_PHYS_BASE + 0x5000 - 1, |
291 | .flags = IORESOURCE_IRQ, | 242 | .flags = IORESOURCE_MEM, |
292 | }, | 243 | }, { |
244 | .name = "sata irq", | ||
245 | .start = IRQ_ORION5X_SATA, | ||
246 | .end = IRQ_ORION5X_SATA, | ||
247 | .flags = IORESOURCE_IRQ, | ||
248 | }, | ||
293 | }; | 249 | }; |
294 | 250 | ||
295 | static struct platform_device orion5x_sata = { | 251 | static struct platform_device orion5x_sata = { |
296 | .name = "sata_mv", | 252 | .name = "sata_mv", |
297 | .id = 0, | 253 | .id = 0, |
298 | .dev = { | 254 | .dev = { |
299 | .coherent_dma_mask = 0xffffffff, | 255 | .coherent_dma_mask = 0xffffffff, |
300 | }, | 256 | }, |
301 | .num_resources = ARRAY_SIZE(orion5x_sata_resources), | 257 | .num_resources = ARRAY_SIZE(orion5x_sata_resources), |
302 | .resource = orion5x_sata_resources, | 258 | .resource = orion5x_sata_resources, |
303 | }; | 259 | }; |
304 | 260 | ||
305 | void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data) | 261 | void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data) |
@@ -309,23 +265,111 @@ void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data) | |||
309 | platform_device_register(&orion5x_sata); | 265 | platform_device_register(&orion5x_sata); |
310 | } | 266 | } |
311 | 267 | ||
268 | |||
312 | /***************************************************************************** | 269 | /***************************************************************************** |
313 | * Time handling | 270 | * UART0 |
271 | ****************************************************************************/ | ||
272 | static struct plat_serial8250_port orion5x_uart0_data[] = { | ||
273 | { | ||
274 | .mapbase = UART0_PHYS_BASE, | ||
275 | .membase = (char *)UART0_VIRT_BASE, | ||
276 | .irq = IRQ_ORION5X_UART0, | ||
277 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | ||
278 | .iotype = UPIO_MEM, | ||
279 | .regshift = 2, | ||
280 | .uartclk = ORION5X_TCLK, | ||
281 | }, { | ||
282 | }, | ||
283 | }; | ||
284 | |||
285 | static struct resource orion5x_uart0_resources[] = { | ||
286 | { | ||
287 | .start = UART0_PHYS_BASE, | ||
288 | .end = UART0_PHYS_BASE + 0xff, | ||
289 | .flags = IORESOURCE_MEM, | ||
290 | }, { | ||
291 | .start = IRQ_ORION5X_UART0, | ||
292 | .end = IRQ_ORION5X_UART0, | ||
293 | .flags = IORESOURCE_IRQ, | ||
294 | }, | ||
295 | }; | ||
296 | |||
297 | static struct platform_device orion5x_uart0 = { | ||
298 | .name = "serial8250", | ||
299 | .id = PLAT8250_DEV_PLATFORM, | ||
300 | .dev = { | ||
301 | .platform_data = orion5x_uart0_data, | ||
302 | }, | ||
303 | .resource = orion5x_uart0_resources, | ||
304 | .num_resources = ARRAY_SIZE(orion5x_uart0_resources), | ||
305 | }; | ||
306 | |||
307 | void __init orion5x_uart0_init(void) | ||
308 | { | ||
309 | platform_device_register(&orion5x_uart0); | ||
310 | } | ||
311 | |||
312 | |||
313 | /***************************************************************************** | ||
314 | * UART1 | ||
314 | ****************************************************************************/ | 315 | ****************************************************************************/ |
316 | static struct plat_serial8250_port orion5x_uart1_data[] = { | ||
317 | { | ||
318 | .mapbase = UART1_PHYS_BASE, | ||
319 | .membase = (char *)UART1_VIRT_BASE, | ||
320 | .irq = IRQ_ORION5X_UART1, | ||
321 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | ||
322 | .iotype = UPIO_MEM, | ||
323 | .regshift = 2, | ||
324 | .uartclk = ORION5X_TCLK, | ||
325 | }, { | ||
326 | }, | ||
327 | }; | ||
328 | |||
329 | static struct resource orion5x_uart1_resources[] = { | ||
330 | { | ||
331 | .start = UART1_PHYS_BASE, | ||
332 | .end = UART1_PHYS_BASE + 0xff, | ||
333 | .flags = IORESOURCE_MEM, | ||
334 | }, { | ||
335 | .start = IRQ_ORION5X_UART1, | ||
336 | .end = IRQ_ORION5X_UART1, | ||
337 | .flags = IORESOURCE_IRQ, | ||
338 | }, | ||
339 | }; | ||
340 | |||
341 | static struct platform_device orion5x_uart1 = { | ||
342 | .name = "serial8250", | ||
343 | .id = PLAT8250_DEV_PLATFORM1, | ||
344 | .dev = { | ||
345 | .platform_data = orion5x_uart1_data, | ||
346 | }, | ||
347 | .resource = orion5x_uart1_resources, | ||
348 | .num_resources = ARRAY_SIZE(orion5x_uart1_resources), | ||
349 | }; | ||
350 | |||
351 | void __init orion5x_uart1_init(void) | ||
352 | { | ||
353 | platform_device_register(&orion5x_uart1); | ||
354 | } | ||
355 | |||
315 | 356 | ||
357 | /***************************************************************************** | ||
358 | * Time handling | ||
359 | ****************************************************************************/ | ||
316 | static void orion5x_timer_init(void) | 360 | static void orion5x_timer_init(void) |
317 | { | 361 | { |
318 | orion_time_init(IRQ_ORION5X_BRIDGE, ORION5X_TCLK); | 362 | orion_time_init(IRQ_ORION5X_BRIDGE, ORION5X_TCLK); |
319 | } | 363 | } |
320 | 364 | ||
321 | struct sys_timer orion5x_timer = { | 365 | struct sys_timer orion5x_timer = { |
322 | .init = orion5x_timer_init, | 366 | .init = orion5x_timer_init, |
323 | }; | 367 | }; |
324 | 368 | ||
369 | |||
325 | /***************************************************************************** | 370 | /***************************************************************************** |
326 | * General | 371 | * General |
327 | ****************************************************************************/ | 372 | ****************************************************************************/ |
328 | |||
329 | /* | 373 | /* |
330 | * Identify device ID and rev from PCIe configuration header space '0'. | 374 | * Identify device ID and rev from PCIe configuration header space '0'. |
331 | */ | 375 | */ |
@@ -350,8 +394,10 @@ static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) | |||
350 | } else if (*dev == MV88F5181_DEV_ID) { | 394 | } else if (*dev == MV88F5181_DEV_ID) { |
351 | if (*rev == MV88F5181_REV_B1) { | 395 | if (*rev == MV88F5181_REV_B1) { |
352 | *dev_name = "MV88F5181-Rev-B1"; | 396 | *dev_name = "MV88F5181-Rev-B1"; |
397 | } else if (*rev == MV88F5181L_REV_A1) { | ||
398 | *dev_name = "MV88F5181L-Rev-A1"; | ||
353 | } else { | 399 | } else { |
354 | *dev_name = "MV88F5181-Rev-Unsupported"; | 400 | *dev_name = "MV88F5181(L)-Rev-Unsupported"; |
355 | } | 401 | } |
356 | } else { | 402 | } else { |
357 | *dev_name = "Device-Unknown"; | 403 | *dev_name = "Device-Unknown"; |
@@ -370,15 +416,6 @@ void __init orion5x_init(void) | |||
370 | * Setup Orion address map | 416 | * Setup Orion address map |
371 | */ | 417 | */ |
372 | orion5x_setup_cpu_mbus_bridge(); | 418 | orion5x_setup_cpu_mbus_bridge(); |
373 | |||
374 | /* | ||
375 | * Register devices. | ||
376 | */ | ||
377 | platform_device_register(&orion5x_uart); | ||
378 | platform_device_register(&orion5x_ehci0); | ||
379 | if (dev == MV88F5182_DEV_ID) | ||
380 | platform_device_register(&orion5x_ehci1); | ||
381 | platform_device_register(&orion5x_i2c); | ||
382 | } | 419 | } |
383 | 420 | ||
384 | /* | 421 | /* |