common.c 16 KB

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