1e58fe957SKim Phillips /*
2e58fe957SKim Phillips * Copyright (C) 2006 Freescale Semiconductor, Inc.
3e58fe957SKim Phillips *
4e58fe957SKim Phillips * Dave Liu <daveliu@freescale.com>
5e58fe957SKim Phillips *
61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
7e58fe957SKim Phillips */
8e58fe957SKim Phillips
9e58fe957SKim Phillips #include <common.h>
10e58fe957SKim Phillips #include <ioports.h>
11e58fe957SKim Phillips #include <mpc83xx.h>
12e58fe957SKim Phillips #include <i2c.h>
13e58fe957SKim Phillips #include <miiphy.h>
14e58fe957SKim Phillips #include <command.h>
15e58fe957SKim Phillips #if defined(CONFIG_PCI)
16e58fe957SKim Phillips #include <pci.h>
17e58fe957SKim Phillips #endif
18e58fe957SKim Phillips #include <asm/mmu.h>
19b3458d2cSKim Phillips #if defined(CONFIG_OF_LIBFDT)
20*0e00a84cSMasahiro Yamada #include <linux/libfdt.h>
21e58fe957SKim Phillips #endif
22e58fe957SKim Phillips #if defined(CONFIG_PQ_MDS_PIB)
23e58fe957SKim Phillips #include "../common/pq-mds-pib.h"
24e58fe957SKim Phillips #endif
25e58fe957SKim Phillips
26088454cdSSimon Glass DECLARE_GLOBAL_DATA_PTR;
27088454cdSSimon Glass
28e58fe957SKim Phillips const qe_iop_conf_t qe_iop_conf_tab[] = {
29e58fe957SKim Phillips /* ETH3 */
30e58fe957SKim Phillips {1, 0, 1, 0, 1}, /* TxD0 */
31e58fe957SKim Phillips {1, 1, 1, 0, 1}, /* TxD1 */
32e58fe957SKim Phillips {1, 2, 1, 0, 1}, /* TxD2 */
33e58fe957SKim Phillips {1, 3, 1, 0, 1}, /* TxD3 */
34e58fe957SKim Phillips {1, 9, 1, 0, 1}, /* TxER */
35e58fe957SKim Phillips {1, 12, 1, 0, 1}, /* TxEN */
36e58fe957SKim Phillips {3, 24, 2, 0, 1}, /* TxCLK->CLK10 */
37e58fe957SKim Phillips
38e58fe957SKim Phillips {1, 4, 2, 0, 1}, /* RxD0 */
39e58fe957SKim Phillips {1, 5, 2, 0, 1}, /* RxD1 */
40e58fe957SKim Phillips {1, 6, 2, 0, 1}, /* RxD2 */
41e58fe957SKim Phillips {1, 7, 2, 0, 1}, /* RxD3 */
42e58fe957SKim Phillips {1, 8, 2, 0, 1}, /* RxER */
43e58fe957SKim Phillips {1, 10, 2, 0, 1}, /* RxDV */
44e58fe957SKim Phillips {0, 13, 2, 0, 1}, /* RxCLK->CLK9 */
45e58fe957SKim Phillips {1, 11, 2, 0, 1}, /* COL */
46e58fe957SKim Phillips {1, 13, 2, 0, 1}, /* CRS */
47e58fe957SKim Phillips
48e58fe957SKim Phillips /* ETH4 */
49e58fe957SKim Phillips {1, 18, 1, 0, 1}, /* TxD0 */
50e58fe957SKim Phillips {1, 19, 1, 0, 1}, /* TxD1 */
51e58fe957SKim Phillips {1, 20, 1, 0, 1}, /* TxD2 */
52e58fe957SKim Phillips {1, 21, 1, 0, 1}, /* TxD3 */
53e58fe957SKim Phillips {1, 27, 1, 0, 1}, /* TxER */
54e58fe957SKim Phillips {1, 30, 1, 0, 1}, /* TxEN */
55e58fe957SKim Phillips {3, 6, 2, 0, 1}, /* TxCLK->CLK8 */
56e58fe957SKim Phillips
57e58fe957SKim Phillips {1, 22, 2, 0, 1}, /* RxD0 */
58e58fe957SKim Phillips {1, 23, 2, 0, 1}, /* RxD1 */
59e58fe957SKim Phillips {1, 24, 2, 0, 1}, /* RxD2 */
60e58fe957SKim Phillips {1, 25, 2, 0, 1}, /* RxD3 */
61e58fe957SKim Phillips {1, 26, 1, 0, 1}, /* RxER */
62e58fe957SKim Phillips {1, 28, 2, 0, 1}, /* Rx_DV */
63e58fe957SKim Phillips {3, 31, 2, 0, 1}, /* RxCLK->CLK7 */
64e58fe957SKim Phillips {1, 29, 2, 0, 1}, /* COL */
65e58fe957SKim Phillips {1, 31, 2, 0, 1}, /* CRS */
66e58fe957SKim Phillips
67e58fe957SKim Phillips {3, 4, 3, 0, 2}, /* MDIO */
68e58fe957SKim Phillips {3, 5, 1, 0, 2}, /* MDC */
69e58fe957SKim Phillips
70e58fe957SKim Phillips {0, 0, 0, 0, QE_IOP_TAB_END}, /* END of table */
71e58fe957SKim Phillips };
72e58fe957SKim Phillips
board_early_init_f(void)73e58fe957SKim Phillips int board_early_init_f(void)
74e58fe957SKim Phillips {
756d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile u8 *bcsr = (volatile u8 *)CONFIG_SYS_BCSR;
76e58fe957SKim Phillips
77e58fe957SKim Phillips /* Enable flash write */
78e58fe957SKim Phillips bcsr[9] &= ~0x08;
79e58fe957SKim Phillips
80e58fe957SKim Phillips return 0;
81e58fe957SKim Phillips }
82e58fe957SKim Phillips
board_early_init_r(void)83e58fe957SKim Phillips int board_early_init_r(void)
84e58fe957SKim Phillips {
85e58fe957SKim Phillips #ifdef CONFIG_PQ_MDS_PIB
86e58fe957SKim Phillips pib_init();
87e58fe957SKim Phillips #endif
88e58fe957SKim Phillips return 0;
89e58fe957SKim Phillips }
90e58fe957SKim Phillips
91e58fe957SKim Phillips int fixed_sdram(void);
92e58fe957SKim Phillips
dram_init(void)93f1683aa7SSimon Glass int dram_init(void)
94e58fe957SKim Phillips {
956d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
96e58fe957SKim Phillips u32 msize = 0;
97e58fe957SKim Phillips
98e58fe957SKim Phillips if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im)
99088454cdSSimon Glass return -ENXIO;
100e58fe957SKim Phillips
101e58fe957SKim Phillips /* DDR SDRAM - Main SODIMM */
1026d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_BASE & LAWBAR_BAR;
103e58fe957SKim Phillips
104e58fe957SKim Phillips msize = fixed_sdram();
105e58fe957SKim Phillips
106088454cdSSimon Glass /* set total bus SDRAM size(bytes) -- DDR */
107088454cdSSimon Glass gd->ram_size = msize * 1024 * 1024;
108088454cdSSimon Glass
109088454cdSSimon Glass return 0;
110e58fe957SKim Phillips }
111e58fe957SKim Phillips
112e58fe957SKim Phillips /*************************************************************************
113e58fe957SKim Phillips * fixed sdram init -- doesn't use serial presence detect.
114e58fe957SKim Phillips ************************************************************************/
fixed_sdram(void)115e58fe957SKim Phillips int fixed_sdram(void)
116e58fe957SKim Phillips {
1176d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
118e58fe957SKim Phillips u32 msize = 0;
119e58fe957SKim Phillips u32 ddr_size;
120e58fe957SKim Phillips u32 ddr_size_log2;
121e58fe957SKim Phillips
1226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD msize = CONFIG_SYS_DDR_SIZE;
123e58fe957SKim Phillips for (ddr_size = msize << 20, ddr_size_log2 = 0;
124e58fe957SKim Phillips (ddr_size > 1); ddr_size = ddr_size >> 1, ddr_size_log2++) {
125e58fe957SKim Phillips if (ddr_size & 1) {
126e58fe957SKim Phillips return -1;
127e58fe957SKim Phillips }
128e58fe957SKim Phillips }
129e58fe957SKim Phillips im->sysconf.ddrlaw[0].ar =
130e58fe957SKim Phillips LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
1316d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if (CONFIG_SYS_DDR_SIZE != 128)
132e58fe957SKim Phillips #warning Currenly any ddr size other than 128 is not supported
133e58fe957SKim Phillips #endif
1346d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CNTL;
1356d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.csbnds[0].csbnds = CONFIG_SYS_DDR_CS0_BNDS;
1366d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.cs_config[0] = CONFIG_SYS_DDR_CS0_CONFIG;
1376d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0;
1386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1;
1396d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2;
1406d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3;
1416d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_cfg = CONFIG_SYS_DDR_SDRAM_CFG;
1426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_cfg2 = CONFIG_SYS_DDR_SDRAM_CFG2;
1436d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_mode = CONFIG_SYS_DDR_MODE;
1446d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_mode2 = CONFIG_SYS_DDR_MODE2;
1456d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_interval = CONFIG_SYS_DDR_INTERVAL;
146e58fe957SKim Phillips __asm__ __volatile__ ("sync");
147e58fe957SKim Phillips udelay(200);
148e58fe957SKim Phillips
149e58fe957SKim Phillips im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
150e58fe957SKim Phillips __asm__ __volatile__ ("sync");
151e58fe957SKim Phillips return msize;
152e58fe957SKim Phillips }
153e58fe957SKim Phillips
checkboard(void)154e58fe957SKim Phillips int checkboard(void)
155e58fe957SKim Phillips {
156e58fe957SKim Phillips puts("Board: Freescale MPC832XEMDS\n");
157e58fe957SKim Phillips return 0;
158e58fe957SKim Phillips }
159e58fe957SKim Phillips
160e58fe957SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,bd_t * bd)161e895a4b0SSimon Glass int ft_board_setup(void *blob, bd_t *bd)
162e58fe957SKim Phillips {
163e58fe957SKim Phillips ft_cpu_setup(blob, bd);
164e58fe957SKim Phillips #ifdef CONFIG_PCI
165e58fe957SKim Phillips ft_pci_setup(blob, bd);
166e58fe957SKim Phillips #endif
167e895a4b0SSimon Glass
168e895a4b0SSimon Glass return 0;
169e58fe957SKim Phillips }
170e58fe957SKim Phillips #endif
171