1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2011 Freescale Semiconductor, Inc.
3*4882a593Smuzhiyun * Jason Liu <r64343@freescale.com>
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <asm/io.h>
10*4882a593Smuzhiyun #include <asm/arch/imx-regs.h>
11*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
12*4882a593Smuzhiyun #include <asm/arch/crm_regs.h>
13*4882a593Smuzhiyun #include <asm/arch/clock.h>
14*4882a593Smuzhiyun #include <asm/arch/iomux-mx53.h>
15*4882a593Smuzhiyun #include <asm/arch/clock.h>
16*4882a593Smuzhiyun #include <linux/errno.h>
17*4882a593Smuzhiyun #include <asm/mach-imx/mx5_video.h>
18*4882a593Smuzhiyun #include <netdev.h>
19*4882a593Smuzhiyun #include <i2c.h>
20*4882a593Smuzhiyun #include <mmc.h>
21*4882a593Smuzhiyun #include <fsl_esdhc.h>
22*4882a593Smuzhiyun #include <asm/gpio.h>
23*4882a593Smuzhiyun #include <power/pmic.h>
24*4882a593Smuzhiyun #include <dialog_pmic.h>
25*4882a593Smuzhiyun #include <fsl_pmic.h>
26*4882a593Smuzhiyun #include <linux/fb.h>
27*4882a593Smuzhiyun #include <ipu_pixfmt.h>
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #define MX53LOCO_LCD_POWER IMX_GPIO_NR(3, 24)
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun static uint32_t mx53_dram_size[2];
34*4882a593Smuzhiyun
get_effective_memsize(void)35*4882a593Smuzhiyun phys_size_t get_effective_memsize(void)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun /*
38*4882a593Smuzhiyun * WARNING: We must override get_effective_memsize() function here
39*4882a593Smuzhiyun * to report only the size of the first DRAM bank. This is to make
40*4882a593Smuzhiyun * U-Boot relocator place U-Boot into valid memory, that is, at the
41*4882a593Smuzhiyun * end of the first DRAM bank. If we did not override this function
42*4882a593Smuzhiyun * like so, U-Boot would be placed at the address of the first DRAM
43*4882a593Smuzhiyun * bank + total DRAM size - sizeof(uboot), which in the setup where
44*4882a593Smuzhiyun * each DRAM bank contains 512MiB of DRAM would result in placing
45*4882a593Smuzhiyun * U-Boot into invalid memory area close to the end of the first
46*4882a593Smuzhiyun * DRAM bank.
47*4882a593Smuzhiyun */
48*4882a593Smuzhiyun return mx53_dram_size[0];
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun
dram_init(void)51*4882a593Smuzhiyun int dram_init(void)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun mx53_dram_size[0] = get_ram_size((void *)PHYS_SDRAM_1, 1 << 30);
54*4882a593Smuzhiyun mx53_dram_size[1] = get_ram_size((void *)PHYS_SDRAM_2, 1 << 30);
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun gd->ram_size = mx53_dram_size[0] + mx53_dram_size[1];
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun return 0;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
dram_init_banksize(void)61*4882a593Smuzhiyun int dram_init_banksize(void)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
64*4882a593Smuzhiyun gd->bd->bi_dram[0].size = mx53_dram_size[0];
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
67*4882a593Smuzhiyun gd->bd->bi_dram[1].size = mx53_dram_size[1];
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun return 0;
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun
get_board_rev(void)72*4882a593Smuzhiyun u32 get_board_rev(void)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
75*4882a593Smuzhiyun struct fuse_bank *bank = &iim->bank[0];
76*4882a593Smuzhiyun struct fuse_bank0_regs *fuse =
77*4882a593Smuzhiyun (struct fuse_bank0_regs *)bank->fuse_regs;
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun int rev = readl(&fuse->gp[6]);
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR))
82*4882a593Smuzhiyun rev = 0;
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun return (get_cpu_rev() & ~(0xF << 8)) | (rev & 0xF) << 8;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun #define UART_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
88*4882a593Smuzhiyun PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
89*4882a593Smuzhiyun
setup_iomux_uart(void)90*4882a593Smuzhiyun static void setup_iomux_uart(void)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun static const iomux_v3_cfg_t uart_pads[] = {
93*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_CSI0_DAT11__UART1_RXD_MUX, UART_PAD_CTRL),
94*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_CSI0_DAT10__UART1_TXD_MUX, UART_PAD_CTRL),
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun #ifdef CONFIG_USB_EHCI_MX5
board_ehci_hcd_init(int port)101*4882a593Smuzhiyun int board_ehci_hcd_init(int port)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun /* request VBUS power enable pin, GPIO7_8 */
104*4882a593Smuzhiyun imx_iomux_v3_setup_pad(MX53_PAD_PATA_DA_2__GPIO7_8);
105*4882a593Smuzhiyun gpio_direction_output(IMX_GPIO_NR(7, 8), 1);
106*4882a593Smuzhiyun return 0;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun #endif
109*4882a593Smuzhiyun
setup_iomux_fec(void)110*4882a593Smuzhiyun static void setup_iomux_fec(void)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun static const iomux_v3_cfg_t fec_pads[] = {
113*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_MDIO__FEC_MDIO, PAD_CTL_HYS |
114*4882a593Smuzhiyun PAD_CTL_DSE_HIGH | PAD_CTL_PUS_22K_UP | PAD_CTL_ODE),
115*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_MDC__FEC_MDC, PAD_CTL_DSE_HIGH),
116*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_RXD1__FEC_RDATA_1,
117*4882a593Smuzhiyun PAD_CTL_HYS | PAD_CTL_PKE),
118*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_RXD0__FEC_RDATA_0,
119*4882a593Smuzhiyun PAD_CTL_HYS | PAD_CTL_PKE),
120*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_TXD1__FEC_TDATA_1, PAD_CTL_DSE_HIGH),
121*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_TXD0__FEC_TDATA_0, PAD_CTL_DSE_HIGH),
122*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_TX_EN__FEC_TX_EN, PAD_CTL_DSE_HIGH),
123*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_REF_CLK__FEC_TX_CLK,
124*4882a593Smuzhiyun PAD_CTL_HYS | PAD_CTL_PKE),
125*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_RX_ER__FEC_RX_ER,
126*4882a593Smuzhiyun PAD_CTL_HYS | PAD_CTL_PKE),
127*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_FEC_CRS_DV__FEC_RX_DV,
128*4882a593Smuzhiyun PAD_CTL_HYS | PAD_CTL_PKE),
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun #ifdef CONFIG_FSL_ESDHC
135*4882a593Smuzhiyun struct fsl_esdhc_cfg esdhc_cfg[2] = {
136*4882a593Smuzhiyun {MMC_SDHC1_BASE_ADDR},
137*4882a593Smuzhiyun {MMC_SDHC3_BASE_ADDR},
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun
board_mmc_getcd(struct mmc * mmc)140*4882a593Smuzhiyun int board_mmc_getcd(struct mmc *mmc)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
143*4882a593Smuzhiyun int ret;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun imx_iomux_v3_setup_pad(MX53_PAD_EIM_DA11__GPIO3_11);
146*4882a593Smuzhiyun gpio_direction_input(IMX_GPIO_NR(3, 11));
147*4882a593Smuzhiyun imx_iomux_v3_setup_pad(MX53_PAD_EIM_DA13__GPIO3_13);
148*4882a593Smuzhiyun gpio_direction_input(IMX_GPIO_NR(3, 13));
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
151*4882a593Smuzhiyun ret = !gpio_get_value(IMX_GPIO_NR(3, 13));
152*4882a593Smuzhiyun else
153*4882a593Smuzhiyun ret = !gpio_get_value(IMX_GPIO_NR(3, 11));
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun return ret;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun #define SD_CMD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
159*4882a593Smuzhiyun PAD_CTL_PUS_100K_UP)
160*4882a593Smuzhiyun #define SD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_PUS_47K_UP | \
161*4882a593Smuzhiyun PAD_CTL_DSE_HIGH)
162*4882a593Smuzhiyun
board_mmc_init(bd_t * bis)163*4882a593Smuzhiyun int board_mmc_init(bd_t *bis)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun static const iomux_v3_cfg_t sd1_pads[] = {
166*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_SD1_CMD__ESDHC1_CMD, SD_CMD_PAD_CTRL),
167*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_SD1_CLK__ESDHC1_CLK, SD_PAD_CTRL),
168*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_SD1_DATA0__ESDHC1_DAT0, SD_PAD_CTRL),
169*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_SD1_DATA1__ESDHC1_DAT1, SD_PAD_CTRL),
170*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_SD1_DATA2__ESDHC1_DAT2, SD_PAD_CTRL),
171*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_SD1_DATA3__ESDHC1_DAT3, SD_PAD_CTRL),
172*4882a593Smuzhiyun MX53_PAD_EIM_DA13__GPIO3_13,
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun static const iomux_v3_cfg_t sd2_pads[] = {
176*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_RESET_B__ESDHC3_CMD,
177*4882a593Smuzhiyun SD_CMD_PAD_CTRL),
178*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_IORDY__ESDHC3_CLK, SD_PAD_CTRL),
179*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_DATA8__ESDHC3_DAT0, SD_PAD_CTRL),
180*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_DATA9__ESDHC3_DAT1, SD_PAD_CTRL),
181*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_DATA10__ESDHC3_DAT2, SD_PAD_CTRL),
182*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_DATA11__ESDHC3_DAT3, SD_PAD_CTRL),
183*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_DATA0__ESDHC3_DAT4, SD_PAD_CTRL),
184*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_DATA1__ESDHC3_DAT5, SD_PAD_CTRL),
185*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_DATA2__ESDHC3_DAT6, SD_PAD_CTRL),
186*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_PATA_DATA3__ESDHC3_DAT7, SD_PAD_CTRL),
187*4882a593Smuzhiyun MX53_PAD_EIM_DA11__GPIO3_11,
188*4882a593Smuzhiyun };
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun u32 index;
191*4882a593Smuzhiyun int ret;
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
194*4882a593Smuzhiyun esdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; index++) {
197*4882a593Smuzhiyun switch (index) {
198*4882a593Smuzhiyun case 0:
199*4882a593Smuzhiyun imx_iomux_v3_setup_multiple_pads(sd1_pads,
200*4882a593Smuzhiyun ARRAY_SIZE(sd1_pads));
201*4882a593Smuzhiyun break;
202*4882a593Smuzhiyun case 1:
203*4882a593Smuzhiyun imx_iomux_v3_setup_multiple_pads(sd2_pads,
204*4882a593Smuzhiyun ARRAY_SIZE(sd2_pads));
205*4882a593Smuzhiyun break;
206*4882a593Smuzhiyun default:
207*4882a593Smuzhiyun printf("Warning: you configured more ESDHC controller"
208*4882a593Smuzhiyun "(%d) as supported by the board(2)\n",
209*4882a593Smuzhiyun CONFIG_SYS_FSL_ESDHC_NUM);
210*4882a593Smuzhiyun return -EINVAL;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun ret = fsl_esdhc_initialize(bis, &esdhc_cfg[index]);
213*4882a593Smuzhiyun if (ret)
214*4882a593Smuzhiyun return ret;
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun return 0;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun #endif
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun #define I2C_PAD_CTRL (PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | \
222*4882a593Smuzhiyun PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
223*4882a593Smuzhiyun
setup_iomux_i2c(void)224*4882a593Smuzhiyun static void setup_iomux_i2c(void)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun static const iomux_v3_cfg_t i2c1_pads[] = {
227*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_CSI0_DAT8__I2C1_SDA, I2C_PAD_CTRL),
228*4882a593Smuzhiyun NEW_PAD_CTRL(MX53_PAD_CSI0_DAT9__I2C1_SCL, I2C_PAD_CTRL),
229*4882a593Smuzhiyun };
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun imx_iomux_v3_setup_multiple_pads(i2c1_pads, ARRAY_SIZE(i2c1_pads));
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun
power_init(void)234*4882a593Smuzhiyun static int power_init(void)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun unsigned int val;
237*4882a593Smuzhiyun int ret;
238*4882a593Smuzhiyun struct pmic *p;
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR)) {
241*4882a593Smuzhiyun ret = pmic_dialog_init(I2C_PMIC);
242*4882a593Smuzhiyun if (ret)
243*4882a593Smuzhiyun return ret;
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun p = pmic_get("DIALOG_PMIC");
246*4882a593Smuzhiyun if (!p)
247*4882a593Smuzhiyun return -ENODEV;
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun env_set("fdt_file", "imx53-qsb.dtb");
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun /* Set VDDA to 1.25V */
252*4882a593Smuzhiyun val = DA9052_BUCKCORE_BCOREEN | DA_BUCKCORE_VBCORE_1_250V;
253*4882a593Smuzhiyun ret = pmic_reg_write(p, DA9053_BUCKCORE_REG, val);
254*4882a593Smuzhiyun if (ret) {
255*4882a593Smuzhiyun printf("Writing to BUCKCORE_REG failed: %d\n", ret);
256*4882a593Smuzhiyun return ret;
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun pmic_reg_read(p, DA9053_SUPPLY_REG, &val);
260*4882a593Smuzhiyun val |= DA9052_SUPPLY_VBCOREGO;
261*4882a593Smuzhiyun ret = pmic_reg_write(p, DA9053_SUPPLY_REG, val);
262*4882a593Smuzhiyun if (ret) {
263*4882a593Smuzhiyun printf("Writing to SUPPLY_REG failed: %d\n", ret);
264*4882a593Smuzhiyun return ret;
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun /* Set Vcc peripheral to 1.30V */
268*4882a593Smuzhiyun ret = pmic_reg_write(p, DA9053_BUCKPRO_REG, 0x62);
269*4882a593Smuzhiyun if (ret) {
270*4882a593Smuzhiyun printf("Writing to BUCKPRO_REG failed: %d\n", ret);
271*4882a593Smuzhiyun return ret;
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun ret = pmic_reg_write(p, DA9053_SUPPLY_REG, 0x62);
275*4882a593Smuzhiyun if (ret) {
276*4882a593Smuzhiyun printf("Writing to SUPPLY_REG failed: %d\n", ret);
277*4882a593Smuzhiyun return ret;
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun return ret;
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun if (!i2c_probe(CONFIG_SYS_FSL_PMIC_I2C_ADDR)) {
284*4882a593Smuzhiyun ret = pmic_init(I2C_0);
285*4882a593Smuzhiyun if (ret)
286*4882a593Smuzhiyun return ret;
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun p = pmic_get("FSL_PMIC");
289*4882a593Smuzhiyun if (!p)
290*4882a593Smuzhiyun return -ENODEV;
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun env_set("fdt_file", "imx53-qsrb.dtb");
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun /* Set VDDGP to 1.25V for 1GHz on SW1 */
295*4882a593Smuzhiyun pmic_reg_read(p, REG_SW_0, &val);
296*4882a593Smuzhiyun val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_250V_MC34708;
297*4882a593Smuzhiyun ret = pmic_reg_write(p, REG_SW_0, val);
298*4882a593Smuzhiyun if (ret) {
299*4882a593Smuzhiyun printf("Writing to REG_SW_0 failed: %d\n", ret);
300*4882a593Smuzhiyun return ret;
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun /* Set VCC as 1.30V on SW2 */
304*4882a593Smuzhiyun pmic_reg_read(p, REG_SW_1, &val);
305*4882a593Smuzhiyun val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_300V_MC34708;
306*4882a593Smuzhiyun ret = pmic_reg_write(p, REG_SW_1, val);
307*4882a593Smuzhiyun if (ret) {
308*4882a593Smuzhiyun printf("Writing to REG_SW_1 failed: %d\n", ret);
309*4882a593Smuzhiyun return ret;
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun /* Set global reset timer to 4s */
313*4882a593Smuzhiyun pmic_reg_read(p, REG_POWER_CTL2, &val);
314*4882a593Smuzhiyun val = (val & ~TIMER_MASK_MC34708) | TIMER_4S_MC34708;
315*4882a593Smuzhiyun ret = pmic_reg_write(p, REG_POWER_CTL2, val);
316*4882a593Smuzhiyun if (ret) {
317*4882a593Smuzhiyun printf("Writing to REG_POWER_CTL2 failed: %d\n", ret);
318*4882a593Smuzhiyun return ret;
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun /* Set VUSBSEL and VUSBEN for USB PHY supply*/
322*4882a593Smuzhiyun pmic_reg_read(p, REG_MODE_0, &val);
323*4882a593Smuzhiyun val |= (VUSBSEL_MC34708 | VUSBEN_MC34708);
324*4882a593Smuzhiyun ret = pmic_reg_write(p, REG_MODE_0, val);
325*4882a593Smuzhiyun if (ret) {
326*4882a593Smuzhiyun printf("Writing to REG_MODE_0 failed: %d\n", ret);
327*4882a593Smuzhiyun return ret;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun /* Set SWBST to 5V in auto mode */
331*4882a593Smuzhiyun val = SWBST_AUTO;
332*4882a593Smuzhiyun ret = pmic_reg_write(p, SWBST_CTRL, val);
333*4882a593Smuzhiyun if (ret) {
334*4882a593Smuzhiyun printf("Writing to SWBST_CTRL failed: %d\n", ret);
335*4882a593Smuzhiyun return ret;
336*4882a593Smuzhiyun }
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun return ret;
339*4882a593Smuzhiyun }
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun return -1;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun
clock_1GHz(void)344*4882a593Smuzhiyun static void clock_1GHz(void)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun int ret;
347*4882a593Smuzhiyun u32 ref_clk = MXC_HCLK;
348*4882a593Smuzhiyun /*
349*4882a593Smuzhiyun * After increasing voltage to 1.25V, we can switch
350*4882a593Smuzhiyun * CPU clock to 1GHz and DDR to 400MHz safely
351*4882a593Smuzhiyun */
352*4882a593Smuzhiyun ret = mxc_set_clock(ref_clk, 1000, MXC_ARM_CLK);
353*4882a593Smuzhiyun if (ret)
354*4882a593Smuzhiyun printf("CPU: Switch CPU clock to 1GHZ failed\n");
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun ret = mxc_set_clock(ref_clk, 400, MXC_PERIPH_CLK);
357*4882a593Smuzhiyun ret |= mxc_set_clock(ref_clk, 400, MXC_DDR_CLK);
358*4882a593Smuzhiyun if (ret)
359*4882a593Smuzhiyun printf("CPU: Switch DDR clock to 400MHz failed\n");
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun
board_early_init_f(void)362*4882a593Smuzhiyun int board_early_init_f(void)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun setup_iomux_uart();
365*4882a593Smuzhiyun setup_iomux_fec();
366*4882a593Smuzhiyun setup_iomux_lcd();
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun return 0;
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun /*
372*4882a593Smuzhiyun * Do not overwrite the console
373*4882a593Smuzhiyun * Use always serial for U-Boot console
374*4882a593Smuzhiyun */
overwrite_console(void)375*4882a593Smuzhiyun int overwrite_console(void)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun return 1;
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun
board_init(void)380*4882a593Smuzhiyun int board_init(void)
381*4882a593Smuzhiyun {
382*4882a593Smuzhiyun gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun mxc_set_sata_internal_clock();
385*4882a593Smuzhiyun setup_iomux_i2c();
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun return 0;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
board_late_init(void)390*4882a593Smuzhiyun int board_late_init(void)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun if (!power_init())
393*4882a593Smuzhiyun clock_1GHz();
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun return 0;
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun
checkboard(void)398*4882a593Smuzhiyun int checkboard(void)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun puts("Board: MX53 LOCO\n");
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun return 0;
403*4882a593Smuzhiyun }
404