cpu_init.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. /*
  2. * (C) Copyright 2003
  3. * Josef Baumgartner <josef.baumgartner@telex.de>
  4. *
  5. * MCF5282 additionals
  6. * (C) Copyright 2005
  7. * BuS Elektronik GmbH & Co. KG <esw@bus-elektronik.de>
  8. *
  9. * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
  10. * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
  11. * Hayden Fraser (Hayden.Fraser@freescale.com)
  12. *
  13. * MCF5275 additions
  14. * Copyright (C) 2008 Arthur Shipkowski (art@videon-central.com)
  15. *
  16. * See file CREDITS for list of people who contributed to this
  17. * project.
  18. *
  19. * This program is free software; you can redistribute it and/or
  20. * modify it under the terms of the GNU General Public License as
  21. * published by the Free Software Foundation; either version 2 of
  22. * the License, or (at your option) any later version.
  23. *
  24. * This program is distributed in the hope that it will be useful,
  25. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  26. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  27. * GNU General Public License for more details.
  28. *
  29. * You should have received a copy of the GNU General Public License
  30. * along with this program; if not, write to the Free Software
  31. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  32. * MA 02111-1307 USA
  33. */
  34. #include <common.h>
  35. #include <watchdog.h>
  36. #include <asm/immap.h>
  37. #if defined(CONFIG_M5253)
  38. /*
  39. * Breath some life into the CPU...
  40. *
  41. * Set up the memory map,
  42. * initialize a bunch of registers,
  43. * initialize the UPM's
  44. */
  45. void cpu_init_f(void)
  46. {
  47. mbar_writeByte(MCFSIM_MPARK, 0x40); /* 5249 Internal Core takes priority over DMA */
  48. mbar_writeByte(MCFSIM_SYPCR, 0x00);
  49. mbar_writeByte(MCFSIM_SWIVR, 0x0f);
  50. mbar_writeByte(MCFSIM_SWSR, 0x00);
  51. mbar_writeByte(MCFSIM_SWDICR, 0x00);
  52. mbar_writeByte(MCFSIM_TIMER1ICR, 0x00);
  53. mbar_writeByte(MCFSIM_TIMER2ICR, 0x88);
  54. mbar_writeByte(MCFSIM_I2CICR, 0x00);
  55. mbar_writeByte(MCFSIM_UART1ICR, 0x00);
  56. mbar_writeByte(MCFSIM_UART2ICR, 0x00);
  57. mbar_writeByte(MCFSIM_ICR6, 0x00);
  58. mbar_writeByte(MCFSIM_ICR7, 0x00);
  59. mbar_writeByte(MCFSIM_ICR8, 0x00);
  60. mbar_writeByte(MCFSIM_ICR9, 0x00);
  61. mbar_writeByte(MCFSIM_QSPIICR, 0x00);
  62. mbar2_writeLong(MCFSIM_GPIO_INT_EN, 0x00000080);
  63. mbar2_writeByte(MCFSIM_INTBASE, 0x40); /* Base interrupts at 64 */
  64. mbar2_writeByte(MCFSIM_SPURVEC, 0x00);
  65. /*mbar2_writeLong(MCFSIM_IDECONFIG1, 0x00000020); */ /* Enable a 1 cycle pre-drive cycle on CS1 */
  66. /*
  67. * Setup chip selects...
  68. */
  69. mbar_writeShort(MCFSIM_CSAR1, CFG_CSAR1);
  70. mbar_writeShort(MCFSIM_CSCR1, CFG_CSCR1);
  71. mbar_writeLong(MCFSIM_CSMR1, CFG_CSMR1);
  72. mbar_writeShort(MCFSIM_CSAR0, CFG_CSAR0);
  73. mbar_writeShort(MCFSIM_CSCR0, CFG_CSCR0);
  74. mbar_writeLong(MCFSIM_CSMR0, CFG_CSMR0);
  75. /* enable instruction cache now */
  76. icache_enable();
  77. }
  78. /*initialize higher level parts of CPU like timers */
  79. int cpu_init_r(void)
  80. {
  81. return (0);
  82. }
  83. void uart_port_conf(void)
  84. {
  85. /* Setup Ports: */
  86. switch (CFG_UART_PORT) {
  87. case 0:
  88. break;
  89. case 1:
  90. break;
  91. case 2:
  92. break;
  93. }
  94. }
  95. #endif /* #if defined(CONFIG_M5253) */
  96. #if defined(CONFIG_M5271)
  97. void cpu_init_f(void)
  98. {
  99. #ifndef CONFIG_WATCHDOG
  100. /* Disable the watchdog if we aren't using it */
  101. mbar_writeShort(MCF_WTM_WCR, 0);
  102. #endif
  103. /* Set clockspeed to 100MHz */
  104. mbar_writeShort(MCF_FMPLL_SYNCR,
  105. MCF_FMPLL_SYNCR_MFD(0) | MCF_FMPLL_SYNCR_RFD(0));
  106. while (!mbar_readByte(MCF_FMPLL_SYNSR) & MCF_FMPLL_SYNSR_LOCK) ;
  107. }
  108. /*
  109. * initialize higher level parts of CPU like timers
  110. */
  111. int cpu_init_r(void)
  112. {
  113. return (0);
  114. }
  115. void uart_port_conf(void)
  116. {
  117. /* Setup Ports: */
  118. switch (CFG_UART_PORT) {
  119. case 0:
  120. mbar_writeShort(MCF_GPIO_PAR_UART, MCF_GPIO_PAR_UART_U0TXD |
  121. MCF_GPIO_PAR_UART_U0RXD);
  122. break;
  123. case 1:
  124. mbar_writeShort(MCF_GPIO_PAR_UART,
  125. MCF_GPIO_PAR_UART_U1RXD_UART1 |
  126. MCF_GPIO_PAR_UART_U1TXD_UART1);
  127. break;
  128. case 2:
  129. mbar_writeShort(MCF_GPIO_PAR_UART, 0x3000);
  130. break;
  131. }
  132. }
  133. #endif
  134. #if defined(CONFIG_M5272)
  135. /*
  136. * Breath some life into the CPU...
  137. *
  138. * Set up the memory map,
  139. * initialize a bunch of registers,
  140. * initialize the UPM's
  141. */
  142. void cpu_init_f(void)
  143. {
  144. /* if we come from RAM we assume the CPU is
  145. * already initialized.
  146. */
  147. #ifndef CONFIG_MONITOR_IS_IN_RAM
  148. volatile sysctrl_t *sysctrl = (sysctrl_t *) (CFG_MBAR);
  149. volatile gpio_t *gpio = (gpio_t *) (MMAP_GPIO);
  150. volatile csctrl_t *csctrl = (csctrl_t *) (MMAP_FBCS);
  151. sysctrl->sc_scr = CFG_SCR;
  152. sysctrl->sc_spr = CFG_SPR;
  153. /* Setup Ports: */
  154. gpio->gpio_pacnt = CFG_PACNT;
  155. gpio->gpio_paddr = CFG_PADDR;
  156. gpio->gpio_padat = CFG_PADAT;
  157. gpio->gpio_pbcnt = CFG_PBCNT;
  158. gpio->gpio_pbddr = CFG_PBDDR;
  159. gpio->gpio_pbdat = CFG_PBDAT;
  160. gpio->gpio_pdcnt = CFG_PDCNT;
  161. /* Memory Controller: */
  162. csctrl->cs_br0 = CFG_BR0_PRELIM;
  163. csctrl->cs_or0 = CFG_OR0_PRELIM;
  164. #if (defined(CFG_OR1_PRELIM) && defined(CFG_BR1_PRELIM))
  165. csctrl->cs_br1 = CFG_BR1_PRELIM;
  166. csctrl->cs_or1 = CFG_OR1_PRELIM;
  167. #endif
  168. #if defined(CFG_OR2_PRELIM) && defined(CFG_BR2_PRELIM)
  169. csctrl->cs_br2 = CFG_BR2_PRELIM;
  170. csctrl->cs_or2 = CFG_OR2_PRELIM;
  171. #endif
  172. #if defined(CFG_OR3_PRELIM) && defined(CFG_BR3_PRELIM)
  173. csctrl->cs_br3 = CFG_BR3_PRELIM;
  174. csctrl->cs_or3 = CFG_OR3_PRELIM;
  175. #endif
  176. #if defined(CFG_OR4_PRELIM) && defined(CFG_BR4_PRELIM)
  177. csctrl->cs_br4 = CFG_BR4_PRELIM;
  178. csctrl->cs_or4 = CFG_OR4_PRELIM;
  179. #endif
  180. #if defined(CFG_OR5_PRELIM) && defined(CFG_BR5_PRELIM)
  181. csctrl->cs_br5 = CFG_BR5_PRELIM;
  182. csctrl->cs_or5 = CFG_OR5_PRELIM;
  183. #endif
  184. #if defined(CFG_OR6_PRELIM) && defined(CFG_BR6_PRELIM)
  185. csctrl->cs_br6 = CFG_BR6_PRELIM;
  186. csctrl->cs_or6 = CFG_OR6_PRELIM;
  187. #endif
  188. #if defined(CFG_OR7_PRELIM) && defined(CFG_BR7_PRELIM)
  189. csctrl->cs_br7 = CFG_BR7_PRELIM;
  190. csctrl->cs_or7 = CFG_OR7_PRELIM;
  191. #endif
  192. #endif /* #ifndef CONFIG_MONITOR_IS_IN_RAM */
  193. /* enable instruction cache now */
  194. icache_enable();
  195. }
  196. /*
  197. * initialize higher level parts of CPU like timers
  198. */
  199. int cpu_init_r(void)
  200. {
  201. return (0);
  202. }
  203. void uart_port_conf(void)
  204. {
  205. volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
  206. /* Setup Ports: */
  207. switch (CFG_UART_PORT) {
  208. case 0:
  209. gpio->gpio_pbcnt &= ~(GPIO_PBCNT_PB0MSK | GPIO_PBCNT_PB1MSK);
  210. gpio->gpio_pbcnt |= (GPIO_PBCNT_URT0_TXD | GPIO_PBCNT_URT0_RXD);
  211. break;
  212. case 1:
  213. gpio->gpio_pdcnt &= ~(GPIO_PDCNT_PD1MSK | GPIO_PDCNT_PD4MSK);
  214. gpio->gpio_pdcnt |= (GPIO_PDCNT_URT1_RXD | GPIO_PDCNT_URT1_TXD);
  215. break;
  216. }
  217. }
  218. #endif /* #if defined(CONFIG_M5272) */
  219. #if defined(CONFIG_M5275)
  220. /*
  221. * Breathe some life into the CPU...
  222. *
  223. * Set up the memory map,
  224. * initialize a bunch of registers,
  225. * initialize the UPM's
  226. */
  227. void cpu_init_f(void)
  228. {
  229. /* if we come from RAM we assume the CPU is
  230. * already initialized.
  231. */
  232. #ifndef CONFIG_MONITOR_IS_IN_RAM
  233. volatile wdog_t *wdog_reg = (wdog_t *)(MMAP_WDOG);
  234. volatile gpio_t *gpio_reg = (gpio_t *)(MMAP_GPIO);
  235. volatile csctrl_t *csctrl_reg = (csctrl_t *)(MMAP_FBCS);
  236. /* Kill watchdog so we can initialize the PLL */
  237. wdog_reg->wcr = 0;
  238. /* Memory Controller: */
  239. /* Flash */
  240. csctrl_reg->ar0 = CFG_AR0_PRELIM;
  241. csctrl_reg->cr0 = CFG_CR0_PRELIM;
  242. csctrl_reg->mr0 = CFG_MR0_PRELIM;
  243. #if (defined(CFG_AR1_PRELIM) && defined(CFG_CR1_PRELIM) && defined(CFG_MR1_PRELIM))
  244. csctrl_reg->ar1 = CFG_AR1_PRELIM;
  245. csctrl_reg->cr1 = CFG_CR1_PRELIM;
  246. csctrl_reg->mr1 = CFG_MR1_PRELIM;
  247. #endif
  248. #if (defined(CFG_AR2_PRELIM) && defined(CFG_CR2_PRELIM) && defined(CFG_MR2_PRELIM))
  249. csctrl_reg->ar2 = CFG_AR2_PRELIM;
  250. csctrl_reg->cr2 = CFG_CR2_PRELIM;
  251. csctrl_reg->mr2 = CFG_MR2_PRELIM;
  252. #endif
  253. #if (defined(CFG_AR3_PRELIM) && defined(CFG_CR3_PRELIM) && defined(CFG_MR3_PRELIM))
  254. csctrl_reg->ar3 = CFG_AR3_PRELIM;
  255. csctrl_reg->cr3 = CFG_CR3_PRELIM;
  256. csctrl_reg->mr3 = CFG_MR3_PRELIM;
  257. #endif
  258. #if (defined(CFG_AR4_PRELIM) && defined(CFG_CR4_PRELIM) && defined(CFG_MR4_PRELIM))
  259. csctrl_reg->ar4 = CFG_AR4_PRELIM;
  260. csctrl_reg->cr4 = CFG_CR4_PRELIM;
  261. csctrl_reg->mr4 = CFG_MR4_PRELIM;
  262. #endif
  263. #if (defined(CFG_AR5_PRELIM) && defined(CFG_CR5_PRELIM) && defined(CFG_MR5_PRELIM))
  264. csctrl_reg->ar5 = CFG_AR5_PRELIM;
  265. csctrl_reg->cr5 = CFG_CR5_PRELIM;
  266. csctrl_reg->mr5 = CFG_MR5_PRELIM;
  267. #endif
  268. #if (defined(CFG_AR6_PRELIM) && defined(CFG_CR6_PRELIM) && defined(CFG_MR6_PRELIM))
  269. csctrl_reg->ar6 = CFG_AR6_PRELIM;
  270. csctrl_reg->cr6 = CFG_CR6_PRELIM;
  271. csctrl_reg->mr6 = CFG_MR6_PRELIM;
  272. #endif
  273. #if (defined(CFG_AR7_PRELIM) && defined(CFG_CR7_PRELIM) && defined(CFG_MR7_PRELIM))
  274. csctrl_reg->ar7 = CFG_AR7_PRELIM;
  275. csctrl_reg->cr7 = CFG_CR7_PRELIM;
  276. csctrl_reg->mr7 = CFG_MR7_PRELIM;
  277. #endif
  278. #endif /* #ifndef CONFIG_MONITOR_IS_IN_RAM */
  279. #ifdef CONFIG_FSL_I2C
  280. gpio_reg->par_feci2c = 0x000F;
  281. #endif
  282. /* enable instruction cache now */
  283. icache_enable();
  284. }
  285. /*
  286. * initialize higher level parts of CPU like timers
  287. */
  288. int cpu_init_r(void)
  289. {
  290. return (0);
  291. }
  292. void uart_port_conf(void)
  293. {
  294. volatile gpio_t *gpio = (gpio_t *)MMAP_GPIO;
  295. /* Setup Ports: */
  296. switch (CFG_UART_PORT) {
  297. case 0:
  298. gpio->par_uart |= UART0_ENABLE_MASK;
  299. break;
  300. case 1:
  301. gpio->par_uart |= UART1_ENABLE_MASK;
  302. break;
  303. case 2:
  304. gpio->par_uart |= UART2_ENABLE_MASK;
  305. break;
  306. }
  307. }
  308. #endif /* #if defined(CONFIG_M5275) */
  309. #if defined(CONFIG_M5282)
  310. /*
  311. * Breath some life into the CPU...
  312. *
  313. * Set up the memory map,
  314. * initialize a bunch of registers,
  315. * initialize the UPM's
  316. */
  317. void cpu_init_f(void)
  318. {
  319. #ifndef CONFIG_WATCHDOG
  320. /* disable watchdog if we aren't using it */
  321. MCFWTM_WCR = 0;
  322. #endif
  323. #ifndef CONFIG_MONITOR_IS_IN_RAM
  324. /* Set speed /PLL */
  325. MCFCLOCK_SYNCR =
  326. MCFCLOCK_SYNCR_MFD(CFG_MFD) | MCFCLOCK_SYNCR_RFD(CFG_RFD);
  327. while (!(MCFCLOCK_SYNSR & MCFCLOCK_SYNSR_LOCK)) ;
  328. MCFGPIO_PBCDPAR = 0xc0;
  329. /* Set up the GPIO ports */
  330. #ifdef CFG_PEPAR
  331. MCFGPIO_PEPAR = CFG_PEPAR;
  332. #endif
  333. #ifdef CFG_PFPAR
  334. MCFGPIO_PFPAR = CFG_PFPAR;
  335. #endif
  336. #ifdef CFG_PJPAR
  337. MCFGPIO_PJPAR = CFG_PJPAR;
  338. #endif
  339. #ifdef CFG_PSDPAR
  340. MCFGPIO_PSDPAR = CFG_PSDPAR;
  341. #endif
  342. #ifdef CFG_PASPAR
  343. MCFGPIO_PASPAR = CFG_PASPAR;
  344. #endif
  345. #ifdef CFG_PEHLPAR
  346. MCFGPIO_PEHLPAR = CFG_PEHLPAR;
  347. #endif
  348. #ifdef CFG_PQSPAR
  349. MCFGPIO_PQSPAR = CFG_PQSPAR;
  350. #endif
  351. #ifdef CFG_PTCPAR
  352. MCFGPIO_PTCPAR = CFG_PTCPAR;
  353. #endif
  354. #ifdef CFG_PTDPAR
  355. MCFGPIO_PTDPAR = CFG_PTDPAR;
  356. #endif
  357. #ifdef CFG_PUAPAR
  358. MCFGPIO_PUAPAR = CFG_PUAPAR;
  359. #endif
  360. #ifdef CFG_DDRUA
  361. MCFGPIO_DDRUA = CFG_DDRUA;
  362. #endif
  363. /* This is probably a bad place to setup chip selects, but everyone
  364. else is doing it! */
  365. #if defined(CFG_CS0_BASE) & defined(CFG_CS0_SIZE) & \
  366. defined(CFG_CS0_WIDTH) & defined(CFG_CS0_RO) & \
  367. defined(CFG_CS0_WS)
  368. MCFCSM_CSAR0 = (CFG_CS0_BASE >> 16) & 0xFFFF;
  369. #if (CFG_CS0_WIDTH == 8)
  370. #define CFG_CS0_PS MCFCSM_CSCR_PS_8
  371. #elif (CFG_CS0_WIDTH == 16)
  372. #define CFG_CS0_PS MCFCSM_CSCR_PS_16
  373. #elif (CFG_CS0_WIDTH == 32)
  374. #define CFG_CS0_PS MCFCSM_CSCR_PS_32
  375. #else
  376. #error "CFG_CS0_WIDTH: Fault - wrong bus with for CS0"
  377. #endif
  378. MCFCSM_CSCR0 = MCFCSM_CSCR_WS(CFG_CS0_WS)
  379. | CFG_CS0_PS | MCFCSM_CSCR_AA;
  380. #if (CFG_CS0_RO != 0)
  381. MCFCSM_CSMR0 = MCFCSM_CSMR_BAM(CFG_CS0_SIZE - 1)
  382. | MCFCSM_CSMR_WP | MCFCSM_CSMR_V;
  383. #else
  384. MCFCSM_CSMR0 = MCFCSM_CSMR_BAM(CFG_CS0_SIZE - 1) | MCFCSM_CSMR_V;
  385. #endif
  386. #else
  387. #waring "Chip Select 0 are not initialized/used"
  388. #endif
  389. #if defined(CFG_CS1_BASE) & defined(CFG_CS1_SIZE) & \
  390. defined(CFG_CS1_WIDTH) & defined(CFG_CS1_RO) & \
  391. defined(CFG_CS1_WS)
  392. MCFCSM_CSAR1 = (CFG_CS1_BASE >> 16) & 0xFFFF;
  393. #if (CFG_CS1_WIDTH == 8)
  394. #define CFG_CS1_PS MCFCSM_CSCR_PS_8
  395. #elif (CFG_CS1_WIDTH == 16)
  396. #define CFG_CS1_PS MCFCSM_CSCR_PS_16
  397. #elif (CFG_CS1_WIDTH == 32)
  398. #define CFG_CS1_PS MCFCSM_CSCR_PS_32
  399. #else
  400. #error "CFG_CS1_WIDTH: Fault - wrong bus with for CS1"
  401. #endif
  402. MCFCSM_CSCR1 = MCFCSM_CSCR_WS(CFG_CS1_WS)
  403. | CFG_CS1_PS | MCFCSM_CSCR_AA;
  404. #if (CFG_CS1_RO != 0)
  405. MCFCSM_CSMR1 = MCFCSM_CSMR_BAM(CFG_CS1_SIZE - 1)
  406. | MCFCSM_CSMR_WP | MCFCSM_CSMR_V;
  407. #else
  408. MCFCSM_CSMR1 = MCFCSM_CSMR_BAM(CFG_CS1_SIZE - 1)
  409. | MCFCSM_CSMR_V;
  410. #endif
  411. #else
  412. #warning "Chip Select 1 are not initialized/used"
  413. #endif
  414. #if defined(CFG_CS2_BASE) & defined(CFG_CS2_SIZE) & \
  415. defined(CFG_CS2_WIDTH) & defined(CFG_CS2_RO) & \
  416. defined(CFG_CS2_WS)
  417. MCFCSM_CSAR2 = (CFG_CS2_BASE >> 16) & 0xFFFF;
  418. #if (CFG_CS2_WIDTH == 8)
  419. #define CFG_CS2_PS MCFCSM_CSCR_PS_8
  420. #elif (CFG_CS2_WIDTH == 16)
  421. #define CFG_CS2_PS MCFCSM_CSCR_PS_16
  422. #elif (CFG_CS2_WIDTH == 32)
  423. #define CFG_CS2_PS MCFCSM_CSCR_PS_32
  424. #else
  425. #error "CFG_CS2_WIDTH: Fault - wrong bus with for CS2"
  426. #endif
  427. MCFCSM_CSCR2 = MCFCSM_CSCR_WS(CFG_CS2_WS)
  428. | CFG_CS2_PS | MCFCSM_CSCR_AA;
  429. #if (CFG_CS2_RO != 0)
  430. MCFCSM_CSMR2 = MCFCSM_CSMR_BAM(CFG_CS2_SIZE - 1)
  431. | MCFCSM_CSMR_WP | MCFCSM_CSMR_V;
  432. #else
  433. MCFCSM_CSMR2 = MCFCSM_CSMR_BAM(CFG_CS2_SIZE - 1)
  434. | MCFCSM_CSMR_V;
  435. #endif
  436. #else
  437. #warning "Chip Select 2 are not initialized/used"
  438. #endif
  439. #if defined(CFG_CS3_BASE) & defined(CFG_CS3_SIZE) & \
  440. defined(CFG_CS3_WIDTH) & defined(CFG_CS3_RO) & \
  441. defined(CFG_CS3_WS)
  442. MCFCSM_CSAR3 = (CFG_CS3_BASE >> 16) & 0xFFFF;
  443. #if (CFG_CS3_WIDTH == 8)
  444. #define CFG_CS3_PS MCFCSM_CSCR_PS_8
  445. #elif (CFG_CS3_WIDTH == 16)
  446. #define CFG_CS3_PS MCFCSM_CSCR_PS_16
  447. #elif (CFG_CS3_WIDTH == 32)
  448. #define CFG_CS3_PS MCFCSM_CSCR_PS_32
  449. #else
  450. #error "CFG_CS3_WIDTH: Fault - wrong bus with for CS1"
  451. #endif
  452. MCFCSM_CSCR3 = MCFCSM_CSCR_WS(CFG_CS3_WS)
  453. | CFG_CS3_PS | MCFCSM_CSCR_AA;
  454. #if (CFG_CS3_RO != 0)
  455. MCFCSM_CSMR3 = MCFCSM_CSMR_BAM(CFG_CS3_SIZE - 1)
  456. | MCFCSM_CSMR_WP | MCFCSM_CSMR_V;
  457. #else
  458. MCFCSM_CSMR3 = MCFCSM_CSMR_BAM(CFG_CS3_SIZE - 1)
  459. | MCFCSM_CSMR_V;
  460. #endif
  461. #else
  462. #warning "Chip Select 3 are not initialized/used"
  463. #endif
  464. #endif /* CONFIG_MONITOR_IS_IN_RAM */
  465. /* defer enabling cache until boot (see do_go) */
  466. /* icache_enable(); */
  467. }
  468. /*
  469. * initialize higher level parts of CPU like timers
  470. */
  471. int cpu_init_r(void)
  472. {
  473. return (0);
  474. }
  475. void uart_port_conf(void)
  476. {
  477. /* Setup Ports: */
  478. switch (CFG_UART_PORT) {
  479. case 0:
  480. MCFGPIO_PUAPAR &= 0xFc;
  481. MCFGPIO_PUAPAR |= 0x03;
  482. break;
  483. case 1:
  484. MCFGPIO_PUAPAR &= 0xF3;
  485. MCFGPIO_PUAPAR |= 0x0C;
  486. break;
  487. case 2:
  488. MCFGPIO_PASPAR &= 0xFF0F;
  489. MCFGPIO_PASPAR |= 0x00A0;
  490. break;
  491. }
  492. }
  493. #endif
  494. #if defined(CONFIG_M5249)
  495. /*
  496. * Breath some life into the CPU...
  497. *
  498. * Set up the memory map,
  499. * initialize a bunch of registers,
  500. * initialize the UPM's
  501. */
  502. void cpu_init_f(void)
  503. {
  504. /*
  505. * NOTE: by setting the GPIO_FUNCTION registers, we ensure that the UART pins
  506. * (UART0: gpio 30,27, UART1: gpio 31, 28) will be used as UART pins
  507. * which is their primary function.
  508. * ~Jeremy
  509. */
  510. mbar2_writeLong(MCFSIM_GPIO_FUNC, CFG_GPIO_FUNC);
  511. mbar2_writeLong(MCFSIM_GPIO1_FUNC, CFG_GPIO1_FUNC);
  512. mbar2_writeLong(MCFSIM_GPIO_EN, CFG_GPIO_EN);
  513. mbar2_writeLong(MCFSIM_GPIO1_EN, CFG_GPIO1_EN);
  514. mbar2_writeLong(MCFSIM_GPIO_OUT, CFG_GPIO_OUT);
  515. mbar2_writeLong(MCFSIM_GPIO1_OUT, CFG_GPIO1_OUT);
  516. /*
  517. * dBug Compliance:
  518. * You can verify these values by using dBug's 'ird'
  519. * (Internal Register Display) command
  520. * ~Jeremy
  521. *
  522. */
  523. mbar_writeByte(MCFSIM_MPARK, 0x30); /* 5249 Internal Core takes priority over DMA */
  524. mbar_writeByte(MCFSIM_SYPCR, 0x00);
  525. mbar_writeByte(MCFSIM_SWIVR, 0x0f);
  526. mbar_writeByte(MCFSIM_SWSR, 0x00);
  527. mbar_writeLong(MCFSIM_IMR, 0xfffffbff);
  528. mbar_writeByte(MCFSIM_SWDICR, 0x00);
  529. mbar_writeByte(MCFSIM_TIMER1ICR, 0x00);
  530. mbar_writeByte(MCFSIM_TIMER2ICR, 0x88);
  531. mbar_writeByte(MCFSIM_I2CICR, 0x00);
  532. mbar_writeByte(MCFSIM_UART1ICR, 0x00);
  533. mbar_writeByte(MCFSIM_UART2ICR, 0x00);
  534. mbar_writeByte(MCFSIM_ICR6, 0x00);
  535. mbar_writeByte(MCFSIM_ICR7, 0x00);
  536. mbar_writeByte(MCFSIM_ICR8, 0x00);
  537. mbar_writeByte(MCFSIM_ICR9, 0x00);
  538. mbar_writeByte(MCFSIM_QSPIICR, 0x00);
  539. mbar2_writeLong(MCFSIM_GPIO_INT_EN, 0x00000080);
  540. mbar2_writeByte(MCFSIM_INTBASE, 0x40); /* Base interrupts at 64 */
  541. mbar2_writeByte(MCFSIM_SPURVEC, 0x00);
  542. mbar2_writeLong(MCFSIM_IDECONFIG1, 0x00000020); /* Enable a 1 cycle pre-drive cycle on CS1 */
  543. /* Setup interrupt priorities for gpio7 */
  544. /* mbar2_writeLong(MCFSIM_INTLEV5, 0x70000000); */
  545. /* IDE Config registers */
  546. mbar2_writeLong(MCFSIM_IDECONFIG1, 0x00000020);
  547. mbar2_writeLong(MCFSIM_IDECONFIG2, 0x00000000);
  548. /*
  549. * Setup chip selects...
  550. */
  551. mbar_writeShort(MCFSIM_CSAR1, CFG_CSAR1);
  552. mbar_writeShort(MCFSIM_CSCR1, CFG_CSCR1);
  553. mbar_writeLong(MCFSIM_CSMR1, CFG_CSMR1);
  554. mbar_writeShort(MCFSIM_CSAR0, CFG_CSAR0);
  555. mbar_writeShort(MCFSIM_CSCR0, CFG_CSCR0);
  556. mbar_writeLong(MCFSIM_CSMR0, CFG_CSMR0);
  557. /* enable instruction cache now */
  558. icache_enable();
  559. }
  560. /*
  561. * initialize higher level parts of CPU like timers
  562. */
  563. int cpu_init_r(void)
  564. {
  565. return (0);
  566. }
  567. void uart_port_conf(void)
  568. {
  569. /* Setup Ports: */
  570. switch (CFG_UART_PORT) {
  571. case 0:
  572. break;
  573. case 1:
  574. break;
  575. }
  576. }
  577. #endif /* #if defined(CONFIG_M5249) */