common.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. /*
  2. * arch/arm/mach-kirkwood/common.c
  3. *
  4. * Core functions for Marvell Kirkwood SoCs
  5. *
  6. * This file is licensed under the terms of the GNU General Public
  7. * License version 2. This program is licensed "as is" without any
  8. * warranty of any kind, whether express or implied.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/init.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/serial_8250.h>
  14. #include <linux/mbus.h>
  15. #include <linux/mv643xx_eth.h>
  16. #include <linux/ata_platform.h>
  17. #include <linux/spi/orion_spi.h>
  18. #include <net/dsa.h>
  19. #include <asm/page.h>
  20. #include <asm/timex.h>
  21. #include <asm/mach/map.h>
  22. #include <asm/mach/time.h>
  23. #include <mach/kirkwood.h>
  24. #include <plat/cache-feroceon-l2.h>
  25. #include <plat/ehci-orion.h>
  26. #include <plat/mv_xor.h>
  27. #include <plat/orion_nand.h>
  28. #include <plat/time.h>
  29. #include "common.h"
  30. /*****************************************************************************
  31. * I/O Address Mapping
  32. ****************************************************************************/
  33. static struct map_desc kirkwood_io_desc[] __initdata = {
  34. {
  35. .virtual = KIRKWOOD_PCIE_IO_VIRT_BASE,
  36. .pfn = __phys_to_pfn(KIRKWOOD_PCIE_IO_PHYS_BASE),
  37. .length = KIRKWOOD_PCIE_IO_SIZE,
  38. .type = MT_DEVICE,
  39. }, {
  40. .virtual = KIRKWOOD_REGS_VIRT_BASE,
  41. .pfn = __phys_to_pfn(KIRKWOOD_REGS_PHYS_BASE),
  42. .length = KIRKWOOD_REGS_SIZE,
  43. .type = MT_DEVICE,
  44. },
  45. };
  46. void __init kirkwood_map_io(void)
  47. {
  48. iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc));
  49. }
  50. /*****************************************************************************
  51. * EHCI
  52. ****************************************************************************/
  53. static struct orion_ehci_data kirkwood_ehci_data = {
  54. .dram = &kirkwood_mbus_dram_info,
  55. .phy_version = EHCI_PHY_NA,
  56. };
  57. static u64 ehci_dmamask = 0xffffffffUL;
  58. /*****************************************************************************
  59. * EHCI0
  60. ****************************************************************************/
  61. static struct resource kirkwood_ehci_resources[] = {
  62. {
  63. .start = USB_PHYS_BASE,
  64. .end = USB_PHYS_BASE + 0x0fff,
  65. .flags = IORESOURCE_MEM,
  66. }, {
  67. .start = IRQ_KIRKWOOD_USB,
  68. .end = IRQ_KIRKWOOD_USB,
  69. .flags = IORESOURCE_IRQ,
  70. },
  71. };
  72. static struct platform_device kirkwood_ehci = {
  73. .name = "orion-ehci",
  74. .id = 0,
  75. .dev = {
  76. .dma_mask = &ehci_dmamask,
  77. .coherent_dma_mask = 0xffffffff,
  78. .platform_data = &kirkwood_ehci_data,
  79. },
  80. .resource = kirkwood_ehci_resources,
  81. .num_resources = ARRAY_SIZE(kirkwood_ehci_resources),
  82. };
  83. void __init kirkwood_ehci_init(void)
  84. {
  85. platform_device_register(&kirkwood_ehci);
  86. }
  87. /*****************************************************************************
  88. * GE00
  89. ****************************************************************************/
  90. struct mv643xx_eth_shared_platform_data kirkwood_ge00_shared_data = {
  91. .dram = &kirkwood_mbus_dram_info,
  92. };
  93. static struct resource kirkwood_ge00_shared_resources[] = {
  94. {
  95. .name = "ge00 base",
  96. .start = GE00_PHYS_BASE + 0x2000,
  97. .end = GE00_PHYS_BASE + 0x3fff,
  98. .flags = IORESOURCE_MEM,
  99. }, {
  100. .name = "ge00 err irq",
  101. .start = IRQ_KIRKWOOD_GE00_ERR,
  102. .end = IRQ_KIRKWOOD_GE00_ERR,
  103. .flags = IORESOURCE_IRQ,
  104. },
  105. };
  106. static struct platform_device kirkwood_ge00_shared = {
  107. .name = MV643XX_ETH_SHARED_NAME,
  108. .id = 0,
  109. .dev = {
  110. .platform_data = &kirkwood_ge00_shared_data,
  111. },
  112. .num_resources = ARRAY_SIZE(kirkwood_ge00_shared_resources),
  113. .resource = kirkwood_ge00_shared_resources,
  114. };
  115. static struct resource kirkwood_ge00_resources[] = {
  116. {
  117. .name = "ge00 irq",
  118. .start = IRQ_KIRKWOOD_GE00_SUM,
  119. .end = IRQ_KIRKWOOD_GE00_SUM,
  120. .flags = IORESOURCE_IRQ,
  121. },
  122. };
  123. static struct platform_device kirkwood_ge00 = {
  124. .name = MV643XX_ETH_NAME,
  125. .id = 0,
  126. .num_resources = 1,
  127. .resource = kirkwood_ge00_resources,
  128. };
  129. void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data)
  130. {
  131. eth_data->shared = &kirkwood_ge00_shared;
  132. kirkwood_ge00.dev.platform_data = eth_data;
  133. platform_device_register(&kirkwood_ge00_shared);
  134. platform_device_register(&kirkwood_ge00);
  135. }
  136. /*****************************************************************************
  137. * Ethernet switch
  138. ****************************************************************************/
  139. static struct resource kirkwood_switch_resources[] = {
  140. {
  141. .start = 0,
  142. .end = 0,
  143. .flags = IORESOURCE_IRQ,
  144. },
  145. };
  146. static struct platform_device kirkwood_switch_device = {
  147. .name = "dsa",
  148. .id = 0,
  149. .num_resources = 0,
  150. .resource = kirkwood_switch_resources,
  151. };
  152. void __init kirkwood_ge00_switch_init(struct dsa_platform_data *d, int irq)
  153. {
  154. if (irq != NO_IRQ) {
  155. kirkwood_switch_resources[0].start = irq;
  156. kirkwood_switch_resources[0].end = irq;
  157. kirkwood_switch_device.num_resources = 1;
  158. }
  159. d->mii_bus = &kirkwood_ge00_shared.dev;
  160. d->netdev = &kirkwood_ge00.dev;
  161. kirkwood_switch_device.dev.platform_data = d;
  162. platform_device_register(&kirkwood_switch_device);
  163. }
  164. /*****************************************************************************
  165. * SoC RTC
  166. ****************************************************************************/
  167. static struct resource kirkwood_rtc_resource = {
  168. .start = RTC_PHYS_BASE,
  169. .end = RTC_PHYS_BASE + SZ_16 - 1,
  170. .flags = IORESOURCE_MEM,
  171. };
  172. void __init kirkwood_rtc_init(void)
  173. {
  174. platform_device_register_simple("rtc-mv", -1, &kirkwood_rtc_resource, 1);
  175. }
  176. /*****************************************************************************
  177. * SATA
  178. ****************************************************************************/
  179. static struct resource kirkwood_sata_resources[] = {
  180. {
  181. .name = "sata base",
  182. .start = SATA_PHYS_BASE,
  183. .end = SATA_PHYS_BASE + 0x5000 - 1,
  184. .flags = IORESOURCE_MEM,
  185. }, {
  186. .name = "sata irq",
  187. .start = IRQ_KIRKWOOD_SATA,
  188. .end = IRQ_KIRKWOOD_SATA,
  189. .flags = IORESOURCE_IRQ,
  190. },
  191. };
  192. static struct platform_device kirkwood_sata = {
  193. .name = "sata_mv",
  194. .id = 0,
  195. .dev = {
  196. .coherent_dma_mask = 0xffffffff,
  197. },
  198. .num_resources = ARRAY_SIZE(kirkwood_sata_resources),
  199. .resource = kirkwood_sata_resources,
  200. };
  201. void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data)
  202. {
  203. sata_data->dram = &kirkwood_mbus_dram_info;
  204. kirkwood_sata.dev.platform_data = sata_data;
  205. platform_device_register(&kirkwood_sata);
  206. }
  207. /*****************************************************************************
  208. * SPI
  209. ****************************************************************************/
  210. static struct orion_spi_info kirkwood_spi_plat_data = {
  211. };
  212. static struct resource kirkwood_spi_resources[] = {
  213. {
  214. .start = SPI_PHYS_BASE,
  215. .end = SPI_PHYS_BASE + SZ_512 - 1,
  216. .flags = IORESOURCE_MEM,
  217. },
  218. };
  219. static struct platform_device kirkwood_spi = {
  220. .name = "orion_spi",
  221. .id = 0,
  222. .resource = kirkwood_spi_resources,
  223. .dev = {
  224. .platform_data = &kirkwood_spi_plat_data,
  225. },
  226. .num_resources = ARRAY_SIZE(kirkwood_spi_resources),
  227. };
  228. void __init kirkwood_spi_init()
  229. {
  230. platform_device_register(&kirkwood_spi);
  231. }
  232. /*****************************************************************************
  233. * UART0
  234. ****************************************************************************/
  235. static struct plat_serial8250_port kirkwood_uart0_data[] = {
  236. {
  237. .mapbase = UART0_PHYS_BASE,
  238. .membase = (char *)UART0_VIRT_BASE,
  239. .irq = IRQ_KIRKWOOD_UART_0,
  240. .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
  241. .iotype = UPIO_MEM,
  242. .regshift = 2,
  243. .uartclk = 0,
  244. }, {
  245. },
  246. };
  247. static struct resource kirkwood_uart0_resources[] = {
  248. {
  249. .start = UART0_PHYS_BASE,
  250. .end = UART0_PHYS_BASE + 0xff,
  251. .flags = IORESOURCE_MEM,
  252. }, {
  253. .start = IRQ_KIRKWOOD_UART_0,
  254. .end = IRQ_KIRKWOOD_UART_0,
  255. .flags = IORESOURCE_IRQ,
  256. },
  257. };
  258. static struct platform_device kirkwood_uart0 = {
  259. .name = "serial8250",
  260. .id = 0,
  261. .dev = {
  262. .platform_data = kirkwood_uart0_data,
  263. },
  264. .resource = kirkwood_uart0_resources,
  265. .num_resources = ARRAY_SIZE(kirkwood_uart0_resources),
  266. };
  267. void __init kirkwood_uart0_init(void)
  268. {
  269. platform_device_register(&kirkwood_uart0);
  270. }
  271. /*****************************************************************************
  272. * UART1
  273. ****************************************************************************/
  274. static struct plat_serial8250_port kirkwood_uart1_data[] = {
  275. {
  276. .mapbase = UART1_PHYS_BASE,
  277. .membase = (char *)UART1_VIRT_BASE,
  278. .irq = IRQ_KIRKWOOD_UART_1,
  279. .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
  280. .iotype = UPIO_MEM,
  281. .regshift = 2,
  282. .uartclk = 0,
  283. }, {
  284. },
  285. };
  286. static struct resource kirkwood_uart1_resources[] = {
  287. {
  288. .start = UART1_PHYS_BASE,
  289. .end = UART1_PHYS_BASE + 0xff,
  290. .flags = IORESOURCE_MEM,
  291. }, {
  292. .start = IRQ_KIRKWOOD_UART_1,
  293. .end = IRQ_KIRKWOOD_UART_1,
  294. .flags = IORESOURCE_IRQ,
  295. },
  296. };
  297. static struct platform_device kirkwood_uart1 = {
  298. .name = "serial8250",
  299. .id = 1,
  300. .dev = {
  301. .platform_data = kirkwood_uart1_data,
  302. },
  303. .resource = kirkwood_uart1_resources,
  304. .num_resources = ARRAY_SIZE(kirkwood_uart1_resources),
  305. };
  306. void __init kirkwood_uart1_init(void)
  307. {
  308. platform_device_register(&kirkwood_uart1);
  309. }
  310. /*****************************************************************************
  311. * XOR
  312. ****************************************************************************/
  313. static struct mv_xor_platform_shared_data kirkwood_xor_shared_data = {
  314. .dram = &kirkwood_mbus_dram_info,
  315. };
  316. static u64 kirkwood_xor_dmamask = DMA_32BIT_MASK;
  317. /*****************************************************************************
  318. * XOR0
  319. ****************************************************************************/
  320. static struct resource kirkwood_xor0_shared_resources[] = {
  321. {
  322. .name = "xor 0 low",
  323. .start = XOR0_PHYS_BASE,
  324. .end = XOR0_PHYS_BASE + 0xff,
  325. .flags = IORESOURCE_MEM,
  326. }, {
  327. .name = "xor 0 high",
  328. .start = XOR0_HIGH_PHYS_BASE,
  329. .end = XOR0_HIGH_PHYS_BASE + 0xff,
  330. .flags = IORESOURCE_MEM,
  331. },
  332. };
  333. static struct platform_device kirkwood_xor0_shared = {
  334. .name = MV_XOR_SHARED_NAME,
  335. .id = 0,
  336. .dev = {
  337. .platform_data = &kirkwood_xor_shared_data,
  338. },
  339. .num_resources = ARRAY_SIZE(kirkwood_xor0_shared_resources),
  340. .resource = kirkwood_xor0_shared_resources,
  341. };
  342. static struct resource kirkwood_xor00_resources[] = {
  343. [0] = {
  344. .start = IRQ_KIRKWOOD_XOR_00,
  345. .end = IRQ_KIRKWOOD_XOR_00,
  346. .flags = IORESOURCE_IRQ,
  347. },
  348. };
  349. static struct mv_xor_platform_data kirkwood_xor00_data = {
  350. .shared = &kirkwood_xor0_shared,
  351. .hw_id = 0,
  352. .pool_size = PAGE_SIZE,
  353. };
  354. static struct platform_device kirkwood_xor00_channel = {
  355. .name = MV_XOR_NAME,
  356. .id = 0,
  357. .num_resources = ARRAY_SIZE(kirkwood_xor00_resources),
  358. .resource = kirkwood_xor00_resources,
  359. .dev = {
  360. .dma_mask = &kirkwood_xor_dmamask,
  361. .coherent_dma_mask = DMA_64BIT_MASK,
  362. .platform_data = (void *)&kirkwood_xor00_data,
  363. },
  364. };
  365. static struct resource kirkwood_xor01_resources[] = {
  366. [0] = {
  367. .start = IRQ_KIRKWOOD_XOR_01,
  368. .end = IRQ_KIRKWOOD_XOR_01,
  369. .flags = IORESOURCE_IRQ,
  370. },
  371. };
  372. static struct mv_xor_platform_data kirkwood_xor01_data = {
  373. .shared = &kirkwood_xor0_shared,
  374. .hw_id = 1,
  375. .pool_size = PAGE_SIZE,
  376. };
  377. static struct platform_device kirkwood_xor01_channel = {
  378. .name = MV_XOR_NAME,
  379. .id = 1,
  380. .num_resources = ARRAY_SIZE(kirkwood_xor01_resources),
  381. .resource = kirkwood_xor01_resources,
  382. .dev = {
  383. .dma_mask = &kirkwood_xor_dmamask,
  384. .coherent_dma_mask = DMA_64BIT_MASK,
  385. .platform_data = (void *)&kirkwood_xor01_data,
  386. },
  387. };
  388. void __init kirkwood_xor0_init(void)
  389. {
  390. platform_device_register(&kirkwood_xor0_shared);
  391. /*
  392. * two engines can't do memset simultaneously, this limitation
  393. * satisfied by removing memset support from one of the engines.
  394. */
  395. dma_cap_set(DMA_MEMCPY, kirkwood_xor00_data.cap_mask);
  396. dma_cap_set(DMA_XOR, kirkwood_xor00_data.cap_mask);
  397. platform_device_register(&kirkwood_xor00_channel);
  398. dma_cap_set(DMA_MEMCPY, kirkwood_xor01_data.cap_mask);
  399. dma_cap_set(DMA_MEMSET, kirkwood_xor01_data.cap_mask);
  400. dma_cap_set(DMA_XOR, kirkwood_xor01_data.cap_mask);
  401. platform_device_register(&kirkwood_xor01_channel);
  402. }
  403. /*****************************************************************************
  404. * XOR1
  405. ****************************************************************************/
  406. static struct resource kirkwood_xor1_shared_resources[] = {
  407. {
  408. .name = "xor 1 low",
  409. .start = XOR1_PHYS_BASE,
  410. .end = XOR1_PHYS_BASE + 0xff,
  411. .flags = IORESOURCE_MEM,
  412. }, {
  413. .name = "xor 1 high",
  414. .start = XOR1_HIGH_PHYS_BASE,
  415. .end = XOR1_HIGH_PHYS_BASE + 0xff,
  416. .flags = IORESOURCE_MEM,
  417. },
  418. };
  419. static struct platform_device kirkwood_xor1_shared = {
  420. .name = MV_XOR_SHARED_NAME,
  421. .id = 1,
  422. .dev = {
  423. .platform_data = &kirkwood_xor_shared_data,
  424. },
  425. .num_resources = ARRAY_SIZE(kirkwood_xor1_shared_resources),
  426. .resource = kirkwood_xor1_shared_resources,
  427. };
  428. static struct resource kirkwood_xor10_resources[] = {
  429. [0] = {
  430. .start = IRQ_KIRKWOOD_XOR_10,
  431. .end = IRQ_KIRKWOOD_XOR_10,
  432. .flags = IORESOURCE_IRQ,
  433. },
  434. };
  435. static struct mv_xor_platform_data kirkwood_xor10_data = {
  436. .shared = &kirkwood_xor1_shared,
  437. .hw_id = 0,
  438. .pool_size = PAGE_SIZE,
  439. };
  440. static struct platform_device kirkwood_xor10_channel = {
  441. .name = MV_XOR_NAME,
  442. .id = 2,
  443. .num_resources = ARRAY_SIZE(kirkwood_xor10_resources),
  444. .resource = kirkwood_xor10_resources,
  445. .dev = {
  446. .dma_mask = &kirkwood_xor_dmamask,
  447. .coherent_dma_mask = DMA_64BIT_MASK,
  448. .platform_data = (void *)&kirkwood_xor10_data,
  449. },
  450. };
  451. static struct resource kirkwood_xor11_resources[] = {
  452. [0] = {
  453. .start = IRQ_KIRKWOOD_XOR_11,
  454. .end = IRQ_KIRKWOOD_XOR_11,
  455. .flags = IORESOURCE_IRQ,
  456. },
  457. };
  458. static struct mv_xor_platform_data kirkwood_xor11_data = {
  459. .shared = &kirkwood_xor1_shared,
  460. .hw_id = 1,
  461. .pool_size = PAGE_SIZE,
  462. };
  463. static struct platform_device kirkwood_xor11_channel = {
  464. .name = MV_XOR_NAME,
  465. .id = 3,
  466. .num_resources = ARRAY_SIZE(kirkwood_xor11_resources),
  467. .resource = kirkwood_xor11_resources,
  468. .dev = {
  469. .dma_mask = &kirkwood_xor_dmamask,
  470. .coherent_dma_mask = DMA_64BIT_MASK,
  471. .platform_data = (void *)&kirkwood_xor11_data,
  472. },
  473. };
  474. void __init kirkwood_xor1_init(void)
  475. {
  476. platform_device_register(&kirkwood_xor1_shared);
  477. /*
  478. * two engines can't do memset simultaneously, this limitation
  479. * satisfied by removing memset support from one of the engines.
  480. */
  481. dma_cap_set(DMA_MEMCPY, kirkwood_xor10_data.cap_mask);
  482. dma_cap_set(DMA_XOR, kirkwood_xor10_data.cap_mask);
  483. platform_device_register(&kirkwood_xor10_channel);
  484. dma_cap_set(DMA_MEMCPY, kirkwood_xor11_data.cap_mask);
  485. dma_cap_set(DMA_MEMSET, kirkwood_xor11_data.cap_mask);
  486. dma_cap_set(DMA_XOR, kirkwood_xor11_data.cap_mask);
  487. platform_device_register(&kirkwood_xor11_channel);
  488. }
  489. /*****************************************************************************
  490. * Time handling
  491. ****************************************************************************/
  492. int kirkwood_tclk;
  493. int __init kirkwood_find_tclk(void)
  494. {
  495. u32 dev, rev;
  496. kirkwood_pcie_id(&dev, &rev);
  497. if (dev == MV88F6281_DEV_ID && rev == MV88F6281_REV_A0)
  498. return 200000000;
  499. return 166666667;
  500. }
  501. static void kirkwood_timer_init(void)
  502. {
  503. kirkwood_tclk = kirkwood_find_tclk();
  504. orion_time_init(IRQ_KIRKWOOD_BRIDGE, kirkwood_tclk);
  505. }
  506. struct sys_timer kirkwood_timer = {
  507. .init = kirkwood_timer_init,
  508. };
  509. /*****************************************************************************
  510. * General
  511. ****************************************************************************/
  512. /*
  513. * Identify device ID and revision.
  514. */
  515. static char * __init kirkwood_id(void)
  516. {
  517. u32 dev, rev;
  518. kirkwood_pcie_id(&dev, &rev);
  519. if (dev == MV88F6281_DEV_ID) {
  520. if (rev == MV88F6281_REV_Z0)
  521. return "MV88F6281-Z0";
  522. else if (rev == MV88F6281_REV_A0)
  523. return "MV88F6281-A0";
  524. else
  525. return "MV88F6281-Rev-Unsupported";
  526. } else if (dev == MV88F6192_DEV_ID) {
  527. if (rev == MV88F6192_REV_Z0)
  528. return "MV88F6192-Z0";
  529. else if (rev == MV88F6192_REV_A0)
  530. return "MV88F6192-A0";
  531. else
  532. return "MV88F6192-Rev-Unsupported";
  533. } else if (dev == MV88F6180_DEV_ID) {
  534. if (rev == MV88F6180_REV_A0)
  535. return "MV88F6180-Rev-A0";
  536. else
  537. return "MV88F6180-Rev-Unsupported";
  538. } else {
  539. return "Device-Unknown";
  540. }
  541. }
  542. static void __init kirkwood_l2_init(void)
  543. {
  544. #ifdef CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
  545. writel(readl(L2_CONFIG_REG) | L2_WRITETHROUGH, L2_CONFIG_REG);
  546. feroceon_l2_init(1);
  547. #else
  548. writel(readl(L2_CONFIG_REG) & ~L2_WRITETHROUGH, L2_CONFIG_REG);
  549. feroceon_l2_init(0);
  550. #endif
  551. }
  552. void __init kirkwood_init(void)
  553. {
  554. printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n",
  555. kirkwood_id(), kirkwood_tclk);
  556. kirkwood_ge00_shared_data.t_clk = kirkwood_tclk;
  557. kirkwood_spi_plat_data.tclk = kirkwood_tclk;
  558. kirkwood_uart0_data[0].uartclk = kirkwood_tclk;
  559. kirkwood_uart1_data[0].uartclk = kirkwood_tclk;
  560. kirkwood_setup_cpu_mbus();
  561. #ifdef CONFIG_CACHE_FEROCEON_L2
  562. kirkwood_l2_init();
  563. #endif
  564. }