1938080dcSJason Liu /*
2938080dcSJason Liu * Copyright (C) 2011 Freescale Semiconductor, Inc.
3938080dcSJason Liu * Jason Liu <r64343@freescale.com>
4938080dcSJason Liu *
51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
6938080dcSJason Liu */
7938080dcSJason Liu
8938080dcSJason Liu #include <common.h>
9938080dcSJason Liu #include <asm/io.h>
10938080dcSJason Liu #include <asm/arch/imx-regs.h>
11938080dcSJason Liu #include <asm/arch/sys_proto.h>
12938080dcSJason Liu #include <asm/arch/crm_regs.h>
13f92e4e6cSStefano Babic #include <asm/arch/clock.h>
14721d0b00SBenoît Thébaudeau #include <asm/arch/iomux-mx53.h>
15938080dcSJason Liu #include <asm/arch/clock.h>
161221ce45SMasahiro Yamada #include <linux/errno.h>
17552a848eSStefano Babic #include <asm/mach-imx/mx5_video.h>
18938080dcSJason Liu #include <netdev.h>
19938080dcSJason Liu #include <i2c.h>
20938080dcSJason Liu #include <mmc.h>
21938080dcSJason Liu #include <fsl_esdhc.h>
2250410078SStefano Babic #include <asm/gpio.h>
23c7336815SŁukasz Majewski #include <power/pmic.h>
24e7e33722SFabio Estevam #include <dialog_pmic.h>
255b547f3cSFabio Estevam #include <fsl_pmic.h>
26f714b0a9SFabio Estevam #include <linux/fb.h>
27f714b0a9SFabio Estevam #include <ipu_pixfmt.h>
28f714b0a9SFabio Estevam
293ef0a312SFabio Estevam #define MX53LOCO_LCD_POWER IMX_GPIO_NR(3, 24)
30938080dcSJason Liu
31938080dcSJason Liu DECLARE_GLOBAL_DATA_PTR;
32938080dcSJason Liu
3331c832f9SMarek Vasut static uint32_t mx53_dram_size[2];
3431c832f9SMarek Vasut
get_effective_memsize(void)3531c832f9SMarek Vasut phys_size_t get_effective_memsize(void)
3631c832f9SMarek Vasut {
3731c832f9SMarek Vasut /*
3831c832f9SMarek Vasut * WARNING: We must override get_effective_memsize() function here
3931c832f9SMarek Vasut * to report only the size of the first DRAM bank. This is to make
4031c832f9SMarek Vasut * U-Boot relocator place U-Boot into valid memory, that is, at the
4131c832f9SMarek Vasut * end of the first DRAM bank. If we did not override this function
4231c832f9SMarek Vasut * like so, U-Boot would be placed at the address of the first DRAM
4331c832f9SMarek Vasut * bank + total DRAM size - sizeof(uboot), which in the setup where
4431c832f9SMarek Vasut * each DRAM bank contains 512MiB of DRAM would result in placing
4531c832f9SMarek Vasut * U-Boot into invalid memory area close to the end of the first
4631c832f9SMarek Vasut * DRAM bank.
4731c832f9SMarek Vasut */
4831c832f9SMarek Vasut return mx53_dram_size[0];
4931c832f9SMarek Vasut }
5031c832f9SMarek Vasut
dram_init(void)51938080dcSJason Liu int dram_init(void)
52938080dcSJason Liu {
5331c832f9SMarek Vasut mx53_dram_size[0] = get_ram_size((void *)PHYS_SDRAM_1, 1 << 30);
5431c832f9SMarek Vasut mx53_dram_size[1] = get_ram_size((void *)PHYS_SDRAM_2, 1 << 30);
55938080dcSJason Liu
5631c832f9SMarek Vasut gd->ram_size = mx53_dram_size[0] + mx53_dram_size[1];
57938080dcSJason Liu
58938080dcSJason Liu return 0;
59938080dcSJason Liu }
6031c832f9SMarek Vasut
dram_init_banksize(void)6176b00acaSSimon Glass int dram_init_banksize(void)
62938080dcSJason Liu {
63938080dcSJason Liu gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
6431c832f9SMarek Vasut gd->bd->bi_dram[0].size = mx53_dram_size[0];
65938080dcSJason Liu
66938080dcSJason Liu gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
6731c832f9SMarek Vasut gd->bd->bi_dram[1].size = mx53_dram_size[1];
6876b00acaSSimon Glass
6976b00acaSSimon Glass return 0;
70938080dcSJason Liu }
71938080dcSJason Liu
get_board_rev(void)7254cd1deeSFabio Estevam u32 get_board_rev(void)
7354cd1deeSFabio Estevam {
7454cd1deeSFabio Estevam struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
7554cd1deeSFabio Estevam struct fuse_bank *bank = &iim->bank[0];
7654cd1deeSFabio Estevam struct fuse_bank0_regs *fuse =
7754cd1deeSFabio Estevam (struct fuse_bank0_regs *)bank->fuse_regs;
7854cd1deeSFabio Estevam
7954cd1deeSFabio Estevam int rev = readl(&fuse->gp[6]);
8054cd1deeSFabio Estevam
81eae08eb2SFabio Estevam if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR))
82eae08eb2SFabio Estevam rev = 0;
83eae08eb2SFabio Estevam
8454cd1deeSFabio Estevam return (get_cpu_rev() & ~(0xF << 8)) | (rev & 0xF) << 8;
8554cd1deeSFabio Estevam }
8654cd1deeSFabio Estevam
87721d0b00SBenoît Thébaudeau #define UART_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
88721d0b00SBenoît Thébaudeau PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
89721d0b00SBenoît Thébaudeau
setup_iomux_uart(void)90938080dcSJason Liu static void setup_iomux_uart(void)
91938080dcSJason Liu {
92721d0b00SBenoît Thébaudeau static const iomux_v3_cfg_t uart_pads[] = {
93721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_CSI0_DAT11__UART1_RXD_MUX, UART_PAD_CTRL),
94721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_CSI0_DAT10__UART1_TXD_MUX, UART_PAD_CTRL),
95721d0b00SBenoît Thébaudeau };
96938080dcSJason Liu
97721d0b00SBenoît Thébaudeau imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
98938080dcSJason Liu }
99938080dcSJason Liu
10045cf6adaSWolfgang Grandegger #ifdef CONFIG_USB_EHCI_MX5
board_ehci_hcd_init(int port)10160bae5efSAnatolij Gustschin int board_ehci_hcd_init(int port)
10245cf6adaSWolfgang Grandegger {
1036ecaee82SFabio Estevam /* request VBUS power enable pin, GPIO7_8 */
104721d0b00SBenoît Thébaudeau imx_iomux_v3_setup_pad(MX53_PAD_PATA_DA_2__GPIO7_8);
105721d0b00SBenoît Thébaudeau gpio_direction_output(IMX_GPIO_NR(7, 8), 1);
10660bae5efSAnatolij Gustschin return 0;
10745cf6adaSWolfgang Grandegger }
10845cf6adaSWolfgang Grandegger #endif
10945cf6adaSWolfgang Grandegger
setup_iomux_fec(void)110938080dcSJason Liu static void setup_iomux_fec(void)
111938080dcSJason Liu {
112721d0b00SBenoît Thébaudeau static const iomux_v3_cfg_t fec_pads[] = {
113721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_MDIO__FEC_MDIO, PAD_CTL_HYS |
114721d0b00SBenoît Thébaudeau PAD_CTL_DSE_HIGH | PAD_CTL_PUS_22K_UP | PAD_CTL_ODE),
115721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_MDC__FEC_MDC, PAD_CTL_DSE_HIGH),
116721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_RXD1__FEC_RDATA_1,
117721d0b00SBenoît Thébaudeau PAD_CTL_HYS | PAD_CTL_PKE),
118721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_RXD0__FEC_RDATA_0,
119721d0b00SBenoît Thébaudeau PAD_CTL_HYS | PAD_CTL_PKE),
120721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_TXD1__FEC_TDATA_1, PAD_CTL_DSE_HIGH),
121721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_TXD0__FEC_TDATA_0, PAD_CTL_DSE_HIGH),
122721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_TX_EN__FEC_TX_EN, PAD_CTL_DSE_HIGH),
123721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_REF_CLK__FEC_TX_CLK,
124721d0b00SBenoît Thébaudeau PAD_CTL_HYS | PAD_CTL_PKE),
125721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_RX_ER__FEC_RX_ER,
126721d0b00SBenoît Thébaudeau PAD_CTL_HYS | PAD_CTL_PKE),
127721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_FEC_CRS_DV__FEC_RX_DV,
128721d0b00SBenoît Thébaudeau PAD_CTL_HYS | PAD_CTL_PKE),
129721d0b00SBenoît Thébaudeau };
130938080dcSJason Liu
131721d0b00SBenoît Thébaudeau imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
132938080dcSJason Liu }
133938080dcSJason Liu
134938080dcSJason Liu #ifdef CONFIG_FSL_ESDHC
135938080dcSJason Liu struct fsl_esdhc_cfg esdhc_cfg[2] = {
13616e43f35SBenoît Thébaudeau {MMC_SDHC1_BASE_ADDR},
13716e43f35SBenoît Thébaudeau {MMC_SDHC3_BASE_ADDR},
138938080dcSJason Liu };
139938080dcSJason Liu
board_mmc_getcd(struct mmc * mmc)140314284b1SThierry Reding int board_mmc_getcd(struct mmc *mmc)
141938080dcSJason Liu {
142938080dcSJason Liu struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
143314284b1SThierry Reding int ret;
144938080dcSJason Liu
145721d0b00SBenoît Thébaudeau imx_iomux_v3_setup_pad(MX53_PAD_EIM_DA11__GPIO3_11);
14692550708SAshok Kumar Reddy gpio_direction_input(IMX_GPIO_NR(3, 11));
147721d0b00SBenoît Thébaudeau imx_iomux_v3_setup_pad(MX53_PAD_EIM_DA13__GPIO3_13);
14892550708SAshok Kumar Reddy gpio_direction_input(IMX_GPIO_NR(3, 13));
14973128aadSFabio Estevam
150938080dcSJason Liu if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
15192550708SAshok Kumar Reddy ret = !gpio_get_value(IMX_GPIO_NR(3, 13));
152938080dcSJason Liu else
15392550708SAshok Kumar Reddy ret = !gpio_get_value(IMX_GPIO_NR(3, 11));
154938080dcSJason Liu
155314284b1SThierry Reding return ret;
156938080dcSJason Liu }
157938080dcSJason Liu
158721d0b00SBenoît Thébaudeau #define SD_CMD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
159721d0b00SBenoît Thébaudeau PAD_CTL_PUS_100K_UP)
160721d0b00SBenoît Thébaudeau #define SD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
161721d0b00SBenoît Thébaudeau PAD_CTL_DSE_HIGH)
162721d0b00SBenoît Thébaudeau
board_mmc_init(bd_t * bis)163938080dcSJason Liu int board_mmc_init(bd_t *bis)
164938080dcSJason Liu {
165721d0b00SBenoît Thébaudeau static const iomux_v3_cfg_t sd1_pads[] = {
166721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_SD1_CMD__ESDHC1_CMD, SD_CMD_PAD_CTRL),
167721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_SD1_CLK__ESDHC1_CLK, SD_PAD_CTRL),
168721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_SD1_DATA0__ESDHC1_DAT0, SD_PAD_CTRL),
169721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_SD1_DATA1__ESDHC1_DAT1, SD_PAD_CTRL),
170721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_SD1_DATA2__ESDHC1_DAT2, SD_PAD_CTRL),
171721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_SD1_DATA3__ESDHC1_DAT3, SD_PAD_CTRL),
172721d0b00SBenoît Thébaudeau MX53_PAD_EIM_DA13__GPIO3_13,
173721d0b00SBenoît Thébaudeau };
174721d0b00SBenoît Thébaudeau
175721d0b00SBenoît Thébaudeau static const iomux_v3_cfg_t sd2_pads[] = {
176721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_RESET_B__ESDHC3_CMD,
177721d0b00SBenoît Thébaudeau SD_CMD_PAD_CTRL),
178721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_IORDY__ESDHC3_CLK, SD_PAD_CTRL),
179721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_DATA8__ESDHC3_DAT0, SD_PAD_CTRL),
180721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_DATA9__ESDHC3_DAT1, SD_PAD_CTRL),
181721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_DATA10__ESDHC3_DAT2, SD_PAD_CTRL),
182721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_DATA11__ESDHC3_DAT3, SD_PAD_CTRL),
183721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_DATA0__ESDHC3_DAT4, SD_PAD_CTRL),
184721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_DATA1__ESDHC3_DAT5, SD_PAD_CTRL),
185721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_DATA2__ESDHC3_DAT6, SD_PAD_CTRL),
186721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_PATA_DATA3__ESDHC3_DAT7, SD_PAD_CTRL),
187721d0b00SBenoît Thébaudeau MX53_PAD_EIM_DA11__GPIO3_11,
188721d0b00SBenoît Thébaudeau };
189721d0b00SBenoît Thébaudeau
190938080dcSJason Liu u32 index;
1911769502bSFabio Estevam int ret;
192938080dcSJason Liu
193a2ac1b3aSBenoît Thébaudeau esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
194a2ac1b3aSBenoît Thébaudeau esdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
195a2ac1b3aSBenoît Thébaudeau
196938080dcSJason Liu for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; index++) {
197938080dcSJason Liu switch (index) {
198938080dcSJason Liu case 0:
199721d0b00SBenoît Thébaudeau imx_iomux_v3_setup_multiple_pads(sd1_pads,
200721d0b00SBenoît Thébaudeau ARRAY_SIZE(sd1_pads));
201938080dcSJason Liu break;
202938080dcSJason Liu case 1:
203721d0b00SBenoît Thébaudeau imx_iomux_v3_setup_multiple_pads(sd2_pads,
204721d0b00SBenoît Thébaudeau ARRAY_SIZE(sd2_pads));
205938080dcSJason Liu break;
206938080dcSJason Liu default:
207938080dcSJason Liu printf("Warning: you configured more ESDHC controller"
208938080dcSJason Liu "(%d) as supported by the board(2)\n",
209938080dcSJason Liu CONFIG_SYS_FSL_ESDHC_NUM);
2101769502bSFabio Estevam return -EINVAL;
211938080dcSJason Liu }
2121769502bSFabio Estevam ret = fsl_esdhc_initialize(bis, &esdhc_cfg[index]);
2131769502bSFabio Estevam if (ret)
2141769502bSFabio Estevam return ret;
215938080dcSJason Liu }
216938080dcSJason Liu
2171769502bSFabio Estevam return 0;
218938080dcSJason Liu }
219938080dcSJason Liu #endif
220938080dcSJason Liu
221721d0b00SBenoît Thébaudeau #define I2C_PAD_CTRL (PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | \
222721d0b00SBenoît Thébaudeau PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
223721d0b00SBenoît Thébaudeau
setup_iomux_i2c(void)224e7e33722SFabio Estevam static void setup_iomux_i2c(void)
225e7e33722SFabio Estevam {
226721d0b00SBenoît Thébaudeau static const iomux_v3_cfg_t i2c1_pads[] = {
227721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_CSI0_DAT8__I2C1_SDA, I2C_PAD_CTRL),
228721d0b00SBenoît Thébaudeau NEW_PAD_CTRL(MX53_PAD_CSI0_DAT9__I2C1_SCL, I2C_PAD_CTRL),
229721d0b00SBenoît Thébaudeau };
230721d0b00SBenoît Thébaudeau
231721d0b00SBenoît Thébaudeau imx_iomux_v3_setup_multiple_pads(i2c1_pads, ARRAY_SIZE(i2c1_pads));
232e7e33722SFabio Estevam }
233e7e33722SFabio Estevam
power_init(void)234e7e33722SFabio Estevam static int power_init(void)
235e7e33722SFabio Estevam {
2365b547f3cSFabio Estevam unsigned int val;
237085e728aSFabio Estevam int ret;
238e7e33722SFabio Estevam struct pmic *p;
239e7e33722SFabio Estevam
2405b547f3cSFabio Estevam if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR)) {
241d2292510SFabio Estevam ret = pmic_dialog_init(I2C_PMIC);
242d2292510SFabio Estevam if (ret)
243d2292510SFabio Estevam return ret;
244c7336815SŁukasz Majewski
245c7336815SŁukasz Majewski p = pmic_get("DIALOG_PMIC");
246c7336815SŁukasz Majewski if (!p)
247c7336815SŁukasz Majewski return -ENODEV;
248e7e33722SFabio Estevam
249*382bee57SSimon Glass env_set("fdt_file", "imx53-qsb.dtb");
2504ccaf5ddSFabio Estevam
251e7e33722SFabio Estevam /* Set VDDA to 1.25V */
252e7e33722SFabio Estevam val = DA9052_BUCKCORE_BCOREEN | DA_BUCKCORE_VBCORE_1_250V;
253e7e33722SFabio Estevam ret = pmic_reg_write(p, DA9053_BUCKCORE_REG, val);
254085e728aSFabio Estevam if (ret) {
255085e728aSFabio Estevam printf("Writing to BUCKCORE_REG failed: %d\n", ret);
256085e728aSFabio Estevam return ret;
257085e728aSFabio Estevam }
258e7e33722SFabio Estevam
259085e728aSFabio Estevam pmic_reg_read(p, DA9053_SUPPLY_REG, &val);
260e7e33722SFabio Estevam val |= DA9052_SUPPLY_VBCOREGO;
261085e728aSFabio Estevam ret = pmic_reg_write(p, DA9053_SUPPLY_REG, val);
262085e728aSFabio Estevam if (ret) {
263085e728aSFabio Estevam printf("Writing to SUPPLY_REG failed: %d\n", ret);
264085e728aSFabio Estevam return ret;
265085e728aSFabio Estevam }
266e7e33722SFabio Estevam
2675b547f3cSFabio Estevam /* Set Vcc peripheral to 1.30V */
268085e728aSFabio Estevam ret = pmic_reg_write(p, DA9053_BUCKPRO_REG, 0x62);
269085e728aSFabio Estevam if (ret) {
270085e728aSFabio Estevam printf("Writing to BUCKPRO_REG failed: %d\n", ret);
271085e728aSFabio Estevam return ret;
272085e728aSFabio Estevam }
273085e728aSFabio Estevam
274085e728aSFabio Estevam ret = pmic_reg_write(p, DA9053_SUPPLY_REG, 0x62);
275085e728aSFabio Estevam if (ret) {
276085e728aSFabio Estevam printf("Writing to SUPPLY_REG failed: %d\n", ret);
277085e728aSFabio Estevam return ret;
278085e728aSFabio Estevam }
279085e728aSFabio Estevam
280085e728aSFabio Estevam return ret;
2815b547f3cSFabio Estevam }
2825b547f3cSFabio Estevam
2835b547f3cSFabio Estevam if (!i2c_probe(CONFIG_SYS_FSL_PMIC_I2C_ADDR)) {
284570aa2faSFabio Estevam ret = pmic_init(I2C_0);
285d2292510SFabio Estevam if (ret)
286d2292510SFabio Estevam return ret;
287c7336815SŁukasz Majewski
2888965112bSFabio Estevam p = pmic_get("FSL_PMIC");
289c7336815SŁukasz Majewski if (!p)
290c7336815SŁukasz Majewski return -ENODEV;
2915b547f3cSFabio Estevam
292*382bee57SSimon Glass env_set("fdt_file", "imx53-qsrb.dtb");
2934ccaf5ddSFabio Estevam
2945b547f3cSFabio Estevam /* Set VDDGP to 1.25V for 1GHz on SW1 */
2955b547f3cSFabio Estevam pmic_reg_read(p, REG_SW_0, &val);
2965b547f3cSFabio Estevam val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_250V_MC34708;
2975b547f3cSFabio Estevam ret = pmic_reg_write(p, REG_SW_0, val);
298085e728aSFabio Estevam if (ret) {
299085e728aSFabio Estevam printf("Writing to REG_SW_0 failed: %d\n", ret);
300085e728aSFabio Estevam return ret;
301085e728aSFabio Estevam }
3025b547f3cSFabio Estevam
3035b547f3cSFabio Estevam /* Set VCC as 1.30V on SW2 */
3045b547f3cSFabio Estevam pmic_reg_read(p, REG_SW_1, &val);
3055b547f3cSFabio Estevam val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_300V_MC34708;
306085e728aSFabio Estevam ret = pmic_reg_write(p, REG_SW_1, val);
307085e728aSFabio Estevam if (ret) {
308085e728aSFabio Estevam printf("Writing to REG_SW_1 failed: %d\n", ret);
309085e728aSFabio Estevam return ret;
310085e728aSFabio Estevam }
3115b547f3cSFabio Estevam
3125b547f3cSFabio Estevam /* Set global reset timer to 4s */
3135b547f3cSFabio Estevam pmic_reg_read(p, REG_POWER_CTL2, &val);
3145b547f3cSFabio Estevam val = (val & ~TIMER_MASK_MC34708) | TIMER_4S_MC34708;
315085e728aSFabio Estevam ret = pmic_reg_write(p, REG_POWER_CTL2, val);
316085e728aSFabio Estevam if (ret) {
317085e728aSFabio Estevam printf("Writing to REG_POWER_CTL2 failed: %d\n", ret);
318085e728aSFabio Estevam return ret;
319085e728aSFabio Estevam }
320768a0597SFabio Estevam
321768a0597SFabio Estevam /* Set VUSBSEL and VUSBEN for USB PHY supply*/
322768a0597SFabio Estevam pmic_reg_read(p, REG_MODE_0, &val);
323768a0597SFabio Estevam val |= (VUSBSEL_MC34708 | VUSBEN_MC34708);
324085e728aSFabio Estevam ret = pmic_reg_write(p, REG_MODE_0, val);
325085e728aSFabio Estevam if (ret) {
326085e728aSFabio Estevam printf("Writing to REG_MODE_0 failed: %d\n", ret);
327085e728aSFabio Estevam return ret;
328085e728aSFabio Estevam }
329768a0597SFabio Estevam
330768a0597SFabio Estevam /* Set SWBST to 5V in auto mode */
331768a0597SFabio Estevam val = SWBST_AUTO;
332085e728aSFabio Estevam ret = pmic_reg_write(p, SWBST_CTRL, val);
333085e728aSFabio Estevam if (ret) {
334085e728aSFabio Estevam printf("Writing to SWBST_CTRL failed: %d\n", ret);
335085e728aSFabio Estevam return ret;
3365b547f3cSFabio Estevam }
337e7e33722SFabio Estevam
338e7e33722SFabio Estevam return ret;
339e7e33722SFabio Estevam }
340e7e33722SFabio Estevam
341085e728aSFabio Estevam return -1;
342085e728aSFabio Estevam }
343085e728aSFabio Estevam
clock_1GHz(void)344e7e33722SFabio Estevam static void clock_1GHz(void)
345e7e33722SFabio Estevam {
346e7e33722SFabio Estevam int ret;
347833b6435SBenoît Thébaudeau u32 ref_clk = MXC_HCLK;
348e7e33722SFabio Estevam /*
349e7e33722SFabio Estevam * After increasing voltage to 1.25V, we can switch
350e7e33722SFabio Estevam * CPU clock to 1GHz and DDR to 400MHz safely
351e7e33722SFabio Estevam */
352e7e33722SFabio Estevam ret = mxc_set_clock(ref_clk, 1000, MXC_ARM_CLK);
353e7e33722SFabio Estevam if (ret)
354e7e33722SFabio Estevam printf("CPU: Switch CPU clock to 1GHZ failed\n");
355e7e33722SFabio Estevam
356e7e33722SFabio Estevam ret = mxc_set_clock(ref_clk, 400, MXC_PERIPH_CLK);
357e7e33722SFabio Estevam ret |= mxc_set_clock(ref_clk, 400, MXC_DDR_CLK);
358e7e33722SFabio Estevam if (ret)
359e7e33722SFabio Estevam printf("CPU: Switch DDR clock to 400MHz failed\n");
360e7e33722SFabio Estevam }
361e7e33722SFabio Estevam
board_early_init_f(void)362938080dcSJason Liu int board_early_init_f(void)
363938080dcSJason Liu {
364938080dcSJason Liu setup_iomux_uart();
365938080dcSJason Liu setup_iomux_fec();
36630ea4be9SVikram Narayanan setup_iomux_lcd();
367938080dcSJason Liu
368938080dcSJason Liu return 0;
369938080dcSJason Liu }
370938080dcSJason Liu
3713e077370SStefano Babic /*
3723e077370SStefano Babic * Do not overwrite the console
3733e077370SStefano Babic * Use always serial for U-Boot console
3743e077370SStefano Babic */
overwrite_console(void)3753e077370SStefano Babic int overwrite_console(void)
3761fc56f1cSFabio Estevam {
3773e077370SStefano Babic return 1;
3781fc56f1cSFabio Estevam }
3791fc56f1cSFabio Estevam
board_init(void)380938080dcSJason Liu int board_init(void)
381938080dcSJason Liu {
382938080dcSJason Liu gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
383938080dcSJason Liu
384f92e4e6cSStefano Babic mxc_set_sata_internal_clock();
385eae08eb2SFabio Estevam setup_iomux_i2c();
38654bb8411SFabio Estevam
38754bb8411SFabio Estevam return 0;
38854bb8411SFabio Estevam }
38954bb8411SFabio Estevam
board_late_init(void)39054bb8411SFabio Estevam int board_late_init(void)
39154bb8411SFabio Estevam {
392eae08eb2SFabio Estevam if (!power_init())
393eae08eb2SFabio Estevam clock_1GHz();
394f92e4e6cSStefano Babic
395938080dcSJason Liu return 0;
396938080dcSJason Liu }
397938080dcSJason Liu
checkboard(void)398938080dcSJason Liu int checkboard(void)
399938080dcSJason Liu {
400938080dcSJason Liu puts("Board: MX53 LOCO\n");
401938080dcSJason Liu
402938080dcSJason Liu return 0;
403938080dcSJason Liu }
404