1c1747970SPierre Aubert /*
2c1747970SPierre Aubert * Copyright (C) 2012 Freescale Semiconductor, Inc.
3c1747970SPierre Aubert *
4c1747970SPierre Aubert * Author: Fabio Estevam <fabio.estevam@freescale.com>
5c1747970SPierre Aubert *
61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
7c1747970SPierre Aubert */
8c1747970SPierre Aubert
9c1747970SPierre Aubert #include <asm/arch/clock.h>
10c1747970SPierre Aubert #include <asm/arch/imx-regs.h>
11c1747970SPierre Aubert #include <asm/arch/iomux.h>
12c1747970SPierre Aubert #include <asm/arch/mx6-pins.h>
131221ce45SMasahiro Yamada #include <linux/errno.h>
14c1747970SPierre Aubert #include <asm/gpio.h>
15552a848eSStefano Babic #include <asm/mach-imx/mxc_i2c.h>
16552a848eSStefano Babic #include <asm/mach-imx/iomux-v3.h>
17552a848eSStefano Babic #include <asm/mach-imx/boot_mode.h>
18552a848eSStefano Babic #include <asm/mach-imx/video.h>
19c1747970SPierre Aubert #include <mmc.h>
20c1747970SPierre Aubert #include <fsl_esdhc.h>
21c1747970SPierre Aubert #include <miiphy.h>
22c1747970SPierre Aubert #include <netdev.h>
2358cc9787SPardeep Kumar Singla #include <asm/arch/mxc_hdmi.h>
2458cc9787SPardeep Kumar Singla #include <asm/arch/crm_regs.h>
2558cc9787SPardeep Kumar Singla #include <asm/io.h>
2658cc9787SPardeep Kumar Singla #include <asm/arch/sys_proto.h>
2766ca09fcSFabio Estevam #include <i2c.h>
2866ca09fcSFabio Estevam #include <power/pmic.h>
2966ca09fcSFabio Estevam #include <power/pfuze100_pmic.h>
30f0fabb79SYe.Li #include "../common/pfuze.h"
315a3d63c5SPeng Fan #include <usb.h>
3275f2ba42SJohn Tobias
33c1747970SPierre Aubert DECLARE_GLOBAL_DATA_PTR;
34c1747970SPierre Aubert
35c1747970SPierre Aubert #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
36c1747970SPierre Aubert PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
37c1747970SPierre Aubert PAD_CTL_SRE_FAST | PAD_CTL_HYS)
38c1747970SPierre Aubert
39c1747970SPierre Aubert #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
40c1747970SPierre Aubert PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
41c1747970SPierre Aubert PAD_CTL_SRE_FAST | PAD_CTL_HYS)
42c1747970SPierre Aubert
43c1747970SPierre Aubert #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
44c1747970SPierre Aubert PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
45c1747970SPierre Aubert
468bfa9c69SFabio Estevam #define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
478bfa9c69SFabio Estevam PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
488bfa9c69SFabio Estevam
4966ca09fcSFabio Estevam #define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
5066ca09fcSFabio Estevam PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
5166ca09fcSFabio Estevam PAD_CTL_ODE | PAD_CTL_SRE_FAST)
5266ca09fcSFabio Estevam
5366ca09fcSFabio Estevam #define I2C_PMIC 1
5466ca09fcSFabio Estevam
5566ca09fcSFabio Estevam #define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
5666ca09fcSFabio Estevam
57ca9d817aSFabio Estevam #define DISP0_PWR_EN IMX_GPIO_NR(1, 21)
58ca9d817aSFabio Estevam
59d96796caSDiego Dorta #define KEY_VOL_UP IMX_GPIO_NR(1, 4)
60d96796caSDiego Dorta
dram_init(void)61c1747970SPierre Aubert int dram_init(void)
62c1747970SPierre Aubert {
6375f2ba42SJohn Tobias gd->ram_size = imx_ddr_size();
64c1747970SPierre Aubert return 0;
65c1747970SPierre Aubert }
66c1747970SPierre Aubert
673302c275SFabio Estevam static iomux_v3_cfg_t const uart1_pads[] = {
68ff9f71b4SFabio Estevam IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
69ff9f71b4SFabio Estevam IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
70c1747970SPierre Aubert };
71c1747970SPierre Aubert
723302c275SFabio Estevam static iomux_v3_cfg_t const enet_pads[] = {
73ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)),
74ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
75ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
76ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
77ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
78ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
79ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
80ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
81ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL)),
82ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
83ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
84ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
85ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
86ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
87ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
88c1747970SPierre Aubert /* AR8031 PHY Reset */
89ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL)),
90c1747970SPierre Aubert };
91c1747970SPierre Aubert
setup_iomux_enet(void)92c1747970SPierre Aubert static void setup_iomux_enet(void)
93c1747970SPierre Aubert {
94ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(enet_pads);
95c1747970SPierre Aubert
96c1747970SPierre Aubert /* Reset AR8031 PHY */
97c1747970SPierre Aubert gpio_direction_output(IMX_GPIO_NR(1, 25) , 0);
98a307760aSFabio Estevam mdelay(10);
99c1747970SPierre Aubert gpio_set_value(IMX_GPIO_NR(1, 25), 1);
100a307760aSFabio Estevam udelay(100);
101c1747970SPierre Aubert }
102c1747970SPierre Aubert
1033302c275SFabio Estevam static iomux_v3_cfg_t const usdhc2_pads[] = {
104ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
105ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
106ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
107ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
108ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
109ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
110ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
111ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
112ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
113ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
114ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
115c1747970SPierre Aubert };
116c1747970SPierre Aubert
1173302c275SFabio Estevam static iomux_v3_cfg_t const usdhc3_pads[] = {
118ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
119ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
120ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
121ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
122ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
123ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
124ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
125ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
126ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
127ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
128ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
129c1747970SPierre Aubert };
130c1747970SPierre Aubert
1313302c275SFabio Estevam static iomux_v3_cfg_t const usdhc4_pads[] = {
132ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_CLK__SD4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
133ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_CMD__SD4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
134ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
135ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
136ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
137ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
138ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
139ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
140ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
141ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
142c1747970SPierre Aubert };
143c1747970SPierre Aubert
1443302c275SFabio Estevam static iomux_v3_cfg_t const ecspi1_pads[] = {
145ff9f71b4SFabio Estevam IOMUX_PADS(PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
146ff9f71b4SFabio Estevam IOMUX_PADS(PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
147ff9f71b4SFabio Estevam IOMUX_PADS(PAD_KEY_ROW0__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)),
148ff9f71b4SFabio Estevam IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
1498bfa9c69SFabio Estevam };
1508bfa9c69SFabio Estevam
151ca9d817aSFabio Estevam static iomux_v3_cfg_t const rgb_pads[] = {
152ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL)),
153ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
154ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
155ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
156ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
157ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
158ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
159ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
160ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
161ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
162ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
163ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
164ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
165ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL)),
166ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
167ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL)),
168ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL)),
169ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL)),
170ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL)),
171ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL)),
172ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
173ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL)),
174ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL)),
175ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
176ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
177ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL)),
178ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
179ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL)),
180ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL)),
1816c51a364SMarco Franchi };
1826c51a364SMarco Franchi
1836c51a364SMarco Franchi static iomux_v3_cfg_t const bl_pads[] = {
184ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
185ca9d817aSFabio Estevam };
186ca9d817aSFabio Estevam
enable_backlight(void)1876c51a364SMarco Franchi static void enable_backlight(void)
1886c51a364SMarco Franchi {
189ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(bl_pads);
1906c51a364SMarco Franchi gpio_direction_output(DISP0_PWR_EN, 1);
1916c51a364SMarco Franchi }
1926c51a364SMarco Franchi
enable_rgb(struct display_info_t const * dev)193ca9d817aSFabio Estevam static void enable_rgb(struct display_info_t const *dev)
194ca9d817aSFabio Estevam {
195ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(rgb_pads);
1966c51a364SMarco Franchi enable_backlight();
1976c51a364SMarco Franchi }
1986c51a364SMarco Franchi
enable_lvds(struct display_info_t const * dev)1996c51a364SMarco Franchi static void enable_lvds(struct display_info_t const *dev)
2006c51a364SMarco Franchi {
2016c51a364SMarco Franchi enable_backlight();
202ca9d817aSFabio Estevam }
203ca9d817aSFabio Estevam
204ff9f71b4SFabio Estevam static struct i2c_pads_info mx6q_i2c_pad_info1 = {
20566ca09fcSFabio Estevam .scl = {
206ff9f71b4SFabio Estevam .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
207ff9f71b4SFabio Estevam .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
20866ca09fcSFabio Estevam .gp = IMX_GPIO_NR(4, 12)
20966ca09fcSFabio Estevam },
21066ca09fcSFabio Estevam .sda = {
211ff9f71b4SFabio Estevam .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
212ff9f71b4SFabio Estevam .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
213ff9f71b4SFabio Estevam .gp = IMX_GPIO_NR(4, 13)
214ff9f71b4SFabio Estevam }
215ff9f71b4SFabio Estevam };
216ff9f71b4SFabio Estevam
217ff9f71b4SFabio Estevam static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
218ff9f71b4SFabio Estevam .scl = {
219ff9f71b4SFabio Estevam .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
220ff9f71b4SFabio Estevam .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
221ff9f71b4SFabio Estevam .gp = IMX_GPIO_NR(4, 12)
222ff9f71b4SFabio Estevam },
223ff9f71b4SFabio Estevam .sda = {
224ff9f71b4SFabio Estevam .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
225ff9f71b4SFabio Estevam .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
22666ca09fcSFabio Estevam .gp = IMX_GPIO_NR(4, 13)
22766ca09fcSFabio Estevam }
22866ca09fcSFabio Estevam };
22966ca09fcSFabio Estevam
setup_spi(void)2308bfa9c69SFabio Estevam static void setup_spi(void)
2318bfa9c69SFabio Estevam {
232ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(ecspi1_pads);
2338bfa9c69SFabio Estevam }
2348bfa9c69SFabio Estevam
235e919aa23SMarek Vasut iomux_v3_cfg_t const pcie_pads[] = {
236ff9f71b4SFabio Estevam IOMUX_PADS(PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* POWER */
237ff9f71b4SFabio Estevam IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* RESET */
238e919aa23SMarek Vasut };
239e919aa23SMarek Vasut
setup_pcie(void)240e919aa23SMarek Vasut static void setup_pcie(void)
241e919aa23SMarek Vasut {
242ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(pcie_pads);
243e919aa23SMarek Vasut }
244e919aa23SMarek Vasut
245be4ab3ddSFabio Estevam iomux_v3_cfg_t const di0_pads[] = {
246ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK), /* DISP0_CLK */
247ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02), /* DISP0_HSYNC */
248ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03), /* DISP0_VSYNC */
249be4ab3ddSFabio Estevam };
250be4ab3ddSFabio Estevam
setup_iomux_uart(void)251c1747970SPierre Aubert static void setup_iomux_uart(void)
252c1747970SPierre Aubert {
253ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(uart1_pads);
254c1747970SPierre Aubert }
255c1747970SPierre Aubert
256c1747970SPierre Aubert #ifdef CONFIG_FSL_ESDHC
257c1747970SPierre Aubert struct fsl_esdhc_cfg usdhc_cfg[3] = {
258c1747970SPierre Aubert {USDHC2_BASE_ADDR},
259c1747970SPierre Aubert {USDHC3_BASE_ADDR},
260c1747970SPierre Aubert {USDHC4_BASE_ADDR},
261c1747970SPierre Aubert };
262c1747970SPierre Aubert
263c1747970SPierre Aubert #define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2)
264c1747970SPierre Aubert #define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0)
265c1747970SPierre Aubert
board_mmc_get_env_dev(int devno)266fb0d0428SPeng Fan int board_mmc_get_env_dev(int devno)
267fb0d0428SPeng Fan {
268fb0d0428SPeng Fan return devno - 1;
269fb0d0428SPeng Fan }
270fb0d0428SPeng Fan
board_mmc_getcd(struct mmc * mmc)271c1747970SPierre Aubert int board_mmc_getcd(struct mmc *mmc)
272c1747970SPierre Aubert {
273c1747970SPierre Aubert struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
274c1747970SPierre Aubert int ret = 0;
275c1747970SPierre Aubert
276c1747970SPierre Aubert switch (cfg->esdhc_base) {
277c1747970SPierre Aubert case USDHC2_BASE_ADDR:
278c1747970SPierre Aubert ret = !gpio_get_value(USDHC2_CD_GPIO);
279c1747970SPierre Aubert break;
280c1747970SPierre Aubert case USDHC3_BASE_ADDR:
281c1747970SPierre Aubert ret = !gpio_get_value(USDHC3_CD_GPIO);
282c1747970SPierre Aubert break;
283c1747970SPierre Aubert case USDHC4_BASE_ADDR:
284c1747970SPierre Aubert ret = 1; /* eMMC/uSDHC4 is always present */
285c1747970SPierre Aubert break;
286c1747970SPierre Aubert }
287c1747970SPierre Aubert
288c1747970SPierre Aubert return ret;
289c1747970SPierre Aubert }
290c1747970SPierre Aubert
board_mmc_init(bd_t * bis)291c1747970SPierre Aubert int board_mmc_init(bd_t *bis)
292c1747970SPierre Aubert {
29375f2ba42SJohn Tobias #ifndef CONFIG_SPL_BUILD
294952fdc4eSFabio Estevam int ret;
295c1747970SPierre Aubert int i;
296c1747970SPierre Aubert
297c1747970SPierre Aubert /*
298c1747970SPierre Aubert * According to the board_mmc_init() the following map is done:
299a187559eSBin Meng * (U-Boot device node) (Physical Port)
300c1747970SPierre Aubert * mmc0 SD2
301c1747970SPierre Aubert * mmc1 SD3
302c1747970SPierre Aubert * mmc2 eMMC
303c1747970SPierre Aubert */
304c1747970SPierre Aubert for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
305c1747970SPierre Aubert switch (i) {
306c1747970SPierre Aubert case 0:
307ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc2_pads);
308c1747970SPierre Aubert gpio_direction_input(USDHC2_CD_GPIO);
309c1747970SPierre Aubert usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
310c1747970SPierre Aubert break;
311c1747970SPierre Aubert case 1:
312ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc3_pads);
313c1747970SPierre Aubert gpio_direction_input(USDHC3_CD_GPIO);
314c1747970SPierre Aubert usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
315c1747970SPierre Aubert break;
316c1747970SPierre Aubert case 2:
317ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc4_pads);
318c1747970SPierre Aubert usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
319c1747970SPierre Aubert break;
320c1747970SPierre Aubert default:
321c1747970SPierre Aubert printf("Warning: you configured more USDHC controllers"
322c1747970SPierre Aubert "(%d) then supported by the board (%d)\n",
323c1747970SPierre Aubert i + 1, CONFIG_SYS_FSL_USDHC_NUM);
324952fdc4eSFabio Estevam return -EINVAL;
325c1747970SPierre Aubert }
326c1747970SPierre Aubert
327952fdc4eSFabio Estevam ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
328952fdc4eSFabio Estevam if (ret)
329952fdc4eSFabio Estevam return ret;
330c1747970SPierre Aubert }
331c1747970SPierre Aubert
332952fdc4eSFabio Estevam return 0;
33375f2ba42SJohn Tobias #else
334ae80eeccSFabio Estevam struct src *psrc = (struct src *)SRC_BASE_ADDR;
335ae80eeccSFabio Estevam unsigned reg = readl(&psrc->sbmr1) >> 11;
33675f2ba42SJohn Tobias /*
33775f2ba42SJohn Tobias * Upon reading BOOT_CFG register the following map is done:
33875f2ba42SJohn Tobias * Bit 11 and 12 of BOOT_CFG register can determine the current
33975f2ba42SJohn Tobias * mmc port
34075f2ba42SJohn Tobias * 0x1 SD1
34175f2ba42SJohn Tobias * 0x2 SD2
34275f2ba42SJohn Tobias * 0x3 SD4
34375f2ba42SJohn Tobias */
34475f2ba42SJohn Tobias
34575f2ba42SJohn Tobias switch (reg & 0x3) {
34675f2ba42SJohn Tobias case 0x1:
347ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc2_pads);
34875f2ba42SJohn Tobias usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
34975f2ba42SJohn Tobias usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
35075f2ba42SJohn Tobias gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
35175f2ba42SJohn Tobias break;
35275f2ba42SJohn Tobias case 0x2:
353ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc3_pads);
35475f2ba42SJohn Tobias usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
35575f2ba42SJohn Tobias usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
35675f2ba42SJohn Tobias gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
35775f2ba42SJohn Tobias break;
35875f2ba42SJohn Tobias case 0x3:
359ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc4_pads);
36075f2ba42SJohn Tobias usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR;
36175f2ba42SJohn Tobias usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
36275f2ba42SJohn Tobias gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
36375f2ba42SJohn Tobias break;
36475f2ba42SJohn Tobias }
36575f2ba42SJohn Tobias
36675f2ba42SJohn Tobias return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
36775f2ba42SJohn Tobias #endif
368c1747970SPierre Aubert }
369c1747970SPierre Aubert #endif
370c1747970SPierre Aubert
ar8031_phy_fixup(struct phy_device * phydev)3714b6035daSFabio Estevam static int ar8031_phy_fixup(struct phy_device *phydev)
3724b6035daSFabio Estevam {
3734b6035daSFabio Estevam unsigned short val;
3744b6035daSFabio Estevam
3754b6035daSFabio Estevam /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
3764b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
3774b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
3784b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
3794b6035daSFabio Estevam
3804b6035daSFabio Estevam val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
3814b6035daSFabio Estevam val &= 0xffe3;
3824b6035daSFabio Estevam val |= 0x18;
3834b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
3844b6035daSFabio Estevam
3854b6035daSFabio Estevam /* introduce tx clock delay */
3864b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
3874b6035daSFabio Estevam val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
3884b6035daSFabio Estevam val |= 0x0100;
3894b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
3904b6035daSFabio Estevam
3914b6035daSFabio Estevam return 0;
3924b6035daSFabio Estevam }
3934b6035daSFabio Estevam
board_phy_config(struct phy_device * phydev)3944b6035daSFabio Estevam int board_phy_config(struct phy_device *phydev)
3954b6035daSFabio Estevam {
3964b6035daSFabio Estevam ar8031_phy_fixup(phydev);
3974b6035daSFabio Estevam
3984b6035daSFabio Estevam if (phydev->drv->config)
3994b6035daSFabio Estevam phydev->drv->config(phydev);
4004b6035daSFabio Estevam
4014b6035daSFabio Estevam return 0;
4024b6035daSFabio Estevam }
4034b6035daSFabio Estevam
40458cc9787SPardeep Kumar Singla #if defined(CONFIG_VIDEO_IPUV3)
disable_lvds(struct display_info_t const * dev)405b48e3b04SFabio Estevam static void disable_lvds(struct display_info_t const *dev)
406b48e3b04SFabio Estevam {
407b48e3b04SFabio Estevam struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
408b48e3b04SFabio Estevam
409b48e3b04SFabio Estevam int reg = readl(&iomux->gpr[2]);
410b48e3b04SFabio Estevam
411b48e3b04SFabio Estevam reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
412b48e3b04SFabio Estevam IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
413b48e3b04SFabio Estevam
414b48e3b04SFabio Estevam writel(reg, &iomux->gpr[2]);
415b48e3b04SFabio Estevam }
416b48e3b04SFabio Estevam
do_enable_hdmi(struct display_info_t const * dev)417d9b89460SFabio Estevam static void do_enable_hdmi(struct display_info_t const *dev)
418d9b89460SFabio Estevam {
419b48e3b04SFabio Estevam disable_lvds(dev);
420d9b89460SFabio Estevam imx_enable_hdmi_phy();
421d9b89460SFabio Estevam }
422d9b89460SFabio Estevam
423053b795eSEric Benard struct display_info_t const displays[] = {{
424d9b89460SFabio Estevam .bus = -1,
425d9b89460SFabio Estevam .addr = 0,
426119e9909SFabio Estevam .pixfmt = IPU_PIX_FMT_RGB666,
427b48e3b04SFabio Estevam .detect = NULL,
4286c51a364SMarco Franchi .enable = enable_lvds,
429d9b89460SFabio Estevam .mode = {
430b48e3b04SFabio Estevam .name = "Hannstar-XGA",
43158cc9787SPardeep Kumar Singla .refresh = 60,
43258cc9787SPardeep Kumar Singla .xres = 1024,
43358cc9787SPardeep Kumar Singla .yres = 768,
434779594d3SFabio Estevam .pixclock = 15384,
435779594d3SFabio Estevam .left_margin = 160,
436779594d3SFabio Estevam .right_margin = 24,
437779594d3SFabio Estevam .upper_margin = 29,
438779594d3SFabio Estevam .lower_margin = 3,
439779594d3SFabio Estevam .hsync_len = 136,
440779594d3SFabio Estevam .vsync_len = 6,
44158cc9787SPardeep Kumar Singla .sync = FB_SYNC_EXT,
44258cc9787SPardeep Kumar Singla .vmode = FB_VMODE_NONINTERLACED
443d9b89460SFabio Estevam } }, {
444d9b89460SFabio Estevam .bus = -1,
445d9b89460SFabio Estevam .addr = 0,
446b48e3b04SFabio Estevam .pixfmt = IPU_PIX_FMT_RGB24,
447b48e3b04SFabio Estevam .detect = detect_hdmi,
448b48e3b04SFabio Estevam .enable = do_enable_hdmi,
449d9b89460SFabio Estevam .mode = {
450b48e3b04SFabio Estevam .name = "HDMI",
451d9b89460SFabio Estevam .refresh = 60,
452d9b89460SFabio Estevam .xres = 1024,
453d9b89460SFabio Estevam .yres = 768,
454779594d3SFabio Estevam .pixclock = 15384,
455779594d3SFabio Estevam .left_margin = 160,
456779594d3SFabio Estevam .right_margin = 24,
457779594d3SFabio Estevam .upper_margin = 29,
458779594d3SFabio Estevam .lower_margin = 3,
459779594d3SFabio Estevam .hsync_len = 136,
460779594d3SFabio Estevam .vsync_len = 6,
461d9b89460SFabio Estevam .sync = FB_SYNC_EXT,
462d9b89460SFabio Estevam .vmode = FB_VMODE_NONINTERLACED
463ca9d817aSFabio Estevam } }, {
464ca9d817aSFabio Estevam .bus = 0,
465ca9d817aSFabio Estevam .addr = 0,
466ca9d817aSFabio Estevam .pixfmt = IPU_PIX_FMT_RGB24,
467ca9d817aSFabio Estevam .detect = NULL,
468ca9d817aSFabio Estevam .enable = enable_rgb,
469ca9d817aSFabio Estevam .mode = {
470ca9d817aSFabio Estevam .name = "SEIKO-WVGA",
471ca9d817aSFabio Estevam .refresh = 60,
472ca9d817aSFabio Estevam .xres = 800,
473ca9d817aSFabio Estevam .yres = 480,
474ca9d817aSFabio Estevam .pixclock = 29850,
475ca9d817aSFabio Estevam .left_margin = 89,
476ca9d817aSFabio Estevam .right_margin = 164,
477ca9d817aSFabio Estevam .upper_margin = 23,
478ca9d817aSFabio Estevam .lower_margin = 10,
479ca9d817aSFabio Estevam .hsync_len = 10,
480ca9d817aSFabio Estevam .vsync_len = 10,
481ca9d817aSFabio Estevam .sync = 0,
482ca9d817aSFabio Estevam .vmode = FB_VMODE_NONINTERLACED
483d9b89460SFabio Estevam } } };
484053b795eSEric Benard size_t display_count = ARRAY_SIZE(displays);
48558cc9787SPardeep Kumar Singla
setup_display(void)48658cc9787SPardeep Kumar Singla static void setup_display(void)
48758cc9787SPardeep Kumar Singla {
48858cc9787SPardeep Kumar Singla struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
489d9b89460SFabio Estevam struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
49058cc9787SPardeep Kumar Singla int reg;
49158cc9787SPardeep Kumar Singla
492be4ab3ddSFabio Estevam /* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */
493ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(di0_pads);
494be4ab3ddSFabio Estevam
49558cc9787SPardeep Kumar Singla enable_ipu_clock();
49658cc9787SPardeep Kumar Singla imx_setup_hdmi();
49758cc9787SPardeep Kumar Singla
498d9b89460SFabio Estevam /* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */
49912307437SLiu Ying reg = readl(&mxc_ccm->CCGR3);
500d9b89460SFabio Estevam reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
501d9b89460SFabio Estevam writel(reg, &mxc_ccm->CCGR3);
502d9b89460SFabio Estevam
503d9b89460SFabio Estevam /* set LDB0, LDB1 clk select to 011/011 */
504d9b89460SFabio Estevam reg = readl(&mxc_ccm->cs2cdr);
505d9b89460SFabio Estevam reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
506d9b89460SFabio Estevam | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
507d9b89460SFabio Estevam reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
508d9b89460SFabio Estevam | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
509d9b89460SFabio Estevam writel(reg, &mxc_ccm->cs2cdr);
510d9b89460SFabio Estevam
511d9b89460SFabio Estevam reg = readl(&mxc_ccm->cscmr2);
512d9b89460SFabio Estevam reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
513d9b89460SFabio Estevam writel(reg, &mxc_ccm->cscmr2);
514d9b89460SFabio Estevam
51558cc9787SPardeep Kumar Singla reg = readl(&mxc_ccm->chsccdr);
51658cc9787SPardeep Kumar Singla reg |= (CHSCCDR_CLK_SEL_LDB_DI0
51758cc9787SPardeep Kumar Singla << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
518d9b89460SFabio Estevam reg |= (CHSCCDR_CLK_SEL_LDB_DI0
519d9b89460SFabio Estevam << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
52058cc9787SPardeep Kumar Singla writel(reg, &mxc_ccm->chsccdr);
521d9b89460SFabio Estevam
522d9b89460SFabio Estevam reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
523d9b89460SFabio Estevam | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW
524d9b89460SFabio Estevam | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
525d9b89460SFabio Estevam | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
526d9b89460SFabio Estevam | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
527d9b89460SFabio Estevam | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
528d9b89460SFabio Estevam | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
529d9b89460SFabio Estevam | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED
530d9b89460SFabio Estevam | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0;
531d9b89460SFabio Estevam writel(reg, &iomux->gpr[2]);
532d9b89460SFabio Estevam
533d9b89460SFabio Estevam reg = readl(&iomux->gpr[3]);
534d9b89460SFabio Estevam reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK
535d9b89460SFabio Estevam | IOMUXC_GPR3_HDMI_MUX_CTL_MASK))
536d9b89460SFabio Estevam | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
537d9b89460SFabio Estevam << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET);
538d9b89460SFabio Estevam writel(reg, &iomux->gpr[3]);
53958cc9787SPardeep Kumar Singla }
54058cc9787SPardeep Kumar Singla #endif /* CONFIG_VIDEO_IPUV3 */
54158cc9787SPardeep Kumar Singla
54258cc9787SPardeep Kumar Singla /*
54358cc9787SPardeep Kumar Singla * Do not overwrite the console
54458cc9787SPardeep Kumar Singla * Use always serial for U-Boot console
54558cc9787SPardeep Kumar Singla */
overwrite_console(void)54658cc9787SPardeep Kumar Singla int overwrite_console(void)
54758cc9787SPardeep Kumar Singla {
54858cc9787SPardeep Kumar Singla return 1;
54958cc9787SPardeep Kumar Singla }
55058cc9787SPardeep Kumar Singla
board_eth_init(bd_t * bis)551c1747970SPierre Aubert int board_eth_init(bd_t *bis)
552c1747970SPierre Aubert {
553c1747970SPierre Aubert setup_iomux_enet();
554e919aa23SMarek Vasut setup_pcie();
555c1747970SPierre Aubert
55692c707a5SFabio Estevam return cpu_eth_init(bis);
557c1747970SPierre Aubert }
558c1747970SPierre Aubert
5595a3d63c5SPeng Fan #ifdef CONFIG_USB_EHCI_MX6
5605a3d63c5SPeng Fan #define USB_OTHERREGS_OFFSET 0x800
5615a3d63c5SPeng Fan #define UCTRL_PWR_POL (1 << 9)
5625a3d63c5SPeng Fan
5635a3d63c5SPeng Fan static iomux_v3_cfg_t const usb_otg_pads[] = {
564ff9f71b4SFabio Estevam IOMUX_PADS(PAD_EIM_D22__USB_OTG_PWR | MUX_PAD_CTRL(NO_PAD_CTRL)),
565ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL)),
5665a3d63c5SPeng Fan };
5675a3d63c5SPeng Fan
5685a3d63c5SPeng Fan static iomux_v3_cfg_t const usb_hc1_pads[] = {
569ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL)),
5705a3d63c5SPeng Fan };
5715a3d63c5SPeng Fan
setup_usb(void)5725a3d63c5SPeng Fan static void setup_usb(void)
5735a3d63c5SPeng Fan {
574ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usb_otg_pads);
5755a3d63c5SPeng Fan
5765a3d63c5SPeng Fan /*
5775a3d63c5SPeng Fan * set daisy chain for otg_pin_id on 6q.
5785a3d63c5SPeng Fan * for 6dl, this bit is reserved
5795a3d63c5SPeng Fan */
5805a3d63c5SPeng Fan imx_iomux_set_gpr_register(1, 13, 1, 0);
5815a3d63c5SPeng Fan
582ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usb_hc1_pads);
5835a3d63c5SPeng Fan }
5845a3d63c5SPeng Fan
board_ehci_hcd_init(int port)5855a3d63c5SPeng Fan int board_ehci_hcd_init(int port)
5865a3d63c5SPeng Fan {
5875a3d63c5SPeng Fan u32 *usbnc_usb_ctrl;
5885a3d63c5SPeng Fan
5895a3d63c5SPeng Fan if (port > 1)
5905a3d63c5SPeng Fan return -EINVAL;
5915a3d63c5SPeng Fan
5925a3d63c5SPeng Fan usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET +
5935a3d63c5SPeng Fan port * 4);
5945a3d63c5SPeng Fan
5955a3d63c5SPeng Fan setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL);
5965a3d63c5SPeng Fan
5975a3d63c5SPeng Fan return 0;
5985a3d63c5SPeng Fan }
5995a3d63c5SPeng Fan
board_ehci_power(int port,int on)6005a3d63c5SPeng Fan int board_ehci_power(int port, int on)
6015a3d63c5SPeng Fan {
6025a3d63c5SPeng Fan switch (port) {
6035a3d63c5SPeng Fan case 0:
6045a3d63c5SPeng Fan break;
6055a3d63c5SPeng Fan case 1:
6065a3d63c5SPeng Fan if (on)
6075a3d63c5SPeng Fan gpio_direction_output(IMX_GPIO_NR(1, 29), 1);
6085a3d63c5SPeng Fan else
6095a3d63c5SPeng Fan gpio_direction_output(IMX_GPIO_NR(1, 29), 0);
6105a3d63c5SPeng Fan break;
6115a3d63c5SPeng Fan default:
6125a3d63c5SPeng Fan printf("MXC USB port %d not yet supported\n", port);
6135a3d63c5SPeng Fan return -EINVAL;
6145a3d63c5SPeng Fan }
6155a3d63c5SPeng Fan
6165a3d63c5SPeng Fan return 0;
6175a3d63c5SPeng Fan }
6185a3d63c5SPeng Fan #endif
6195a3d63c5SPeng Fan
board_early_init_f(void)620c1747970SPierre Aubert int board_early_init_f(void)
621c1747970SPierre Aubert {
622c1747970SPierre Aubert setup_iomux_uart();
62358cc9787SPardeep Kumar Singla #if defined(CONFIG_VIDEO_IPUV3)
62458cc9787SPardeep Kumar Singla setup_display();
62558cc9787SPardeep Kumar Singla #endif
626c1747970SPierre Aubert
627c1747970SPierre Aubert return 0;
628c1747970SPierre Aubert }
629c1747970SPierre Aubert
board_init(void)630c1747970SPierre Aubert int board_init(void)
631c1747970SPierre Aubert {
632c1747970SPierre Aubert /* address of boot parameters */
633c1747970SPierre Aubert gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
634c1747970SPierre Aubert
6358bfa9c69SFabio Estevam #ifdef CONFIG_MXC_SPI
6368bfa9c69SFabio Estevam setup_spi();
6378bfa9c69SFabio Estevam #endif
638ff9f71b4SFabio Estevam if (is_mx6dq() || is_mx6dqp())
639ff9f71b4SFabio Estevam setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
640ff9f71b4SFabio Estevam else
641ff9f71b4SFabio Estevam setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
6425a3d63c5SPeng Fan #ifdef CONFIG_USB_EHCI_MX6
6435a3d63c5SPeng Fan setup_usb();
6445a3d63c5SPeng Fan #endif
6455a3d63c5SPeng Fan
64666ca09fcSFabio Estevam return 0;
64766ca09fcSFabio Estevam }
64866ca09fcSFabio Estevam
power_init_board(void)649f0fabb79SYe.Li int power_init_board(void)
65066ca09fcSFabio Estevam {
65166ca09fcSFabio Estevam struct pmic *p;
652e4b984d7SFabio Estevam unsigned int reg;
653e4b984d7SFabio Estevam int ret;
65466ca09fcSFabio Estevam
655f0fabb79SYe.Li p = pfuze_common_init(I2C_PMIC);
656f0fabb79SYe.Li if (!p)
657f0fabb79SYe.Li return -ENODEV;
65866ca09fcSFabio Estevam
659258c98f8SPeng Fan ret = pfuze_mode_init(p, APS_PFM);
660258c98f8SPeng Fan if (ret < 0)
661258c98f8SPeng Fan return ret;
662258c98f8SPeng Fan
66366ca09fcSFabio Estevam /* Increase VGEN3 from 2.5 to 2.8V */
66466ca09fcSFabio Estevam pmic_reg_read(p, PFUZE100_VGEN3VOL, ®);
665f0fabb79SYe.Li reg &= ~LDO_VOL_MASK;
666f0fabb79SYe.Li reg |= LDOB_2_80V;
66766ca09fcSFabio Estevam pmic_reg_write(p, PFUZE100_VGEN3VOL, reg);
66866ca09fcSFabio Estevam
66966ca09fcSFabio Estevam /* Increase VGEN5 from 2.8 to 3V */
67066ca09fcSFabio Estevam pmic_reg_read(p, PFUZE100_VGEN5VOL, ®);
671f0fabb79SYe.Li reg &= ~LDO_VOL_MASK;
672f0fabb79SYe.Li reg |= LDOB_3_00V;
67366ca09fcSFabio Estevam pmic_reg_write(p, PFUZE100_VGEN5VOL, reg);
67466ca09fcSFabio Estevam
675c1747970SPierre Aubert return 0;
676c1747970SPierre Aubert }
677c1747970SPierre Aubert
678155fa9afSNikita Kiryanov #ifdef CONFIG_MXC_SPI
board_spi_cs_gpio(unsigned bus,unsigned cs)679155fa9afSNikita Kiryanov int board_spi_cs_gpio(unsigned bus, unsigned cs)
680155fa9afSNikita Kiryanov {
681155fa9afSNikita Kiryanov return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
682155fa9afSNikita Kiryanov }
683155fa9afSNikita Kiryanov #endif
684155fa9afSNikita Kiryanov
685c1747970SPierre Aubert #ifdef CONFIG_CMD_BMODE
686c1747970SPierre Aubert static const struct boot_mode board_boot_modes[] = {
687c1747970SPierre Aubert /* 4 bit bus width */
688c1747970SPierre Aubert {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
689c1747970SPierre Aubert {"sd3", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
690c1747970SPierre Aubert /* 8 bit bus width */
691214c3f0fSYe Li {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)},
692c1747970SPierre Aubert {NULL, 0},
693c1747970SPierre Aubert };
694c1747970SPierre Aubert #endif
695c1747970SPierre Aubert
board_late_init(void)696c1747970SPierre Aubert int board_late_init(void)
697c1747970SPierre Aubert {
698c1747970SPierre Aubert #ifdef CONFIG_CMD_BMODE
699c1747970SPierre Aubert add_board_boot_modes(board_boot_modes);
700c1747970SPierre Aubert #endif
701e6fc8995SPeng Fan
702e6fc8995SPeng Fan #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
703382bee57SSimon Glass env_set("board_name", "SABRESD");
704e6fc8995SPeng Fan
705e469719cSPeng Fan if (is_mx6dqp())
706382bee57SSimon Glass env_set("board_rev", "MX6QP");
70783e13942SPeng Fan else if (is_mx6dq())
708382bee57SSimon Glass env_set("board_rev", "MX6Q");
70983e13942SPeng Fan else if (is_mx6sdl())
710382bee57SSimon Glass env_set("board_rev", "MX6DL");
711e6fc8995SPeng Fan #endif
712e6fc8995SPeng Fan
713c1747970SPierre Aubert return 0;
714c1747970SPierre Aubert }
715c1747970SPierre Aubert
checkboard(void)716c1747970SPierre Aubert int checkboard(void)
717c1747970SPierre Aubert {
718c1747970SPierre Aubert puts("Board: MX6-SabreSD\n");
719c1747970SPierre Aubert return 0;
720c1747970SPierre Aubert }
72175f2ba42SJohn Tobias
72275f2ba42SJohn Tobias #ifdef CONFIG_SPL_BUILD
723ff9f71b4SFabio Estevam #include <asm/arch/mx6-ddr.h>
72475f2ba42SJohn Tobias #include <spl.h>
725*0e00a84cSMasahiro Yamada #include <linux/libfdt.h>
72675f2ba42SJohn Tobias
727d96796caSDiego Dorta #ifdef CONFIG_SPL_OS_BOOT
spl_start_uboot(void)728d96796caSDiego Dorta int spl_start_uboot(void)
729d96796caSDiego Dorta {
730d96796caSDiego Dorta gpio_direction_input(KEY_VOL_UP);
731d96796caSDiego Dorta
732d96796caSDiego Dorta /* Only enter in Falcon mode if KEY_VOL_UP is pressed */
733d96796caSDiego Dorta return gpio_get_value(KEY_VOL_UP);
734d96796caSDiego Dorta }
735d96796caSDiego Dorta #endif
736d96796caSDiego Dorta
ccgr_init(void)7376e9b6bb5SFabio Estevam static void ccgr_init(void)
7386e9b6bb5SFabio Estevam {
7396e9b6bb5SFabio Estevam struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
7406e9b6bb5SFabio Estevam
7416e9b6bb5SFabio Estevam writel(0x00C03F3F, &ccm->CCGR0);
7426e9b6bb5SFabio Estevam writel(0x0030FC03, &ccm->CCGR1);
7436e9b6bb5SFabio Estevam writel(0x0FFFC000, &ccm->CCGR2);
7446e9b6bb5SFabio Estevam writel(0x3FF00000, &ccm->CCGR3);
7456e9b6bb5SFabio Estevam writel(0x00FFF300, &ccm->CCGR4);
7466e9b6bb5SFabio Estevam writel(0x0F0000C3, &ccm->CCGR5);
7476e9b6bb5SFabio Estevam writel(0x000003FF, &ccm->CCGR6);
7486e9b6bb5SFabio Estevam }
7496e9b6bb5SFabio Estevam
7503b30eeceSFabio Estevam static int mx6q_dcd_table[] = {
7513b30eeceSFabio Estevam 0x020e0798, 0x000C0000,
7523b30eeceSFabio Estevam 0x020e0758, 0x00000000,
7533b30eeceSFabio Estevam 0x020e0588, 0x00000030,
7543b30eeceSFabio Estevam 0x020e0594, 0x00000030,
7553b30eeceSFabio Estevam 0x020e056c, 0x00000030,
7563b30eeceSFabio Estevam 0x020e0578, 0x00000030,
7573b30eeceSFabio Estevam 0x020e074c, 0x00000030,
7583b30eeceSFabio Estevam 0x020e057c, 0x00000030,
7593b30eeceSFabio Estevam 0x020e058c, 0x00000000,
7603b30eeceSFabio Estevam 0x020e059c, 0x00000030,
7613b30eeceSFabio Estevam 0x020e05a0, 0x00000030,
7623b30eeceSFabio Estevam 0x020e078c, 0x00000030,
7633b30eeceSFabio Estevam 0x020e0750, 0x00020000,
7643b30eeceSFabio Estevam 0x020e05a8, 0x00000030,
7653b30eeceSFabio Estevam 0x020e05b0, 0x00000030,
7663b30eeceSFabio Estevam 0x020e0524, 0x00000030,
7673b30eeceSFabio Estevam 0x020e051c, 0x00000030,
7683b30eeceSFabio Estevam 0x020e0518, 0x00000030,
7693b30eeceSFabio Estevam 0x020e050c, 0x00000030,
7703b30eeceSFabio Estevam 0x020e05b8, 0x00000030,
7713b30eeceSFabio Estevam 0x020e05c0, 0x00000030,
7723b30eeceSFabio Estevam 0x020e0774, 0x00020000,
7733b30eeceSFabio Estevam 0x020e0784, 0x00000030,
7743b30eeceSFabio Estevam 0x020e0788, 0x00000030,
7753b30eeceSFabio Estevam 0x020e0794, 0x00000030,
7763b30eeceSFabio Estevam 0x020e079c, 0x00000030,
7773b30eeceSFabio Estevam 0x020e07a0, 0x00000030,
7783b30eeceSFabio Estevam 0x020e07a4, 0x00000030,
7793b30eeceSFabio Estevam 0x020e07a8, 0x00000030,
7803b30eeceSFabio Estevam 0x020e0748, 0x00000030,
7813b30eeceSFabio Estevam 0x020e05ac, 0x00000030,
7823b30eeceSFabio Estevam 0x020e05b4, 0x00000030,
7833b30eeceSFabio Estevam 0x020e0528, 0x00000030,
7843b30eeceSFabio Estevam 0x020e0520, 0x00000030,
7853b30eeceSFabio Estevam 0x020e0514, 0x00000030,
7863b30eeceSFabio Estevam 0x020e0510, 0x00000030,
7873b30eeceSFabio Estevam 0x020e05bc, 0x00000030,
7883b30eeceSFabio Estevam 0x020e05c4, 0x00000030,
7893b30eeceSFabio Estevam 0x021b0800, 0xa1390003,
7903b30eeceSFabio Estevam 0x021b080c, 0x001F001F,
7913b30eeceSFabio Estevam 0x021b0810, 0x001F001F,
7923b30eeceSFabio Estevam 0x021b480c, 0x001F001F,
7933b30eeceSFabio Estevam 0x021b4810, 0x001F001F,
7943b30eeceSFabio Estevam 0x021b083c, 0x43270338,
7953b30eeceSFabio Estevam 0x021b0840, 0x03200314,
7963b30eeceSFabio Estevam 0x021b483c, 0x431A032F,
7973b30eeceSFabio Estevam 0x021b4840, 0x03200263,
7983b30eeceSFabio Estevam 0x021b0848, 0x4B434748,
7993b30eeceSFabio Estevam 0x021b4848, 0x4445404C,
8003b30eeceSFabio Estevam 0x021b0850, 0x38444542,
8013b30eeceSFabio Estevam 0x021b4850, 0x4935493A,
8023b30eeceSFabio Estevam 0x021b081c, 0x33333333,
8033b30eeceSFabio Estevam 0x021b0820, 0x33333333,
8043b30eeceSFabio Estevam 0x021b0824, 0x33333333,
8053b30eeceSFabio Estevam 0x021b0828, 0x33333333,
8063b30eeceSFabio Estevam 0x021b481c, 0x33333333,
8073b30eeceSFabio Estevam 0x021b4820, 0x33333333,
8083b30eeceSFabio Estevam 0x021b4824, 0x33333333,
8093b30eeceSFabio Estevam 0x021b4828, 0x33333333,
8103b30eeceSFabio Estevam 0x021b08b8, 0x00000800,
8113b30eeceSFabio Estevam 0x021b48b8, 0x00000800,
8123b30eeceSFabio Estevam 0x021b0004, 0x00020036,
8133b30eeceSFabio Estevam 0x021b0008, 0x09444040,
8143b30eeceSFabio Estevam 0x021b000c, 0x555A7975,
8153b30eeceSFabio Estevam 0x021b0010, 0xFF538F64,
8163b30eeceSFabio Estevam 0x021b0014, 0x01FF00DB,
8173b30eeceSFabio Estevam 0x021b0018, 0x00001740,
8183b30eeceSFabio Estevam 0x021b001c, 0x00008000,
8193b30eeceSFabio Estevam 0x021b002c, 0x000026d2,
8203b30eeceSFabio Estevam 0x021b0030, 0x005A1023,
8213b30eeceSFabio Estevam 0x021b0040, 0x00000027,
8223b30eeceSFabio Estevam 0x021b0000, 0x831A0000,
8233b30eeceSFabio Estevam 0x021b001c, 0x04088032,
8243b30eeceSFabio Estevam 0x021b001c, 0x00008033,
8253b30eeceSFabio Estevam 0x021b001c, 0x00048031,
8263b30eeceSFabio Estevam 0x021b001c, 0x09408030,
8273b30eeceSFabio Estevam 0x021b001c, 0x04008040,
8283b30eeceSFabio Estevam 0x021b0020, 0x00005800,
8293b30eeceSFabio Estevam 0x021b0818, 0x00011117,
8303b30eeceSFabio Estevam 0x021b4818, 0x00011117,
8313b30eeceSFabio Estevam 0x021b0004, 0x00025576,
8323b30eeceSFabio Estevam 0x021b0404, 0x00011006,
8333b30eeceSFabio Estevam 0x021b001c, 0x00000000,
83475f2ba42SJohn Tobias };
83575f2ba42SJohn Tobias
8363b30eeceSFabio Estevam static int mx6qp_dcd_table[] = {
8373b30eeceSFabio Estevam 0x020e0798, 0x000c0000,
8383b30eeceSFabio Estevam 0x020e0758, 0x00000000,
8393b30eeceSFabio Estevam 0x020e0588, 0x00000030,
8403b30eeceSFabio Estevam 0x020e0594, 0x00000030,
8413b30eeceSFabio Estevam 0x020e056c, 0x00000030,
8423b30eeceSFabio Estevam 0x020e0578, 0x00000030,
8433b30eeceSFabio Estevam 0x020e074c, 0x00000030,
8443b30eeceSFabio Estevam 0x020e057c, 0x00000030,
8453b30eeceSFabio Estevam 0x020e058c, 0x00000000,
8463b30eeceSFabio Estevam 0x020e059c, 0x00000030,
8473b30eeceSFabio Estevam 0x020e05a0, 0x00000030,
8483b30eeceSFabio Estevam 0x020e078c, 0x00000030,
8493b30eeceSFabio Estevam 0x020e0750, 0x00020000,
8503b30eeceSFabio Estevam 0x020e05a8, 0x00000030,
8513b30eeceSFabio Estevam 0x020e05b0, 0x00000030,
8523b30eeceSFabio Estevam 0x020e0524, 0x00000030,
8533b30eeceSFabio Estevam 0x020e051c, 0x00000030,
8543b30eeceSFabio Estevam 0x020e0518, 0x00000030,
8553b30eeceSFabio Estevam 0x020e050c, 0x00000030,
8563b30eeceSFabio Estevam 0x020e05b8, 0x00000030,
8573b30eeceSFabio Estevam 0x020e05c0, 0x00000030,
8583b30eeceSFabio Estevam 0x020e0774, 0x00020000,
8593b30eeceSFabio Estevam 0x020e0784, 0x00000030,
8603b30eeceSFabio Estevam 0x020e0788, 0x00000030,
8613b30eeceSFabio Estevam 0x020e0794, 0x00000030,
8623b30eeceSFabio Estevam 0x020e079c, 0x00000030,
8633b30eeceSFabio Estevam 0x020e07a0, 0x00000030,
8643b30eeceSFabio Estevam 0x020e07a4, 0x00000030,
8653b30eeceSFabio Estevam 0x020e07a8, 0x00000030,
8663b30eeceSFabio Estevam 0x020e0748, 0x00000030,
8673b30eeceSFabio Estevam 0x020e05ac, 0x00000030,
8683b30eeceSFabio Estevam 0x020e05b4, 0x00000030,
8693b30eeceSFabio Estevam 0x020e0528, 0x00000030,
8703b30eeceSFabio Estevam 0x020e0520, 0x00000030,
8713b30eeceSFabio Estevam 0x020e0514, 0x00000030,
8723b30eeceSFabio Estevam 0x020e0510, 0x00000030,
8733b30eeceSFabio Estevam 0x020e05bc, 0x00000030,
8743b30eeceSFabio Estevam 0x020e05c4, 0x00000030,
8753b30eeceSFabio Estevam 0x021b0800, 0xa1390003,
8763b30eeceSFabio Estevam 0x021b080c, 0x001b001e,
8773b30eeceSFabio Estevam 0x021b0810, 0x002e0029,
8783b30eeceSFabio Estevam 0x021b480c, 0x001b002a,
8793b30eeceSFabio Estevam 0x021b4810, 0x0019002c,
8803b30eeceSFabio Estevam 0x021b083c, 0x43240334,
8813b30eeceSFabio Estevam 0x021b0840, 0x0324031a,
8823b30eeceSFabio Estevam 0x021b483c, 0x43340344,
8833b30eeceSFabio Estevam 0x021b4840, 0x03280276,
8843b30eeceSFabio Estevam 0x021b0848, 0x44383A3E,
8853b30eeceSFabio Estevam 0x021b4848, 0x3C3C3846,
8863b30eeceSFabio Estevam 0x021b0850, 0x2e303230,
8873b30eeceSFabio Estevam 0x021b4850, 0x38283E34,
8883b30eeceSFabio Estevam 0x021b081c, 0x33333333,
8893b30eeceSFabio Estevam 0x021b0820, 0x33333333,
8903b30eeceSFabio Estevam 0x021b0824, 0x33333333,
8913b30eeceSFabio Estevam 0x021b0828, 0x33333333,
8923b30eeceSFabio Estevam 0x021b481c, 0x33333333,
8933b30eeceSFabio Estevam 0x021b4820, 0x33333333,
8943b30eeceSFabio Estevam 0x021b4824, 0x33333333,
8953b30eeceSFabio Estevam 0x021b4828, 0x33333333,
8963b30eeceSFabio Estevam 0x021b08c0, 0x24912249,
8973b30eeceSFabio Estevam 0x021b48c0, 0x24914289,
8983b30eeceSFabio Estevam 0x021b08b8, 0x00000800,
8993b30eeceSFabio Estevam 0x021b48b8, 0x00000800,
9003b30eeceSFabio Estevam 0x021b0004, 0x00020036,
9013b30eeceSFabio Estevam 0x021b0008, 0x24444040,
9023b30eeceSFabio Estevam 0x021b000c, 0x555A7955,
9033b30eeceSFabio Estevam 0x021b0010, 0xFF320F64,
9043b30eeceSFabio Estevam 0x021b0014, 0x01ff00db,
9053b30eeceSFabio Estevam 0x021b0018, 0x00001740,
9063b30eeceSFabio Estevam 0x021b001c, 0x00008000,
9073b30eeceSFabio Estevam 0x021b002c, 0x000026d2,
9083b30eeceSFabio Estevam 0x021b0030, 0x005A1023,
9093b30eeceSFabio Estevam 0x021b0040, 0x00000027,
9103b30eeceSFabio Estevam 0x021b0400, 0x14420000,
9113b30eeceSFabio Estevam 0x021b0000, 0x831A0000,
9123b30eeceSFabio Estevam 0x021b0890, 0x00400C58,
9133b30eeceSFabio Estevam 0x00bb0008, 0x00000000,
9143b30eeceSFabio Estevam 0x00bb000c, 0x2891E41A,
9153b30eeceSFabio Estevam 0x00bb0038, 0x00000564,
9163b30eeceSFabio Estevam 0x00bb0014, 0x00000040,
9173b30eeceSFabio Estevam 0x00bb0028, 0x00000020,
9183b30eeceSFabio Estevam 0x00bb002c, 0x00000020,
9193b30eeceSFabio Estevam 0x021b001c, 0x04088032,
9203b30eeceSFabio Estevam 0x021b001c, 0x00008033,
9213b30eeceSFabio Estevam 0x021b001c, 0x00048031,
9223b30eeceSFabio Estevam 0x021b001c, 0x09408030,
9233b30eeceSFabio Estevam 0x021b001c, 0x04008040,
9243b30eeceSFabio Estevam 0x021b0020, 0x00005800,
9253b30eeceSFabio Estevam 0x021b0818, 0x00011117,
9263b30eeceSFabio Estevam 0x021b4818, 0x00011117,
9273b30eeceSFabio Estevam 0x021b0004, 0x00025576,
9283b30eeceSFabio Estevam 0x021b0404, 0x00011006,
9293b30eeceSFabio Estevam 0x021b001c, 0x00000000,
9303b30eeceSFabio Estevam };
9313b30eeceSFabio Estevam
932b22841e5SFabio Estevam static int mx6dl_dcd_table[] = {
933b22841e5SFabio Estevam 0x020e0774, 0x000C0000,
934b22841e5SFabio Estevam 0x020e0754, 0x00000000,
935b22841e5SFabio Estevam 0x020e04ac, 0x00000030,
936b22841e5SFabio Estevam 0x020e04b0, 0x00000030,
937b22841e5SFabio Estevam 0x020e0464, 0x00000030,
938b22841e5SFabio Estevam 0x020e0490, 0x00000030,
939b22841e5SFabio Estevam 0x020e074c, 0x00000030,
940b22841e5SFabio Estevam 0x020e0494, 0x00000030,
941b22841e5SFabio Estevam 0x020e04a0, 0x00000000,
942b22841e5SFabio Estevam 0x020e04b4, 0x00000030,
943b22841e5SFabio Estevam 0x020e04b8, 0x00000030,
944b22841e5SFabio Estevam 0x020e076c, 0x00000030,
945b22841e5SFabio Estevam 0x020e0750, 0x00020000,
946b22841e5SFabio Estevam 0x020e04bc, 0x00000030,
947b22841e5SFabio Estevam 0x020e04c0, 0x00000030,
948b22841e5SFabio Estevam 0x020e04c4, 0x00000030,
949b22841e5SFabio Estevam 0x020e04c8, 0x00000030,
950b22841e5SFabio Estevam 0x020e04cc, 0x00000030,
951b22841e5SFabio Estevam 0x020e04d0, 0x00000030,
952b22841e5SFabio Estevam 0x020e04d4, 0x00000030,
953b22841e5SFabio Estevam 0x020e04d8, 0x00000030,
954b22841e5SFabio Estevam 0x020e0760, 0x00020000,
955b22841e5SFabio Estevam 0x020e0764, 0x00000030,
956b22841e5SFabio Estevam 0x020e0770, 0x00000030,
957b22841e5SFabio Estevam 0x020e0778, 0x00000030,
958b22841e5SFabio Estevam 0x020e077c, 0x00000030,
959b22841e5SFabio Estevam 0x020e0780, 0x00000030,
960b22841e5SFabio Estevam 0x020e0784, 0x00000030,
961b22841e5SFabio Estevam 0x020e078c, 0x00000030,
962b22841e5SFabio Estevam 0x020e0748, 0x00000030,
963b22841e5SFabio Estevam 0x020e0470, 0x00000030,
964b22841e5SFabio Estevam 0x020e0474, 0x00000030,
965b22841e5SFabio Estevam 0x020e0478, 0x00000030,
966b22841e5SFabio Estevam 0x020e047c, 0x00000030,
967b22841e5SFabio Estevam 0x020e0480, 0x00000030,
968b22841e5SFabio Estevam 0x020e0484, 0x00000030,
969b22841e5SFabio Estevam 0x020e0488, 0x00000030,
970b22841e5SFabio Estevam 0x020e048c, 0x00000030,
971b22841e5SFabio Estevam 0x021b0800, 0xa1390003,
972b22841e5SFabio Estevam 0x021b080c, 0x001F001F,
973b22841e5SFabio Estevam 0x021b0810, 0x001F001F,
974b22841e5SFabio Estevam 0x021b480c, 0x001F001F,
975b22841e5SFabio Estevam 0x021b4810, 0x001F001F,
976b22841e5SFabio Estevam 0x021b083c, 0x4220021F,
977b22841e5SFabio Estevam 0x021b0840, 0x0207017E,
978b22841e5SFabio Estevam 0x021b483c, 0x4201020C,
979b22841e5SFabio Estevam 0x021b4840, 0x01660172,
980b22841e5SFabio Estevam 0x021b0848, 0x4A4D4E4D,
981b22841e5SFabio Estevam 0x021b4848, 0x4A4F5049,
982b22841e5SFabio Estevam 0x021b0850, 0x3F3C3D31,
983b22841e5SFabio Estevam 0x021b4850, 0x3238372B,
984b22841e5SFabio Estevam 0x021b081c, 0x33333333,
985b22841e5SFabio Estevam 0x021b0820, 0x33333333,
986b22841e5SFabio Estevam 0x021b0824, 0x33333333,
987b22841e5SFabio Estevam 0x021b0828, 0x33333333,
988b22841e5SFabio Estevam 0x021b481c, 0x33333333,
989b22841e5SFabio Estevam 0x021b4820, 0x33333333,
990b22841e5SFabio Estevam 0x021b4824, 0x33333333,
991b22841e5SFabio Estevam 0x021b4828, 0x33333333,
992b22841e5SFabio Estevam 0x021b08b8, 0x00000800,
993b22841e5SFabio Estevam 0x021b48b8, 0x00000800,
994b22841e5SFabio Estevam 0x021b0004, 0x0002002D,
995b22841e5SFabio Estevam 0x021b0008, 0x00333030,
996b22841e5SFabio Estevam 0x021b000c, 0x3F435313,
997b22841e5SFabio Estevam 0x021b0010, 0xB66E8B63,
998b22841e5SFabio Estevam 0x021b0014, 0x01FF00DB,
999b22841e5SFabio Estevam 0x021b0018, 0x00001740,
1000b22841e5SFabio Estevam 0x021b001c, 0x00008000,
1001b22841e5SFabio Estevam 0x021b002c, 0x000026d2,
1002b22841e5SFabio Estevam 0x021b0030, 0x00431023,
1003b22841e5SFabio Estevam 0x021b0040, 0x00000027,
1004b22841e5SFabio Estevam 0x021b0000, 0x831A0000,
1005b22841e5SFabio Estevam 0x021b001c, 0x04008032,
1006b22841e5SFabio Estevam 0x021b001c, 0x00008033,
1007b22841e5SFabio Estevam 0x021b001c, 0x00048031,
1008b22841e5SFabio Estevam 0x021b001c, 0x05208030,
1009b22841e5SFabio Estevam 0x021b001c, 0x04008040,
1010b22841e5SFabio Estevam 0x021b0020, 0x00005800,
1011b22841e5SFabio Estevam 0x021b0818, 0x00011117,
1012b22841e5SFabio Estevam 0x021b4818, 0x00011117,
1013b22841e5SFabio Estevam 0x021b0004, 0x0002556D,
1014b22841e5SFabio Estevam 0x021b0404, 0x00011006,
1015b22841e5SFabio Estevam 0x021b001c, 0x00000000,
1016b22841e5SFabio Estevam };
1017b22841e5SFabio Estevam
ddr_init(int * table,int size)10183b30eeceSFabio Estevam static void ddr_init(int *table, int size)
10193b30eeceSFabio Estevam {
10203b30eeceSFabio Estevam int i;
10213b30eeceSFabio Estevam
10223b30eeceSFabio Estevam for (i = 0; i < size / 2 ; i++)
10233b30eeceSFabio Estevam writel(table[2 * i + 1], table[2 * i]);
102475f2ba42SJohn Tobias }
10253b30eeceSFabio Estevam
spl_dram_init(void)10263b30eeceSFabio Estevam static void spl_dram_init(void)
10273b30eeceSFabio Estevam {
10283b30eeceSFabio Estevam if (is_mx6dq())
10293b30eeceSFabio Estevam ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
10303b30eeceSFabio Estevam else if (is_mx6dqp())
10313b30eeceSFabio Estevam ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
1032b22841e5SFabio Estevam else if (is_mx6sdl())
1033b22841e5SFabio Estevam ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
1034e469719cSPeng Fan }
103575f2ba42SJohn Tobias
board_init_f(ulong dummy)103675f2ba42SJohn Tobias void board_init_f(ulong dummy)
103775f2ba42SJohn Tobias {
10383b30eeceSFabio Estevam /* DDR initialization */
10393b30eeceSFabio Estevam spl_dram_init();
10403b30eeceSFabio Estevam
104175f2ba42SJohn Tobias /* setup AIPS and disable watchdog */
104275f2ba42SJohn Tobias arch_cpu_init();
104375f2ba42SJohn Tobias
10446e9b6bb5SFabio Estevam ccgr_init();
10456e9b6bb5SFabio Estevam gpr_init();
10466e9b6bb5SFabio Estevam
104775f2ba42SJohn Tobias /* iomux and setup of i2c */
104875f2ba42SJohn Tobias board_early_init_f();
104975f2ba42SJohn Tobias
105075f2ba42SJohn Tobias /* setup GP timer */
105175f2ba42SJohn Tobias timer_init();
105275f2ba42SJohn Tobias
105375f2ba42SJohn Tobias /* UART clocks enabled and gd valid - init serial console */
105475f2ba42SJohn Tobias preloader_console_init();
105575f2ba42SJohn Tobias
105675f2ba42SJohn Tobias /* Clear the BSS. */
105775f2ba42SJohn Tobias memset(__bss_start, 0, __bss_end - __bss_start);
105875f2ba42SJohn Tobias
105975f2ba42SJohn Tobias /* load/boot image from boot device */
106075f2ba42SJohn Tobias board_init_r(NULL, 0);
106175f2ba42SJohn Tobias }
106275f2ba42SJohn Tobias #endif
1063