1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * (C) Copyright 2013-2015, Freescale Semiconductor, Inc.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <asm/io.h>
9*4882a593Smuzhiyun #include <asm/arch/imx-regs.h>
10*4882a593Smuzhiyun #include <asm/arch/siul.h>
11*4882a593Smuzhiyun #include <asm/arch/lpddr2.h>
12*4882a593Smuzhiyun #include <asm/arch/clock.h>
13*4882a593Smuzhiyun #include <mmc.h>
14*4882a593Smuzhiyun #include <fsl_esdhc.h>
15*4882a593Smuzhiyun #include <miiphy.h>
16*4882a593Smuzhiyun #include <netdev.h>
17*4882a593Smuzhiyun #include <i2c.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
20*4882a593Smuzhiyun
setup_iomux_ddr(void)21*4882a593Smuzhiyun void setup_iomux_ddr(void)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun lpddr2_config_iomux(DDR0);
24*4882a593Smuzhiyun lpddr2_config_iomux(DDR1);
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun
ddr_phy_init(void)28*4882a593Smuzhiyun void ddr_phy_init(void)
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun }
31*4882a593Smuzhiyun
ddr_ctrl_init(void)32*4882a593Smuzhiyun void ddr_ctrl_init(void)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun config_mmdc(0);
35*4882a593Smuzhiyun config_mmdc(1);
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun
dram_init(void)38*4882a593Smuzhiyun int dram_init(void)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun setup_iomux_ddr();
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun ddr_ctrl_init();
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun return 0;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun
setup_iomux_uart(void)49*4882a593Smuzhiyun static void setup_iomux_uart(void)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun /* Muxing for linflex */
52*4882a593Smuzhiyun /* Replace the magic values after bringup */
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun /* set TXD - MSCR[12] PA12 */
55*4882a593Smuzhiyun writel(SIUL2_UART_TXD, SIUL2_MSCRn(SIUL2_UART0_TXD_PAD));
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun /* set RXD - MSCR[11] - PA11 */
58*4882a593Smuzhiyun writel(SIUL2_UART_MSCR_RXD, SIUL2_MSCRn(SIUL2_UART0_MSCR_RXD_PAD));
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun /* set RXD - IMCR[200] - 200 */
61*4882a593Smuzhiyun writel(SIUL2_UART_IMCR_RXD, SIUL2_IMCRn(SIUL2_UART0_IMCR_RXD_PAD));
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun
setup_iomux_enet(void)64*4882a593Smuzhiyun static void setup_iomux_enet(void)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun
setup_iomux_i2c(void)68*4882a593Smuzhiyun static void setup_iomux_i2c(void)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun #ifdef CONFIG_SYS_USE_NAND
setup_iomux_nfc(void)73*4882a593Smuzhiyun void setup_iomux_nfc(void)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun #endif
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun #ifdef CONFIG_FSL_ESDHC
79*4882a593Smuzhiyun struct fsl_esdhc_cfg esdhc_cfg[1] = {
80*4882a593Smuzhiyun {USDHC_BASE_ADDR},
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun
board_mmc_getcd(struct mmc * mmc)83*4882a593Smuzhiyun int board_mmc_getcd(struct mmc *mmc)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun /* eSDHC1 is always present */
86*4882a593Smuzhiyun return 1;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun
board_mmc_init(bd_t * bis)89*4882a593Smuzhiyun int board_mmc_init(bd_t * bis)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_USDHC_CLK);
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun /* Set iomux PADS for USDHC */
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun /* PK6 pad: uSDHC clk */
96*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_CLK, SIUL2_MSCRn(150));
97*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(902));
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun /* PK7 pad: uSDHC CMD */
100*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_CMD, SIUL2_MSCRn(151));
101*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(901));
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun /* PK8 pad: uSDHC DAT0 */
104*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_DAT0_3, SIUL2_MSCRn(152));
105*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(903));
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun /* PK9 pad: uSDHC DAT1 */
108*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_DAT0_3, SIUL2_MSCRn(153));
109*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(904));
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun /* PK10 pad: uSDHC DAT2 */
112*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_DAT0_3, SIUL2_MSCRn(154));
113*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(905));
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun /* PK11 pad: uSDHC DAT3 */
116*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_DAT0_3, SIUL2_MSCRn(155));
117*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(906));
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun /* PK15 pad: uSDHC DAT4 */
120*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_DAT4_7, SIUL2_MSCRn(159));
121*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(907));
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun /* PL0 pad: uSDHC DAT5 */
124*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_DAT4_7, SIUL2_MSCRn(160));
125*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(908));
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun /* PL1 pad: uSDHC DAT6 */
128*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_DAT4_7, SIUL2_MSCRn(161));
129*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(909));
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /* PL2 pad: uSDHC DAT7 */
132*4882a593Smuzhiyun writel(SIUL2_USDHC_PAD_CTRL_DAT4_7, SIUL2_MSCRn(162));
133*4882a593Smuzhiyun writel(0x3, SIUL2_MSCRn(910));
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun #endif
138*4882a593Smuzhiyun
mscm_init(void)139*4882a593Smuzhiyun static void mscm_init(void)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun struct mscm_ir *mscmir = (struct mscm_ir *)MSCM_BASE_ADDR;
142*4882a593Smuzhiyun int i;
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun for (i = 0; i < MSCM_IRSPRC_NUM; i++)
145*4882a593Smuzhiyun writew(MSCM_IRSPRC_CPn_EN, &mscmir->irsprc[i]);
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
board_phy_config(struct phy_device * phydev)148*4882a593Smuzhiyun int board_phy_config(struct phy_device *phydev)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun if (phydev->drv->config)
151*4882a593Smuzhiyun phydev->drv->config(phydev);
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun return 0;
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun
board_early_init_f(void)156*4882a593Smuzhiyun int board_early_init_f(void)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun clock_init();
159*4882a593Smuzhiyun mscm_init();
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun setup_iomux_uart();
162*4882a593Smuzhiyun setup_iomux_enet();
163*4882a593Smuzhiyun setup_iomux_i2c();
164*4882a593Smuzhiyun #ifdef CONFIG_SYS_USE_NAND
165*4882a593Smuzhiyun setup_iomux_nfc();
166*4882a593Smuzhiyun #endif
167*4882a593Smuzhiyun return 0;
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun
board_init(void)170*4882a593Smuzhiyun int board_init(void)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun /* address of boot parameters */
173*4882a593Smuzhiyun gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun return 0;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
checkboard(void)178*4882a593Smuzhiyun int checkboard(void)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun puts("Board: s32v234evb\n");
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun return 0;
183*4882a593Smuzhiyun }
184