blob: a8fe2511345e181ad6ce058392e627a1fa4742ee [file] [log] [blame]
Fabio Estevam7dd65452012-09-24 08:09:33 +00001/*
2 * Copyright (C) 2012 Freescale Semiconductor, Inc.
3 *
4 * Author: Fabio Estevam <fabio.estevam@freescale.com>
5 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02006 * SPDX-License-Identifier: GPL-2.0+
Fabio Estevam7dd65452012-09-24 08:09:33 +00007 */
8
9#include <common.h>
10#include <asm/io.h>
11#include <asm/arch/clock.h>
12#include <asm/arch/imx-regs.h>
13#include <asm/arch/iomux.h>
Eric Nelsonb47abc32013-11-13 16:36:19 -070014#include <asm/arch/mx6-pins.h>
Masahiro Yamada1221ce42016-09-21 11:28:55 +090015#include <linux/errno.h>
Fabio Estevam7dd65452012-09-24 08:09:33 +000016#include <asm/gpio.h>
Stefano Babic552a8482017-06-29 10:16:06 +020017#include <asm/mach-imx/iomux-v3.h>
18#include <asm/mach-imx/mxc_i2c.h>
19#include <asm/mach-imx/boot_mode.h>
20#include <asm/mach-imx/spi.h>
Fabio Estevam7dd65452012-09-24 08:09:33 +000021#include <mmc.h>
22#include <fsl_esdhc.h>
Fabio Estevamfe5ebe92012-09-25 08:43:57 +000023#include <miiphy.h>
24#include <netdev.h>
Fabio Estevamdce67bd2012-10-02 11:20:12 +000025#include <asm/arch/sys_proto.h>
Renato Frias19578162013-05-13 18:01:12 +000026#include <i2c.h>
Fabio Estevam510922a2014-09-22 13:55:52 -030027#include <asm/arch/mxc_hdmi.h>
Stefano Babic552a8482017-06-29 10:16:06 +020028#include <asm/mach-imx/video.h>
Fabio Estevam510922a2014-09-22 13:55:52 -030029#include <asm/arch/crm_regs.h>
Ye.Li8fe280f2014-10-30 18:53:49 +080030#include <pca953x.h>
Ye.Li593243d2014-11-06 16:29:02 +080031#include <power/pmic.h>
Peng Fan258c98f2015-01-27 10:14:04 +080032#include <power/pfuze100_pmic.h>
Ye.Li593243d2014-11-06 16:29:02 +080033#include "../common/pfuze.h"
Fabio Estevamdce67bd2012-10-02 11:20:12 +000034
Fabio Estevam7dd65452012-09-24 08:09:33 +000035DECLARE_GLOBAL_DATA_PTR;
36
Benoît Thébaudeau7e2173c2013-04-26 01:34:47 +000037#define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
38 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
39 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevam7dd65452012-09-24 08:09:33 +000040
Benoît Thébaudeau7e2173c2013-04-26 01:34:47 +000041#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
42 PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
43 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevam7dd65452012-09-24 08:09:33 +000044
Benoît Thébaudeau7e2173c2013-04-26 01:34:47 +000045#define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
46 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
Fabio Estevamfe5ebe92012-09-25 08:43:57 +000047
Renato Frias19578162013-05-13 18:01:12 +000048#define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
49 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
50 PAD_CTL_ODE | PAD_CTL_SRE_FAST)
51
Ye.Li83bb3212014-11-12 14:02:05 +080052#define GPMI_PAD_CTRL0 (PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_PUS_100K_UP)
53#define GPMI_PAD_CTRL1 (PAD_CTL_DSE_40ohm | PAD_CTL_SPEED_MED | \
54 PAD_CTL_SRE_FAST)
55#define GPMI_PAD_CTRL2 (GPMI_PAD_CTRL0 | GPMI_PAD_CTRL1)
56
Renato Frias19578162013-05-13 18:01:12 +000057#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
58
Fabio Estevamcdbdde32014-11-14 11:27:23 -020059#define WEIM_NOR_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
60 PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
61 PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
62
Ye.Li593243d2014-11-06 16:29:02 +080063#define I2C_PMIC 1
64
Fabio Estevam7dd65452012-09-24 08:09:33 +000065int dram_init(void)
66{
Vanessa Maegima369012e2016-06-08 15:17:54 -030067 gd->ram_size = imx_ddr_size();
Fabio Estevam7dd65452012-09-24 08:09:33 +000068
69 return 0;
70}
71
Fabio Estevam067a6592014-09-13 18:21:36 -030072static iomux_v3_cfg_t const uart4_pads[] = {
Vanessa Maegima823dff92017-06-29 09:33:45 -030073 IOMUX_PADS(PAD_KEY_COL0__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
74 IOMUX_PADS(PAD_KEY_ROW0__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
Fabio Estevam7dd65452012-09-24 08:09:33 +000075};
76
Fabio Estevam067a6592014-09-13 18:21:36 -030077static iomux_v3_cfg_t const enet_pads[] = {
Vanessa Maegima823dff92017-06-29 09:33:45 -030078 IOMUX_PADS(PAD_KEY_COL1__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)),
79 IOMUX_PADS(PAD_KEY_COL2__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
80 IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
81 IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
82 IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
83 IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
84 IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
85 IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
86 IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL)),
87 IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
88 IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
89 IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
90 IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
91 IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
92 IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
Fabio Estevamfe5ebe92012-09-25 08:43:57 +000093};
94
Renato Frias19578162013-05-13 18:01:12 +000095/* I2C2 PMIC, iPod, Tuner, Codec, Touch, HDMI EDID, MIPI CSI2 card */
Vanessa Maegima823dff92017-06-29 09:33:45 -030096static struct i2c_pads_info mx6q_i2c_pad_info1 = {
Renato Frias19578162013-05-13 18:01:12 +000097 .scl = {
Vanessa Maegima823dff92017-06-29 09:33:45 -030098 .i2c_mode = MX6Q_PAD_EIM_EB2__I2C2_SCL | PC,
99 .gpio_mode = MX6Q_PAD_EIM_EB2__GPIO2_IO30 | PC,
Renato Frias19578162013-05-13 18:01:12 +0000100 .gp = IMX_GPIO_NR(2, 30)
101 },
102 .sda = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300103 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
104 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
105 .gp = IMX_GPIO_NR(4, 13)
106 }
107};
108
109static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
110 .scl = {
111 .i2c_mode = MX6DL_PAD_EIM_EB2__I2C2_SCL | PC,
112 .gpio_mode = MX6DL_PAD_EIM_EB2__GPIO2_IO30 | PC,
113 .gp = IMX_GPIO_NR(2, 30)
114 },
115 .sda = {
116 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
117 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
Renato Frias19578162013-05-13 18:01:12 +0000118 .gp = IMX_GPIO_NR(4, 13)
119 }
120};
121
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200122#ifndef CONFIG_SYS_FLASH_CFI
Renato Frias19578162013-05-13 18:01:12 +0000123/*
124 * I2C3 MLB, Port Expanders (A, B, C), Video ADC, Light Sensor,
125 * Compass Sensor, Accelerometer, Res Touch
126 */
Vanessa Maegima823dff92017-06-29 09:33:45 -0300127static struct i2c_pads_info mx6q_i2c_pad_info2 = {
Renato Frias19578162013-05-13 18:01:12 +0000128 .scl = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300129 .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
130 .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
Renato Frias19578162013-05-13 18:01:12 +0000131 .gp = IMX_GPIO_NR(1, 3)
132 },
133 .sda = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300134 .i2c_mode = MX6Q_PAD_EIM_D18__I2C3_SDA | PC,
135 .gpio_mode = MX6Q_PAD_EIM_D18__GPIO3_IO18 | PC,
136 .gp = IMX_GPIO_NR(3, 18)
137 }
138};
139
140static struct i2c_pads_info mx6dl_i2c_pad_info2 = {
141 .scl = {
142 .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
143 .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
144 .gp = IMX_GPIO_NR(1, 3)
145 },
146 .sda = {
147 .i2c_mode = MX6DL_PAD_EIM_D18__I2C3_SDA | PC,
148 .gpio_mode = MX6DL_PAD_EIM_D18__GPIO3_IO18 | PC,
Renato Frias19578162013-05-13 18:01:12 +0000149 .gp = IMX_GPIO_NR(3, 18)
150 }
151};
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200152#endif
Renato Frias19578162013-05-13 18:01:12 +0000153
Fabio Estevam067a6592014-09-13 18:21:36 -0300154static iomux_v3_cfg_t const i2c3_pads[] = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300155 IOMUX_PADS(PAD_EIM_A24__GPIO5_IO04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Renato Frias19578162013-05-13 18:01:12 +0000156};
157
Fabio Estevam067a6592014-09-13 18:21:36 -0300158static iomux_v3_cfg_t const port_exp[] = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300159 IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Renato Friasa1f67802013-05-13 18:01:13 +0000160};
161
Ye.Li8fe280f2014-10-30 18:53:49 +0800162/*Define for building port exp gpio, pin starts from 0*/
163#define PORTEXP_IO_NR(chip, pin) \
164 ((chip << 5) + pin)
165
166/*Get the chip addr from a ioexp gpio*/
167#define PORTEXP_IO_TO_CHIP(gpio_nr) \
168 (gpio_nr >> 5)
169
170/*Get the pin number from a ioexp gpio*/
171#define PORTEXP_IO_TO_PIN(gpio_nr) \
172 (gpio_nr & 0x1f)
173
174static int port_exp_direction_output(unsigned gpio, int value)
175{
176 int ret;
177
178 i2c_set_bus_num(2);
179 ret = i2c_probe(PORTEXP_IO_TO_CHIP(gpio));
180 if (ret)
181 return ret;
182
183 ret = pca953x_set_dir(PORTEXP_IO_TO_CHIP(gpio),
184 (1 << PORTEXP_IO_TO_PIN(gpio)),
185 (PCA953X_DIR_OUT << PORTEXP_IO_TO_PIN(gpio)));
186
187 if (ret)
188 return ret;
189
190 ret = pca953x_set_val(PORTEXP_IO_TO_CHIP(gpio),
191 (1 << PORTEXP_IO_TO_PIN(gpio)),
192 (value << PORTEXP_IO_TO_PIN(gpio)));
193
194 if (ret)
195 return ret;
196
197 return 0;
198}
199
Fabio Estevamca62e5d2017-07-10 15:59:11 -0300200#ifdef CONFIG_MTD_NOR_FLASH
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200201static iomux_v3_cfg_t const eimnor_pads[] = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300202 IOMUX_PADS(PAD_EIM_D16__EIM_DATA16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
203 IOMUX_PADS(PAD_EIM_D17__EIM_DATA17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
204 IOMUX_PADS(PAD_EIM_D18__EIM_DATA18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
205 IOMUX_PADS(PAD_EIM_D19__EIM_DATA19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
206 IOMUX_PADS(PAD_EIM_D20__EIM_DATA20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
207 IOMUX_PADS(PAD_EIM_D21__EIM_DATA21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
208 IOMUX_PADS(PAD_EIM_D22__EIM_DATA22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
209 IOMUX_PADS(PAD_EIM_D23__EIM_DATA23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
210 IOMUX_PADS(PAD_EIM_D24__EIM_DATA24 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
211 IOMUX_PADS(PAD_EIM_D25__EIM_DATA25 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
212 IOMUX_PADS(PAD_EIM_D26__EIM_DATA26 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
213 IOMUX_PADS(PAD_EIM_D27__EIM_DATA27 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
214 IOMUX_PADS(PAD_EIM_D28__EIM_DATA28 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
215 IOMUX_PADS(PAD_EIM_D29__EIM_DATA29 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
216 IOMUX_PADS(PAD_EIM_D30__EIM_DATA30 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
217 IOMUX_PADS(PAD_EIM_D31__EIM_DATA31 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
218 IOMUX_PADS(PAD_EIM_DA0__EIM_AD00 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
219 IOMUX_PADS(PAD_EIM_DA1__EIM_AD01 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
220 IOMUX_PADS(PAD_EIM_DA2__EIM_AD02 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
221 IOMUX_PADS(PAD_EIM_DA3__EIM_AD03 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
222 IOMUX_PADS(PAD_EIM_DA4__EIM_AD04 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
223 IOMUX_PADS(PAD_EIM_DA5__EIM_AD05 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
224 IOMUX_PADS(PAD_EIM_DA6__EIM_AD06 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
225 IOMUX_PADS(PAD_EIM_DA7__EIM_AD07 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
226 IOMUX_PADS(PAD_EIM_DA8__EIM_AD08 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
227 IOMUX_PADS(PAD_EIM_DA9__EIM_AD09 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
228 IOMUX_PADS(PAD_EIM_DA10__EIM_AD10 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
229 IOMUX_PADS(PAD_EIM_DA11__EIM_AD11 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
230 IOMUX_PADS(PAD_EIM_DA12__EIM_AD12 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
231 IOMUX_PADS(PAD_EIM_DA13__EIM_AD13 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
232 IOMUX_PADS(PAD_EIM_DA14__EIM_AD14 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
233 IOMUX_PADS(PAD_EIM_DA15__EIM_AD15 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
234 IOMUX_PADS(PAD_EIM_A16__EIM_ADDR16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
235 IOMUX_PADS(PAD_EIM_A17__EIM_ADDR17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
236 IOMUX_PADS(PAD_EIM_A18__EIM_ADDR18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
237 IOMUX_PADS(PAD_EIM_A19__EIM_ADDR19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
238 IOMUX_PADS(PAD_EIM_A20__EIM_ADDR20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
239 IOMUX_PADS(PAD_EIM_A21__EIM_ADDR21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
240 IOMUX_PADS(PAD_EIM_A22__EIM_ADDR22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
241 IOMUX_PADS(PAD_EIM_A23__EIM_ADDR23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
242 IOMUX_PADS(PAD_EIM_OE__EIM_OE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
243 IOMUX_PADS(PAD_EIM_RW__EIM_RW | MUX_PAD_CTRL(NO_PAD_CTRL)),
244 IOMUX_PADS(PAD_EIM_CS0__EIM_CS0_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200245};
246
247static void eimnor_cs_setup(void)
248{
249 struct weim *weim_regs = (struct weim *)WEIM_BASE_ADDR;
250
251 writel(0x00020181, &weim_regs->cs0gcr1);
252 writel(0x00000001, &weim_regs->cs0gcr2);
253 writel(0x0a020000, &weim_regs->cs0rcr1);
254 writel(0x0000c000, &weim_regs->cs0rcr2);
255 writel(0x0804a240, &weim_regs->cs0wcr1);
256 writel(0x00000120, &weim_regs->wcr);
257
258 set_chipselect_size(CS0_128);
259}
260
Fabio Estevamcfb37772016-12-26 23:04:41 -0200261static void eim_clk_setup(void)
262{
263 struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
264 int cscmr1, ccgr6;
265
266
267 /* Turn off EIM clock */
268 ccgr6 = readl(&imx_ccm->CCGR6);
269 ccgr6 &= ~(0x3 << 10);
270 writel(ccgr6, &imx_ccm->CCGR6);
271
272 /*
273 * Configure clk_eim_slow_sel = 00 --> derive clock from AXI clk root
274 * and aclk_eim_slow_podf = 01 --> divide by 2
275 * so that we can have EIM at the maximum clock of 132MHz
276 */
277 cscmr1 = readl(&imx_ccm->cscmr1);
278 cscmr1 &= ~(MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK |
279 MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK);
280 cscmr1 |= (1 << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET);
281 writel(cscmr1, &imx_ccm->cscmr1);
282
283 /* Turn on EIM clock */
284 ccgr6 |= (0x3 << 10);
285 writel(ccgr6, &imx_ccm->CCGR6);
286}
287
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200288static void setup_iomux_eimnor(void)
289{
Vanessa Maegima823dff92017-06-29 09:33:45 -0300290 SETUP_IOMUX_PADS(eimnor_pads);
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200291
292 gpio_direction_output(IMX_GPIO_NR(5, 4), 0);
293
294 eimnor_cs_setup();
295}
Fabio Estevamca62e5d2017-07-10 15:59:11 -0300296#endif
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200297
Fabio Estevamfe5ebe92012-09-25 08:43:57 +0000298static void setup_iomux_enet(void)
299{
Vanessa Maegima823dff92017-06-29 09:33:45 -0300300 SETUP_IOMUX_PADS(enet_pads);
Fabio Estevamfe5ebe92012-09-25 08:43:57 +0000301}
302
Fabio Estevam067a6592014-09-13 18:21:36 -0300303static iomux_v3_cfg_t const usdhc3_pads[] = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300304 IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
305 IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
306 IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
307 IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
308 IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
309 IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
310 IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
311 IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
312 IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
313 IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
314 IOMUX_PADS(PAD_GPIO_18__SD3_VSELECT | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
315 IOMUX_PADS(PAD_NANDF_CS2__GPIO6_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevam7dd65452012-09-24 08:09:33 +0000316};
317
318static void setup_iomux_uart(void)
319{
Vanessa Maegima823dff92017-06-29 09:33:45 -0300320 SETUP_IOMUX_PADS(uart4_pads);
Fabio Estevam7dd65452012-09-24 08:09:33 +0000321}
322
323#ifdef CONFIG_FSL_ESDHC
Fabio Estevam067a6592014-09-13 18:21:36 -0300324static struct fsl_esdhc_cfg usdhc_cfg[1] = {
Fabio Estevam7dd65452012-09-24 08:09:33 +0000325 {USDHC3_BASE_ADDR},
326};
327
328int board_mmc_getcd(struct mmc *mmc)
329{
330 gpio_direction_input(IMX_GPIO_NR(6, 15));
331 return !gpio_get_value(IMX_GPIO_NR(6, 15));
332}
333
334int board_mmc_init(bd_t *bis)
335{
Vanessa Maegima823dff92017-06-29 09:33:45 -0300336 SETUP_IOMUX_PADS(usdhc3_pads);
Fabio Estevam7dd65452012-09-24 08:09:33 +0000337
Benoît Thébaudeaua2ac1b32012-10-01 08:36:25 +0000338 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
Fabio Estevam7dd65452012-09-24 08:09:33 +0000339 return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
340}
341#endif
342
Ye.Li83bb3212014-11-12 14:02:05 +0800343#ifdef CONFIG_NAND_MXS
344static iomux_v3_cfg_t gpmi_pads[] = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300345 IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
346 IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
347 IOMUX_PADS(PAD_NANDF_WP_B__NAND_WP_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
348 IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(GPMI_PAD_CTRL0)),
349 IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
350 IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
351 IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
352 IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
353 IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
354 IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
355 IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
356 IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
357 IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
358 IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
359 IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
360 IOMUX_PADS(PAD_SD4_DAT0__NAND_DQS | MUX_PAD_CTRL(GPMI_PAD_CTRL1)),
Ye.Li83bb3212014-11-12 14:02:05 +0800361};
362
363static void setup_gpmi_nand(void)
364{
365 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
366
367 /* config gpmi nand iomux */
Vanessa Maegima823dff92017-06-29 09:33:45 -0300368 SETUP_IOMUX_PADS(gpmi_pads);
Ye.Li83bb3212014-11-12 14:02:05 +0800369
Ye.Li5f22d882015-01-12 17:37:13 +0800370 setup_gpmi_io_clk((MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
Ye.Li83bb3212014-11-12 14:02:05 +0800371 MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
Ye.Li5f22d882015-01-12 17:37:13 +0800372 MXC_CCM_CS2CDR_ENFC_CLK_SEL(3)));
Ye.Li83bb3212014-11-12 14:02:05 +0800373
374 /* enable apbh clock gating */
375 setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
376}
377#endif
378
Peng Fan361b7152015-07-11 11:38:47 +0800379static void setup_fec(void)
380{
381 if (is_mx6dqp()) {
382 /*
383 * select ENET MAC0 TX clock from PLL
384 */
385 imx_iomux_set_gpr_register(5, 9, 1, 1);
Peng Fan6d97dc12015-08-12 17:46:50 +0800386 enable_fec_anatop_clock(0, ENET_125MHZ);
Peng Fan361b7152015-07-11 11:38:47 +0800387 }
388
389 setup_iomux_enet();
390}
391
Fabio Estevamfe5ebe92012-09-25 08:43:57 +0000392int board_eth_init(bd_t *bis)
393{
Peng Fan361b7152015-07-11 11:38:47 +0800394 setup_fec();
Fabio Estevamfe5ebe92012-09-25 08:43:57 +0000395
Fabio Estevam579be2f2014-01-04 17:36:31 -0200396 return cpu_eth_init(bis);
Fabio Estevamfe5ebe92012-09-25 08:43:57 +0000397}
398
Fabio Estevamdce67bd2012-10-02 11:20:12 +0000399#define BOARD_REV_B 0x200
400#define BOARD_REV_A 0x100
401
402static int mx6sabre_rev(void)
403{
404 /*
405 * Get Board ID information from OCOTP_GP1[15:8]
406 * i.MX6Q ARD RevA: 0x01
407 * i.MX6Q ARD RevB: 0x02
408 */
409 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
Benoît Thébaudeau8f3ff112013-04-23 10:17:38 +0000410 struct fuse_bank *bank = &ocotp->bank[4];
411 struct fuse_bank4_regs *fuse =
412 (struct fuse_bank4_regs *)bank->fuse_regs;
413 int reg = readl(&fuse->gp1);
Fabio Estevamdce67bd2012-10-02 11:20:12 +0000414 int ret;
415
416 switch (reg >> 8 & 0x0F) {
417 case 0x02:
418 ret = BOARD_REV_B;
419 break;
420 case 0x01:
421 default:
422 ret = BOARD_REV_A;
423 break;
424 }
425
426 return ret;
427}
428
Fabio Estevam7dd65452012-09-24 08:09:33 +0000429u32 get_board_rev(void)
430{
Fabio Estevamdce67bd2012-10-02 11:20:12 +0000431 int rev = mx6sabre_rev();
432
433 return (get_cpu_rev() & ~(0xF << 8)) | rev;
Fabio Estevam7dd65452012-09-24 08:09:33 +0000434}
435
Fabio Estevam510922a2014-09-22 13:55:52 -0300436#if defined(CONFIG_VIDEO_IPUV3)
Peng Fanccf43262015-12-15 16:27:18 +0800437static void disable_lvds(struct display_info_t const *dev)
438{
439 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
440
441 clrbits_le32(&iomux->gpr[2],
442 IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
443 IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
444}
445
Fabio Estevam510922a2014-09-22 13:55:52 -0300446static void do_enable_hdmi(struct display_info_t const *dev)
447{
Peng Fanccf43262015-12-15 16:27:18 +0800448 disable_lvds(dev);
Fabio Estevam510922a2014-09-22 13:55:52 -0300449 imx_enable_hdmi_phy();
450}
451
452struct display_info_t const displays[] = {{
453 .bus = -1,
454 .addr = 0,
Peng Fanccf43262015-12-15 16:27:18 +0800455 .pixfmt = IPU_PIX_FMT_RGB666,
456 .detect = NULL,
457 .enable = NULL,
458 .mode = {
459 .name = "Hannstar-XGA",
460 .refresh = 60,
461 .xres = 1024,
462 .yres = 768,
463 .pixclock = 15385,
464 .left_margin = 220,
465 .right_margin = 40,
466 .upper_margin = 21,
467 .lower_margin = 7,
468 .hsync_len = 60,
469 .vsync_len = 10,
470 .sync = FB_SYNC_EXT,
471 .vmode = FB_VMODE_NONINTERLACED
472} }, {
473 .bus = -1,
474 .addr = 0,
Fabio Estevam510922a2014-09-22 13:55:52 -0300475 .pixfmt = IPU_PIX_FMT_RGB24,
476 .detect = detect_hdmi,
477 .enable = do_enable_hdmi,
478 .mode = {
479 .name = "HDMI",
480 .refresh = 60,
481 .xres = 1024,
482 .yres = 768,
483 .pixclock = 15385,
484 .left_margin = 220,
485 .right_margin = 40,
486 .upper_margin = 21,
487 .lower_margin = 7,
488 .hsync_len = 60,
489 .vsync_len = 10,
490 .sync = FB_SYNC_EXT,
491 .vmode = FB_VMODE_NONINTERLACED,
492} } };
493size_t display_count = ARRAY_SIZE(displays);
494
Peng Fanccf43262015-12-15 16:27:18 +0800495iomux_v3_cfg_t const backlight_pads[] = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300496 IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
Peng Fanccf43262015-12-15 16:27:18 +0800497};
498
499static void setup_iomux_backlight(void)
500{
501 gpio_direction_output(IMX_GPIO_NR(2, 9), 1);
Vanessa Maegima823dff92017-06-29 09:33:45 -0300502 SETUP_IOMUX_PADS(backlight_pads);
Peng Fanccf43262015-12-15 16:27:18 +0800503}
504
Fabio Estevam510922a2014-09-22 13:55:52 -0300505static void setup_display(void)
506{
507 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
Peng Fanccf43262015-12-15 16:27:18 +0800508 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
Fabio Estevam510922a2014-09-22 13:55:52 -0300509 int reg;
510
Peng Fanccf43262015-12-15 16:27:18 +0800511 setup_iomux_backlight();
Fabio Estevam510922a2014-09-22 13:55:52 -0300512 enable_ipu_clock();
513 imx_setup_hdmi();
514
Peng Fanccf43262015-12-15 16:27:18 +0800515 /* Turn on LDB_DI0 and LDB_DI1 clocks */
516 reg = readl(&mxc_ccm->CCGR3);
517 reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
518 writel(reg, &mxc_ccm->CCGR3);
519
520 /* Set LDB_DI0 and LDB_DI1 clk select to 3b'011 */
521 reg = readl(&mxc_ccm->cs2cdr);
522 reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK |
523 MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
524 reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET) |
525 (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
526 writel(reg, &mxc_ccm->cs2cdr);
527
528 reg = readl(&mxc_ccm->cscmr2);
529 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
530 writel(reg, &mxc_ccm->cscmr2);
531
Fabio Estevam510922a2014-09-22 13:55:52 -0300532 reg = readl(&mxc_ccm->chsccdr);
533 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
534 << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
Peng Fanccf43262015-12-15 16:27:18 +0800535 reg |= (CHSCCDR_CLK_SEL_LDB_DI0 <<
536 MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
Fabio Estevam510922a2014-09-22 13:55:52 -0300537 writel(reg, &mxc_ccm->chsccdr);
Peng Fanccf43262015-12-15 16:27:18 +0800538
539 reg = IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW |
540 IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW |
541 IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG |
542 IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT |
543 IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG |
544 IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT |
545 IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0 |
546 IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED;
547 writel(reg, &iomux->gpr[2]);
548
549 reg = readl(&iomux->gpr[3]);
550 reg &= ~(IOMUXC_GPR3_LVDS0_MUX_CTL_MASK |
551 IOMUXC_GPR3_HDMI_MUX_CTL_MASK);
552 reg |= (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
553 IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET) |
554 (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
555 IOMUXC_GPR3_HDMI_MUX_CTL_OFFSET);
556 writel(reg, &iomux->gpr[3]);
Fabio Estevam510922a2014-09-22 13:55:52 -0300557}
558#endif /* CONFIG_VIDEO_IPUV3 */
559
560/*
561 * Do not overwrite the console
562 * Use always serial for U-Boot console
563 */
564int overwrite_console(void)
565{
566 return 1;
567}
568
Fabio Estevam7dd65452012-09-24 08:09:33 +0000569int board_early_init_f(void)
570{
571 setup_iomux_uart();
Ye.Li83bb3212014-11-12 14:02:05 +0800572
573#ifdef CONFIG_NAND_MXS
574 setup_gpmi_nand();
575#endif
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200576
Fabio Estevamca62e5d2017-07-10 15:59:11 -0300577#ifdef CONFIG_MTD_NOR_FLASH
578 eim_clk_setup();
579#endif
Fabio Estevam7dd65452012-09-24 08:09:33 +0000580 return 0;
581}
582
583int board_init(void)
584{
585 /* address of boot parameters */
586 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
587
Renato Frias19578162013-05-13 18:01:12 +0000588 /* I2C 2 and 3 setup - I2C 3 hw mux with EIM */
Vanessa Maegima823dff92017-06-29 09:33:45 -0300589 if (is_mx6dq() || is_mx6dqp())
590 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
591 else
592 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
Renato Frias19578162013-05-13 18:01:12 +0000593 /* I2C 3 Steer */
594 gpio_direction_output(IMX_GPIO_NR(5, 4), 1);
Vanessa Maegima823dff92017-06-29 09:33:45 -0300595 SETUP_IOMUX_PADS(i2c3_pads);
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200596#ifndef CONFIG_SYS_FLASH_CFI
Vanessa Maegima823dff92017-06-29 09:33:45 -0300597 if (is_mx6dq() || is_mx6dqp())
598 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info2);
599 else
600 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info2);
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200601#endif
Renato Friasa1f67802013-05-13 18:01:13 +0000602 gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
Vanessa Maegima823dff92017-06-29 09:33:45 -0300603 SETUP_IOMUX_PADS(port_exp);
Renato Friasa1f67802013-05-13 18:01:13 +0000604
Peng Fanccf43262015-12-15 16:27:18 +0800605#ifdef CONFIG_VIDEO_IPUV3
606 setup_display();
607#endif
Fabio Estevamca62e5d2017-07-10 15:59:11 -0300608
609#ifdef CONFIG_MTD_NOR_FLASH
Fabio Estevamcdbdde32014-11-14 11:27:23 -0200610 setup_iomux_eimnor();
Fabio Estevamca62e5d2017-07-10 15:59:11 -0300611#endif
Fabio Estevam7dd65452012-09-24 08:09:33 +0000612 return 0;
613}
614
Nikita Kiryanov155fa9a2014-08-20 15:08:50 +0300615#ifdef CONFIG_MXC_SPI
616int board_spi_cs_gpio(unsigned bus, unsigned cs)
617{
618 return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
619}
620#endif
621
Ye.Li593243d2014-11-06 16:29:02 +0800622int power_init_board(void)
623{
624 struct pmic *p;
Peng Fan361b7152015-07-11 11:38:47 +0800625 unsigned int value;
Ye.Li593243d2014-11-06 16:29:02 +0800626
627 p = pfuze_common_init(I2C_PMIC);
628 if (!p)
629 return -ENODEV;
630
Peng Fan361b7152015-07-11 11:38:47 +0800631 if (is_mx6dqp()) {
632 /* set SW2 staby volatage 0.975V*/
633 pmic_reg_read(p, PFUZE100_SW2STBY, &value);
634 value &= ~0x3f;
635 value |= 0x17;
636 pmic_reg_write(p, PFUZE100_SW2STBY, value);
637 }
Peng Fan258c98f2015-01-27 10:14:04 +0800638
Peng Fan361b7152015-07-11 11:38:47 +0800639 return pfuze_mode_init(p, APS_PFM);
Ye.Li593243d2014-11-06 16:29:02 +0800640}
641
Otavio Salvador85449db2013-03-16 08:05:07 +0000642#ifdef CONFIG_CMD_BMODE
643static const struct boot_mode board_boot_modes[] = {
644 /* 4 bit bus width */
645 {"mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
646 {NULL, 0},
647};
648#endif
649
650int board_late_init(void)
651{
652#ifdef CONFIG_CMD_BMODE
653 add_board_boot_modes(board_boot_modes);
654#endif
655
Peng Fane6fc8992015-07-11 11:38:46 +0800656#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
657 setenv("board_name", "SABREAUTO");
658
Peng Fan361b7152015-07-11 11:38:47 +0800659 if (is_mx6dqp())
660 setenv("board_rev", "MX6QP");
Peng Fan83e13942016-05-23 18:36:06 +0800661 else if (is_mx6dq())
Peng Fane6fc8992015-07-11 11:38:46 +0800662 setenv("board_rev", "MX6Q");
Peng Fan83e13942016-05-23 18:36:06 +0800663 else if (is_mx6sdl())
Peng Fane6fc8992015-07-11 11:38:46 +0800664 setenv("board_rev", "MX6DL");
665#endif
666
Otavio Salvador85449db2013-03-16 08:05:07 +0000667 return 0;
668}
669
Fabio Estevam7dd65452012-09-24 08:09:33 +0000670int checkboard(void)
671{
Fabio Estevamdce67bd2012-10-02 11:20:12 +0000672 int rev = mx6sabre_rev();
673 char *revname;
674
675 switch (rev) {
676 case BOARD_REV_B:
677 revname = "B";
678 break;
679 case BOARD_REV_A:
680 default:
681 revname = "A";
682 break;
683 }
684
685 printf("Board: MX6Q-Sabreauto rev%s\n", revname);
Fabio Estevam7dd65452012-09-24 08:09:33 +0000686
687 return 0;
688}
Ye.Li8fe280f2014-10-30 18:53:49 +0800689
690#ifdef CONFIG_USB_EHCI_MX6
691#define USB_HOST1_PWR PORTEXP_IO_NR(0x32, 7)
692#define USB_OTG_PWR PORTEXP_IO_NR(0x34, 1)
693
694iomux_v3_cfg_t const usb_otg_pads[] = {
Vanessa Maegima823dff92017-06-29 09:33:45 -0300695 IOMUX_PADS(PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL)),
Ye.Li8fe280f2014-10-30 18:53:49 +0800696};
697
698int board_ehci_hcd_init(int port)
699{
700 switch (port) {
701 case 0:
Vanessa Maegima823dff92017-06-29 09:33:45 -0300702 SETUP_IOMUX_PADS(usb_otg_pads);
Ye.Li8fe280f2014-10-30 18:53:49 +0800703
704 /*
705 * Set daisy chain for otg_pin_id on 6q.
706 * For 6dl, this bit is reserved.
707 */
708 imx_iomux_set_gpr_register(1, 13, 1, 0);
709 break;
710 case 1:
711 break;
712 default:
713 printf("MXC USB port %d not yet supported\n", port);
714 return -EINVAL;
715 }
716 return 0;
717}
718
719int board_ehci_power(int port, int on)
720{
721 switch (port) {
722 case 0:
723 if (on)
724 port_exp_direction_output(USB_OTG_PWR, 1);
725 else
726 port_exp_direction_output(USB_OTG_PWR, 0);
727 break;
728 case 1:
729 if (on)
730 port_exp_direction_output(USB_HOST1_PWR, 1);
731 else
732 port_exp_direction_output(USB_HOST1_PWR, 0);
733 break;
734 default:
735 printf("MXC USB port %d not yet supported\n", port);
736 return -EINVAL;
737 }
738
739 return 0;
740}
741#endif
Vanessa Maegima823dff92017-06-29 09:33:45 -0300742
743#ifdef CONFIG_SPL_BUILD
744#include <asm/arch/mx6-ddr.h>
745#include <spl.h>
746#include <libfdt.h>
747
Diego Dorta07f6ddb2017-07-07 15:38:34 -0300748#ifdef CONFIG_SPL_OS_BOOT
749int spl_start_uboot(void)
750{
751 return 0;
752}
753#endif
754
Vanessa Maegima823dff92017-06-29 09:33:45 -0300755static void ccgr_init(void)
756{
757 struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
758
759 writel(0x00C03F3F, &ccm->CCGR0);
760 writel(0x0030FC03, &ccm->CCGR1);
761 writel(0x0FFFC000, &ccm->CCGR2);
762 writel(0x3FF00000, &ccm->CCGR3);
763 writel(0x00FFF300, &ccm->CCGR4);
764 writel(0x0F0000C3, &ccm->CCGR5);
765 writel(0x000003FF, &ccm->CCGR6);
766}
767
768static void gpr_init(void)
769{
770 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
771
772 /* enable AXI cache for VDOA/VPU/IPU */
773 writel(0xF00000CF, &iomux->gpr[4]);
774 if (is_mx6dqp()) {
775 /* set IPU AXI-id1 Qos=0x1 AXI-id0/2/3 Qos=0x7 */
776 writel(0x007F007F, &iomux->gpr[6]);
777 writel(0x007F007F, &iomux->gpr[7]);
778 } else {
779 /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
780 writel(0x007F007F, &iomux->gpr[6]);
781 writel(0x007F007F, &iomux->gpr[7]);
782 }
783}
784
785static int mx6q_dcd_table[] = {
786 0x020e0798, 0x000C0000,
787 0x020e0758, 0x00000000,
788 0x020e0588, 0x00000030,
789 0x020e0594, 0x00000030,
790 0x020e056c, 0x00000030,
791 0x020e0578, 0x00000030,
792 0x020e074c, 0x00000030,
793 0x020e057c, 0x00000030,
794 0x020e058c, 0x00000000,
795 0x020e059c, 0x00000030,
796 0x020e05a0, 0x00000030,
797 0x020e078c, 0x00000030,
798 0x020e0750, 0x00020000,
799 0x020e05a8, 0x00000028,
800 0x020e05b0, 0x00000028,
801 0x020e0524, 0x00000028,
802 0x020e051c, 0x00000028,
803 0x020e0518, 0x00000028,
804 0x020e050c, 0x00000028,
805 0x020e05b8, 0x00000028,
806 0x020e05c0, 0x00000028,
807 0x020e0774, 0x00020000,
808 0x020e0784, 0x00000028,
809 0x020e0788, 0x00000028,
810 0x020e0794, 0x00000028,
811 0x020e079c, 0x00000028,
812 0x020e07a0, 0x00000028,
813 0x020e07a4, 0x00000028,
814 0x020e07a8, 0x00000028,
815 0x020e0748, 0x00000028,
816 0x020e05ac, 0x00000028,
817 0x020e05b4, 0x00000028,
818 0x020e0528, 0x00000028,
819 0x020e0520, 0x00000028,
820 0x020e0514, 0x00000028,
821 0x020e0510, 0x00000028,
822 0x020e05bc, 0x00000028,
823 0x020e05c4, 0x00000028,
824 0x021b0800, 0xa1390003,
825 0x021b080c, 0x001F001F,
826 0x021b0810, 0x001F001F,
827 0x021b480c, 0x001F001F,
828 0x021b4810, 0x001F001F,
829 0x021b083c, 0x43260335,
830 0x021b0840, 0x031A030B,
831 0x021b483c, 0x4323033B,
832 0x021b4840, 0x0323026F,
833 0x021b0848, 0x483D4545,
834 0x021b4848, 0x44433E48,
835 0x021b0850, 0x41444840,
836 0x021b4850, 0x4835483E,
837 0x021b081c, 0x33333333,
838 0x021b0820, 0x33333333,
839 0x021b0824, 0x33333333,
840 0x021b0828, 0x33333333,
841 0x021b481c, 0x33333333,
842 0x021b4820, 0x33333333,
843 0x021b4824, 0x33333333,
844 0x021b4828, 0x33333333,
845 0x021b08b8, 0x00000800,
846 0x021b48b8, 0x00000800,
847 0x021b0004, 0x00020036,
848 0x021b0008, 0x09444040,
849 0x021b000c, 0x8A8F7955,
850 0x021b0010, 0xFF328F64,
851 0x021b0014, 0x01FF00DB,
852 0x021b0018, 0x00001740,
853 0x021b001c, 0x00008000,
854 0x021b002c, 0x000026d2,
855 0x021b0030, 0x008F1023,
856 0x021b0040, 0x00000047,
857 0x021b0000, 0x841A0000,
858 0x021b001c, 0x04088032,
859 0x021b001c, 0x00008033,
860 0x021b001c, 0x00048031,
861 0x021b001c, 0x09408030,
862 0x021b001c, 0x04008040,
863 0x021b0020, 0x00005800,
864 0x021b0818, 0x00011117,
865 0x021b4818, 0x00011117,
866 0x021b0004, 0x00025576,
867 0x021b0404, 0x00011006,
868 0x021b001c, 0x00000000,
869 0x020c4068, 0x00C03F3F,
870 0x020c406c, 0x0030FC03,
871 0x020c4070, 0x0FFFC000,
872 0x020c4074, 0x3FF00000,
873 0x020c4078, 0xFFFFF300,
874 0x020c407c, 0x0F0000F3,
875 0x020c4080, 0x00000FFF,
876 0x020e0010, 0xF00000CF,
877 0x020e0018, 0x007F007F,
878 0x020e001c, 0x007F007F,
879};
880
881static int mx6qp_dcd_table[] = {
882 0x020e0798, 0x000C0000,
883 0x020e0758, 0x00000000,
884 0x020e0588, 0x00000030,
885 0x020e0594, 0x00000030,
886 0x020e056c, 0x00000030,
887 0x020e0578, 0x00000030,
888 0x020e074c, 0x00000030,
889 0x020e057c, 0x00000030,
890 0x020e058c, 0x00000000,
891 0x020e059c, 0x00000030,
892 0x020e05a0, 0x00000030,
893 0x020e078c, 0x00000030,
894 0x020e0750, 0x00020000,
895 0x020e05a8, 0x00000030,
896 0x020e05b0, 0x00000030,
897 0x020e0524, 0x00000030,
898 0x020e051c, 0x00000030,
899 0x020e0518, 0x00000030,
900 0x020e050c, 0x00000030,
901 0x020e05b8, 0x00000030,
902 0x020e05c0, 0x00000030,
903 0x020e0774, 0x00020000,
904 0x020e0784, 0x00000030,
905 0x020e0788, 0x00000030,
906 0x020e0794, 0x00000030,
907 0x020e079c, 0x00000030,
908 0x020e07a0, 0x00000030,
909 0x020e07a4, 0x00000030,
910 0x020e07a8, 0x00000030,
911 0x020e0748, 0x00000030,
912 0x020e05ac, 0x00000030,
913 0x020e05b4, 0x00000030,
914 0x020e0528, 0x00000030,
915 0x020e0520, 0x00000030,
916 0x020e0514, 0x00000030,
917 0x020e0510, 0x00000030,
918 0x020e05bc, 0x00000030,
919 0x020e05c4, 0x00000030,
920 0x021b0800, 0xa1390003,
921 0x021b080c, 0x001b001e,
922 0x021b0810, 0x002e0029,
923 0x021b480c, 0x001b002a,
924 0x021b4810, 0x0019002c,
925 0x021b083c, 0x43240334,
926 0x021b0840, 0x0324031a,
927 0x021b483c, 0x43340344,
928 0x021b4840, 0x03280276,
929 0x021b0848, 0x44383A3E,
930 0x021b4848, 0x3C3C3846,
931 0x021b0850, 0x2e303230,
932 0x021b4850, 0x38283E34,
933 0x021b081c, 0x33333333,
934 0x021b0820, 0x33333333,
935 0x021b0824, 0x33333333,
936 0x021b0828, 0x33333333,
937 0x021b481c, 0x33333333,
938 0x021b4820, 0x33333333,
939 0x021b4824, 0x33333333,
940 0x021b4828, 0x33333333,
941 0x021b08c0, 0x24912492,
942 0x021b48c0, 0x24912492,
943 0x021b08b8, 0x00000800,
944 0x021b48b8, 0x00000800,
945 0x021b0004, 0x00020036,
946 0x021b0008, 0x09444040,
947 0x021b000c, 0x898E7955,
948 0x021b0010, 0xFF328F64,
949 0x021b0014, 0x01FF00DB,
950 0x021b0018, 0x00001740,
951 0x021b001c, 0x00008000,
952 0x021b002c, 0x000026d2,
953 0x021b0030, 0x008E1023,
954 0x021b0040, 0x00000047,
955 0x021b0400, 0x14420000,
956 0x021b0000, 0x841A0000,
957 0x00bb0008, 0x00000004,
958 0x00bb000c, 0x2891E41A,
959 0x00bb0038, 0x00000564,
960 0x00bb0014, 0x00000040,
961 0x00bb0028, 0x00000020,
962 0x00bb002c, 0x00000020,
963 0x021b001c, 0x04088032,
964 0x021b001c, 0x00008033,
965 0x021b001c, 0x00048031,
966 0x021b001c, 0x09408030,
967 0x021b001c, 0x04008040,
968 0x021b0020, 0x00005800,
969 0x021b0818, 0x00011117,
970 0x021b4818, 0x00011117,
971 0x021b0004, 0x00025576,
972 0x021b0404, 0x00011006,
973 0x021b001c, 0x00000000,
974 0x020c4068, 0x00C03F3F,
975 0x020c406c, 0x0030FC03,
976 0x020c4070, 0x0FFFC000,
977 0x020c4074, 0x3FF00000,
978 0x020c4078, 0xFFFFF300,
979 0x020c407c, 0x0F0000F3,
980 0x020c4080, 0x00000FFF,
981 0x020e0010, 0xF00000CF,
982 0x020e0018, 0x77177717,
983 0x020e001c, 0x77177717,
984};
985
986static int mx6dl_dcd_table[] = {
987 0x020e0774, 0x000C0000,
988 0x020e0754, 0x00000000,
989 0x020e04ac, 0x00000030,
990 0x020e04b0, 0x00000030,
991 0x020e0464, 0x00000030,
992 0x020e0490, 0x00000030,
993 0x020e074c, 0x00000030,
994 0x020e0494, 0x00000030,
995 0x020e04a0, 0x00000000,
996 0x020e04b4, 0x00000030,
997 0x020e04b8, 0x00000030,
998 0x020e076c, 0x00000030,
999 0x020e0750, 0x00020000,
1000 0x020e04bc, 0x00000028,
1001 0x020e04c0, 0x00000028,
1002 0x020e04c4, 0x00000028,
1003 0x020e04c8, 0x00000028,
1004 0x020e04cc, 0x00000028,
1005 0x020e04d0, 0x00000028,
1006 0x020e04d4, 0x00000028,
1007 0x020e04d8, 0x00000028,
1008 0x020e0760, 0x00020000,
1009 0x020e0764, 0x00000028,
1010 0x020e0770, 0x00000028,
1011 0x020e0778, 0x00000028,
1012 0x020e077c, 0x00000028,
1013 0x020e0780, 0x00000028,
1014 0x020e0784, 0x00000028,
1015 0x020e078c, 0x00000028,
1016 0x020e0748, 0x00000028,
1017 0x020e0470, 0x00000028,
1018 0x020e0474, 0x00000028,
1019 0x020e0478, 0x00000028,
1020 0x020e047c, 0x00000028,
1021 0x020e0480, 0x00000028,
1022 0x020e0484, 0x00000028,
1023 0x020e0488, 0x00000028,
1024 0x020e048c, 0x00000028,
1025 0x021b0800, 0xa1390003,
1026 0x021b080c, 0x001F001F,
1027 0x021b0810, 0x001F001F,
1028 0x021b480c, 0x001F001F,
1029 0x021b4810, 0x001F001F,
1030 0x021b083c, 0x42190217,
1031 0x021b0840, 0x017B017B,
1032 0x021b483c, 0x4176017B,
1033 0x021b4840, 0x015F016C,
1034 0x021b0848, 0x4C4C4D4C,
1035 0x021b4848, 0x4A4D4C48,
1036 0x021b0850, 0x3F3F3F40,
1037 0x021b4850, 0x3538382E,
1038 0x021b081c, 0x33333333,
1039 0x021b0820, 0x33333333,
1040 0x021b0824, 0x33333333,
1041 0x021b0828, 0x33333333,
1042 0x021b481c, 0x33333333,
1043 0x021b4820, 0x33333333,
1044 0x021b4824, 0x33333333,
1045 0x021b4828, 0x33333333,
1046 0x021b08b8, 0x00000800,
1047 0x021b48b8, 0x00000800,
1048 0x021b0004, 0x00020025,
1049 0x021b0008, 0x00333030,
1050 0x021b000c, 0x676B5313,
1051 0x021b0010, 0xB66E8B63,
1052 0x021b0014, 0x01FF00DB,
1053 0x021b0018, 0x00001740,
1054 0x021b001c, 0x00008000,
1055 0x021b002c, 0x000026d2,
1056 0x021b0030, 0x006B1023,
1057 0x021b0040, 0x00000047,
1058 0x021b0000, 0x841A0000,
1059 0x021b001c, 0x04008032,
1060 0x021b001c, 0x00008033,
1061 0x021b001c, 0x00048031,
1062 0x021b001c, 0x05208030,
1063 0x021b001c, 0x04008040,
1064 0x021b0020, 0x00005800,
1065 0x021b0818, 0x00011117,
1066 0x021b4818, 0x00011117,
1067 0x021b0004, 0x00025565,
1068 0x021b0404, 0x00011006,
1069 0x021b001c, 0x00000000,
1070 0x020c4068, 0x00C03F3F,
1071 0x020c406c, 0x0030FC03,
1072 0x020c4070, 0x0FFFC000,
1073 0x020c4074, 0x3FF00000,
1074 0x020c4078, 0xFFFFF300,
1075 0x020c407c, 0x0F0000C3,
1076 0x020c4080, 0x00000FFF,
1077 0x020e0010, 0xF00000CF,
1078 0x020e0018, 0x007F007F,
1079 0x020e001c, 0x007F007F,
1080};
1081
1082static void ddr_init(int *table, int size)
1083{
1084 int i;
1085
1086 for (i = 0; i < size / 2 ; i++)
1087 writel(table[2 * i + 1], table[2 * i]);
1088}
1089
1090static void spl_dram_init(void)
1091{
1092 if (is_mx6dq())
1093 ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
1094 else if (is_mx6dqp())
1095 ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
1096 else if (is_mx6sdl())
1097 ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
1098}
1099
1100void board_init_f(ulong dummy)
1101{
1102 /* DDR initialization */
1103 spl_dram_init();
1104
1105 /* setup AIPS and disable watchdog */
1106 arch_cpu_init();
1107
1108 ccgr_init();
1109 gpr_init();
1110
1111 /* iomux and setup of i2c */
1112 board_early_init_f();
1113
1114 /* setup GP timer */
1115 timer_init();
1116
1117 /* UART clocks enabled and gd valid - init serial console */
1118 preloader_console_init();
1119
1120 /* Clear the BSS. */
1121 memset(__bss_start, 0, __bss_end - __bss_start);
1122
1123 /* load/boot image from boot device */
1124 board_init_r(NULL, 0);
1125}
1126#endif