blob: 9155dcfbd09d604db2935d276c07eb6ff47b8b1a [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Fabio Estevamafe20bf2012-09-24 08:09:33 +00002/*
3 * Copyright (C) 2012 Freescale Semiconductor, Inc.
4 *
5 * Author: Fabio Estevam <fabio.estevam@freescale.com>
Fabio Estevamafe20bf2012-09-24 08:09:33 +00006 */
7
8#include <common.h>
Simon Glass2dc9c342020-05-10 11:40:01 -06009#include <image.h>
Simon Glassa7b51302019-11-14 12:57:46 -070010#include <init.h>
Simon Glass274e0b02020-05-10 11:39:56 -060011#include <net.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060012#include <asm/global_data.h>
Fabio Estevamafe20bf2012-09-24 08:09:33 +000013#include <asm/io.h>
14#include <asm/arch/clock.h>
15#include <asm/arch/imx-regs.h>
16#include <asm/arch/iomux.h>
Eric Nelson24ded0c2013-11-13 16:36:19 -070017#include <asm/arch/mx6-pins.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060018#include <env.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090019#include <linux/errno.h>
Fabio Estevamafe20bf2012-09-24 08:09:33 +000020#include <asm/gpio.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020021#include <asm/mach-imx/iomux-v3.h>
22#include <asm/mach-imx/mxc_i2c.h>
23#include <asm/mach-imx/boot_mode.h>
24#include <asm/mach-imx/spi.h>
Fabio Estevamafe20bf2012-09-24 08:09:33 +000025#include <mmc.h>
Yangbo Lu73340382019-06-21 11:42:28 +080026#include <fsl_esdhc_imx.h>
Fabio Estevambe59b6a2012-09-25 08:43:57 +000027#include <miiphy.h>
Fabio Estevam96ad33d2012-10-02 11:20:12 +000028#include <asm/arch/sys_proto.h>
Renato Friasbf084322013-05-13 18:01:12 +000029#include <i2c.h>
Diego Dorta2661c9c2017-09-22 12:12:18 -030030#include <input.h>
Fabio Estevam5a6c8c42014-09-22 13:55:52 -030031#include <asm/arch/mxc_hdmi.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020032#include <asm/mach-imx/video.h>
Fabio Estevam5a6c8c42014-09-22 13:55:52 -030033#include <asm/arch/crm_regs.h>
Ye.Li700020e2014-10-30 18:53:49 +080034#include <pca953x.h>
Ye.Licfaa23b2014-11-06 16:29:02 +080035#include <power/pmic.h>
Peng Fane5bcd4d2015-01-27 10:14:04 +080036#include <power/pfuze100_pmic.h>
Ye.Licfaa23b2014-11-06 16:29:02 +080037#include "../common/pfuze.h"
Fabio Estevam96ad33d2012-10-02 11:20:12 +000038
Fabio Estevamafe20bf2012-09-24 08:09:33 +000039DECLARE_GLOBAL_DATA_PTR;
40
Benoît Thébaudeau21670242013-04-26 01:34:47 +000041#define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
42 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
43 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevamafe20bf2012-09-24 08:09:33 +000044
Benoît Thébaudeau21670242013-04-26 01:34:47 +000045#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
46 PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
47 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevamafe20bf2012-09-24 08:09:33 +000048
Benoît Thébaudeau21670242013-04-26 01:34:47 +000049#define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
50 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
Fabio Estevambe59b6a2012-09-25 08:43:57 +000051
Renato Friasbf084322013-05-13 18:01:12 +000052#define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
53 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
54 PAD_CTL_ODE | PAD_CTL_SRE_FAST)
55
Ye.Li4a1f9222014-11-12 14:02:05 +080056#define GPMI_PAD_CTRL0 (PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_PUS_100K_UP)
57#define GPMI_PAD_CTRL1 (PAD_CTL_DSE_40ohm | PAD_CTL_SPEED_MED | \
58 PAD_CTL_SRE_FAST)
59#define GPMI_PAD_CTRL2 (GPMI_PAD_CTRL0 | GPMI_PAD_CTRL1)
60
Renato Friasbf084322013-05-13 18:01:12 +000061#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
62
Fabio Estevam2623cb12014-11-14 11:27:23 -020063#define WEIM_NOR_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
64 PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
65 PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
66
Ye.Licfaa23b2014-11-06 16:29:02 +080067#define I2C_PMIC 1
68
Fabio Estevamafe20bf2012-09-24 08:09:33 +000069int dram_init(void)
70{
Vanessa Maegima627c0e52016-06-08 15:17:54 -030071 gd->ram_size = imx_ddr_size();
Fabio Estevamafe20bf2012-09-24 08:09:33 +000072
73 return 0;
74}
75
Fabio Estevam6bfdb102014-09-13 18:21:36 -030076static iomux_v3_cfg_t const uart4_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -030077 IOMUX_PADS(PAD_KEY_COL0__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
78 IOMUX_PADS(PAD_KEY_ROW0__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
Fabio Estevamafe20bf2012-09-24 08:09:33 +000079};
80
Fabio Estevambe59b6a2012-09-25 08:43:57 +000081
Renato Friasbf084322013-05-13 18:01:12 +000082/* I2C2 PMIC, iPod, Tuner, Codec, Touch, HDMI EDID, MIPI CSI2 card */
Vanessa Maegima65779d32017-06-29 09:33:45 -030083static struct i2c_pads_info mx6q_i2c_pad_info1 = {
Renato Friasbf084322013-05-13 18:01:12 +000084 .scl = {
Vanessa Maegima65779d32017-06-29 09:33:45 -030085 .i2c_mode = MX6Q_PAD_EIM_EB2__I2C2_SCL | PC,
86 .gpio_mode = MX6Q_PAD_EIM_EB2__GPIO2_IO30 | PC,
Renato Friasbf084322013-05-13 18:01:12 +000087 .gp = IMX_GPIO_NR(2, 30)
88 },
89 .sda = {
Vanessa Maegima65779d32017-06-29 09:33:45 -030090 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
91 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
Renato Friasbf084322013-05-13 18:01:12 +000092 .gp = IMX_GPIO_NR(4, 13)
93 }
94};
95
Vanessa Maegima65779d32017-06-29 09:33:45 -030096static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
97 .scl = {
98 .i2c_mode = MX6DL_PAD_EIM_EB2__I2C2_SCL | PC,
99 .gpio_mode = MX6DL_PAD_EIM_EB2__GPIO2_IO30 | PC,
100 .gp = IMX_GPIO_NR(2, 30)
101 },
102 .sda = {
103 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
104 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
105 .gp = IMX_GPIO_NR(4, 13)
106 }
107};
108
Fabio Estevam2623cb12014-11-14 11:27:23 -0200109#ifndef CONFIG_SYS_FLASH_CFI
Renato Friasbf084322013-05-13 18:01:12 +0000110/*
111 * I2C3 MLB, Port Expanders (A, B, C), Video ADC, Light Sensor,
112 * Compass Sensor, Accelerometer, Res Touch
113 */
Vanessa Maegima65779d32017-06-29 09:33:45 -0300114static struct i2c_pads_info mx6q_i2c_pad_info2 = {
Renato Friasbf084322013-05-13 18:01:12 +0000115 .scl = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300116 .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
117 .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
Renato Friasbf084322013-05-13 18:01:12 +0000118 .gp = IMX_GPIO_NR(1, 3)
119 },
120 .sda = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300121 .i2c_mode = MX6Q_PAD_EIM_D18__I2C3_SDA | PC,
122 .gpio_mode = MX6Q_PAD_EIM_D18__GPIO3_IO18 | PC,
Renato Friasbf084322013-05-13 18:01:12 +0000123 .gp = IMX_GPIO_NR(3, 18)
124 }
125};
Vanessa Maegima65779d32017-06-29 09:33:45 -0300126
127static struct i2c_pads_info mx6dl_i2c_pad_info2 = {
128 .scl = {
129 .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
130 .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
131 .gp = IMX_GPIO_NR(1, 3)
132 },
133 .sda = {
134 .i2c_mode = MX6DL_PAD_EIM_D18__I2C3_SDA | PC,
135 .gpio_mode = MX6DL_PAD_EIM_D18__GPIO3_IO18 | PC,
136 .gp = IMX_GPIO_NR(3, 18)
137 }
138};
Fabio Estevam2623cb12014-11-14 11:27:23 -0200139#endif
Renato Friasbf084322013-05-13 18:01:12 +0000140
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300141static iomux_v3_cfg_t const i2c3_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300142 IOMUX_PADS(PAD_EIM_A24__GPIO5_IO04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Renato Friasbf084322013-05-13 18:01:12 +0000143};
144
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300145static iomux_v3_cfg_t const port_exp[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300146 IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Renato Frias7cbaae82013-05-13 18:01:13 +0000147};
148
Fabio Estevama03035f2017-07-10 15:59:11 -0300149#ifdef CONFIG_MTD_NOR_FLASH
Fabio Estevam2623cb12014-11-14 11:27:23 -0200150static iomux_v3_cfg_t const eimnor_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300151 IOMUX_PADS(PAD_EIM_D16__EIM_DATA16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
152 IOMUX_PADS(PAD_EIM_D17__EIM_DATA17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
153 IOMUX_PADS(PAD_EIM_D18__EIM_DATA18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
154 IOMUX_PADS(PAD_EIM_D19__EIM_DATA19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
155 IOMUX_PADS(PAD_EIM_D20__EIM_DATA20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
156 IOMUX_PADS(PAD_EIM_D21__EIM_DATA21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
157 IOMUX_PADS(PAD_EIM_D22__EIM_DATA22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
158 IOMUX_PADS(PAD_EIM_D23__EIM_DATA23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
159 IOMUX_PADS(PAD_EIM_D24__EIM_DATA24 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
160 IOMUX_PADS(PAD_EIM_D25__EIM_DATA25 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
161 IOMUX_PADS(PAD_EIM_D26__EIM_DATA26 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
162 IOMUX_PADS(PAD_EIM_D27__EIM_DATA27 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
163 IOMUX_PADS(PAD_EIM_D28__EIM_DATA28 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
164 IOMUX_PADS(PAD_EIM_D29__EIM_DATA29 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
165 IOMUX_PADS(PAD_EIM_D30__EIM_DATA30 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
166 IOMUX_PADS(PAD_EIM_D31__EIM_DATA31 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
167 IOMUX_PADS(PAD_EIM_DA0__EIM_AD00 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
168 IOMUX_PADS(PAD_EIM_DA1__EIM_AD01 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
169 IOMUX_PADS(PAD_EIM_DA2__EIM_AD02 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
170 IOMUX_PADS(PAD_EIM_DA3__EIM_AD03 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
171 IOMUX_PADS(PAD_EIM_DA4__EIM_AD04 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
172 IOMUX_PADS(PAD_EIM_DA5__EIM_AD05 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
173 IOMUX_PADS(PAD_EIM_DA6__EIM_AD06 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
174 IOMUX_PADS(PAD_EIM_DA7__EIM_AD07 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
175 IOMUX_PADS(PAD_EIM_DA8__EIM_AD08 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
176 IOMUX_PADS(PAD_EIM_DA9__EIM_AD09 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
177 IOMUX_PADS(PAD_EIM_DA10__EIM_AD10 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
178 IOMUX_PADS(PAD_EIM_DA11__EIM_AD11 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
179 IOMUX_PADS(PAD_EIM_DA12__EIM_AD12 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
180 IOMUX_PADS(PAD_EIM_DA13__EIM_AD13 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
181 IOMUX_PADS(PAD_EIM_DA14__EIM_AD14 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
182 IOMUX_PADS(PAD_EIM_DA15__EIM_AD15 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
183 IOMUX_PADS(PAD_EIM_A16__EIM_ADDR16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
184 IOMUX_PADS(PAD_EIM_A17__EIM_ADDR17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
185 IOMUX_PADS(PAD_EIM_A18__EIM_ADDR18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
186 IOMUX_PADS(PAD_EIM_A19__EIM_ADDR19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
187 IOMUX_PADS(PAD_EIM_A20__EIM_ADDR20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
188 IOMUX_PADS(PAD_EIM_A21__EIM_ADDR21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
189 IOMUX_PADS(PAD_EIM_A22__EIM_ADDR22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
190 IOMUX_PADS(PAD_EIM_A23__EIM_ADDR23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
191 IOMUX_PADS(PAD_EIM_OE__EIM_OE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
192 IOMUX_PADS(PAD_EIM_RW__EIM_RW | MUX_PAD_CTRL(NO_PAD_CTRL)),
193 IOMUX_PADS(PAD_EIM_CS0__EIM_CS0_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevam2623cb12014-11-14 11:27:23 -0200194};
195
196static void eimnor_cs_setup(void)
197{
198 struct weim *weim_regs = (struct weim *)WEIM_BASE_ADDR;
199
200 writel(0x00020181, &weim_regs->cs0gcr1);
201 writel(0x00000001, &weim_regs->cs0gcr2);
202 writel(0x0a020000, &weim_regs->cs0rcr1);
203 writel(0x0000c000, &weim_regs->cs0rcr2);
204 writel(0x0804a240, &weim_regs->cs0wcr1);
205 writel(0x00000120, &weim_regs->wcr);
206
207 set_chipselect_size(CS0_128);
208}
209
Fabio Estevame795b6d2016-12-26 23:04:41 -0200210static void eim_clk_setup(void)
211{
212 struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
213 int cscmr1, ccgr6;
214
215
216 /* Turn off EIM clock */
217 ccgr6 = readl(&imx_ccm->CCGR6);
218 ccgr6 &= ~(0x3 << 10);
219 writel(ccgr6, &imx_ccm->CCGR6);
220
221 /*
222 * Configure clk_eim_slow_sel = 00 --> derive clock from AXI clk root
223 * and aclk_eim_slow_podf = 01 --> divide by 2
224 * so that we can have EIM at the maximum clock of 132MHz
225 */
226 cscmr1 = readl(&imx_ccm->cscmr1);
227 cscmr1 &= ~(MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK |
228 MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK);
229 cscmr1 |= (1 << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET);
230 writel(cscmr1, &imx_ccm->cscmr1);
231
232 /* Turn on EIM clock */
233 ccgr6 |= (0x3 << 10);
234 writel(ccgr6, &imx_ccm->CCGR6);
235}
236
Fabio Estevam2623cb12014-11-14 11:27:23 -0200237static void setup_iomux_eimnor(void)
238{
Vanessa Maegima65779d32017-06-29 09:33:45 -0300239 SETUP_IOMUX_PADS(eimnor_pads);
Fabio Estevam2623cb12014-11-14 11:27:23 -0200240
241 gpio_direction_output(IMX_GPIO_NR(5, 4), 0);
242
243 eimnor_cs_setup();
244}
Fabio Estevama03035f2017-07-10 15:59:11 -0300245#endif
Fabio Estevam2623cb12014-11-14 11:27:23 -0200246
Fabio Estevambe59b6a2012-09-25 08:43:57 +0000247
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300248static iomux_v3_cfg_t const usdhc3_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300249 IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
250 IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
251 IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
252 IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
253 IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
254 IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
255 IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
256 IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
257 IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
258 IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
259 IOMUX_PADS(PAD_GPIO_18__SD3_VSELECT | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
260 IOMUX_PADS(PAD_NANDF_CS2__GPIO6_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000261};
262
263static void setup_iomux_uart(void)
264{
Vanessa Maegima65779d32017-06-29 09:33:45 -0300265 SETUP_IOMUX_PADS(uart4_pads);
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000266}
267
Yangbo Lu73340382019-06-21 11:42:28 +0800268#ifdef CONFIG_FSL_ESDHC_IMX
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300269static struct fsl_esdhc_cfg usdhc_cfg[1] = {
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000270 {USDHC3_BASE_ADDR},
271};
272
273int board_mmc_getcd(struct mmc *mmc)
274{
275 gpio_direction_input(IMX_GPIO_NR(6, 15));
276 return !gpio_get_value(IMX_GPIO_NR(6, 15));
277}
278
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900279int board_mmc_init(struct bd_info *bis)
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000280{
Vanessa Maegima65779d32017-06-29 09:33:45 -0300281 SETUP_IOMUX_PADS(usdhc3_pads);
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000282
Benoît Thébaudeauc58ff342012-10-01 08:36:25 +0000283 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000284 return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
285}
286#endif
287
Ye.Li4a1f9222014-11-12 14:02:05 +0800288#ifdef CONFIG_NAND_MXS
289static iomux_v3_cfg_t gpmi_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300290 IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
291 IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
292 IOMUX_PADS(PAD_NANDF_WP_B__NAND_WP_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
293 IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(GPMI_PAD_CTRL0)),
294 IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
295 IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
296 IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
297 IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
298 IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
299 IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
300 IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
301 IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
302 IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
303 IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
304 IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
305 IOMUX_PADS(PAD_SD4_DAT0__NAND_DQS | MUX_PAD_CTRL(GPMI_PAD_CTRL1)),
Ye.Li4a1f9222014-11-12 14:02:05 +0800306};
307
308static void setup_gpmi_nand(void)
309{
310 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
311
312 /* config gpmi nand iomux */
Vanessa Maegima65779d32017-06-29 09:33:45 -0300313 SETUP_IOMUX_PADS(gpmi_pads);
Ye.Li4a1f9222014-11-12 14:02:05 +0800314
Ye.Li2dea0402015-01-12 17:37:13 +0800315 setup_gpmi_io_clk((MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
Ye.Li4a1f9222014-11-12 14:02:05 +0800316 MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
Ye.Li2dea0402015-01-12 17:37:13 +0800317 MXC_CCM_CS2CDR_ENFC_CLK_SEL(3)));
Ye.Li4a1f9222014-11-12 14:02:05 +0800318
319 /* enable apbh clock gating */
320 setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
321}
322#endif
323
Tom Rini4cc38852021-08-30 09:16:30 -0400324#ifdef CONFIG_REVISION_TAG
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000325u32 get_board_rev(void)
326{
Fabio Estevam49bcdd72017-11-27 10:25:09 -0200327 int rev = nxp_board_rev();
Fabio Estevam96ad33d2012-10-02 11:20:12 +0000328
329 return (get_cpu_rev() & ~(0xF << 8)) | rev;
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000330}
Tom Rini4cc38852021-08-30 09:16:30 -0400331#endif
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000332
Fabio Estevam9af078f2017-07-12 18:31:45 -0300333static int ar8031_phy_fixup(struct phy_device *phydev)
334{
335 unsigned short val;
336
337 /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
338 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
339 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
340 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
341
342 val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
343 val &= 0xffe3;
344 val |= 0x18;
345 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
346
347 /* introduce tx clock delay */
348 phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
349 val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
350 val |= 0x0100;
351 phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
352
353 return 0;
354}
355
356int board_phy_config(struct phy_device *phydev)
357{
358 ar8031_phy_fixup(phydev);
359
360 if (phydev->drv->config)
361 phydev->drv->config(phydev);
362
363 return 0;
364}
365
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300366#if defined(CONFIG_VIDEO_IPUV3)
Peng Fan03f8d152015-12-15 16:27:18 +0800367static void disable_lvds(struct display_info_t const *dev)
368{
369 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
370
371 clrbits_le32(&iomux->gpr[2],
372 IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
373 IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
374}
375
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300376static void do_enable_hdmi(struct display_info_t const *dev)
377{
Peng Fan03f8d152015-12-15 16:27:18 +0800378 disable_lvds(dev);
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300379 imx_enable_hdmi_phy();
380}
381
382struct display_info_t const displays[] = {{
383 .bus = -1,
384 .addr = 0,
Peng Fan03f8d152015-12-15 16:27:18 +0800385 .pixfmt = IPU_PIX_FMT_RGB666,
386 .detect = NULL,
387 .enable = NULL,
388 .mode = {
389 .name = "Hannstar-XGA",
390 .refresh = 60,
391 .xres = 1024,
392 .yres = 768,
393 .pixclock = 15385,
394 .left_margin = 220,
395 .right_margin = 40,
396 .upper_margin = 21,
397 .lower_margin = 7,
398 .hsync_len = 60,
399 .vsync_len = 10,
400 .sync = FB_SYNC_EXT,
401 .vmode = FB_VMODE_NONINTERLACED
402} }, {
403 .bus = -1,
404 .addr = 0,
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300405 .pixfmt = IPU_PIX_FMT_RGB24,
406 .detect = detect_hdmi,
407 .enable = do_enable_hdmi,
408 .mode = {
409 .name = "HDMI",
410 .refresh = 60,
411 .xres = 1024,
412 .yres = 768,
413 .pixclock = 15385,
414 .left_margin = 220,
415 .right_margin = 40,
416 .upper_margin = 21,
417 .lower_margin = 7,
418 .hsync_len = 60,
419 .vsync_len = 10,
420 .sync = FB_SYNC_EXT,
421 .vmode = FB_VMODE_NONINTERLACED,
422} } };
423size_t display_count = ARRAY_SIZE(displays);
424
Peng Fan03f8d152015-12-15 16:27:18 +0800425iomux_v3_cfg_t const backlight_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300426 IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
Peng Fan03f8d152015-12-15 16:27:18 +0800427};
428
429static void setup_iomux_backlight(void)
430{
Abel Vesa5d6f33d2019-02-01 16:40:19 +0000431 gpio_request(IMX_GPIO_NR(2, 9), "backlight");
Peng Fan03f8d152015-12-15 16:27:18 +0800432 gpio_direction_output(IMX_GPIO_NR(2, 9), 1);
Vanessa Maegima65779d32017-06-29 09:33:45 -0300433 SETUP_IOMUX_PADS(backlight_pads);
Peng Fan03f8d152015-12-15 16:27:18 +0800434}
435
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300436static void setup_display(void)
437{
438 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
Peng Fan03f8d152015-12-15 16:27:18 +0800439 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300440 int reg;
441
Peng Fan03f8d152015-12-15 16:27:18 +0800442 setup_iomux_backlight();
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300443 enable_ipu_clock();
444 imx_setup_hdmi();
445
Peng Fan03f8d152015-12-15 16:27:18 +0800446 /* Turn on LDB_DI0 and LDB_DI1 clocks */
447 reg = readl(&mxc_ccm->CCGR3);
448 reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
449 writel(reg, &mxc_ccm->CCGR3);
450
451 /* Set LDB_DI0 and LDB_DI1 clk select to 3b'011 */
452 reg = readl(&mxc_ccm->cs2cdr);
453 reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK |
454 MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
455 reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET) |
456 (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
457 writel(reg, &mxc_ccm->cs2cdr);
458
459 reg = readl(&mxc_ccm->cscmr2);
460 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
461 writel(reg, &mxc_ccm->cscmr2);
462
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300463 reg = readl(&mxc_ccm->chsccdr);
464 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
465 << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
Peng Fan03f8d152015-12-15 16:27:18 +0800466 reg |= (CHSCCDR_CLK_SEL_LDB_DI0 <<
467 MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300468 writel(reg, &mxc_ccm->chsccdr);
Peng Fan03f8d152015-12-15 16:27:18 +0800469
470 reg = IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW |
471 IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW |
472 IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG |
473 IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT |
474 IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG |
475 IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT |
476 IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0 |
477 IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED;
478 writel(reg, &iomux->gpr[2]);
479
480 reg = readl(&iomux->gpr[3]);
481 reg &= ~(IOMUXC_GPR3_LVDS0_MUX_CTL_MASK |
482 IOMUXC_GPR3_HDMI_MUX_CTL_MASK);
483 reg |= (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
484 IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET) |
485 (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
486 IOMUXC_GPR3_HDMI_MUX_CTL_OFFSET);
487 writel(reg, &iomux->gpr[3]);
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300488}
489#endif /* CONFIG_VIDEO_IPUV3 */
490
491/*
492 * Do not overwrite the console
493 * Use always serial for U-Boot console
494 */
495int overwrite_console(void)
496{
497 return 1;
498}
499
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000500int board_early_init_f(void)
501{
502 setup_iomux_uart();
Ye.Li4a1f9222014-11-12 14:02:05 +0800503
504#ifdef CONFIG_NAND_MXS
505 setup_gpmi_nand();
506#endif
Fabio Estevam2623cb12014-11-14 11:27:23 -0200507
Fabio Estevama03035f2017-07-10 15:59:11 -0300508#ifdef CONFIG_MTD_NOR_FLASH
509 eim_clk_setup();
510#endif
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000511 return 0;
512}
513
514int board_init(void)
515{
516 /* address of boot parameters */
517 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
518
Renato Friasbf084322013-05-13 18:01:12 +0000519 /* I2C 2 and 3 setup - I2C 3 hw mux with EIM */
Vanessa Maegima65779d32017-06-29 09:33:45 -0300520 if (is_mx6dq() || is_mx6dqp())
521 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
522 else
523 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
Renato Friasbf084322013-05-13 18:01:12 +0000524 /* I2C 3 Steer */
Abel Vesa5d6f33d2019-02-01 16:40:19 +0000525 gpio_request(IMX_GPIO_NR(5, 4), "steer logic");
Renato Friasbf084322013-05-13 18:01:12 +0000526 gpio_direction_output(IMX_GPIO_NR(5, 4), 1);
Vanessa Maegima65779d32017-06-29 09:33:45 -0300527 SETUP_IOMUX_PADS(i2c3_pads);
Fabio Estevam2623cb12014-11-14 11:27:23 -0200528#ifndef CONFIG_SYS_FLASH_CFI
Vanessa Maegima65779d32017-06-29 09:33:45 -0300529 if (is_mx6dq() || is_mx6dqp())
530 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info2);
531 else
532 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info2);
Fabio Estevam2623cb12014-11-14 11:27:23 -0200533#endif
Abel Vesa5d6f33d2019-02-01 16:40:19 +0000534 gpio_request(IMX_GPIO_NR(1, 15), "expander en");
Renato Frias7cbaae82013-05-13 18:01:13 +0000535 gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
Vanessa Maegima65779d32017-06-29 09:33:45 -0300536 SETUP_IOMUX_PADS(port_exp);
Renato Frias7cbaae82013-05-13 18:01:13 +0000537
Peng Fan03f8d152015-12-15 16:27:18 +0800538#ifdef CONFIG_VIDEO_IPUV3
539 setup_display();
540#endif
Fabio Estevama03035f2017-07-10 15:59:11 -0300541
542#ifdef CONFIG_MTD_NOR_FLASH
Fabio Estevam2623cb12014-11-14 11:27:23 -0200543 setup_iomux_eimnor();
Fabio Estevama03035f2017-07-10 15:59:11 -0300544#endif
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000545 return 0;
546}
547
Nikita Kiryanov00cd7382014-08-20 15:08:50 +0300548#ifdef CONFIG_MXC_SPI
549int board_spi_cs_gpio(unsigned bus, unsigned cs)
550{
551 return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
552}
553#endif
554
Ye.Licfaa23b2014-11-06 16:29:02 +0800555int power_init_board(void)
556{
557 struct pmic *p;
Peng Fand4947e32015-07-11 11:38:47 +0800558 unsigned int value;
Ye.Licfaa23b2014-11-06 16:29:02 +0800559
560 p = pfuze_common_init(I2C_PMIC);
561 if (!p)
562 return -ENODEV;
563
Peng Fand4947e32015-07-11 11:38:47 +0800564 if (is_mx6dqp()) {
565 /* set SW2 staby volatage 0.975V*/
566 pmic_reg_read(p, PFUZE100_SW2STBY, &value);
567 value &= ~0x3f;
568 value |= 0x17;
569 pmic_reg_write(p, PFUZE100_SW2STBY, value);
570 }
Peng Fane5bcd4d2015-01-27 10:14:04 +0800571
Peng Fand4947e32015-07-11 11:38:47 +0800572 return pfuze_mode_init(p, APS_PFM);
Ye.Licfaa23b2014-11-06 16:29:02 +0800573}
574
Otavio Salvador52863372013-03-16 08:05:07 +0000575#ifdef CONFIG_CMD_BMODE
576static const struct boot_mode board_boot_modes[] = {
577 /* 4 bit bus width */
578 {"mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
579 {NULL, 0},
580};
581#endif
582
583int board_late_init(void)
584{
585#ifdef CONFIG_CMD_BMODE
586 add_board_boot_modes(board_boot_modes);
587#endif
588
Peng Fan04321fc2015-07-11 11:38:46 +0800589#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Simon Glass6a38e412017-08-03 12:22:09 -0600590 env_set("board_name", "SABREAUTO");
Peng Fan04321fc2015-07-11 11:38:46 +0800591
Peng Fand4947e32015-07-11 11:38:47 +0800592 if (is_mx6dqp())
Simon Glass6a38e412017-08-03 12:22:09 -0600593 env_set("board_rev", "MX6QP");
Peng Fan4a597d02016-05-23 18:36:06 +0800594 else if (is_mx6dq())
Simon Glass6a38e412017-08-03 12:22:09 -0600595 env_set("board_rev", "MX6Q");
Peng Fan4a597d02016-05-23 18:36:06 +0800596 else if (is_mx6sdl())
Simon Glass6a38e412017-08-03 12:22:09 -0600597 env_set("board_rev", "MX6DL");
Peng Fan04321fc2015-07-11 11:38:46 +0800598#endif
599
Otavio Salvador52863372013-03-16 08:05:07 +0000600 return 0;
601}
602
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000603int checkboard(void)
604{
Fabio Estevam49bcdd72017-11-27 10:25:09 -0200605 printf("Board: MX6Q-Sabreauto rev%c\n", nxp_board_rev_string());
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000606
607 return 0;
608}
Ye.Li700020e2014-10-30 18:53:49 +0800609
610#ifdef CONFIG_USB_EHCI_MX6
Ye.Li700020e2014-10-30 18:53:49 +0800611int board_ehci_hcd_init(int port)
612{
613 switch (port) {
614 case 0:
Ye.Li700020e2014-10-30 18:53:49 +0800615 /*
616 * Set daisy chain for otg_pin_id on 6q.
617 * For 6dl, this bit is reserved.
618 */
619 imx_iomux_set_gpr_register(1, 13, 1, 0);
620 break;
621 case 1:
622 break;
623 default:
624 printf("MXC USB port %d not yet supported\n", port);
625 return -EINVAL;
626 }
627 return 0;
628}
Ye.Li700020e2014-10-30 18:53:49 +0800629#endif
Vanessa Maegima65779d32017-06-29 09:33:45 -0300630
631#ifdef CONFIG_SPL_BUILD
632#include <asm/arch/mx6-ddr.h>
633#include <spl.h>
Masahiro Yamada75f82d02018-03-05 01:20:11 +0900634#include <linux/libfdt.h>
Vanessa Maegima65779d32017-06-29 09:33:45 -0300635
Diego Dorta614c2832017-07-07 15:38:34 -0300636#ifdef CONFIG_SPL_OS_BOOT
637int spl_start_uboot(void)
638{
639 return 0;
640}
641#endif
642
Vanessa Maegima65779d32017-06-29 09:33:45 -0300643static void ccgr_init(void)
644{
645 struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
646
647 writel(0x00C03F3F, &ccm->CCGR0);
648 writel(0x0030FC03, &ccm->CCGR1);
649 writel(0x0FFFC000, &ccm->CCGR2);
650 writel(0x3FF00000, &ccm->CCGR3);
651 writel(0x00FFF300, &ccm->CCGR4);
652 writel(0x0F0000C3, &ccm->CCGR5);
653 writel(0x000003FF, &ccm->CCGR6);
654}
655
Vanessa Maegima65779d32017-06-29 09:33:45 -0300656static int mx6q_dcd_table[] = {
657 0x020e0798, 0x000C0000,
658 0x020e0758, 0x00000000,
659 0x020e0588, 0x00000030,
660 0x020e0594, 0x00000030,
661 0x020e056c, 0x00000030,
662 0x020e0578, 0x00000030,
663 0x020e074c, 0x00000030,
664 0x020e057c, 0x00000030,
665 0x020e058c, 0x00000000,
666 0x020e059c, 0x00000030,
667 0x020e05a0, 0x00000030,
668 0x020e078c, 0x00000030,
669 0x020e0750, 0x00020000,
670 0x020e05a8, 0x00000028,
671 0x020e05b0, 0x00000028,
672 0x020e0524, 0x00000028,
673 0x020e051c, 0x00000028,
674 0x020e0518, 0x00000028,
675 0x020e050c, 0x00000028,
676 0x020e05b8, 0x00000028,
677 0x020e05c0, 0x00000028,
678 0x020e0774, 0x00020000,
679 0x020e0784, 0x00000028,
680 0x020e0788, 0x00000028,
681 0x020e0794, 0x00000028,
682 0x020e079c, 0x00000028,
683 0x020e07a0, 0x00000028,
684 0x020e07a4, 0x00000028,
685 0x020e07a8, 0x00000028,
686 0x020e0748, 0x00000028,
687 0x020e05ac, 0x00000028,
688 0x020e05b4, 0x00000028,
689 0x020e0528, 0x00000028,
690 0x020e0520, 0x00000028,
691 0x020e0514, 0x00000028,
692 0x020e0510, 0x00000028,
693 0x020e05bc, 0x00000028,
694 0x020e05c4, 0x00000028,
695 0x021b0800, 0xa1390003,
696 0x021b080c, 0x001F001F,
697 0x021b0810, 0x001F001F,
698 0x021b480c, 0x001F001F,
699 0x021b4810, 0x001F001F,
700 0x021b083c, 0x43260335,
701 0x021b0840, 0x031A030B,
702 0x021b483c, 0x4323033B,
703 0x021b4840, 0x0323026F,
704 0x021b0848, 0x483D4545,
705 0x021b4848, 0x44433E48,
706 0x021b0850, 0x41444840,
707 0x021b4850, 0x4835483E,
708 0x021b081c, 0x33333333,
709 0x021b0820, 0x33333333,
710 0x021b0824, 0x33333333,
711 0x021b0828, 0x33333333,
712 0x021b481c, 0x33333333,
713 0x021b4820, 0x33333333,
714 0x021b4824, 0x33333333,
715 0x021b4828, 0x33333333,
716 0x021b08b8, 0x00000800,
717 0x021b48b8, 0x00000800,
718 0x021b0004, 0x00020036,
719 0x021b0008, 0x09444040,
720 0x021b000c, 0x8A8F7955,
721 0x021b0010, 0xFF328F64,
722 0x021b0014, 0x01FF00DB,
723 0x021b0018, 0x00001740,
724 0x021b001c, 0x00008000,
725 0x021b002c, 0x000026d2,
726 0x021b0030, 0x008F1023,
727 0x021b0040, 0x00000047,
728 0x021b0000, 0x841A0000,
729 0x021b001c, 0x04088032,
730 0x021b001c, 0x00008033,
731 0x021b001c, 0x00048031,
732 0x021b001c, 0x09408030,
733 0x021b001c, 0x04008040,
734 0x021b0020, 0x00005800,
735 0x021b0818, 0x00011117,
736 0x021b4818, 0x00011117,
737 0x021b0004, 0x00025576,
738 0x021b0404, 0x00011006,
739 0x021b001c, 0x00000000,
740 0x020c4068, 0x00C03F3F,
741 0x020c406c, 0x0030FC03,
742 0x020c4070, 0x0FFFC000,
743 0x020c4074, 0x3FF00000,
744 0x020c4078, 0xFFFFF300,
745 0x020c407c, 0x0F0000F3,
746 0x020c4080, 0x00000FFF,
747 0x020e0010, 0xF00000CF,
748 0x020e0018, 0x007F007F,
749 0x020e001c, 0x007F007F,
750};
751
752static int mx6qp_dcd_table[] = {
753 0x020e0798, 0x000C0000,
754 0x020e0758, 0x00000000,
755 0x020e0588, 0x00000030,
756 0x020e0594, 0x00000030,
757 0x020e056c, 0x00000030,
758 0x020e0578, 0x00000030,
759 0x020e074c, 0x00000030,
760 0x020e057c, 0x00000030,
761 0x020e058c, 0x00000000,
762 0x020e059c, 0x00000030,
763 0x020e05a0, 0x00000030,
764 0x020e078c, 0x00000030,
765 0x020e0750, 0x00020000,
766 0x020e05a8, 0x00000030,
767 0x020e05b0, 0x00000030,
768 0x020e0524, 0x00000030,
769 0x020e051c, 0x00000030,
770 0x020e0518, 0x00000030,
771 0x020e050c, 0x00000030,
772 0x020e05b8, 0x00000030,
773 0x020e05c0, 0x00000030,
774 0x020e0774, 0x00020000,
775 0x020e0784, 0x00000030,
776 0x020e0788, 0x00000030,
777 0x020e0794, 0x00000030,
778 0x020e079c, 0x00000030,
779 0x020e07a0, 0x00000030,
780 0x020e07a4, 0x00000030,
781 0x020e07a8, 0x00000030,
782 0x020e0748, 0x00000030,
783 0x020e05ac, 0x00000030,
784 0x020e05b4, 0x00000030,
785 0x020e0528, 0x00000030,
786 0x020e0520, 0x00000030,
787 0x020e0514, 0x00000030,
788 0x020e0510, 0x00000030,
789 0x020e05bc, 0x00000030,
790 0x020e05c4, 0x00000030,
791 0x021b0800, 0xa1390003,
792 0x021b080c, 0x001b001e,
793 0x021b0810, 0x002e0029,
794 0x021b480c, 0x001b002a,
795 0x021b4810, 0x0019002c,
796 0x021b083c, 0x43240334,
797 0x021b0840, 0x0324031a,
798 0x021b483c, 0x43340344,
799 0x021b4840, 0x03280276,
800 0x021b0848, 0x44383A3E,
801 0x021b4848, 0x3C3C3846,
802 0x021b0850, 0x2e303230,
803 0x021b4850, 0x38283E34,
804 0x021b081c, 0x33333333,
805 0x021b0820, 0x33333333,
806 0x021b0824, 0x33333333,
807 0x021b0828, 0x33333333,
808 0x021b481c, 0x33333333,
809 0x021b4820, 0x33333333,
810 0x021b4824, 0x33333333,
811 0x021b4828, 0x33333333,
812 0x021b08c0, 0x24912492,
813 0x021b48c0, 0x24912492,
814 0x021b08b8, 0x00000800,
815 0x021b48b8, 0x00000800,
816 0x021b0004, 0x00020036,
817 0x021b0008, 0x09444040,
818 0x021b000c, 0x898E7955,
819 0x021b0010, 0xFF328F64,
820 0x021b0014, 0x01FF00DB,
821 0x021b0018, 0x00001740,
822 0x021b001c, 0x00008000,
823 0x021b002c, 0x000026d2,
824 0x021b0030, 0x008E1023,
825 0x021b0040, 0x00000047,
826 0x021b0400, 0x14420000,
827 0x021b0000, 0x841A0000,
828 0x00bb0008, 0x00000004,
829 0x00bb000c, 0x2891E41A,
830 0x00bb0038, 0x00000564,
831 0x00bb0014, 0x00000040,
832 0x00bb0028, 0x00000020,
833 0x00bb002c, 0x00000020,
834 0x021b001c, 0x04088032,
835 0x021b001c, 0x00008033,
836 0x021b001c, 0x00048031,
837 0x021b001c, 0x09408030,
838 0x021b001c, 0x04008040,
839 0x021b0020, 0x00005800,
840 0x021b0818, 0x00011117,
841 0x021b4818, 0x00011117,
842 0x021b0004, 0x00025576,
843 0x021b0404, 0x00011006,
844 0x021b001c, 0x00000000,
845 0x020c4068, 0x00C03F3F,
846 0x020c406c, 0x0030FC03,
847 0x020c4070, 0x0FFFC000,
848 0x020c4074, 0x3FF00000,
849 0x020c4078, 0xFFFFF300,
850 0x020c407c, 0x0F0000F3,
851 0x020c4080, 0x00000FFF,
852 0x020e0010, 0xF00000CF,
853 0x020e0018, 0x77177717,
854 0x020e001c, 0x77177717,
855};
856
857static int mx6dl_dcd_table[] = {
858 0x020e0774, 0x000C0000,
859 0x020e0754, 0x00000000,
860 0x020e04ac, 0x00000030,
861 0x020e04b0, 0x00000030,
862 0x020e0464, 0x00000030,
863 0x020e0490, 0x00000030,
864 0x020e074c, 0x00000030,
865 0x020e0494, 0x00000030,
866 0x020e04a0, 0x00000000,
867 0x020e04b4, 0x00000030,
868 0x020e04b8, 0x00000030,
869 0x020e076c, 0x00000030,
870 0x020e0750, 0x00020000,
871 0x020e04bc, 0x00000028,
872 0x020e04c0, 0x00000028,
873 0x020e04c4, 0x00000028,
874 0x020e04c8, 0x00000028,
875 0x020e04cc, 0x00000028,
876 0x020e04d0, 0x00000028,
877 0x020e04d4, 0x00000028,
878 0x020e04d8, 0x00000028,
879 0x020e0760, 0x00020000,
880 0x020e0764, 0x00000028,
881 0x020e0770, 0x00000028,
882 0x020e0778, 0x00000028,
883 0x020e077c, 0x00000028,
884 0x020e0780, 0x00000028,
885 0x020e0784, 0x00000028,
886 0x020e078c, 0x00000028,
887 0x020e0748, 0x00000028,
888 0x020e0470, 0x00000028,
889 0x020e0474, 0x00000028,
890 0x020e0478, 0x00000028,
891 0x020e047c, 0x00000028,
892 0x020e0480, 0x00000028,
893 0x020e0484, 0x00000028,
894 0x020e0488, 0x00000028,
895 0x020e048c, 0x00000028,
896 0x021b0800, 0xa1390003,
897 0x021b080c, 0x001F001F,
898 0x021b0810, 0x001F001F,
899 0x021b480c, 0x001F001F,
900 0x021b4810, 0x001F001F,
901 0x021b083c, 0x42190217,
902 0x021b0840, 0x017B017B,
903 0x021b483c, 0x4176017B,
904 0x021b4840, 0x015F016C,
905 0x021b0848, 0x4C4C4D4C,
906 0x021b4848, 0x4A4D4C48,
907 0x021b0850, 0x3F3F3F40,
908 0x021b4850, 0x3538382E,
909 0x021b081c, 0x33333333,
910 0x021b0820, 0x33333333,
911 0x021b0824, 0x33333333,
912 0x021b0828, 0x33333333,
913 0x021b481c, 0x33333333,
914 0x021b4820, 0x33333333,
915 0x021b4824, 0x33333333,
916 0x021b4828, 0x33333333,
917 0x021b08b8, 0x00000800,
918 0x021b48b8, 0x00000800,
919 0x021b0004, 0x00020025,
920 0x021b0008, 0x00333030,
921 0x021b000c, 0x676B5313,
922 0x021b0010, 0xB66E8B63,
923 0x021b0014, 0x01FF00DB,
924 0x021b0018, 0x00001740,
925 0x021b001c, 0x00008000,
926 0x021b002c, 0x000026d2,
927 0x021b0030, 0x006B1023,
928 0x021b0040, 0x00000047,
929 0x021b0000, 0x841A0000,
930 0x021b001c, 0x04008032,
931 0x021b001c, 0x00008033,
932 0x021b001c, 0x00048031,
933 0x021b001c, 0x05208030,
934 0x021b001c, 0x04008040,
935 0x021b0020, 0x00005800,
936 0x021b0818, 0x00011117,
937 0x021b4818, 0x00011117,
938 0x021b0004, 0x00025565,
939 0x021b0404, 0x00011006,
940 0x021b001c, 0x00000000,
941 0x020c4068, 0x00C03F3F,
942 0x020c406c, 0x0030FC03,
943 0x020c4070, 0x0FFFC000,
944 0x020c4074, 0x3FF00000,
945 0x020c4078, 0xFFFFF300,
946 0x020c407c, 0x0F0000C3,
947 0x020c4080, 0x00000FFF,
948 0x020e0010, 0xF00000CF,
949 0x020e0018, 0x007F007F,
950 0x020e001c, 0x007F007F,
951};
952
953static void ddr_init(int *table, int size)
954{
955 int i;
956
957 for (i = 0; i < size / 2 ; i++)
958 writel(table[2 * i + 1], table[2 * i]);
959}
960
961static void spl_dram_init(void)
962{
963 if (is_mx6dq())
964 ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
965 else if (is_mx6dqp())
966 ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
967 else if (is_mx6sdl())
968 ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
969}
970
971void board_init_f(ulong dummy)
972{
973 /* DDR initialization */
974 spl_dram_init();
975
976 /* setup AIPS and disable watchdog */
977 arch_cpu_init();
978
979 ccgr_init();
980 gpr_init();
981
982 /* iomux and setup of i2c */
983 board_early_init_f();
984
985 /* setup GP timer */
986 timer_init();
987
988 /* UART clocks enabled and gd valid - init serial console */
989 preloader_console_init();
990
991 /* Clear the BSS. */
992 memset(__bss_start, 0, __bss_end - __bss_start);
993
994 /* load/boot image from boot device */
995 board_init_r(NULL, 0);
996}
997#endif
Abel Vesa9fe4c852019-02-01 16:40:13 +0000998
999#ifdef CONFIG_SPL_LOAD_FIT
1000int board_fit_config_name_match(const char *name)
1001{
1002 if (is_mx6dq()) {
1003 if (!strcmp(name, "imx6q-sabreauto"))
1004 return 0;
1005 } else if (is_mx6dqp()) {
1006 if (!strcmp(name, "imx6qp-sabreauto"))
1007 return 0;
1008 } else if (is_mx6dl()) {
1009 if (!strcmp(name, "imx6dl-sabreauto"))
1010 return 0;
1011 }
1012
1013 return -1;
1014}
1015#endif