blob: c031cf8538e7f86c44eea88839202f0bc02c5349 [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>
Fabio Estevamafe20bf2012-09-24 08:09:33 +000012#include <asm/io.h>
13#include <asm/arch/clock.h>
14#include <asm/arch/imx-regs.h>
15#include <asm/arch/iomux.h>
Eric Nelson24ded0c2013-11-13 16:36:19 -070016#include <asm/arch/mx6-pins.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060017#include <env.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090018#include <linux/errno.h>
Fabio Estevamafe20bf2012-09-24 08:09:33 +000019#include <asm/gpio.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020020#include <asm/mach-imx/iomux-v3.h>
21#include <asm/mach-imx/mxc_i2c.h>
22#include <asm/mach-imx/boot_mode.h>
23#include <asm/mach-imx/spi.h>
Fabio Estevamafe20bf2012-09-24 08:09:33 +000024#include <mmc.h>
Yangbo Lu73340382019-06-21 11:42:28 +080025#include <fsl_esdhc_imx.h>
Fabio Estevambe59b6a2012-09-25 08:43:57 +000026#include <miiphy.h>
Fabio Estevam96ad33d2012-10-02 11:20:12 +000027#include <asm/arch/sys_proto.h>
Renato Friasbf084322013-05-13 18:01:12 +000028#include <i2c.h>
Diego Dorta2661c9c2017-09-22 12:12:18 -030029#include <input.h>
Fabio Estevam5a6c8c42014-09-22 13:55:52 -030030#include <asm/arch/mxc_hdmi.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020031#include <asm/mach-imx/video.h>
Fabio Estevam5a6c8c42014-09-22 13:55:52 -030032#include <asm/arch/crm_regs.h>
Ye.Li700020e2014-10-30 18:53:49 +080033#include <pca953x.h>
Ye.Licfaa23b2014-11-06 16:29:02 +080034#include <power/pmic.h>
Peng Fane5bcd4d2015-01-27 10:14:04 +080035#include <power/pfuze100_pmic.h>
Ye.Licfaa23b2014-11-06 16:29:02 +080036#include "../common/pfuze.h"
Fabio Estevam96ad33d2012-10-02 11:20:12 +000037
Fabio Estevamafe20bf2012-09-24 08:09:33 +000038DECLARE_GLOBAL_DATA_PTR;
39
Benoît Thébaudeau21670242013-04-26 01:34:47 +000040#define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
41 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
42 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevamafe20bf2012-09-24 08:09:33 +000043
Benoît Thébaudeau21670242013-04-26 01:34:47 +000044#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
45 PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
46 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevamafe20bf2012-09-24 08:09:33 +000047
Benoît Thébaudeau21670242013-04-26 01:34:47 +000048#define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
49 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
Fabio Estevambe59b6a2012-09-25 08:43:57 +000050
Renato Friasbf084322013-05-13 18:01:12 +000051#define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
52 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
53 PAD_CTL_ODE | PAD_CTL_SRE_FAST)
54
Ye.Li4a1f9222014-11-12 14:02:05 +080055#define GPMI_PAD_CTRL0 (PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_PUS_100K_UP)
56#define GPMI_PAD_CTRL1 (PAD_CTL_DSE_40ohm | PAD_CTL_SPEED_MED | \
57 PAD_CTL_SRE_FAST)
58#define GPMI_PAD_CTRL2 (GPMI_PAD_CTRL0 | GPMI_PAD_CTRL1)
59
Renato Friasbf084322013-05-13 18:01:12 +000060#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
61
Fabio Estevam2623cb12014-11-14 11:27:23 -020062#define WEIM_NOR_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
63 PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
64 PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
65
Ye.Licfaa23b2014-11-06 16:29:02 +080066#define I2C_PMIC 1
67
Fabio Estevamafe20bf2012-09-24 08:09:33 +000068int dram_init(void)
69{
Vanessa Maegima627c0e52016-06-08 15:17:54 -030070 gd->ram_size = imx_ddr_size();
Fabio Estevamafe20bf2012-09-24 08:09:33 +000071
72 return 0;
73}
74
Fabio Estevam6bfdb102014-09-13 18:21:36 -030075static iomux_v3_cfg_t const uart4_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -030076 IOMUX_PADS(PAD_KEY_COL0__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
77 IOMUX_PADS(PAD_KEY_ROW0__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
Fabio Estevamafe20bf2012-09-24 08:09:33 +000078};
79
Fabio Estevambe59b6a2012-09-25 08:43:57 +000080
Renato Friasbf084322013-05-13 18:01:12 +000081/* I2C2 PMIC, iPod, Tuner, Codec, Touch, HDMI EDID, MIPI CSI2 card */
Vanessa Maegima65779d32017-06-29 09:33:45 -030082static struct i2c_pads_info mx6q_i2c_pad_info1 = {
Renato Friasbf084322013-05-13 18:01:12 +000083 .scl = {
Vanessa Maegima65779d32017-06-29 09:33:45 -030084 .i2c_mode = MX6Q_PAD_EIM_EB2__I2C2_SCL | PC,
85 .gpio_mode = MX6Q_PAD_EIM_EB2__GPIO2_IO30 | PC,
Renato Friasbf084322013-05-13 18:01:12 +000086 .gp = IMX_GPIO_NR(2, 30)
87 },
88 .sda = {
Vanessa Maegima65779d32017-06-29 09:33:45 -030089 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
90 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
Renato Friasbf084322013-05-13 18:01:12 +000091 .gp = IMX_GPIO_NR(4, 13)
92 }
93};
94
Vanessa Maegima65779d32017-06-29 09:33:45 -030095static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
96 .scl = {
97 .i2c_mode = MX6DL_PAD_EIM_EB2__I2C2_SCL | PC,
98 .gpio_mode = MX6DL_PAD_EIM_EB2__GPIO2_IO30 | PC,
99 .gp = IMX_GPIO_NR(2, 30)
100 },
101 .sda = {
102 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
103 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
104 .gp = IMX_GPIO_NR(4, 13)
105 }
106};
107
Fabio Estevam2623cb12014-11-14 11:27:23 -0200108#ifndef CONFIG_SYS_FLASH_CFI
Renato Friasbf084322013-05-13 18:01:12 +0000109/*
110 * I2C3 MLB, Port Expanders (A, B, C), Video ADC, Light Sensor,
111 * Compass Sensor, Accelerometer, Res Touch
112 */
Vanessa Maegima65779d32017-06-29 09:33:45 -0300113static struct i2c_pads_info mx6q_i2c_pad_info2 = {
Renato Friasbf084322013-05-13 18:01:12 +0000114 .scl = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300115 .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
116 .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
Renato Friasbf084322013-05-13 18:01:12 +0000117 .gp = IMX_GPIO_NR(1, 3)
118 },
119 .sda = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300120 .i2c_mode = MX6Q_PAD_EIM_D18__I2C3_SDA | PC,
121 .gpio_mode = MX6Q_PAD_EIM_D18__GPIO3_IO18 | PC,
Renato Friasbf084322013-05-13 18:01:12 +0000122 .gp = IMX_GPIO_NR(3, 18)
123 }
124};
Vanessa Maegima65779d32017-06-29 09:33:45 -0300125
126static struct i2c_pads_info mx6dl_i2c_pad_info2 = {
127 .scl = {
128 .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
129 .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
130 .gp = IMX_GPIO_NR(1, 3)
131 },
132 .sda = {
133 .i2c_mode = MX6DL_PAD_EIM_D18__I2C3_SDA | PC,
134 .gpio_mode = MX6DL_PAD_EIM_D18__GPIO3_IO18 | PC,
135 .gp = IMX_GPIO_NR(3, 18)
136 }
137};
Fabio Estevam2623cb12014-11-14 11:27:23 -0200138#endif
Renato Friasbf084322013-05-13 18:01:12 +0000139
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300140static iomux_v3_cfg_t const i2c3_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300141 IOMUX_PADS(PAD_EIM_A24__GPIO5_IO04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Renato Friasbf084322013-05-13 18:01:12 +0000142};
143
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300144static iomux_v3_cfg_t const port_exp[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300145 IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Renato Frias7cbaae82013-05-13 18:01:13 +0000146};
147
Fabio Estevama03035f2017-07-10 15:59:11 -0300148#ifdef CONFIG_MTD_NOR_FLASH
Fabio Estevam2623cb12014-11-14 11:27:23 -0200149static iomux_v3_cfg_t const eimnor_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300150 IOMUX_PADS(PAD_EIM_D16__EIM_DATA16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
151 IOMUX_PADS(PAD_EIM_D17__EIM_DATA17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
152 IOMUX_PADS(PAD_EIM_D18__EIM_DATA18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
153 IOMUX_PADS(PAD_EIM_D19__EIM_DATA19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
154 IOMUX_PADS(PAD_EIM_D20__EIM_DATA20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
155 IOMUX_PADS(PAD_EIM_D21__EIM_DATA21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
156 IOMUX_PADS(PAD_EIM_D22__EIM_DATA22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
157 IOMUX_PADS(PAD_EIM_D23__EIM_DATA23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
158 IOMUX_PADS(PAD_EIM_D24__EIM_DATA24 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
159 IOMUX_PADS(PAD_EIM_D25__EIM_DATA25 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
160 IOMUX_PADS(PAD_EIM_D26__EIM_DATA26 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
161 IOMUX_PADS(PAD_EIM_D27__EIM_DATA27 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
162 IOMUX_PADS(PAD_EIM_D28__EIM_DATA28 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
163 IOMUX_PADS(PAD_EIM_D29__EIM_DATA29 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
164 IOMUX_PADS(PAD_EIM_D30__EIM_DATA30 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
165 IOMUX_PADS(PAD_EIM_D31__EIM_DATA31 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
166 IOMUX_PADS(PAD_EIM_DA0__EIM_AD00 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
167 IOMUX_PADS(PAD_EIM_DA1__EIM_AD01 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
168 IOMUX_PADS(PAD_EIM_DA2__EIM_AD02 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
169 IOMUX_PADS(PAD_EIM_DA3__EIM_AD03 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
170 IOMUX_PADS(PAD_EIM_DA4__EIM_AD04 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
171 IOMUX_PADS(PAD_EIM_DA5__EIM_AD05 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
172 IOMUX_PADS(PAD_EIM_DA6__EIM_AD06 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
173 IOMUX_PADS(PAD_EIM_DA7__EIM_AD07 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
174 IOMUX_PADS(PAD_EIM_DA8__EIM_AD08 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
175 IOMUX_PADS(PAD_EIM_DA9__EIM_AD09 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
176 IOMUX_PADS(PAD_EIM_DA10__EIM_AD10 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
177 IOMUX_PADS(PAD_EIM_DA11__EIM_AD11 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
178 IOMUX_PADS(PAD_EIM_DA12__EIM_AD12 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
179 IOMUX_PADS(PAD_EIM_DA13__EIM_AD13 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
180 IOMUX_PADS(PAD_EIM_DA14__EIM_AD14 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
181 IOMUX_PADS(PAD_EIM_DA15__EIM_AD15 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
182 IOMUX_PADS(PAD_EIM_A16__EIM_ADDR16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
183 IOMUX_PADS(PAD_EIM_A17__EIM_ADDR17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
184 IOMUX_PADS(PAD_EIM_A18__EIM_ADDR18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
185 IOMUX_PADS(PAD_EIM_A19__EIM_ADDR19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
186 IOMUX_PADS(PAD_EIM_A20__EIM_ADDR20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
187 IOMUX_PADS(PAD_EIM_A21__EIM_ADDR21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
188 IOMUX_PADS(PAD_EIM_A22__EIM_ADDR22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
189 IOMUX_PADS(PAD_EIM_A23__EIM_ADDR23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
190 IOMUX_PADS(PAD_EIM_OE__EIM_OE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
191 IOMUX_PADS(PAD_EIM_RW__EIM_RW | MUX_PAD_CTRL(NO_PAD_CTRL)),
192 IOMUX_PADS(PAD_EIM_CS0__EIM_CS0_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevam2623cb12014-11-14 11:27:23 -0200193};
194
195static void eimnor_cs_setup(void)
196{
197 struct weim *weim_regs = (struct weim *)WEIM_BASE_ADDR;
198
199 writel(0x00020181, &weim_regs->cs0gcr1);
200 writel(0x00000001, &weim_regs->cs0gcr2);
201 writel(0x0a020000, &weim_regs->cs0rcr1);
202 writel(0x0000c000, &weim_regs->cs0rcr2);
203 writel(0x0804a240, &weim_regs->cs0wcr1);
204 writel(0x00000120, &weim_regs->wcr);
205
206 set_chipselect_size(CS0_128);
207}
208
Fabio Estevame795b6d2016-12-26 23:04:41 -0200209static void eim_clk_setup(void)
210{
211 struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
212 int cscmr1, ccgr6;
213
214
215 /* Turn off EIM clock */
216 ccgr6 = readl(&imx_ccm->CCGR6);
217 ccgr6 &= ~(0x3 << 10);
218 writel(ccgr6, &imx_ccm->CCGR6);
219
220 /*
221 * Configure clk_eim_slow_sel = 00 --> derive clock from AXI clk root
222 * and aclk_eim_slow_podf = 01 --> divide by 2
223 * so that we can have EIM at the maximum clock of 132MHz
224 */
225 cscmr1 = readl(&imx_ccm->cscmr1);
226 cscmr1 &= ~(MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK |
227 MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK);
228 cscmr1 |= (1 << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET);
229 writel(cscmr1, &imx_ccm->cscmr1);
230
231 /* Turn on EIM clock */
232 ccgr6 |= (0x3 << 10);
233 writel(ccgr6, &imx_ccm->CCGR6);
234}
235
Fabio Estevam2623cb12014-11-14 11:27:23 -0200236static void setup_iomux_eimnor(void)
237{
Vanessa Maegima65779d32017-06-29 09:33:45 -0300238 SETUP_IOMUX_PADS(eimnor_pads);
Fabio Estevam2623cb12014-11-14 11:27:23 -0200239
240 gpio_direction_output(IMX_GPIO_NR(5, 4), 0);
241
242 eimnor_cs_setup();
243}
Fabio Estevama03035f2017-07-10 15:59:11 -0300244#endif
Fabio Estevam2623cb12014-11-14 11:27:23 -0200245
Fabio Estevambe59b6a2012-09-25 08:43:57 +0000246
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300247static iomux_v3_cfg_t const usdhc3_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300248 IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
249 IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
250 IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
251 IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
252 IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
253 IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
254 IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
255 IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
256 IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
257 IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
258 IOMUX_PADS(PAD_GPIO_18__SD3_VSELECT | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
259 IOMUX_PADS(PAD_NANDF_CS2__GPIO6_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000260};
261
262static void setup_iomux_uart(void)
263{
Vanessa Maegima65779d32017-06-29 09:33:45 -0300264 SETUP_IOMUX_PADS(uart4_pads);
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000265}
266
Yangbo Lu73340382019-06-21 11:42:28 +0800267#ifdef CONFIG_FSL_ESDHC_IMX
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300268static struct fsl_esdhc_cfg usdhc_cfg[1] = {
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000269 {USDHC3_BASE_ADDR},
270};
271
272int board_mmc_getcd(struct mmc *mmc)
273{
274 gpio_direction_input(IMX_GPIO_NR(6, 15));
275 return !gpio_get_value(IMX_GPIO_NR(6, 15));
276}
277
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900278int board_mmc_init(struct bd_info *bis)
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000279{
Vanessa Maegima65779d32017-06-29 09:33:45 -0300280 SETUP_IOMUX_PADS(usdhc3_pads);
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000281
Benoît Thébaudeauc58ff342012-10-01 08:36:25 +0000282 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000283 return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
284}
285#endif
286
Ye.Li4a1f9222014-11-12 14:02:05 +0800287#ifdef CONFIG_NAND_MXS
288static iomux_v3_cfg_t gpmi_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300289 IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
290 IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
291 IOMUX_PADS(PAD_NANDF_WP_B__NAND_WP_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
292 IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(GPMI_PAD_CTRL0)),
293 IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
294 IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
295 IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
296 IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
297 IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
298 IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
299 IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
300 IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
301 IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
302 IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
303 IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
304 IOMUX_PADS(PAD_SD4_DAT0__NAND_DQS | MUX_PAD_CTRL(GPMI_PAD_CTRL1)),
Ye.Li4a1f9222014-11-12 14:02:05 +0800305};
306
307static void setup_gpmi_nand(void)
308{
309 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
310
311 /* config gpmi nand iomux */
Vanessa Maegima65779d32017-06-29 09:33:45 -0300312 SETUP_IOMUX_PADS(gpmi_pads);
Ye.Li4a1f9222014-11-12 14:02:05 +0800313
Ye.Li2dea0402015-01-12 17:37:13 +0800314 setup_gpmi_io_clk((MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
Ye.Li4a1f9222014-11-12 14:02:05 +0800315 MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
Ye.Li2dea0402015-01-12 17:37:13 +0800316 MXC_CCM_CS2CDR_ENFC_CLK_SEL(3)));
Ye.Li4a1f9222014-11-12 14:02:05 +0800317
318 /* enable apbh clock gating */
319 setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
320}
321#endif
322
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000323u32 get_board_rev(void)
324{
Fabio Estevam49bcdd72017-11-27 10:25:09 -0200325 int rev = nxp_board_rev();
Fabio Estevam96ad33d2012-10-02 11:20:12 +0000326
327 return (get_cpu_rev() & ~(0xF << 8)) | rev;
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000328}
329
Fabio Estevam9af078f2017-07-12 18:31:45 -0300330static int ar8031_phy_fixup(struct phy_device *phydev)
331{
332 unsigned short val;
333
334 /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
335 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
336 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
337 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
338
339 val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
340 val &= 0xffe3;
341 val |= 0x18;
342 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
343
344 /* introduce tx clock delay */
345 phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
346 val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
347 val |= 0x0100;
348 phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
349
350 return 0;
351}
352
353int board_phy_config(struct phy_device *phydev)
354{
355 ar8031_phy_fixup(phydev);
356
357 if (phydev->drv->config)
358 phydev->drv->config(phydev);
359
360 return 0;
361}
362
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300363#if defined(CONFIG_VIDEO_IPUV3)
Peng Fan03f8d152015-12-15 16:27:18 +0800364static void disable_lvds(struct display_info_t const *dev)
365{
366 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
367
368 clrbits_le32(&iomux->gpr[2],
369 IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
370 IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
371}
372
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300373static void do_enable_hdmi(struct display_info_t const *dev)
374{
Peng Fan03f8d152015-12-15 16:27:18 +0800375 disable_lvds(dev);
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300376 imx_enable_hdmi_phy();
377}
378
379struct display_info_t const displays[] = {{
380 .bus = -1,
381 .addr = 0,
Peng Fan03f8d152015-12-15 16:27:18 +0800382 .pixfmt = IPU_PIX_FMT_RGB666,
383 .detect = NULL,
384 .enable = NULL,
385 .mode = {
386 .name = "Hannstar-XGA",
387 .refresh = 60,
388 .xres = 1024,
389 .yres = 768,
390 .pixclock = 15385,
391 .left_margin = 220,
392 .right_margin = 40,
393 .upper_margin = 21,
394 .lower_margin = 7,
395 .hsync_len = 60,
396 .vsync_len = 10,
397 .sync = FB_SYNC_EXT,
398 .vmode = FB_VMODE_NONINTERLACED
399} }, {
400 .bus = -1,
401 .addr = 0,
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300402 .pixfmt = IPU_PIX_FMT_RGB24,
403 .detect = detect_hdmi,
404 .enable = do_enable_hdmi,
405 .mode = {
406 .name = "HDMI",
407 .refresh = 60,
408 .xres = 1024,
409 .yres = 768,
410 .pixclock = 15385,
411 .left_margin = 220,
412 .right_margin = 40,
413 .upper_margin = 21,
414 .lower_margin = 7,
415 .hsync_len = 60,
416 .vsync_len = 10,
417 .sync = FB_SYNC_EXT,
418 .vmode = FB_VMODE_NONINTERLACED,
419} } };
420size_t display_count = ARRAY_SIZE(displays);
421
Peng Fan03f8d152015-12-15 16:27:18 +0800422iomux_v3_cfg_t const backlight_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300423 IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
Peng Fan03f8d152015-12-15 16:27:18 +0800424};
425
426static void setup_iomux_backlight(void)
427{
Abel Vesa5d6f33d2019-02-01 16:40:19 +0000428 gpio_request(IMX_GPIO_NR(2, 9), "backlight");
Peng Fan03f8d152015-12-15 16:27:18 +0800429 gpio_direction_output(IMX_GPIO_NR(2, 9), 1);
Vanessa Maegima65779d32017-06-29 09:33:45 -0300430 SETUP_IOMUX_PADS(backlight_pads);
Peng Fan03f8d152015-12-15 16:27:18 +0800431}
432
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300433static void setup_display(void)
434{
435 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
Peng Fan03f8d152015-12-15 16:27:18 +0800436 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300437 int reg;
438
Peng Fan03f8d152015-12-15 16:27:18 +0800439 setup_iomux_backlight();
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300440 enable_ipu_clock();
441 imx_setup_hdmi();
442
Peng Fan03f8d152015-12-15 16:27:18 +0800443 /* Turn on LDB_DI0 and LDB_DI1 clocks */
444 reg = readl(&mxc_ccm->CCGR3);
445 reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
446 writel(reg, &mxc_ccm->CCGR3);
447
448 /* Set LDB_DI0 and LDB_DI1 clk select to 3b'011 */
449 reg = readl(&mxc_ccm->cs2cdr);
450 reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK |
451 MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
452 reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET) |
453 (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
454 writel(reg, &mxc_ccm->cs2cdr);
455
456 reg = readl(&mxc_ccm->cscmr2);
457 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
458 writel(reg, &mxc_ccm->cscmr2);
459
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300460 reg = readl(&mxc_ccm->chsccdr);
461 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
462 << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
Peng Fan03f8d152015-12-15 16:27:18 +0800463 reg |= (CHSCCDR_CLK_SEL_LDB_DI0 <<
464 MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300465 writel(reg, &mxc_ccm->chsccdr);
Peng Fan03f8d152015-12-15 16:27:18 +0800466
467 reg = IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW |
468 IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW |
469 IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG |
470 IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT |
471 IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG |
472 IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT |
473 IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0 |
474 IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED;
475 writel(reg, &iomux->gpr[2]);
476
477 reg = readl(&iomux->gpr[3]);
478 reg &= ~(IOMUXC_GPR3_LVDS0_MUX_CTL_MASK |
479 IOMUXC_GPR3_HDMI_MUX_CTL_MASK);
480 reg |= (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
481 IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET) |
482 (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
483 IOMUXC_GPR3_HDMI_MUX_CTL_OFFSET);
484 writel(reg, &iomux->gpr[3]);
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300485}
486#endif /* CONFIG_VIDEO_IPUV3 */
487
488/*
489 * Do not overwrite the console
490 * Use always serial for U-Boot console
491 */
492int overwrite_console(void)
493{
494 return 1;
495}
496
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000497int board_early_init_f(void)
498{
499 setup_iomux_uart();
Ye.Li4a1f9222014-11-12 14:02:05 +0800500
501#ifdef CONFIG_NAND_MXS
502 setup_gpmi_nand();
503#endif
Fabio Estevam2623cb12014-11-14 11:27:23 -0200504
Fabio Estevama03035f2017-07-10 15:59:11 -0300505#ifdef CONFIG_MTD_NOR_FLASH
506 eim_clk_setup();
507#endif
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000508 return 0;
509}
510
511int board_init(void)
512{
513 /* address of boot parameters */
514 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
515
Renato Friasbf084322013-05-13 18:01:12 +0000516 /* I2C 2 and 3 setup - I2C 3 hw mux with EIM */
Vanessa Maegima65779d32017-06-29 09:33:45 -0300517 if (is_mx6dq() || is_mx6dqp())
518 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
519 else
520 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
Renato Friasbf084322013-05-13 18:01:12 +0000521 /* I2C 3 Steer */
Abel Vesa5d6f33d2019-02-01 16:40:19 +0000522 gpio_request(IMX_GPIO_NR(5, 4), "steer logic");
Renato Friasbf084322013-05-13 18:01:12 +0000523 gpio_direction_output(IMX_GPIO_NR(5, 4), 1);
Vanessa Maegima65779d32017-06-29 09:33:45 -0300524 SETUP_IOMUX_PADS(i2c3_pads);
Fabio Estevam2623cb12014-11-14 11:27:23 -0200525#ifndef CONFIG_SYS_FLASH_CFI
Vanessa Maegima65779d32017-06-29 09:33:45 -0300526 if (is_mx6dq() || is_mx6dqp())
527 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info2);
528 else
529 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info2);
Fabio Estevam2623cb12014-11-14 11:27:23 -0200530#endif
Abel Vesa5d6f33d2019-02-01 16:40:19 +0000531 gpio_request(IMX_GPIO_NR(1, 15), "expander en");
Renato Frias7cbaae82013-05-13 18:01:13 +0000532 gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
Vanessa Maegima65779d32017-06-29 09:33:45 -0300533 SETUP_IOMUX_PADS(port_exp);
Renato Frias7cbaae82013-05-13 18:01:13 +0000534
Peng Fan03f8d152015-12-15 16:27:18 +0800535#ifdef CONFIG_VIDEO_IPUV3
536 setup_display();
537#endif
Fabio Estevama03035f2017-07-10 15:59:11 -0300538
539#ifdef CONFIG_MTD_NOR_FLASH
Fabio Estevam2623cb12014-11-14 11:27:23 -0200540 setup_iomux_eimnor();
Fabio Estevama03035f2017-07-10 15:59:11 -0300541#endif
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000542 return 0;
543}
544
Nikita Kiryanov00cd7382014-08-20 15:08:50 +0300545#ifdef CONFIG_MXC_SPI
546int board_spi_cs_gpio(unsigned bus, unsigned cs)
547{
548 return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
549}
550#endif
551
Ye.Licfaa23b2014-11-06 16:29:02 +0800552int power_init_board(void)
553{
554 struct pmic *p;
Peng Fand4947e32015-07-11 11:38:47 +0800555 unsigned int value;
Ye.Licfaa23b2014-11-06 16:29:02 +0800556
557 p = pfuze_common_init(I2C_PMIC);
558 if (!p)
559 return -ENODEV;
560
Peng Fand4947e32015-07-11 11:38:47 +0800561 if (is_mx6dqp()) {
562 /* set SW2 staby volatage 0.975V*/
563 pmic_reg_read(p, PFUZE100_SW2STBY, &value);
564 value &= ~0x3f;
565 value |= 0x17;
566 pmic_reg_write(p, PFUZE100_SW2STBY, value);
567 }
Peng Fane5bcd4d2015-01-27 10:14:04 +0800568
Peng Fand4947e32015-07-11 11:38:47 +0800569 return pfuze_mode_init(p, APS_PFM);
Ye.Licfaa23b2014-11-06 16:29:02 +0800570}
571
Otavio Salvador52863372013-03-16 08:05:07 +0000572#ifdef CONFIG_CMD_BMODE
573static const struct boot_mode board_boot_modes[] = {
574 /* 4 bit bus width */
575 {"mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
576 {NULL, 0},
577};
578#endif
579
580int board_late_init(void)
581{
582#ifdef CONFIG_CMD_BMODE
583 add_board_boot_modes(board_boot_modes);
584#endif
585
Peng Fan04321fc2015-07-11 11:38:46 +0800586#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Simon Glass6a38e412017-08-03 12:22:09 -0600587 env_set("board_name", "SABREAUTO");
Peng Fan04321fc2015-07-11 11:38:46 +0800588
Peng Fand4947e32015-07-11 11:38:47 +0800589 if (is_mx6dqp())
Simon Glass6a38e412017-08-03 12:22:09 -0600590 env_set("board_rev", "MX6QP");
Peng Fan4a597d02016-05-23 18:36:06 +0800591 else if (is_mx6dq())
Simon Glass6a38e412017-08-03 12:22:09 -0600592 env_set("board_rev", "MX6Q");
Peng Fan4a597d02016-05-23 18:36:06 +0800593 else if (is_mx6sdl())
Simon Glass6a38e412017-08-03 12:22:09 -0600594 env_set("board_rev", "MX6DL");
Peng Fan04321fc2015-07-11 11:38:46 +0800595#endif
596
Otavio Salvador52863372013-03-16 08:05:07 +0000597 return 0;
598}
599
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000600int checkboard(void)
601{
Fabio Estevam49bcdd72017-11-27 10:25:09 -0200602 printf("Board: MX6Q-Sabreauto rev%c\n", nxp_board_rev_string());
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000603
604 return 0;
605}
Ye.Li700020e2014-10-30 18:53:49 +0800606
607#ifdef CONFIG_USB_EHCI_MX6
Ye.Li700020e2014-10-30 18:53:49 +0800608int board_ehci_hcd_init(int port)
609{
610 switch (port) {
611 case 0:
Ye.Li700020e2014-10-30 18:53:49 +0800612 /*
613 * Set daisy chain for otg_pin_id on 6q.
614 * For 6dl, this bit is reserved.
615 */
616 imx_iomux_set_gpr_register(1, 13, 1, 0);
617 break;
618 case 1:
619 break;
620 default:
621 printf("MXC USB port %d not yet supported\n", port);
622 return -EINVAL;
623 }
624 return 0;
625}
Ye.Li700020e2014-10-30 18:53:49 +0800626#endif
Vanessa Maegima65779d32017-06-29 09:33:45 -0300627
628#ifdef CONFIG_SPL_BUILD
629#include <asm/arch/mx6-ddr.h>
630#include <spl.h>
Masahiro Yamada75f82d02018-03-05 01:20:11 +0900631#include <linux/libfdt.h>
Vanessa Maegima65779d32017-06-29 09:33:45 -0300632
Diego Dorta614c2832017-07-07 15:38:34 -0300633#ifdef CONFIG_SPL_OS_BOOT
634int spl_start_uboot(void)
635{
636 return 0;
637}
638#endif
639
Vanessa Maegima65779d32017-06-29 09:33:45 -0300640static void ccgr_init(void)
641{
642 struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
643
644 writel(0x00C03F3F, &ccm->CCGR0);
645 writel(0x0030FC03, &ccm->CCGR1);
646 writel(0x0FFFC000, &ccm->CCGR2);
647 writel(0x3FF00000, &ccm->CCGR3);
648 writel(0x00FFF300, &ccm->CCGR4);
649 writel(0x0F0000C3, &ccm->CCGR5);
650 writel(0x000003FF, &ccm->CCGR6);
651}
652
Vanessa Maegima65779d32017-06-29 09:33:45 -0300653static int mx6q_dcd_table[] = {
654 0x020e0798, 0x000C0000,
655 0x020e0758, 0x00000000,
656 0x020e0588, 0x00000030,
657 0x020e0594, 0x00000030,
658 0x020e056c, 0x00000030,
659 0x020e0578, 0x00000030,
660 0x020e074c, 0x00000030,
661 0x020e057c, 0x00000030,
662 0x020e058c, 0x00000000,
663 0x020e059c, 0x00000030,
664 0x020e05a0, 0x00000030,
665 0x020e078c, 0x00000030,
666 0x020e0750, 0x00020000,
667 0x020e05a8, 0x00000028,
668 0x020e05b0, 0x00000028,
669 0x020e0524, 0x00000028,
670 0x020e051c, 0x00000028,
671 0x020e0518, 0x00000028,
672 0x020e050c, 0x00000028,
673 0x020e05b8, 0x00000028,
674 0x020e05c0, 0x00000028,
675 0x020e0774, 0x00020000,
676 0x020e0784, 0x00000028,
677 0x020e0788, 0x00000028,
678 0x020e0794, 0x00000028,
679 0x020e079c, 0x00000028,
680 0x020e07a0, 0x00000028,
681 0x020e07a4, 0x00000028,
682 0x020e07a8, 0x00000028,
683 0x020e0748, 0x00000028,
684 0x020e05ac, 0x00000028,
685 0x020e05b4, 0x00000028,
686 0x020e0528, 0x00000028,
687 0x020e0520, 0x00000028,
688 0x020e0514, 0x00000028,
689 0x020e0510, 0x00000028,
690 0x020e05bc, 0x00000028,
691 0x020e05c4, 0x00000028,
692 0x021b0800, 0xa1390003,
693 0x021b080c, 0x001F001F,
694 0x021b0810, 0x001F001F,
695 0x021b480c, 0x001F001F,
696 0x021b4810, 0x001F001F,
697 0x021b083c, 0x43260335,
698 0x021b0840, 0x031A030B,
699 0x021b483c, 0x4323033B,
700 0x021b4840, 0x0323026F,
701 0x021b0848, 0x483D4545,
702 0x021b4848, 0x44433E48,
703 0x021b0850, 0x41444840,
704 0x021b4850, 0x4835483E,
705 0x021b081c, 0x33333333,
706 0x021b0820, 0x33333333,
707 0x021b0824, 0x33333333,
708 0x021b0828, 0x33333333,
709 0x021b481c, 0x33333333,
710 0x021b4820, 0x33333333,
711 0x021b4824, 0x33333333,
712 0x021b4828, 0x33333333,
713 0x021b08b8, 0x00000800,
714 0x021b48b8, 0x00000800,
715 0x021b0004, 0x00020036,
716 0x021b0008, 0x09444040,
717 0x021b000c, 0x8A8F7955,
718 0x021b0010, 0xFF328F64,
719 0x021b0014, 0x01FF00DB,
720 0x021b0018, 0x00001740,
721 0x021b001c, 0x00008000,
722 0x021b002c, 0x000026d2,
723 0x021b0030, 0x008F1023,
724 0x021b0040, 0x00000047,
725 0x021b0000, 0x841A0000,
726 0x021b001c, 0x04088032,
727 0x021b001c, 0x00008033,
728 0x021b001c, 0x00048031,
729 0x021b001c, 0x09408030,
730 0x021b001c, 0x04008040,
731 0x021b0020, 0x00005800,
732 0x021b0818, 0x00011117,
733 0x021b4818, 0x00011117,
734 0x021b0004, 0x00025576,
735 0x021b0404, 0x00011006,
736 0x021b001c, 0x00000000,
737 0x020c4068, 0x00C03F3F,
738 0x020c406c, 0x0030FC03,
739 0x020c4070, 0x0FFFC000,
740 0x020c4074, 0x3FF00000,
741 0x020c4078, 0xFFFFF300,
742 0x020c407c, 0x0F0000F3,
743 0x020c4080, 0x00000FFF,
744 0x020e0010, 0xF00000CF,
745 0x020e0018, 0x007F007F,
746 0x020e001c, 0x007F007F,
747};
748
749static int mx6qp_dcd_table[] = {
750 0x020e0798, 0x000C0000,
751 0x020e0758, 0x00000000,
752 0x020e0588, 0x00000030,
753 0x020e0594, 0x00000030,
754 0x020e056c, 0x00000030,
755 0x020e0578, 0x00000030,
756 0x020e074c, 0x00000030,
757 0x020e057c, 0x00000030,
758 0x020e058c, 0x00000000,
759 0x020e059c, 0x00000030,
760 0x020e05a0, 0x00000030,
761 0x020e078c, 0x00000030,
762 0x020e0750, 0x00020000,
763 0x020e05a8, 0x00000030,
764 0x020e05b0, 0x00000030,
765 0x020e0524, 0x00000030,
766 0x020e051c, 0x00000030,
767 0x020e0518, 0x00000030,
768 0x020e050c, 0x00000030,
769 0x020e05b8, 0x00000030,
770 0x020e05c0, 0x00000030,
771 0x020e0774, 0x00020000,
772 0x020e0784, 0x00000030,
773 0x020e0788, 0x00000030,
774 0x020e0794, 0x00000030,
775 0x020e079c, 0x00000030,
776 0x020e07a0, 0x00000030,
777 0x020e07a4, 0x00000030,
778 0x020e07a8, 0x00000030,
779 0x020e0748, 0x00000030,
780 0x020e05ac, 0x00000030,
781 0x020e05b4, 0x00000030,
782 0x020e0528, 0x00000030,
783 0x020e0520, 0x00000030,
784 0x020e0514, 0x00000030,
785 0x020e0510, 0x00000030,
786 0x020e05bc, 0x00000030,
787 0x020e05c4, 0x00000030,
788 0x021b0800, 0xa1390003,
789 0x021b080c, 0x001b001e,
790 0x021b0810, 0x002e0029,
791 0x021b480c, 0x001b002a,
792 0x021b4810, 0x0019002c,
793 0x021b083c, 0x43240334,
794 0x021b0840, 0x0324031a,
795 0x021b483c, 0x43340344,
796 0x021b4840, 0x03280276,
797 0x021b0848, 0x44383A3E,
798 0x021b4848, 0x3C3C3846,
799 0x021b0850, 0x2e303230,
800 0x021b4850, 0x38283E34,
801 0x021b081c, 0x33333333,
802 0x021b0820, 0x33333333,
803 0x021b0824, 0x33333333,
804 0x021b0828, 0x33333333,
805 0x021b481c, 0x33333333,
806 0x021b4820, 0x33333333,
807 0x021b4824, 0x33333333,
808 0x021b4828, 0x33333333,
809 0x021b08c0, 0x24912492,
810 0x021b48c0, 0x24912492,
811 0x021b08b8, 0x00000800,
812 0x021b48b8, 0x00000800,
813 0x021b0004, 0x00020036,
814 0x021b0008, 0x09444040,
815 0x021b000c, 0x898E7955,
816 0x021b0010, 0xFF328F64,
817 0x021b0014, 0x01FF00DB,
818 0x021b0018, 0x00001740,
819 0x021b001c, 0x00008000,
820 0x021b002c, 0x000026d2,
821 0x021b0030, 0x008E1023,
822 0x021b0040, 0x00000047,
823 0x021b0400, 0x14420000,
824 0x021b0000, 0x841A0000,
825 0x00bb0008, 0x00000004,
826 0x00bb000c, 0x2891E41A,
827 0x00bb0038, 0x00000564,
828 0x00bb0014, 0x00000040,
829 0x00bb0028, 0x00000020,
830 0x00bb002c, 0x00000020,
831 0x021b001c, 0x04088032,
832 0x021b001c, 0x00008033,
833 0x021b001c, 0x00048031,
834 0x021b001c, 0x09408030,
835 0x021b001c, 0x04008040,
836 0x021b0020, 0x00005800,
837 0x021b0818, 0x00011117,
838 0x021b4818, 0x00011117,
839 0x021b0004, 0x00025576,
840 0x021b0404, 0x00011006,
841 0x021b001c, 0x00000000,
842 0x020c4068, 0x00C03F3F,
843 0x020c406c, 0x0030FC03,
844 0x020c4070, 0x0FFFC000,
845 0x020c4074, 0x3FF00000,
846 0x020c4078, 0xFFFFF300,
847 0x020c407c, 0x0F0000F3,
848 0x020c4080, 0x00000FFF,
849 0x020e0010, 0xF00000CF,
850 0x020e0018, 0x77177717,
851 0x020e001c, 0x77177717,
852};
853
854static int mx6dl_dcd_table[] = {
855 0x020e0774, 0x000C0000,
856 0x020e0754, 0x00000000,
857 0x020e04ac, 0x00000030,
858 0x020e04b0, 0x00000030,
859 0x020e0464, 0x00000030,
860 0x020e0490, 0x00000030,
861 0x020e074c, 0x00000030,
862 0x020e0494, 0x00000030,
863 0x020e04a0, 0x00000000,
864 0x020e04b4, 0x00000030,
865 0x020e04b8, 0x00000030,
866 0x020e076c, 0x00000030,
867 0x020e0750, 0x00020000,
868 0x020e04bc, 0x00000028,
869 0x020e04c0, 0x00000028,
870 0x020e04c4, 0x00000028,
871 0x020e04c8, 0x00000028,
872 0x020e04cc, 0x00000028,
873 0x020e04d0, 0x00000028,
874 0x020e04d4, 0x00000028,
875 0x020e04d8, 0x00000028,
876 0x020e0760, 0x00020000,
877 0x020e0764, 0x00000028,
878 0x020e0770, 0x00000028,
879 0x020e0778, 0x00000028,
880 0x020e077c, 0x00000028,
881 0x020e0780, 0x00000028,
882 0x020e0784, 0x00000028,
883 0x020e078c, 0x00000028,
884 0x020e0748, 0x00000028,
885 0x020e0470, 0x00000028,
886 0x020e0474, 0x00000028,
887 0x020e0478, 0x00000028,
888 0x020e047c, 0x00000028,
889 0x020e0480, 0x00000028,
890 0x020e0484, 0x00000028,
891 0x020e0488, 0x00000028,
892 0x020e048c, 0x00000028,
893 0x021b0800, 0xa1390003,
894 0x021b080c, 0x001F001F,
895 0x021b0810, 0x001F001F,
896 0x021b480c, 0x001F001F,
897 0x021b4810, 0x001F001F,
898 0x021b083c, 0x42190217,
899 0x021b0840, 0x017B017B,
900 0x021b483c, 0x4176017B,
901 0x021b4840, 0x015F016C,
902 0x021b0848, 0x4C4C4D4C,
903 0x021b4848, 0x4A4D4C48,
904 0x021b0850, 0x3F3F3F40,
905 0x021b4850, 0x3538382E,
906 0x021b081c, 0x33333333,
907 0x021b0820, 0x33333333,
908 0x021b0824, 0x33333333,
909 0x021b0828, 0x33333333,
910 0x021b481c, 0x33333333,
911 0x021b4820, 0x33333333,
912 0x021b4824, 0x33333333,
913 0x021b4828, 0x33333333,
914 0x021b08b8, 0x00000800,
915 0x021b48b8, 0x00000800,
916 0x021b0004, 0x00020025,
917 0x021b0008, 0x00333030,
918 0x021b000c, 0x676B5313,
919 0x021b0010, 0xB66E8B63,
920 0x021b0014, 0x01FF00DB,
921 0x021b0018, 0x00001740,
922 0x021b001c, 0x00008000,
923 0x021b002c, 0x000026d2,
924 0x021b0030, 0x006B1023,
925 0x021b0040, 0x00000047,
926 0x021b0000, 0x841A0000,
927 0x021b001c, 0x04008032,
928 0x021b001c, 0x00008033,
929 0x021b001c, 0x00048031,
930 0x021b001c, 0x05208030,
931 0x021b001c, 0x04008040,
932 0x021b0020, 0x00005800,
933 0x021b0818, 0x00011117,
934 0x021b4818, 0x00011117,
935 0x021b0004, 0x00025565,
936 0x021b0404, 0x00011006,
937 0x021b001c, 0x00000000,
938 0x020c4068, 0x00C03F3F,
939 0x020c406c, 0x0030FC03,
940 0x020c4070, 0x0FFFC000,
941 0x020c4074, 0x3FF00000,
942 0x020c4078, 0xFFFFF300,
943 0x020c407c, 0x0F0000C3,
944 0x020c4080, 0x00000FFF,
945 0x020e0010, 0xF00000CF,
946 0x020e0018, 0x007F007F,
947 0x020e001c, 0x007F007F,
948};
949
950static void ddr_init(int *table, int size)
951{
952 int i;
953
954 for (i = 0; i < size / 2 ; i++)
955 writel(table[2 * i + 1], table[2 * i]);
956}
957
958static void spl_dram_init(void)
959{
960 if (is_mx6dq())
961 ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
962 else if (is_mx6dqp())
963 ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
964 else if (is_mx6sdl())
965 ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
966}
967
968void board_init_f(ulong dummy)
969{
970 /* DDR initialization */
971 spl_dram_init();
972
973 /* setup AIPS and disable watchdog */
974 arch_cpu_init();
975
976 ccgr_init();
977 gpr_init();
978
979 /* iomux and setup of i2c */
980 board_early_init_f();
981
982 /* setup GP timer */
983 timer_init();
984
985 /* UART clocks enabled and gd valid - init serial console */
986 preloader_console_init();
987
988 /* Clear the BSS. */
989 memset(__bss_start, 0, __bss_end - __bss_start);
990
991 /* load/boot image from boot device */
992 board_init_r(NULL, 0);
993}
994#endif
Abel Vesa9fe4c852019-02-01 16:40:13 +0000995
996#ifdef CONFIG_SPL_LOAD_FIT
997int board_fit_config_name_match(const char *name)
998{
999 if (is_mx6dq()) {
1000 if (!strcmp(name, "imx6q-sabreauto"))
1001 return 0;
1002 } else if (is_mx6dqp()) {
1003 if (!strcmp(name, "imx6qp-sabreauto"))
1004 return 0;
1005 } else if (is_mx6dl()) {
1006 if (!strcmp(name, "imx6dl-sabreauto"))
1007 return 0;
1008 }
1009
1010 return -1;
1011}
1012#endif