1f0ff57b0SPeng Fan /*
2f0ff57b0SPeng Fan * Copyright (C) 2015 Freescale Semiconductor, Inc.
3f0ff57b0SPeng Fan *
4f0ff57b0SPeng Fan * SPDX-License-Identifier: GPL-2.0+
5f0ff57b0SPeng Fan */
6f0ff57b0SPeng Fan
7f0ff57b0SPeng Fan #include <asm/arch/clock.h>
8f0ff57b0SPeng Fan #include <asm/arch/iomux.h>
9f0ff57b0SPeng Fan #include <asm/arch/imx-regs.h>
10f0ff57b0SPeng Fan #include <asm/arch/crm_regs.h>
11f0ff57b0SPeng Fan #include <asm/arch/mx6ul_pins.h>
12f0ff57b0SPeng Fan #include <asm/arch/mx6-pins.h>
13f0ff57b0SPeng Fan #include <asm/arch/sys_proto.h>
14f0ff57b0SPeng Fan #include <asm/gpio.h>
15552a848eSStefano Babic #include <asm/mach-imx/iomux-v3.h>
16552a848eSStefano Babic #include <asm/mach-imx/boot_mode.h>
17552a848eSStefano Babic #include <asm/mach-imx/mxc_i2c.h>
18f0ff57b0SPeng Fan #include <asm/io.h>
19f0ff57b0SPeng Fan #include <common.h>
20f0ff57b0SPeng Fan #include <fsl_esdhc.h>
21f0ff57b0SPeng Fan #include <i2c.h>
220d4cdb56SPeng Fan #include <miiphy.h>
23f0ff57b0SPeng Fan #include <linux/sizes.h>
24f0ff57b0SPeng Fan #include <mmc.h>
250d4cdb56SPeng Fan #include <netdev.h>
26d9cbb264SPeng Fan #include <power/pmic.h>
27d9cbb264SPeng Fan #include <power/pfuze3000_pmic.h>
28d9cbb264SPeng Fan #include "../common/pfuze.h"
29f0ff57b0SPeng Fan #include <usb.h>
30e162c6b1SMateusz Kulikowski #include <usb/ehci-ci.h>
31f0ff57b0SPeng Fan
32f0ff57b0SPeng Fan DECLARE_GLOBAL_DATA_PTR;
33f0ff57b0SPeng Fan
34f0ff57b0SPeng Fan #define UART_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
35f0ff57b0SPeng Fan PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
36f0ff57b0SPeng Fan PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
37f0ff57b0SPeng Fan
38f0ff57b0SPeng Fan #define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
39f0ff57b0SPeng Fan PAD_CTL_PUS_22K_UP | PAD_CTL_SPEED_LOW | \
40f0ff57b0SPeng Fan PAD_CTL_DSE_80ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
41f0ff57b0SPeng Fan
42f0ff57b0SPeng Fan #define USDHC_DAT3_CD_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
43f0ff57b0SPeng Fan PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_LOW | \
44f0ff57b0SPeng Fan PAD_CTL_DSE_80ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
45f0ff57b0SPeng Fan
46f0ff57b0SPeng Fan #define I2C_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
47f0ff57b0SPeng Fan PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
48f0ff57b0SPeng Fan PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
49f0ff57b0SPeng Fan PAD_CTL_ODE)
50f0ff57b0SPeng Fan
510d4cdb56SPeng Fan #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE | \
520d4cdb56SPeng Fan PAD_CTL_SPEED_HIGH | \
530d4cdb56SPeng Fan PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST)
540d4cdb56SPeng Fan
55df674904SPeng Fan #define LCD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_PUS_100K_UP | PAD_CTL_PUE | \
56df674904SPeng Fan PAD_CTL_PKE | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm)
57df674904SPeng Fan
580d4cdb56SPeng Fan #define MDIO_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE | \
590d4cdb56SPeng Fan PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST | PAD_CTL_ODE)
600d4cdb56SPeng Fan
610d4cdb56SPeng Fan #define ENET_CLK_PAD_CTRL (PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
620d4cdb56SPeng Fan
63f0ff57b0SPeng Fan #define IOX_SDI IMX_GPIO_NR(5, 10)
64f0ff57b0SPeng Fan #define IOX_STCP IMX_GPIO_NR(5, 7)
65f0ff57b0SPeng Fan #define IOX_SHCP IMX_GPIO_NR(5, 11)
6685801579SPeng Fan #define IOX_OE IMX_GPIO_NR(5, 8)
67f0ff57b0SPeng Fan
68f0ff57b0SPeng Fan static iomux_v3_cfg_t const iox_pads[] = {
69f0ff57b0SPeng Fan /* IOX_SDI */
70f0ff57b0SPeng Fan MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
71f0ff57b0SPeng Fan /* IOX_SHCP */
72f0ff57b0SPeng Fan MX6_PAD_BOOT_MODE1__GPIO5_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
73f0ff57b0SPeng Fan /* IOX_STCP */
74f0ff57b0SPeng Fan MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
75f0ff57b0SPeng Fan /* IOX_nOE */
76f0ff57b0SPeng Fan MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
77f0ff57b0SPeng Fan };
78f0ff57b0SPeng Fan
79f0ff57b0SPeng Fan /*
80f0ff57b0SPeng Fan * HDMI_nRST --> Q0
81f0ff57b0SPeng Fan * ENET1_nRST --> Q1
82f0ff57b0SPeng Fan * ENET2_nRST --> Q2
83f0ff57b0SPeng Fan * CAN1_2_STBY --> Q3
84f0ff57b0SPeng Fan * BT_nPWD --> Q4
85f0ff57b0SPeng Fan * CSI_RST --> Q5
86f0ff57b0SPeng Fan * CSI_PWDN --> Q6
87f0ff57b0SPeng Fan * LCD_nPWREN --> Q7
88f0ff57b0SPeng Fan */
89f0ff57b0SPeng Fan enum qn {
90f0ff57b0SPeng Fan HDMI_NRST,
91f0ff57b0SPeng Fan ENET1_NRST,
92f0ff57b0SPeng Fan ENET2_NRST,
93f0ff57b0SPeng Fan CAN1_2_STBY,
94f0ff57b0SPeng Fan BT_NPWD,
95f0ff57b0SPeng Fan CSI_RST,
96f0ff57b0SPeng Fan CSI_PWDN,
97f0ff57b0SPeng Fan LCD_NPWREN,
98f0ff57b0SPeng Fan };
99f0ff57b0SPeng Fan
100f0ff57b0SPeng Fan enum qn_func {
101f0ff57b0SPeng Fan qn_reset,
102f0ff57b0SPeng Fan qn_enable,
103f0ff57b0SPeng Fan qn_disable,
104f0ff57b0SPeng Fan };
105f0ff57b0SPeng Fan
106f0ff57b0SPeng Fan enum qn_level {
107f0ff57b0SPeng Fan qn_low = 0,
108f0ff57b0SPeng Fan qn_high = 1,
109f0ff57b0SPeng Fan };
110f0ff57b0SPeng Fan
111f0ff57b0SPeng Fan static enum qn_level seq[3][2] = {
112f0ff57b0SPeng Fan {0, 1}, {1, 1}, {0, 0}
113f0ff57b0SPeng Fan };
114f0ff57b0SPeng Fan
115f0ff57b0SPeng Fan static enum qn_func qn_output[8] = {
116f0ff57b0SPeng Fan qn_reset, qn_reset, qn_reset, qn_enable, qn_disable, qn_reset,
11728868328SPeng Fan qn_disable, qn_disable
118f0ff57b0SPeng Fan };
119f0ff57b0SPeng Fan
iox74lv_init(void)120f0ff57b0SPeng Fan static void iox74lv_init(void)
121f0ff57b0SPeng Fan {
122f0ff57b0SPeng Fan int i;
123f0ff57b0SPeng Fan
124f0ff57b0SPeng Fan gpio_direction_output(IOX_OE, 0);
125f0ff57b0SPeng Fan
126f0ff57b0SPeng Fan for (i = 7; i >= 0; i--) {
127f0ff57b0SPeng Fan gpio_direction_output(IOX_SHCP, 0);
128f0ff57b0SPeng Fan gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
129f0ff57b0SPeng Fan udelay(500);
130f0ff57b0SPeng Fan gpio_direction_output(IOX_SHCP, 1);
131f0ff57b0SPeng Fan udelay(500);
132f0ff57b0SPeng Fan }
133f0ff57b0SPeng Fan
134f0ff57b0SPeng Fan gpio_direction_output(IOX_STCP, 0);
135f0ff57b0SPeng Fan udelay(500);
136f0ff57b0SPeng Fan /*
137f0ff57b0SPeng Fan * shift register will be output to pins
138f0ff57b0SPeng Fan */
139f0ff57b0SPeng Fan gpio_direction_output(IOX_STCP, 1);
140f0ff57b0SPeng Fan
141f0ff57b0SPeng Fan for (i = 7; i >= 0; i--) {
142f0ff57b0SPeng Fan gpio_direction_output(IOX_SHCP, 0);
143f0ff57b0SPeng Fan gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
144f0ff57b0SPeng Fan udelay(500);
145f0ff57b0SPeng Fan gpio_direction_output(IOX_SHCP, 1);
146f0ff57b0SPeng Fan udelay(500);
147f0ff57b0SPeng Fan }
148f0ff57b0SPeng Fan gpio_direction_output(IOX_STCP, 0);
149f0ff57b0SPeng Fan udelay(500);
150f0ff57b0SPeng Fan /*
151f0ff57b0SPeng Fan * shift register will be output to pins
152f0ff57b0SPeng Fan */
153f0ff57b0SPeng Fan gpio_direction_output(IOX_STCP, 1);
154f0ff57b0SPeng Fan };
155f0ff57b0SPeng Fan
156f0ff57b0SPeng Fan #ifdef CONFIG_SYS_I2C_MXC
157f0ff57b0SPeng Fan #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
158f0ff57b0SPeng Fan /* I2C1 for PMIC and EEPROM */
159d547e7abSFabio Estevam static struct i2c_pads_info i2c_pad_info1 = {
160f0ff57b0SPeng Fan .scl = {
161f0ff57b0SPeng Fan .i2c_mode = MX6_PAD_UART4_TX_DATA__I2C1_SCL | PC,
162f0ff57b0SPeng Fan .gpio_mode = MX6_PAD_UART4_TX_DATA__GPIO1_IO28 | PC,
163f0ff57b0SPeng Fan .gp = IMX_GPIO_NR(1, 28),
164f0ff57b0SPeng Fan },
165f0ff57b0SPeng Fan .sda = {
166f0ff57b0SPeng Fan .i2c_mode = MX6_PAD_UART4_RX_DATA__I2C1_SDA | PC,
167f0ff57b0SPeng Fan .gpio_mode = MX6_PAD_UART4_RX_DATA__GPIO1_IO29 | PC,
168f0ff57b0SPeng Fan .gp = IMX_GPIO_NR(1, 29),
169f0ff57b0SPeng Fan },
170f0ff57b0SPeng Fan };
171d9cbb264SPeng Fan
172d9cbb264SPeng Fan #ifdef CONFIG_POWER
173d9cbb264SPeng Fan #define I2C_PMIC 0
power_init_board(void)174d9cbb264SPeng Fan int power_init_board(void)
175d9cbb264SPeng Fan {
176d9cbb264SPeng Fan if (is_mx6ul_9x9_evk()) {
177d9cbb264SPeng Fan struct pmic *pfuze;
178d9cbb264SPeng Fan int ret;
179d9cbb264SPeng Fan unsigned int reg, rev_id;
180d9cbb264SPeng Fan
181d9cbb264SPeng Fan ret = power_pfuze3000_init(I2C_PMIC);
182d9cbb264SPeng Fan if (ret)
183d9cbb264SPeng Fan return ret;
184d9cbb264SPeng Fan
185d9cbb264SPeng Fan pfuze = pmic_get("PFUZE3000");
186d9cbb264SPeng Fan ret = pmic_probe(pfuze);
187d9cbb264SPeng Fan if (ret)
188d9cbb264SPeng Fan return ret;
189d9cbb264SPeng Fan
190d9cbb264SPeng Fan pmic_reg_read(pfuze, PFUZE3000_DEVICEID, ®);
191d9cbb264SPeng Fan pmic_reg_read(pfuze, PFUZE3000_REVID, &rev_id);
192d9cbb264SPeng Fan printf("PMIC: PFUZE3000 DEV_ID=0x%x REV_ID=0x%x\n",
193d9cbb264SPeng Fan reg, rev_id);
194d9cbb264SPeng Fan
195d9cbb264SPeng Fan /* disable Low Power Mode during standby mode */
196946db0cbSFabio Estevam pmic_reg_write(pfuze, PFUZE3000_LDOGCTL, 0x1);
197d9cbb264SPeng Fan
198d9cbb264SPeng Fan /* SW1B step ramp up time from 2us to 4us/25mV */
199d9cbb264SPeng Fan reg = 0x40;
200d9cbb264SPeng Fan pmic_reg_write(pfuze, PFUZE3000_SW1BCONF, reg);
201d9cbb264SPeng Fan
202d9cbb264SPeng Fan /* SW1B mode to APS/PFM */
203d9cbb264SPeng Fan reg = 0xc;
204d9cbb264SPeng Fan pmic_reg_write(pfuze, PFUZE3000_SW1BMODE, reg);
205d9cbb264SPeng Fan
206d9cbb264SPeng Fan /* SW1B standby voltage set to 0.975V */
207d9cbb264SPeng Fan reg = 0xb;
208d9cbb264SPeng Fan pmic_reg_write(pfuze, PFUZE3000_SW1BSTBY, reg);
209d9cbb264SPeng Fan }
210d9cbb264SPeng Fan
211d9cbb264SPeng Fan return 0;
212d9cbb264SPeng Fan }
213d9cbb264SPeng Fan #endif
214f0ff57b0SPeng Fan #endif
215f0ff57b0SPeng Fan
dram_init(void)216f0ff57b0SPeng Fan int dram_init(void)
217f0ff57b0SPeng Fan {
218d9cbb264SPeng Fan gd->ram_size = imx_ddr_size();
219f0ff57b0SPeng Fan
220f0ff57b0SPeng Fan return 0;
221f0ff57b0SPeng Fan }
222f0ff57b0SPeng Fan
223f0ff57b0SPeng Fan static iomux_v3_cfg_t const uart1_pads[] = {
224f0ff57b0SPeng Fan MX6_PAD_UART1_TX_DATA__UART1_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
225f0ff57b0SPeng Fan MX6_PAD_UART1_RX_DATA__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
226f0ff57b0SPeng Fan };
227f0ff57b0SPeng Fan
22868717594STom Rini #ifndef CONFIG_SPL_BUILD
229f0ff57b0SPeng Fan static iomux_v3_cfg_t const usdhc1_pads[] = {
230f0ff57b0SPeng Fan MX6_PAD_SD1_CLK__USDHC1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
231f0ff57b0SPeng Fan MX6_PAD_SD1_CMD__USDHC1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
232f0ff57b0SPeng Fan MX6_PAD_SD1_DATA0__USDHC1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
233f0ff57b0SPeng Fan MX6_PAD_SD1_DATA1__USDHC1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
234f0ff57b0SPeng Fan MX6_PAD_SD1_DATA2__USDHC1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
235f0ff57b0SPeng Fan MX6_PAD_SD1_DATA3__USDHC1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
236f0ff57b0SPeng Fan
237f0ff57b0SPeng Fan /* VSELECT */
238f0ff57b0SPeng Fan MX6_PAD_GPIO1_IO05__USDHC1_VSELECT | MUX_PAD_CTRL(USDHC_PAD_CTRL),
239f0ff57b0SPeng Fan /* CD */
240f0ff57b0SPeng Fan MX6_PAD_UART1_RTS_B__GPIO1_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL),
241f0ff57b0SPeng Fan /* RST_B */
242f0ff57b0SPeng Fan MX6_PAD_GPIO1_IO09__GPIO1_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL),
243f0ff57b0SPeng Fan };
24468717594STom Rini #endif
245f0ff57b0SPeng Fan
246f0ff57b0SPeng Fan /*
247f0ff57b0SPeng Fan * mx6ul_14x14_evk board default supports sd card. If want to use
248f0ff57b0SPeng Fan * EMMC, need to do board rework for sd2.
249f0ff57b0SPeng Fan * Introduce CONFIG_MX6UL_14X14_EVK_EMMC_REWORK, if sd2 reworked to support
250f0ff57b0SPeng Fan * emmc, need to define this macro.
251f0ff57b0SPeng Fan */
252f0ff57b0SPeng Fan #if defined(CONFIG_MX6UL_14X14_EVK_EMMC_REWORK)
253f0ff57b0SPeng Fan static iomux_v3_cfg_t const usdhc2_emmc_pads[] = {
254f0ff57b0SPeng Fan MX6_PAD_NAND_RE_B__USDHC2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
255f0ff57b0SPeng Fan MX6_PAD_NAND_WE_B__USDHC2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
256f0ff57b0SPeng Fan MX6_PAD_NAND_DATA00__USDHC2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
257f0ff57b0SPeng Fan MX6_PAD_NAND_DATA01__USDHC2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
258f0ff57b0SPeng Fan MX6_PAD_NAND_DATA02__USDHC2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
259f0ff57b0SPeng Fan MX6_PAD_NAND_DATA03__USDHC2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
260f0ff57b0SPeng Fan MX6_PAD_NAND_DATA04__USDHC2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
261f0ff57b0SPeng Fan MX6_PAD_NAND_DATA05__USDHC2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
262f0ff57b0SPeng Fan MX6_PAD_NAND_DATA06__USDHC2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
263f0ff57b0SPeng Fan MX6_PAD_NAND_DATA07__USDHC2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
264f0ff57b0SPeng Fan
265f0ff57b0SPeng Fan /*
266f0ff57b0SPeng Fan * RST_B
267f0ff57b0SPeng Fan */
268f0ff57b0SPeng Fan MX6_PAD_NAND_ALE__GPIO4_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
269f0ff57b0SPeng Fan };
270f0ff57b0SPeng Fan #else
271f0ff57b0SPeng Fan static iomux_v3_cfg_t const usdhc2_pads[] = {
272f0ff57b0SPeng Fan MX6_PAD_NAND_RE_B__USDHC2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
273f0ff57b0SPeng Fan MX6_PAD_NAND_WE_B__USDHC2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
274f0ff57b0SPeng Fan MX6_PAD_NAND_DATA00__USDHC2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
275f0ff57b0SPeng Fan MX6_PAD_NAND_DATA01__USDHC2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
276f0ff57b0SPeng Fan MX6_PAD_NAND_DATA02__USDHC2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
277f0ff57b0SPeng Fan MX6_PAD_NAND_DATA03__USDHC2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
278f0ff57b0SPeng Fan };
279f0ff57b0SPeng Fan
280f0ff57b0SPeng Fan /*
281f0ff57b0SPeng Fan * The evk board uses DAT3 to detect CD card plugin,
282f0ff57b0SPeng Fan * in u-boot we mux the pin to GPIO when doing board_mmc_getcd.
283f0ff57b0SPeng Fan */
284eb3813adSEric Nelson static iomux_v3_cfg_t const usdhc2_cd_pad =
285eb3813adSEric Nelson MX6_PAD_NAND_DATA03__GPIO4_IO05 | MUX_PAD_CTRL(USDHC_DAT3_CD_PAD_CTRL);
286f0ff57b0SPeng Fan
287eb3813adSEric Nelson static iomux_v3_cfg_t const usdhc2_dat3_pad =
288f0ff57b0SPeng Fan MX6_PAD_NAND_DATA03__USDHC2_DATA3 |
289eb3813adSEric Nelson MUX_PAD_CTRL(USDHC_DAT3_CD_PAD_CTRL);
290f0ff57b0SPeng Fan #endif
291f0ff57b0SPeng Fan
setup_iomux_uart(void)292f0ff57b0SPeng Fan static void setup_iomux_uart(void)
293f0ff57b0SPeng Fan {
294f0ff57b0SPeng Fan imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
295f0ff57b0SPeng Fan }
296f0ff57b0SPeng Fan
297f0ff57b0SPeng Fan #ifdef CONFIG_FSL_QSPI
298f0ff57b0SPeng Fan
299f0ff57b0SPeng Fan #define QSPI_PAD_CTRL1 \
300f0ff57b0SPeng Fan (PAD_CTL_SRE_FAST | PAD_CTL_SPEED_MED | \
3010d7cdc2aSPeng Fan PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_PUS_47K_UP | PAD_CTL_DSE_120ohm)
302f0ff57b0SPeng Fan
303f0ff57b0SPeng Fan static iomux_v3_cfg_t const quadspi_pads[] = {
304f0ff57b0SPeng Fan MX6_PAD_NAND_WP_B__QSPI_A_SCLK | MUX_PAD_CTRL(QSPI_PAD_CTRL1),
305f0ff57b0SPeng Fan MX6_PAD_NAND_READY_B__QSPI_A_DATA00 | MUX_PAD_CTRL(QSPI_PAD_CTRL1),
306f0ff57b0SPeng Fan MX6_PAD_NAND_CE0_B__QSPI_A_DATA01 | MUX_PAD_CTRL(QSPI_PAD_CTRL1),
307f0ff57b0SPeng Fan MX6_PAD_NAND_CE1_B__QSPI_A_DATA02 | MUX_PAD_CTRL(QSPI_PAD_CTRL1),
308f0ff57b0SPeng Fan MX6_PAD_NAND_CLE__QSPI_A_DATA03 | MUX_PAD_CTRL(QSPI_PAD_CTRL1),
309f0ff57b0SPeng Fan MX6_PAD_NAND_DQS__QSPI_A_SS0_B | MUX_PAD_CTRL(QSPI_PAD_CTRL1),
310f0ff57b0SPeng Fan };
311f0ff57b0SPeng Fan
board_qspi_init(void)312d547e7abSFabio Estevam static int board_qspi_init(void)
313f0ff57b0SPeng Fan {
314f0ff57b0SPeng Fan /* Set the iomux */
315f0ff57b0SPeng Fan imx_iomux_v3_setup_multiple_pads(quadspi_pads,
316f0ff57b0SPeng Fan ARRAY_SIZE(quadspi_pads));
317f0ff57b0SPeng Fan /* Set the clock */
318f0ff57b0SPeng Fan enable_qspi_clk(0);
319f0ff57b0SPeng Fan
320f0ff57b0SPeng Fan return 0;
321f0ff57b0SPeng Fan }
322f0ff57b0SPeng Fan #endif
323f0ff57b0SPeng Fan
324f0ff57b0SPeng Fan #ifdef CONFIG_FSL_ESDHC
325f0ff57b0SPeng Fan static struct fsl_esdhc_cfg usdhc_cfg[2] = {
326f0ff57b0SPeng Fan {USDHC1_BASE_ADDR, 0, 4},
327f0ff57b0SPeng Fan #if defined(CONFIG_MX6UL_14X14_EVK_EMMC_REWORK)
328f0ff57b0SPeng Fan {USDHC2_BASE_ADDR, 0, 8},
329f0ff57b0SPeng Fan #else
330f0ff57b0SPeng Fan {USDHC2_BASE_ADDR, 0, 4},
331f0ff57b0SPeng Fan #endif
332f0ff57b0SPeng Fan };
333f0ff57b0SPeng Fan
334f0ff57b0SPeng Fan #define USDHC1_CD_GPIO IMX_GPIO_NR(1, 19)
335f0ff57b0SPeng Fan #define USDHC1_PWR_GPIO IMX_GPIO_NR(1, 9)
336f0ff57b0SPeng Fan #define USDHC2_CD_GPIO IMX_GPIO_NR(4, 5)
337f0ff57b0SPeng Fan #define USDHC2_PWR_GPIO IMX_GPIO_NR(4, 10)
338f0ff57b0SPeng Fan
board_mmc_getcd(struct mmc * mmc)339f0ff57b0SPeng Fan int board_mmc_getcd(struct mmc *mmc)
340f0ff57b0SPeng Fan {
341f0ff57b0SPeng Fan struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
342f0ff57b0SPeng Fan int ret = 0;
343f0ff57b0SPeng Fan
344f0ff57b0SPeng Fan switch (cfg->esdhc_base) {
345f0ff57b0SPeng Fan case USDHC1_BASE_ADDR:
346f0ff57b0SPeng Fan ret = !gpio_get_value(USDHC1_CD_GPIO);
347f0ff57b0SPeng Fan break;
348f0ff57b0SPeng Fan case USDHC2_BASE_ADDR:
349f0ff57b0SPeng Fan #if defined(CONFIG_MX6UL_14X14_EVK_EMMC_REWORK)
350f0ff57b0SPeng Fan ret = 1;
351f0ff57b0SPeng Fan #else
352eb3813adSEric Nelson imx_iomux_v3_setup_pad(usdhc2_cd_pad);
353f0ff57b0SPeng Fan gpio_direction_input(USDHC2_CD_GPIO);
354f0ff57b0SPeng Fan
355f0ff57b0SPeng Fan /*
356f0ff57b0SPeng Fan * Since it is the DAT3 pin, this pin is pulled to
357f0ff57b0SPeng Fan * low voltage if no card
358f0ff57b0SPeng Fan */
359f0ff57b0SPeng Fan ret = gpio_get_value(USDHC2_CD_GPIO);
360f0ff57b0SPeng Fan
361eb3813adSEric Nelson imx_iomux_v3_setup_pad(usdhc2_dat3_pad);
362f0ff57b0SPeng Fan #endif
363f0ff57b0SPeng Fan break;
364f0ff57b0SPeng Fan }
365f0ff57b0SPeng Fan
366f0ff57b0SPeng Fan return ret;
367f0ff57b0SPeng Fan }
368f0ff57b0SPeng Fan
board_mmc_init(bd_t * bis)369f0ff57b0SPeng Fan int board_mmc_init(bd_t *bis)
370f0ff57b0SPeng Fan {
371f0ff57b0SPeng Fan #ifdef CONFIG_SPL_BUILD
372f0ff57b0SPeng Fan #if defined(CONFIG_MX6UL_14X14_EVK_EMMC_REWORK)
373f0ff57b0SPeng Fan imx_iomux_v3_setup_multiple_pads(usdhc2_emmc_pads,
374f0ff57b0SPeng Fan ARRAY_SIZE(usdhc2_emmc_pads));
375f0ff57b0SPeng Fan #else
376f0ff57b0SPeng Fan imx_iomux_v3_setup_multiple_pads(usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
377f0ff57b0SPeng Fan #endif
378f0ff57b0SPeng Fan gpio_direction_output(USDHC2_PWR_GPIO, 0);
379f0ff57b0SPeng Fan udelay(500);
380f0ff57b0SPeng Fan gpio_direction_output(USDHC2_PWR_GPIO, 1);
381f0ff57b0SPeng Fan usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
382f0ff57b0SPeng Fan return fsl_esdhc_initialize(bis, &usdhc_cfg[1]);
383f0ff57b0SPeng Fan #else
384f0ff57b0SPeng Fan int i, ret;
385f0ff57b0SPeng Fan
386f0ff57b0SPeng Fan /*
387f0ff57b0SPeng Fan * According to the board_mmc_init() the following map is done:
388a187559eSBin Meng * (U-Boot device node) (Physical Port)
389f0ff57b0SPeng Fan * mmc0 USDHC1
390f0ff57b0SPeng Fan * mmc1 USDHC2
391f0ff57b0SPeng Fan */
392f0ff57b0SPeng Fan for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
393f0ff57b0SPeng Fan switch (i) {
394f0ff57b0SPeng Fan case 0:
395f0ff57b0SPeng Fan imx_iomux_v3_setup_multiple_pads(
396f0ff57b0SPeng Fan usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
397f0ff57b0SPeng Fan gpio_direction_input(USDHC1_CD_GPIO);
398f0ff57b0SPeng Fan usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
399f0ff57b0SPeng Fan
400f0ff57b0SPeng Fan gpio_direction_output(USDHC1_PWR_GPIO, 0);
401f0ff57b0SPeng Fan udelay(500);
402f0ff57b0SPeng Fan gpio_direction_output(USDHC1_PWR_GPIO, 1);
403f0ff57b0SPeng Fan break;
404f0ff57b0SPeng Fan case 1:
405f0ff57b0SPeng Fan #if defined(CONFIG_MX6UL_14X14_EVK_EMMC_REWORK)
406f0ff57b0SPeng Fan imx_iomux_v3_setup_multiple_pads(
407f0ff57b0SPeng Fan usdhc2_emmc_pads, ARRAY_SIZE(usdhc2_emmc_pads));
408f0ff57b0SPeng Fan #else
409f0ff57b0SPeng Fan imx_iomux_v3_setup_multiple_pads(
410f0ff57b0SPeng Fan usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
411f0ff57b0SPeng Fan #endif
412f0ff57b0SPeng Fan gpio_direction_output(USDHC2_PWR_GPIO, 0);
413f0ff57b0SPeng Fan udelay(500);
414f0ff57b0SPeng Fan gpio_direction_output(USDHC2_PWR_GPIO, 1);
415f0ff57b0SPeng Fan usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
416f0ff57b0SPeng Fan break;
417f0ff57b0SPeng Fan default:
418f0ff57b0SPeng Fan printf("Warning: you configured more USDHC controllers (%d) than supported by the board\n", i + 1);
419f0ff57b0SPeng Fan return -EINVAL;
420f0ff57b0SPeng Fan }
421f0ff57b0SPeng Fan
422f0ff57b0SPeng Fan ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
423f0ff57b0SPeng Fan if (ret) {
424f0ff57b0SPeng Fan printf("Warning: failed to initialize mmc dev %d\n", i);
425f0ff57b0SPeng Fan return ret;
426f0ff57b0SPeng Fan }
427f0ff57b0SPeng Fan }
428f0ff57b0SPeng Fan #endif
429f0ff57b0SPeng Fan return 0;
430f0ff57b0SPeng Fan }
431f0ff57b0SPeng Fan #endif
432f0ff57b0SPeng Fan
433f0ff57b0SPeng Fan #ifdef CONFIG_USB_EHCI_MX6
434f0ff57b0SPeng Fan #define USB_OTHERREGS_OFFSET 0x800
435f0ff57b0SPeng Fan #define UCTRL_PWR_POL (1 << 9)
436f0ff57b0SPeng Fan
437f0ff57b0SPeng Fan static iomux_v3_cfg_t const usb_otg_pads[] = {
438f0ff57b0SPeng Fan MX6_PAD_GPIO1_IO00__ANATOP_OTG1_ID | MUX_PAD_CTRL(NO_PAD_CTRL),
439f0ff57b0SPeng Fan };
440f0ff57b0SPeng Fan
441f0ff57b0SPeng Fan /* At default the 3v3 enables the MIC2026 for VBUS power */
setup_usb(void)442f0ff57b0SPeng Fan static void setup_usb(void)
443f0ff57b0SPeng Fan {
444f0ff57b0SPeng Fan imx_iomux_v3_setup_multiple_pads(usb_otg_pads,
445f0ff57b0SPeng Fan ARRAY_SIZE(usb_otg_pads));
446f0ff57b0SPeng Fan }
447f0ff57b0SPeng Fan
board_usb_phy_mode(int port)448f0ff57b0SPeng Fan int board_usb_phy_mode(int port)
449f0ff57b0SPeng Fan {
450f0ff57b0SPeng Fan if (port == 1)
451f0ff57b0SPeng Fan return USB_INIT_HOST;
452f0ff57b0SPeng Fan else
453f0ff57b0SPeng Fan return usb_phy_mode(port);
454f0ff57b0SPeng Fan }
455f0ff57b0SPeng Fan
board_ehci_hcd_init(int port)456f0ff57b0SPeng Fan int board_ehci_hcd_init(int port)
457f0ff57b0SPeng Fan {
458f0ff57b0SPeng Fan u32 *usbnc_usb_ctrl;
459f0ff57b0SPeng Fan
460f0ff57b0SPeng Fan if (port > 1)
461f0ff57b0SPeng Fan return -EINVAL;
462f0ff57b0SPeng Fan
463f0ff57b0SPeng Fan usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET +
464f0ff57b0SPeng Fan port * 4);
465f0ff57b0SPeng Fan
466f0ff57b0SPeng Fan /* Set Power polarity */
467f0ff57b0SPeng Fan setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL);
468f0ff57b0SPeng Fan
469f0ff57b0SPeng Fan return 0;
470f0ff57b0SPeng Fan }
471f0ff57b0SPeng Fan #endif
472f0ff57b0SPeng Fan
4730d4cdb56SPeng Fan #ifdef CONFIG_FEC_MXC
4740d4cdb56SPeng Fan /*
4750d4cdb56SPeng Fan * pin conflicts for fec1 and fec2, GPIO1_IO06 and GPIO1_IO07 can only
4760d4cdb56SPeng Fan * be used for ENET1 or ENET2, cannot be used for both.
4770d4cdb56SPeng Fan */
4780d4cdb56SPeng Fan static iomux_v3_cfg_t const fec1_pads[] = {
4790d4cdb56SPeng Fan MX6_PAD_GPIO1_IO06__ENET1_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
4800d4cdb56SPeng Fan MX6_PAD_GPIO1_IO07__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
4810d4cdb56SPeng Fan MX6_PAD_ENET1_TX_DATA0__ENET1_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
4820d4cdb56SPeng Fan MX6_PAD_ENET1_TX_DATA1__ENET1_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
4830d4cdb56SPeng Fan MX6_PAD_ENET1_TX_EN__ENET1_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
4840d4cdb56SPeng Fan MX6_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),
4850d4cdb56SPeng Fan MX6_PAD_ENET1_RX_DATA0__ENET1_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
4860d4cdb56SPeng Fan MX6_PAD_ENET1_RX_DATA1__ENET1_RDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
4870d4cdb56SPeng Fan MX6_PAD_ENET1_RX_ER__ENET1_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
4880d4cdb56SPeng Fan MX6_PAD_ENET1_RX_EN__ENET1_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
4890d4cdb56SPeng Fan };
4900d4cdb56SPeng Fan
4910d4cdb56SPeng Fan static iomux_v3_cfg_t const fec2_pads[] = {
4920d4cdb56SPeng Fan MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
4930d4cdb56SPeng Fan MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
4940d4cdb56SPeng Fan
4950d4cdb56SPeng Fan MX6_PAD_ENET2_TX_DATA0__ENET2_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
4960d4cdb56SPeng Fan MX6_PAD_ENET2_TX_DATA1__ENET2_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
4970d4cdb56SPeng Fan MX6_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),
4980d4cdb56SPeng Fan MX6_PAD_ENET2_TX_EN__ENET2_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
4990d4cdb56SPeng Fan
5000d4cdb56SPeng Fan MX6_PAD_ENET2_RX_DATA0__ENET2_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
5010d4cdb56SPeng Fan MX6_PAD_ENET2_RX_DATA1__ENET2_RDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
5020d4cdb56SPeng Fan MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
5030d4cdb56SPeng Fan MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
5040d4cdb56SPeng Fan };
5050d4cdb56SPeng Fan
setup_iomux_fec(int fec_id)5060d4cdb56SPeng Fan static void setup_iomux_fec(int fec_id)
5070d4cdb56SPeng Fan {
5080d4cdb56SPeng Fan if (fec_id == 0)
5090d4cdb56SPeng Fan imx_iomux_v3_setup_multiple_pads(fec1_pads,
5100d4cdb56SPeng Fan ARRAY_SIZE(fec1_pads));
5110d4cdb56SPeng Fan else
5120d4cdb56SPeng Fan imx_iomux_v3_setup_multiple_pads(fec2_pads,
5130d4cdb56SPeng Fan ARRAY_SIZE(fec2_pads));
5140d4cdb56SPeng Fan }
5150d4cdb56SPeng Fan
board_eth_init(bd_t * bis)5160d4cdb56SPeng Fan int board_eth_init(bd_t *bis)
5170d4cdb56SPeng Fan {
5180d4cdb56SPeng Fan setup_iomux_fec(CONFIG_FEC_ENET_DEV);
5190d4cdb56SPeng Fan
5200d4cdb56SPeng Fan return fecmxc_initialize_multi(bis, CONFIG_FEC_ENET_DEV,
5210d4cdb56SPeng Fan CONFIG_FEC_MXC_PHYADDR, IMX_FEC_BASE);
5220d4cdb56SPeng Fan }
5230d4cdb56SPeng Fan
setup_fec(int fec_id)5240d4cdb56SPeng Fan static int setup_fec(int fec_id)
5250d4cdb56SPeng Fan {
5260d4cdb56SPeng Fan struct iomuxc *const iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
5270d4cdb56SPeng Fan int ret;
5280d4cdb56SPeng Fan
5290d4cdb56SPeng Fan if (fec_id == 0) {
5300d4cdb56SPeng Fan /*
5310d4cdb56SPeng Fan * Use 50M anatop loopback REF_CLK1 for ENET1,
5320d4cdb56SPeng Fan * clear gpr1[13], set gpr1[17].
5330d4cdb56SPeng Fan */
5340d4cdb56SPeng Fan clrsetbits_le32(&iomuxc_regs->gpr[1], IOMUX_GPR1_FEC1_MASK,
5350d4cdb56SPeng Fan IOMUX_GPR1_FEC1_CLOCK_MUX1_SEL_MASK);
5360d4cdb56SPeng Fan } else {
5370d4cdb56SPeng Fan /*
5380d4cdb56SPeng Fan * Use 50M anatop loopback REF_CLK2 for ENET2,
5390d4cdb56SPeng Fan * clear gpr1[14], set gpr1[18].
5400d4cdb56SPeng Fan */
5410d4cdb56SPeng Fan clrsetbits_le32(&iomuxc_regs->gpr[1], IOMUX_GPR1_FEC2_MASK,
5420d4cdb56SPeng Fan IOMUX_GPR1_FEC2_CLOCK_MUX1_SEL_MASK);
5430d4cdb56SPeng Fan }
5440d4cdb56SPeng Fan
5450d4cdb56SPeng Fan ret = enable_fec_anatop_clock(fec_id, ENET_50MHZ);
5460d4cdb56SPeng Fan if (ret)
5470d4cdb56SPeng Fan return ret;
5480d4cdb56SPeng Fan
5490d4cdb56SPeng Fan enable_enet_clk(1);
5500d4cdb56SPeng Fan
5510d4cdb56SPeng Fan return 0;
5520d4cdb56SPeng Fan }
5530d4cdb56SPeng Fan
board_phy_config(struct phy_device * phydev)5540d4cdb56SPeng Fan int board_phy_config(struct phy_device *phydev)
5550d4cdb56SPeng Fan {
5560d4cdb56SPeng Fan phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x8190);
5570d4cdb56SPeng Fan
5580d4cdb56SPeng Fan if (phydev->drv->config)
5590d4cdb56SPeng Fan phydev->drv->config(phydev);
5600d4cdb56SPeng Fan
5610d4cdb56SPeng Fan return 0;
5620d4cdb56SPeng Fan }
5630d4cdb56SPeng Fan #endif
5640d4cdb56SPeng Fan
565df674904SPeng Fan #ifdef CONFIG_VIDEO_MXS
566df674904SPeng Fan static iomux_v3_cfg_t const lcd_pads[] = {
567df674904SPeng Fan MX6_PAD_LCD_CLK__LCDIF_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL),
568df674904SPeng Fan MX6_PAD_LCD_ENABLE__LCDIF_ENABLE | MUX_PAD_CTRL(LCD_PAD_CTRL),
569df674904SPeng Fan MX6_PAD_LCD_HSYNC__LCDIF_HSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL),
570df674904SPeng Fan MX6_PAD_LCD_VSYNC__LCDIF_VSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL),
571df674904SPeng Fan MX6_PAD_LCD_DATA00__LCDIF_DATA00 | MUX_PAD_CTRL(LCD_PAD_CTRL),
572df674904SPeng Fan MX6_PAD_LCD_DATA01__LCDIF_DATA01 | MUX_PAD_CTRL(LCD_PAD_CTRL),
573df674904SPeng Fan MX6_PAD_LCD_DATA02__LCDIF_DATA02 | MUX_PAD_CTRL(LCD_PAD_CTRL),
574df674904SPeng Fan MX6_PAD_LCD_DATA03__LCDIF_DATA03 | MUX_PAD_CTRL(LCD_PAD_CTRL),
575df674904SPeng Fan MX6_PAD_LCD_DATA04__LCDIF_DATA04 | MUX_PAD_CTRL(LCD_PAD_CTRL),
576df674904SPeng Fan MX6_PAD_LCD_DATA05__LCDIF_DATA05 | MUX_PAD_CTRL(LCD_PAD_CTRL),
577df674904SPeng Fan MX6_PAD_LCD_DATA06__LCDIF_DATA06 | MUX_PAD_CTRL(LCD_PAD_CTRL),
578df674904SPeng Fan MX6_PAD_LCD_DATA07__LCDIF_DATA07 | MUX_PAD_CTRL(LCD_PAD_CTRL),
579df674904SPeng Fan MX6_PAD_LCD_DATA08__LCDIF_DATA08 | MUX_PAD_CTRL(LCD_PAD_CTRL),
580df674904SPeng Fan MX6_PAD_LCD_DATA09__LCDIF_DATA09 | MUX_PAD_CTRL(LCD_PAD_CTRL),
581df674904SPeng Fan MX6_PAD_LCD_DATA10__LCDIF_DATA10 | MUX_PAD_CTRL(LCD_PAD_CTRL),
582df674904SPeng Fan MX6_PAD_LCD_DATA11__LCDIF_DATA11 | MUX_PAD_CTRL(LCD_PAD_CTRL),
583df674904SPeng Fan MX6_PAD_LCD_DATA12__LCDIF_DATA12 | MUX_PAD_CTRL(LCD_PAD_CTRL),
584df674904SPeng Fan MX6_PAD_LCD_DATA13__LCDIF_DATA13 | MUX_PAD_CTRL(LCD_PAD_CTRL),
585df674904SPeng Fan MX6_PAD_LCD_DATA14__LCDIF_DATA14 | MUX_PAD_CTRL(LCD_PAD_CTRL),
586df674904SPeng Fan MX6_PAD_LCD_DATA15__LCDIF_DATA15 | MUX_PAD_CTRL(LCD_PAD_CTRL),
587df674904SPeng Fan MX6_PAD_LCD_DATA16__LCDIF_DATA16 | MUX_PAD_CTRL(LCD_PAD_CTRL),
588df674904SPeng Fan MX6_PAD_LCD_DATA17__LCDIF_DATA17 | MUX_PAD_CTRL(LCD_PAD_CTRL),
589df674904SPeng Fan MX6_PAD_LCD_DATA18__LCDIF_DATA18 | MUX_PAD_CTRL(LCD_PAD_CTRL),
590df674904SPeng Fan MX6_PAD_LCD_DATA19__LCDIF_DATA19 | MUX_PAD_CTRL(LCD_PAD_CTRL),
591df674904SPeng Fan MX6_PAD_LCD_DATA20__LCDIF_DATA20 | MUX_PAD_CTRL(LCD_PAD_CTRL),
592df674904SPeng Fan MX6_PAD_LCD_DATA21__LCDIF_DATA21 | MUX_PAD_CTRL(LCD_PAD_CTRL),
593df674904SPeng Fan MX6_PAD_LCD_DATA22__LCDIF_DATA22 | MUX_PAD_CTRL(LCD_PAD_CTRL),
594df674904SPeng Fan MX6_PAD_LCD_DATA23__LCDIF_DATA23 | MUX_PAD_CTRL(LCD_PAD_CTRL),
595df674904SPeng Fan
596df674904SPeng Fan /* LCD_RST */
597df674904SPeng Fan MX6_PAD_SNVS_TAMPER9__GPIO5_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL),
598df674904SPeng Fan
599df674904SPeng Fan /* Use GPIO for Brightness adjustment, duty cycle = period. */
600df674904SPeng Fan MX6_PAD_GPIO1_IO08__GPIO1_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
601df674904SPeng Fan };
602df674904SPeng Fan
setup_lcd(void)603df674904SPeng Fan static int setup_lcd(void)
604df674904SPeng Fan {
605708f6927SPeng Fan enable_lcdif_clock(LCDIF1_BASE_ADDR, 1);
606df674904SPeng Fan
607df674904SPeng Fan imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
608df674904SPeng Fan
609df674904SPeng Fan /* Reset the LCD */
610df674904SPeng Fan gpio_direction_output(IMX_GPIO_NR(5, 9) , 0);
611df674904SPeng Fan udelay(500);
612df674904SPeng Fan gpio_direction_output(IMX_GPIO_NR(5, 9) , 1);
613df674904SPeng Fan
614df674904SPeng Fan /* Set Brightness to high */
615df674904SPeng Fan gpio_direction_output(IMX_GPIO_NR(1, 8) , 1);
616df674904SPeng Fan
617df674904SPeng Fan return 0;
618df674904SPeng Fan }
619df674904SPeng Fan #endif
620df674904SPeng Fan
board_early_init_f(void)621f0ff57b0SPeng Fan int board_early_init_f(void)
622f0ff57b0SPeng Fan {
623f0ff57b0SPeng Fan setup_iomux_uart();
624f0ff57b0SPeng Fan
625f0ff57b0SPeng Fan return 0;
626f0ff57b0SPeng Fan }
627f0ff57b0SPeng Fan
board_init(void)628f0ff57b0SPeng Fan int board_init(void)
629f0ff57b0SPeng Fan {
630f0ff57b0SPeng Fan /* Address of boot parameters */
631f0ff57b0SPeng Fan gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
632f0ff57b0SPeng Fan
633f0ff57b0SPeng Fan imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
634f0ff57b0SPeng Fan
635f0ff57b0SPeng Fan iox74lv_init();
636f0ff57b0SPeng Fan
637f0ff57b0SPeng Fan #ifdef CONFIG_SYS_I2C_MXC
638f0ff57b0SPeng Fan setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
639f0ff57b0SPeng Fan #endif
640f0ff57b0SPeng Fan
6410d4cdb56SPeng Fan #ifdef CONFIG_FEC_MXC
6420d4cdb56SPeng Fan setup_fec(CONFIG_FEC_ENET_DEV);
6430d4cdb56SPeng Fan #endif
6440d4cdb56SPeng Fan
645f0ff57b0SPeng Fan #ifdef CONFIG_USB_EHCI_MX6
646f0ff57b0SPeng Fan setup_usb();
647f0ff57b0SPeng Fan #endif
648f0ff57b0SPeng Fan
649f0ff57b0SPeng Fan #ifdef CONFIG_FSL_QSPI
650f0ff57b0SPeng Fan board_qspi_init();
651f0ff57b0SPeng Fan #endif
652f0ff57b0SPeng Fan
653df674904SPeng Fan #ifdef CONFIG_VIDEO_MXS
654df674904SPeng Fan setup_lcd();
655df674904SPeng Fan #endif
656df674904SPeng Fan
657f0ff57b0SPeng Fan return 0;
658f0ff57b0SPeng Fan }
659f0ff57b0SPeng Fan
660f0ff57b0SPeng Fan #ifdef CONFIG_CMD_BMODE
661f0ff57b0SPeng Fan static const struct boot_mode board_boot_modes[] = {
662f0ff57b0SPeng Fan /* 4 bit bus width */
663f0ff57b0SPeng Fan {"sd1", MAKE_CFGVAL(0x42, 0x20, 0x00, 0x00)},
664f0ff57b0SPeng Fan {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
665f0ff57b0SPeng Fan {"qspi1", MAKE_CFGVAL(0x10, 0x00, 0x00, 0x00)},
666f0ff57b0SPeng Fan {NULL, 0},
667f0ff57b0SPeng Fan };
668f0ff57b0SPeng Fan #endif
669f0ff57b0SPeng Fan
board_late_init(void)670f0ff57b0SPeng Fan int board_late_init(void)
671f0ff57b0SPeng Fan {
672f0ff57b0SPeng Fan #ifdef CONFIG_CMD_BMODE
673f0ff57b0SPeng Fan add_board_boot_modes(board_boot_modes);
674f0ff57b0SPeng Fan #endif
675f0ff57b0SPeng Fan
676d9cbb264SPeng Fan #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
677382bee57SSimon Glass env_set("board_name", "EVK");
678d9cbb264SPeng Fan
679d9cbb264SPeng Fan if (is_mx6ul_9x9_evk())
680382bee57SSimon Glass env_set("board_rev", "9X9");
681d9cbb264SPeng Fan else
682382bee57SSimon Glass env_set("board_rev", "14X14");
683d9cbb264SPeng Fan #endif
684d9cbb264SPeng Fan
685f0ff57b0SPeng Fan return 0;
686f0ff57b0SPeng Fan }
687f0ff57b0SPeng Fan
checkboard(void)688f0ff57b0SPeng Fan int checkboard(void)
689f0ff57b0SPeng Fan {
690d9cbb264SPeng Fan if (is_mx6ul_9x9_evk())
691d9cbb264SPeng Fan puts("Board: MX6UL 9x9 EVK\n");
692d9cbb264SPeng Fan else
693f0ff57b0SPeng Fan puts("Board: MX6UL 14x14 EVK\n");
694f0ff57b0SPeng Fan
695f0ff57b0SPeng Fan return 0;
696f0ff57b0SPeng Fan }
697f0ff57b0SPeng Fan
698f0ff57b0SPeng Fan #ifdef CONFIG_SPL_BUILD
699*0e00a84cSMasahiro Yamada #include <linux/libfdt.h>
700f0ff57b0SPeng Fan #include <spl.h>
701f0ff57b0SPeng Fan #include <asm/arch/mx6-ddr.h>
702f0ff57b0SPeng Fan
703d9cbb264SPeng Fan
704d9cbb264SPeng Fan static struct mx6ul_iomux_grp_regs mx6_grp_ioregs = {
705d9cbb264SPeng Fan .grp_addds = 0x00000030,
706d9cbb264SPeng Fan .grp_ddrmode_ctl = 0x00020000,
707d9cbb264SPeng Fan .grp_b0ds = 0x00000030,
708d9cbb264SPeng Fan .grp_ctlds = 0x00000030,
709d9cbb264SPeng Fan .grp_b1ds = 0x00000030,
710d9cbb264SPeng Fan .grp_ddrpke = 0x00000000,
711d9cbb264SPeng Fan .grp_ddrmode = 0x00020000,
712d9cbb264SPeng Fan #ifdef CONFIG_TARGET_MX6UL_9X9_EVK
713d9cbb264SPeng Fan .grp_ddr_type = 0x00080000,
714d9cbb264SPeng Fan #else
715d9cbb264SPeng Fan .grp_ddr_type = 0x000c0000,
716d9cbb264SPeng Fan #endif
717d9cbb264SPeng Fan };
718d9cbb264SPeng Fan
719d9cbb264SPeng Fan #ifdef CONFIG_TARGET_MX6UL_9X9_EVK
720d9cbb264SPeng Fan static struct mx6ul_iomux_ddr_regs mx6_ddr_ioregs = {
721d9cbb264SPeng Fan .dram_dqm0 = 0x00000030,
722d9cbb264SPeng Fan .dram_dqm1 = 0x00000030,
723d9cbb264SPeng Fan .dram_ras = 0x00000030,
724d9cbb264SPeng Fan .dram_cas = 0x00000030,
725d9cbb264SPeng Fan .dram_odt0 = 0x00000000,
726d9cbb264SPeng Fan .dram_odt1 = 0x00000000,
727d9cbb264SPeng Fan .dram_sdba2 = 0x00000000,
728d9cbb264SPeng Fan .dram_sdclk_0 = 0x00000030,
729d9cbb264SPeng Fan .dram_sdqs0 = 0x00003030,
730d9cbb264SPeng Fan .dram_sdqs1 = 0x00003030,
731d9cbb264SPeng Fan .dram_reset = 0x00000030,
732d9cbb264SPeng Fan };
733d9cbb264SPeng Fan
734d9cbb264SPeng Fan static struct mx6_mmdc_calibration mx6_mmcd_calib = {
735d9cbb264SPeng Fan .p0_mpwldectrl0 = 0x00000000,
736d9cbb264SPeng Fan .p0_mpdgctrl0 = 0x20000000,
737d9cbb264SPeng Fan .p0_mprddlctl = 0x4040484f,
738d9cbb264SPeng Fan .p0_mpwrdlctl = 0x40405247,
739d9cbb264SPeng Fan .mpzqlp2ctl = 0x1b4700c7,
740d9cbb264SPeng Fan };
741d9cbb264SPeng Fan
742d9cbb264SPeng Fan static struct mx6_lpddr2_cfg mem_ddr = {
743d9cbb264SPeng Fan .mem_speed = 800,
744d9cbb264SPeng Fan .density = 2,
745d9cbb264SPeng Fan .width = 16,
746d9cbb264SPeng Fan .banks = 4,
747d9cbb264SPeng Fan .rowaddr = 14,
748d9cbb264SPeng Fan .coladdr = 10,
749d9cbb264SPeng Fan .trcd_lp = 1500,
750d9cbb264SPeng Fan .trppb_lp = 1500,
751d9cbb264SPeng Fan .trpab_lp = 2000,
752d9cbb264SPeng Fan .trasmin = 4250,
753d9cbb264SPeng Fan };
754d9cbb264SPeng Fan
755d9cbb264SPeng Fan struct mx6_ddr_sysinfo ddr_sysinfo = {
756d9cbb264SPeng Fan .dsize = 0,
757d9cbb264SPeng Fan .cs_density = 18,
758d9cbb264SPeng Fan .ncs = 1,
759d9cbb264SPeng Fan .cs1_mirror = 0,
760d9cbb264SPeng Fan .walat = 0,
761d9cbb264SPeng Fan .ralat = 5,
762d9cbb264SPeng Fan .mif3_mode = 3,
763d9cbb264SPeng Fan .bi_on = 1,
764d9cbb264SPeng Fan .rtt_wr = 0, /* LPDDR2 does not need rtt_wr rtt_nom */
765d9cbb264SPeng Fan .rtt_nom = 0,
766d9cbb264SPeng Fan .sde_to_rst = 0, /* LPDDR2 does not need this field */
767d9cbb264SPeng Fan .rst_to_cke = 0x10, /* JEDEC value for LPDDR2: 200us */
768d9cbb264SPeng Fan .ddr_type = DDR_TYPE_LPDDR2,
769edf00937SFabio Estevam .refsel = 0, /* Refresh cycles at 64KHz */
770edf00937SFabio Estevam .refr = 3, /* 4 refresh commands per refresh cycle */
771d9cbb264SPeng Fan };
772d9cbb264SPeng Fan
773d9cbb264SPeng Fan #else
774d9cbb264SPeng Fan static struct mx6ul_iomux_ddr_regs mx6_ddr_ioregs = {
775f0ff57b0SPeng Fan .dram_dqm0 = 0x00000030,
776f0ff57b0SPeng Fan .dram_dqm1 = 0x00000030,
777f0ff57b0SPeng Fan .dram_ras = 0x00000030,
778f0ff57b0SPeng Fan .dram_cas = 0x00000030,
779f0ff57b0SPeng Fan .dram_odt0 = 0x00000030,
780f0ff57b0SPeng Fan .dram_odt1 = 0x00000030,
781f0ff57b0SPeng Fan .dram_sdba2 = 0x00000000,
782b343417eSFabio Estevam .dram_sdclk_0 = 0x00000030,
783b343417eSFabio Estevam .dram_sdqs0 = 0x00000030,
784f0ff57b0SPeng Fan .dram_sdqs1 = 0x00000030,
785f0ff57b0SPeng Fan .dram_reset = 0x00000030,
786f0ff57b0SPeng Fan };
787f0ff57b0SPeng Fan
788d9cbb264SPeng Fan static struct mx6_mmdc_calibration mx6_mmcd_calib = {
789b343417eSFabio Estevam .p0_mpwldectrl0 = 0x00000000,
790b343417eSFabio Estevam .p0_mpdgctrl0 = 0x41570155,
791b343417eSFabio Estevam .p0_mprddlctl = 0x4040474A,
792b343417eSFabio Estevam .p0_mpwrdlctl = 0x40405550,
793f0ff57b0SPeng Fan };
794f0ff57b0SPeng Fan
795d9cbb264SPeng Fan struct mx6_ddr_sysinfo ddr_sysinfo = {
796d9cbb264SPeng Fan .dsize = 0,
797d9cbb264SPeng Fan .cs_density = 20,
798d9cbb264SPeng Fan .ncs = 1,
799d9cbb264SPeng Fan .cs1_mirror = 0,
800d9cbb264SPeng Fan .rtt_wr = 2,
801d9cbb264SPeng Fan .rtt_nom = 1, /* RTT_Nom = RZQ/2 */
802b343417eSFabio Estevam .walat = 0, /* Write additional latency */
803d9cbb264SPeng Fan .ralat = 5, /* Read additional latency */
804d9cbb264SPeng Fan .mif3_mode = 3, /* Command prediction working mode */
805d9cbb264SPeng Fan .bi_on = 1, /* Bank interleaving enabled */
806d9cbb264SPeng Fan .sde_to_rst = 0x10, /* 14 cycles, 200us (JEDEC default) */
807d9cbb264SPeng Fan .rst_to_cke = 0x23, /* 33 cycles, 500us (JEDEC default) */
808d9cbb264SPeng Fan .ddr_type = DDR_TYPE_DDR3,
8097dbda25eSFabio Estevam .refsel = 0, /* Refresh cycles at 64KHz */
8107dbda25eSFabio Estevam .refr = 1, /* 2 refresh commands per refresh cycle */
811d9cbb264SPeng Fan };
812d9cbb264SPeng Fan
813f0ff57b0SPeng Fan static struct mx6_ddr3_cfg mem_ddr = {
814f0ff57b0SPeng Fan .mem_speed = 800,
815f0ff57b0SPeng Fan .density = 4,
816f0ff57b0SPeng Fan .width = 16,
817f0ff57b0SPeng Fan .banks = 8,
818f0ff57b0SPeng Fan .rowaddr = 15,
819f0ff57b0SPeng Fan .coladdr = 10,
820f0ff57b0SPeng Fan .pagesz = 2,
821f0ff57b0SPeng Fan .trcd = 1375,
822f0ff57b0SPeng Fan .trcmin = 4875,
823f0ff57b0SPeng Fan .trasmin = 3500,
824f0ff57b0SPeng Fan };
825d9cbb264SPeng Fan #endif
826f0ff57b0SPeng Fan
ccgr_init(void)827f0ff57b0SPeng Fan static void ccgr_init(void)
828f0ff57b0SPeng Fan {
829f0ff57b0SPeng Fan struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
830f0ff57b0SPeng Fan
831f0ff57b0SPeng Fan writel(0xFFFFFFFF, &ccm->CCGR0);
832f0ff57b0SPeng Fan writel(0xFFFFFFFF, &ccm->CCGR1);
833f0ff57b0SPeng Fan writel(0xFFFFFFFF, &ccm->CCGR2);
834f0ff57b0SPeng Fan writel(0xFFFFFFFF, &ccm->CCGR3);
835f0ff57b0SPeng Fan writel(0xFFFFFFFF, &ccm->CCGR4);
836f0ff57b0SPeng Fan writel(0xFFFFFFFF, &ccm->CCGR5);
837f0ff57b0SPeng Fan writel(0xFFFFFFFF, &ccm->CCGR6);
838f0ff57b0SPeng Fan writel(0xFFFFFFFF, &ccm->CCGR7);
839f0ff57b0SPeng Fan }
840f0ff57b0SPeng Fan
spl_dram_init(void)841f0ff57b0SPeng Fan static void spl_dram_init(void)
842f0ff57b0SPeng Fan {
843f0ff57b0SPeng Fan mx6ul_dram_iocfg(mem_ddr.width, &mx6_ddr_ioregs, &mx6_grp_ioregs);
844d9cbb264SPeng Fan mx6_dram_cfg(&ddr_sysinfo, &mx6_mmcd_calib, &mem_ddr);
845f0ff57b0SPeng Fan }
846f0ff57b0SPeng Fan
board_init_f(ulong dummy)847f0ff57b0SPeng Fan void board_init_f(ulong dummy)
848f0ff57b0SPeng Fan {
849ab25f0f6SFabio Estevam ccgr_init();
850ab25f0f6SFabio Estevam
851f0ff57b0SPeng Fan /* setup AIPS and disable watchdog */
852f0ff57b0SPeng Fan arch_cpu_init();
853f0ff57b0SPeng Fan
854f0ff57b0SPeng Fan /* iomux and setup of i2c */
855f0ff57b0SPeng Fan board_early_init_f();
856f0ff57b0SPeng Fan
857f0ff57b0SPeng Fan /* setup GP timer */
858f0ff57b0SPeng Fan timer_init();
859f0ff57b0SPeng Fan
860f0ff57b0SPeng Fan /* UART clocks enabled and gd valid - init serial console */
861f0ff57b0SPeng Fan preloader_console_init();
862f0ff57b0SPeng Fan
863f0ff57b0SPeng Fan /* DDR initialization */
864f0ff57b0SPeng Fan spl_dram_init();
865f0ff57b0SPeng Fan
866f0ff57b0SPeng Fan /* Clear the BSS. */
867f0ff57b0SPeng Fan memset(__bss_start, 0, __bss_end - __bss_start);
868f0ff57b0SPeng Fan
869f0ff57b0SPeng Fan /* load/boot image from boot device */
870f0ff57b0SPeng Fan board_init_r(NULL, 0);
871f0ff57b0SPeng Fan }
872f0ff57b0SPeng Fan #endif
873