diff options
Diffstat (limited to 'arch/arm/mach-orion5x/common.c')
-rw-r--r-- | arch/arm/mach-orion5x/common.c | 74 |
1 files changed, 68 insertions, 6 deletions
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 7b11e552bc5a..9625ef5975d0 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/mv643xx_eth.h> | 18 | #include <linux/mv643xx_eth.h> |
19 | #include <linux/mv643xx_i2c.h> | 19 | #include <linux/mv643xx_i2c.h> |
20 | #include <linux/ata_platform.h> | 20 | #include <linux/ata_platform.h> |
21 | #include <linux/spi/orion_spi.h> | ||
21 | #include <asm/page.h> | 22 | #include <asm/page.h> |
22 | #include <asm/setup.h> | 23 | #include <asm/setup.h> |
23 | #include <asm/timex.h> | 24 | #include <asm/timex.h> |
@@ -146,7 +147,6 @@ void __init orion5x_ehci1_init(void) | |||
146 | ****************************************************************************/ | 147 | ****************************************************************************/ |
147 | struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = { | 148 | struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = { |
148 | .dram = &orion5x_mbus_dram_info, | 149 | .dram = &orion5x_mbus_dram_info, |
149 | .t_clk = ORION5X_TCLK, | ||
150 | }; | 150 | }; |
151 | 151 | ||
152 | static struct resource orion5x_eth_shared_resources[] = { | 152 | static struct resource orion5x_eth_shared_resources[] = { |
@@ -154,6 +154,10 @@ static struct resource orion5x_eth_shared_resources[] = { | |||
154 | .start = ORION5X_ETH_PHYS_BASE + 0x2000, | 154 | .start = ORION5X_ETH_PHYS_BASE + 0x2000, |
155 | .end = ORION5X_ETH_PHYS_BASE + 0x3fff, | 155 | .end = ORION5X_ETH_PHYS_BASE + 0x3fff, |
156 | .flags = IORESOURCE_MEM, | 156 | .flags = IORESOURCE_MEM, |
157 | }, { | ||
158 | .start = IRQ_ORION5X_ETH_ERR, | ||
159 | .end = IRQ_ORION5X_ETH_ERR, | ||
160 | .flags = IORESOURCE_IRQ, | ||
157 | }, | 161 | }, |
158 | }; | 162 | }; |
159 | 163 | ||
@@ -163,7 +167,7 @@ static struct platform_device orion5x_eth_shared = { | |||
163 | .dev = { | 167 | .dev = { |
164 | .platform_data = &orion5x_eth_shared_data, | 168 | .platform_data = &orion5x_eth_shared_data, |
165 | }, | 169 | }, |
166 | .num_resources = 1, | 170 | .num_resources = ARRAY_SIZE(orion5x_eth_shared_resources), |
167 | .resource = orion5x_eth_shared_resources, | 171 | .resource = orion5x_eth_shared_resources, |
168 | }; | 172 | }; |
169 | 173 | ||
@@ -268,6 +272,38 @@ void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data) | |||
268 | 272 | ||
269 | 273 | ||
270 | /***************************************************************************** | 274 | /***************************************************************************** |
275 | * SPI | ||
276 | ****************************************************************************/ | ||
277 | static struct orion_spi_info orion5x_spi_plat_data = { | ||
278 | .tclk = 0, | ||
279 | }; | ||
280 | |||
281 | static struct resource orion5x_spi_resources[] = { | ||
282 | { | ||
283 | .name = "spi base", | ||
284 | .start = SPI_PHYS_BASE, | ||
285 | .end = SPI_PHYS_BASE + 0x1f, | ||
286 | .flags = IORESOURCE_MEM, | ||
287 | }, | ||
288 | }; | ||
289 | |||
290 | static struct platform_device orion5x_spi = { | ||
291 | .name = "orion_spi", | ||
292 | .id = 0, | ||
293 | .dev = { | ||
294 | .platform_data = &orion5x_spi_plat_data, | ||
295 | }, | ||
296 | .num_resources = ARRAY_SIZE(orion5x_spi_resources), | ||
297 | .resource = orion5x_spi_resources, | ||
298 | }; | ||
299 | |||
300 | void __init orion5x_spi_init() | ||
301 | { | ||
302 | platform_device_register(&orion5x_spi); | ||
303 | } | ||
304 | |||
305 | |||
306 | /***************************************************************************** | ||
271 | * UART0 | 307 | * UART0 |
272 | ****************************************************************************/ | 308 | ****************************************************************************/ |
273 | static struct plat_serial8250_port orion5x_uart0_data[] = { | 309 | static struct plat_serial8250_port orion5x_uart0_data[] = { |
@@ -278,7 +314,7 @@ static struct plat_serial8250_port orion5x_uart0_data[] = { | |||
278 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | 314 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, |
279 | .iotype = UPIO_MEM, | 315 | .iotype = UPIO_MEM, |
280 | .regshift = 2, | 316 | .regshift = 2, |
281 | .uartclk = ORION5X_TCLK, | 317 | .uartclk = 0, |
282 | }, { | 318 | }, { |
283 | }, | 319 | }, |
284 | }; | 320 | }; |
@@ -322,7 +358,7 @@ static struct plat_serial8250_port orion5x_uart1_data[] = { | |||
322 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | 358 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, |
323 | .iotype = UPIO_MEM, | 359 | .iotype = UPIO_MEM, |
324 | .regshift = 2, | 360 | .regshift = 2, |
325 | .uartclk = ORION5X_TCLK, | 361 | .uartclk = 0, |
326 | }, { | 362 | }, { |
327 | }, | 363 | }, |
328 | }; | 364 | }; |
@@ -455,9 +491,24 @@ void __init orion5x_xor_init(void) | |||
455 | /***************************************************************************** | 491 | /***************************************************************************** |
456 | * Time handling | 492 | * Time handling |
457 | ****************************************************************************/ | 493 | ****************************************************************************/ |
494 | int orion5x_tclk; | ||
495 | |||
496 | int __init orion5x_find_tclk(void) | ||
497 | { | ||
498 | u32 dev, rev; | ||
499 | |||
500 | orion5x_pcie_id(&dev, &rev); | ||
501 | if (dev == MV88F6183_DEV_ID && | ||
502 | (readl(MPP_RESET_SAMPLE) & 0x00000200) == 0) | ||
503 | return 133333333; | ||
504 | |||
505 | return 166666667; | ||
506 | } | ||
507 | |||
458 | static void orion5x_timer_init(void) | 508 | static void orion5x_timer_init(void) |
459 | { | 509 | { |
460 | orion_time_init(IRQ_ORION5X_BRIDGE, ORION5X_TCLK); | 510 | orion5x_tclk = orion5x_find_tclk(); |
511 | orion_time_init(IRQ_ORION5X_BRIDGE, orion5x_tclk); | ||
461 | } | 512 | } |
462 | 513 | ||
463 | struct sys_timer orion5x_timer = { | 514 | struct sys_timer orion5x_timer = { |
@@ -499,6 +550,12 @@ static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) | |||
499 | } else { | 550 | } else { |
500 | *dev_name = "MV88F5181(L)-Rev-Unsupported"; | 551 | *dev_name = "MV88F5181(L)-Rev-Unsupported"; |
501 | } | 552 | } |
553 | } else if (*dev == MV88F6183_DEV_ID) { | ||
554 | if (*rev == MV88F6183_REV_B0) { | ||
555 | *dev_name = "MV88F6183-Rev-B0"; | ||
556 | } else { | ||
557 | *dev_name = "MV88F6183-Rev-Unsupported"; | ||
558 | } | ||
502 | } else { | 559 | } else { |
503 | *dev_name = "Device-Unknown"; | 560 | *dev_name = "Device-Unknown"; |
504 | } | 561 | } |
@@ -510,7 +567,12 @@ void __init orion5x_init(void) | |||
510 | u32 dev, rev; | 567 | u32 dev, rev; |
511 | 568 | ||
512 | orion5x_id(&dev, &rev, &dev_name); | 569 | orion5x_id(&dev, &rev, &dev_name); |
513 | printk(KERN_INFO "Orion ID: %s. TCLK=%d.\n", dev_name, ORION5X_TCLK); | 570 | printk(KERN_INFO "Orion ID: %s. TCLK=%d.\n", dev_name, orion5x_tclk); |
571 | |||
572 | orion5x_eth_shared_data.t_clk = orion5x_tclk; | ||
573 | orion5x_spi_plat_data.tclk = orion5x_tclk; | ||
574 | orion5x_uart0_data[0].uartclk = orion5x_tclk; | ||
575 | orion5x_uart1_data[0].uartclk = orion5x_tclk; | ||
514 | 576 | ||
515 | /* | 577 | /* |
516 | * Setup Orion address map | 578 | * Setup Orion address map |