blob: b346ca4ced9c84eb2869d77f2889361b33de7658 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Fabio Estevam77e62892012-09-13 03:18:20 +00002/*
3 * Copyright (C) 2012 Freescale Semiconductor, Inc.
4 *
5 * Author: Fabio Estevam <fabio.estevam@freescale.com>
Fabio Estevam77e62892012-09-13 03:18:20 +00006 */
7
Simon Glassa7b51302019-11-14 12:57:46 -07008#include <init.h>
Fabio Estevam77e62892012-09-13 03:18:20 +00009#include <asm/arch/clock.h>
10#include <asm/arch/imx-regs.h>
11#include <asm/arch/iomux.h>
Pierre Aubertec10aed2013-06-04 09:00:15 +020012#include <asm/arch/mx6-pins.h>
Diego Dorta5433ebb2017-09-27 13:12:38 -030013#include <asm/mach-imx/spi.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060014#include <env.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090015#include <linux/errno.h>
Fabio Estevam77e62892012-09-13 03:18:20 +000016#include <asm/gpio.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020017#include <asm/mach-imx/mxc_i2c.h>
18#include <asm/mach-imx/iomux-v3.h>
19#include <asm/mach-imx/boot_mode.h>
20#include <asm/mach-imx/video.h>
Fabio Estevam77e62892012-09-13 03:18:20 +000021#include <mmc.h>
Yangbo Lu73340382019-06-21 11:42:28 +080022#include <fsl_esdhc_imx.h>
Fabio Estevam77e62892012-09-13 03:18:20 +000023#include <miiphy.h>
24#include <netdev.h>
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -050025#include <asm/arch/mxc_hdmi.h>
26#include <asm/arch/crm_regs.h>
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -050027#include <asm/io.h>
28#include <asm/arch/sys_proto.h>
Fabio Estevamba92ad62014-05-09 13:15:42 -030029#include <i2c.h>
Diego Dorta2661c9c2017-09-22 12:12:18 -030030#include <input.h>
Fabio Estevamba92ad62014-05-09 13:15:42 -030031#include <power/pmic.h>
32#include <power/pfuze100_pmic.h>
Ye.Li75e02f92014-11-06 16:29:00 +080033#include "../common/pfuze.h"
Peng Fanc9498fa2014-12-02 09:55:27 +080034#include <usb.h>
Diego Dortade4c6612017-09-27 13:12:40 -030035#include <usb/ehci-ci.h>
John Tobias07491552014-11-12 14:27:45 -080036
Fabio Estevam77e62892012-09-13 03:18:20 +000037DECLARE_GLOBAL_DATA_PTR;
38
Benoît Thébaudeau21670242013-04-26 01:34:47 +000039#define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
40 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
41 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevam77e62892012-09-13 03:18:20 +000042
Benoît Thébaudeau21670242013-04-26 01:34:47 +000043#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
44 PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
45 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevam77e62892012-09-13 03:18:20 +000046
Benoît Thébaudeau21670242013-04-26 01:34:47 +000047#define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
48 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
Fabio Estevam77e62892012-09-13 03:18:20 +000049
Fabio Estevamd82dad42013-11-08 16:20:54 -020050#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
51 PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
52
Fabio Estevamba92ad62014-05-09 13:15:42 -030053#define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
54 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
55 PAD_CTL_ODE | PAD_CTL_SRE_FAST)
56
57#define I2C_PMIC 1
58
59#define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
60
Fabio Estevam0d29cee2014-10-21 21:14:53 -020061#define DISP0_PWR_EN IMX_GPIO_NR(1, 21)
62
Diego Dorta466016e2016-10-11 11:09:27 -030063#define KEY_VOL_UP IMX_GPIO_NR(1, 4)
64
Fabio Estevam77e62892012-09-13 03:18:20 +000065int dram_init(void)
66{
John Tobias07491552014-11-12 14:27:45 -080067 gd->ram_size = imx_ddr_size();
Fabio Estevam77e62892012-09-13 03:18:20 +000068 return 0;
69}
70
Fabio Estevamf533c2e2014-11-06 12:24:25 -020071static iomux_v3_cfg_t const uart1_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -030072 IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
73 IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
Fabio Estevam77e62892012-09-13 03:18:20 +000074};
75
Fabio Estevamf533c2e2014-11-06 12:24:25 -020076static iomux_v3_cfg_t const enet_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -030077 IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)),
78 IOMUX_PADS(PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
79 IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
80 IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
81 IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
82 IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
83 IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
84 IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
85 IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL)),
86 IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
87 IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
88 IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
89 IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
90 IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
91 IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
Fabio Estevam2ebe2462012-09-18 17:24:23 +000092 /* AR8031 PHY Reset */
Fabio Estevamc88f1672017-05-12 12:45:23 -030093 IOMUX_PADS(PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevam2ebe2462012-09-18 17:24:23 +000094};
95
96static void setup_iomux_enet(void)
97{
Fabio Estevamc88f1672017-05-12 12:45:23 -030098 SETUP_IOMUX_PADS(enet_pads);
Fabio Estevam2ebe2462012-09-18 17:24:23 +000099}
100
Fabio Estevamf533c2e2014-11-06 12:24:25 -0200101static iomux_v3_cfg_t const usdhc2_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300102 IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
103 IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
104 IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
105 IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
106 IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
107 IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
108 IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
109 IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
110 IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
111 IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
112 IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
Shawn Guo7e5e8332012-12-30 14:14:59 +0000113};
114
Fabio Estevamf533c2e2014-11-06 12:24:25 -0200115static iomux_v3_cfg_t const usdhc3_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300116 IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
117 IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
118 IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
119 IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
120 IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
121 IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
122 IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
123 IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
124 IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
125 IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
126 IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
Fabio Estevam77e62892012-09-13 03:18:20 +0000127};
128
Fabio Estevamf533c2e2014-11-06 12:24:25 -0200129static iomux_v3_cfg_t const usdhc4_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300130 IOMUX_PADS(PAD_SD4_CLK__SD4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
131 IOMUX_PADS(PAD_SD4_CMD__SD4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
132 IOMUX_PADS(PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
133 IOMUX_PADS(PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
134 IOMUX_PADS(PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
135 IOMUX_PADS(PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
136 IOMUX_PADS(PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
137 IOMUX_PADS(PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
138 IOMUX_PADS(PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
139 IOMUX_PADS(PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
Shawn Guo7e5e8332012-12-30 14:14:59 +0000140};
141
Fabio Estevamf533c2e2014-11-06 12:24:25 -0200142static iomux_v3_cfg_t const ecspi1_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300143 IOMUX_PADS(PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
144 IOMUX_PADS(PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
145 IOMUX_PADS(PAD_KEY_ROW0__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)),
146 IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevamd82dad42013-11-08 16:20:54 -0200147};
148
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200149static iomux_v3_cfg_t const rgb_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300150 IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL)),
151 IOMUX_PADS(PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
152 IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
153 IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
154 IOMUX_PADS(PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
155 IOMUX_PADS(PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
156 IOMUX_PADS(PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
157 IOMUX_PADS(PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
158 IOMUX_PADS(PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
159 IOMUX_PADS(PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
160 IOMUX_PADS(PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
161 IOMUX_PADS(PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
162 IOMUX_PADS(PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
163 IOMUX_PADS(PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL)),
164 IOMUX_PADS(PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
165 IOMUX_PADS(PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL)),
166 IOMUX_PADS(PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL)),
167 IOMUX_PADS(PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL)),
168 IOMUX_PADS(PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL)),
169 IOMUX_PADS(PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL)),
170 IOMUX_PADS(PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
171 IOMUX_PADS(PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL)),
172 IOMUX_PADS(PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL)),
173 IOMUX_PADS(PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
174 IOMUX_PADS(PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
175 IOMUX_PADS(PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL)),
176 IOMUX_PADS(PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
177 IOMUX_PADS(PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL)),
178 IOMUX_PADS(PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Marco Franchi029d07f2016-06-08 15:05:31 -0300179};
180
181static iomux_v3_cfg_t const bl_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300182 IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200183};
184
Marco Franchi029d07f2016-06-08 15:05:31 -0300185static void enable_backlight(void)
186{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300187 SETUP_IOMUX_PADS(bl_pads);
Abel Vesa78d974e2019-02-01 16:40:19 +0000188 gpio_request(DISP0_PWR_EN, "Display Power Enable");
Marco Franchi029d07f2016-06-08 15:05:31 -0300189 gpio_direction_output(DISP0_PWR_EN, 1);
190}
191
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200192static void enable_rgb(struct display_info_t const *dev)
193{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300194 SETUP_IOMUX_PADS(rgb_pads);
Marco Franchi029d07f2016-06-08 15:05:31 -0300195 enable_backlight();
196}
197
198static void enable_lvds(struct display_info_t const *dev)
199{
200 enable_backlight();
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200201}
202
Fabio Estevamc88f1672017-05-12 12:45:23 -0300203static struct i2c_pads_info mx6q_i2c_pad_info1 = {
Fabio Estevamba92ad62014-05-09 13:15:42 -0300204 .scl = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300205 .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
206 .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
Fabio Estevamba92ad62014-05-09 13:15:42 -0300207 .gp = IMX_GPIO_NR(4, 12)
208 },
209 .sda = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300210 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
211 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
Fabio Estevamba92ad62014-05-09 13:15:42 -0300212 .gp = IMX_GPIO_NR(4, 13)
213 }
214};
215
Fabio Estevamc88f1672017-05-12 12:45:23 -0300216static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
217 .scl = {
218 .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
219 .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
220 .gp = IMX_GPIO_NR(4, 12)
221 },
222 .sda = {
223 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
224 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
225 .gp = IMX_GPIO_NR(4, 13)
226 }
227};
228
Fabio Estevamd82dad42013-11-08 16:20:54 -0200229static void setup_spi(void)
230{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300231 SETUP_IOMUX_PADS(ecspi1_pads);
Fabio Estevamd82dad42013-11-08 16:20:54 -0200232}
233
Marek Vasut0e99f012014-03-23 22:45:41 +0100234iomux_v3_cfg_t const pcie_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300235 IOMUX_PADS(PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* POWER */
236 IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* RESET */
Marek Vasut0e99f012014-03-23 22:45:41 +0100237};
238
239static void setup_pcie(void)
240{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300241 SETUP_IOMUX_PADS(pcie_pads);
Marek Vasut0e99f012014-03-23 22:45:41 +0100242}
243
Fabio Estevamdee3c842013-12-04 01:08:16 -0200244iomux_v3_cfg_t const di0_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300245 IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK), /* DISP0_CLK */
246 IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02), /* DISP0_HSYNC */
247 IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03), /* DISP0_VSYNC */
Fabio Estevamdee3c842013-12-04 01:08:16 -0200248};
249
Fabio Estevam77e62892012-09-13 03:18:20 +0000250static void setup_iomux_uart(void)
251{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300252 SETUP_IOMUX_PADS(uart1_pads);
Fabio Estevam77e62892012-09-13 03:18:20 +0000253}
254
Yangbo Lu73340382019-06-21 11:42:28 +0800255#ifdef CONFIG_FSL_ESDHC_IMX
Shawn Guo7e5e8332012-12-30 14:14:59 +0000256struct fsl_esdhc_cfg usdhc_cfg[3] = {
257 {USDHC2_BASE_ADDR},
Fabio Estevam77e62892012-09-13 03:18:20 +0000258 {USDHC3_BASE_ADDR},
Shawn Guo7e5e8332012-12-30 14:14:59 +0000259 {USDHC4_BASE_ADDR},
Fabio Estevam77e62892012-09-13 03:18:20 +0000260};
261
Shawn Guo7e5e8332012-12-30 14:14:59 +0000262#define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2)
263#define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0)
264
Peng Fan03a43df2016-01-28 16:51:27 +0800265int board_mmc_get_env_dev(int devno)
266{
267 return devno - 1;
268}
269
Fabio Estevam77e62892012-09-13 03:18:20 +0000270int board_mmc_getcd(struct mmc *mmc)
271{
Shawn Guo7e5e8332012-12-30 14:14:59 +0000272 struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000273 int ret = 0;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000274
275 switch (cfg->esdhc_base) {
276 case USDHC2_BASE_ADDR:
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000277 ret = !gpio_get_value(USDHC2_CD_GPIO);
278 break;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000279 case USDHC3_BASE_ADDR:
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000280 ret = !gpio_get_value(USDHC3_CD_GPIO);
281 break;
282 case USDHC4_BASE_ADDR:
283 ret = 1; /* eMMC/uSDHC4 is always present */
284 break;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000285 }
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000286
287 return ret;
Fabio Estevam77e62892012-09-13 03:18:20 +0000288}
289
290int board_mmc_init(bd_t *bis)
291{
Fabio Estevam56cf36a2014-11-18 11:26:06 -0200292 struct src *psrc = (struct src *)SRC_BASE_ADDR;
293 unsigned reg = readl(&psrc->sbmr1) >> 11;
John Tobias07491552014-11-12 14:27:45 -0800294 /*
295 * Upon reading BOOT_CFG register the following map is done:
296 * Bit 11 and 12 of BOOT_CFG register can determine the current
297 * mmc port
298 * 0x1 SD1
299 * 0x2 SD2
300 * 0x3 SD4
301 */
302
303 switch (reg & 0x3) {
304 case 0x1:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300305 SETUP_IOMUX_PADS(usdhc2_pads);
John Tobias07491552014-11-12 14:27:45 -0800306 usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
307 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
308 gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
309 break;
310 case 0x2:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300311 SETUP_IOMUX_PADS(usdhc3_pads);
John Tobias07491552014-11-12 14:27:45 -0800312 usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
313 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
314 gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
315 break;
316 case 0x3:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300317 SETUP_IOMUX_PADS(usdhc4_pads);
John Tobias07491552014-11-12 14:27:45 -0800318 usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR;
319 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
320 gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
321 break;
322 }
323
324 return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
Fabio Estevam77e62892012-09-13 03:18:20 +0000325}
326#endif
327
Fabio Estevam509c06f2016-10-24 10:22:06 -0200328static int ar8031_phy_fixup(struct phy_device *phydev)
329{
330 unsigned short val;
331
332 /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
333 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
334 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
335 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
336
337 val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
338 val &= 0xffe3;
339 val |= 0x18;
340 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
341
342 /* introduce tx clock delay */
343 phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
344 val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
345 val |= 0x0100;
346 phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
347
348 return 0;
349}
350
351int board_phy_config(struct phy_device *phydev)
352{
353 ar8031_phy_fixup(phydev);
354
355 if (phydev->drv->config)
356 phydev->drv->config(phydev);
357
358 return 0;
359}
360
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500361#if defined(CONFIG_VIDEO_IPUV3)
Fabio Estevam70f84b52013-11-25 10:34:26 -0200362static void disable_lvds(struct display_info_t const *dev)
363{
364 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
365
366 int reg = readl(&iomux->gpr[2]);
367
368 reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
369 IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
370
371 writel(reg, &iomux->gpr[2]);
372}
373
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300374static void do_enable_hdmi(struct display_info_t const *dev)
375{
Fabio Estevam70f84b52013-11-25 10:34:26 -0200376 disable_lvds(dev);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300377 imx_enable_hdmi_phy();
378}
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500379
Eric Benardd6cabb22014-04-04 19:05:54 +0200380struct display_info_t const displays[] = {{
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300381 .bus = -1,
382 .addr = 0,
Fabio Estevam7d66d562013-12-04 01:08:17 -0200383 .pixfmt = IPU_PIX_FMT_RGB666,
Fabio Estevam70f84b52013-11-25 10:34:26 -0200384 .detect = NULL,
Marco Franchi029d07f2016-06-08 15:05:31 -0300385 .enable = enable_lvds,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300386 .mode = {
Fabio Estevam70f84b52013-11-25 10:34:26 -0200387 .name = "Hannstar-XGA",
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300388 .refresh = 60,
389 .xres = 1024,
390 .yres = 768,
Fabio Estevame2b20032016-03-16 12:55:03 -0300391 .pixclock = 15384,
392 .left_margin = 160,
393 .right_margin = 24,
394 .upper_margin = 29,
395 .lower_margin = 3,
396 .hsync_len = 136,
397 .vsync_len = 6,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300398 .sync = FB_SYNC_EXT,
399 .vmode = FB_VMODE_NONINTERLACED
400} }, {
401 .bus = -1,
402 .addr = 0,
Fabio Estevam70f84b52013-11-25 10:34:26 -0200403 .pixfmt = IPU_PIX_FMT_RGB24,
404 .detect = detect_hdmi,
405 .enable = do_enable_hdmi,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300406 .mode = {
Fabio Estevam70f84b52013-11-25 10:34:26 -0200407 .name = "HDMI",
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300408 .refresh = 60,
409 .xres = 1024,
410 .yres = 768,
Fabio Estevame2b20032016-03-16 12:55:03 -0300411 .pixclock = 15384,
412 .left_margin = 160,
413 .right_margin = 24,
414 .upper_margin = 29,
415 .lower_margin = 3,
416 .hsync_len = 136,
417 .vsync_len = 6,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300418 .sync = FB_SYNC_EXT,
419 .vmode = FB_VMODE_NONINTERLACED
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200420} }, {
421 .bus = 0,
422 .addr = 0,
423 .pixfmt = IPU_PIX_FMT_RGB24,
424 .detect = NULL,
425 .enable = enable_rgb,
426 .mode = {
427 .name = "SEIKO-WVGA",
428 .refresh = 60,
429 .xres = 800,
430 .yres = 480,
431 .pixclock = 29850,
432 .left_margin = 89,
433 .right_margin = 164,
434 .upper_margin = 23,
435 .lower_margin = 10,
436 .hsync_len = 10,
437 .vsync_len = 10,
438 .sync = 0,
439 .vmode = FB_VMODE_NONINTERLACED
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300440} } };
Eric Benardd6cabb22014-04-04 19:05:54 +0200441size_t display_count = ARRAY_SIZE(displays);
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500442
443static void setup_display(void)
444{
445 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300446 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500447 int reg;
448
Fabio Estevamdee3c842013-12-04 01:08:16 -0200449 /* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */
Fabio Estevamc88f1672017-05-12 12:45:23 -0300450 SETUP_IOMUX_PADS(di0_pads);
Fabio Estevamdee3c842013-12-04 01:08:16 -0200451
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500452 enable_ipu_clock();
453 imx_setup_hdmi();
454
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300455 /* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */
Liu Ying6f450632013-11-29 22:38:39 +0800456 reg = readl(&mxc_ccm->CCGR3);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300457 reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
458 writel(reg, &mxc_ccm->CCGR3);
459
460 /* set LDB0, LDB1 clk select to 011/011 */
461 reg = readl(&mxc_ccm->cs2cdr);
462 reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
463 | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
464 reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
465 | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
466 writel(reg, &mxc_ccm->cs2cdr);
467
468 reg = readl(&mxc_ccm->cscmr2);
469 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
470 writel(reg, &mxc_ccm->cscmr2);
471
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500472 reg = readl(&mxc_ccm->chsccdr);
473 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
474 << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300475 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
476 << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500477 writel(reg, &mxc_ccm->chsccdr);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300478
479 reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
480 | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW
481 | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
482 | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
483 | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
484 | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
485 | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
486 | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED
487 | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0;
488 writel(reg, &iomux->gpr[2]);
489
490 reg = readl(&iomux->gpr[3]);
491 reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK
492 | IOMUXC_GPR3_HDMI_MUX_CTL_MASK))
493 | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
494 << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET);
495 writel(reg, &iomux->gpr[3]);
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500496}
497#endif /* CONFIG_VIDEO_IPUV3 */
498
499/*
500 * Do not overwrite the console
501 * Use always serial for U-Boot console
502 */
503int overwrite_console(void)
504{
505 return 1;
506}
507
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000508int board_eth_init(bd_t *bis)
509{
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000510 setup_iomux_enet();
Marek Vasut0e99f012014-03-23 22:45:41 +0100511 setup_pcie();
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000512
Fabio Estevamfa3ae402014-01-04 17:36:32 -0200513 return cpu_eth_init(bis);
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000514}
515
Peng Fanc9498fa2014-12-02 09:55:27 +0800516#ifdef CONFIG_USB_EHCI_MX6
Peng Fanc9498fa2014-12-02 09:55:27 +0800517static void setup_usb(void)
518{
Peng Fanc9498fa2014-12-02 09:55:27 +0800519 /*
520 * set daisy chain for otg_pin_id on 6q.
521 * for 6dl, this bit is reserved
522 */
523 imx_iomux_set_gpr_register(1, 13, 1, 0);
Peng Fanc9498fa2014-12-02 09:55:27 +0800524}
525#endif
526
Fabio Estevam77e62892012-09-13 03:18:20 +0000527int board_early_init_f(void)
528{
529 setup_iomux_uart();
530
531 return 0;
532}
533
534int board_init(void)
535{
536 /* address of boot parameters */
537 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
538
Fabio Estevamd82dad42013-11-08 16:20:54 -0200539#ifdef CONFIG_MXC_SPI
540 setup_spi();
541#endif
Fabio Estevamc88f1672017-05-12 12:45:23 -0300542 if (is_mx6dq() || is_mx6dqp())
543 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
544 else
545 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
Fabio Estevam6f73a292017-09-22 23:45:28 -0300546#if defined(CONFIG_VIDEO_IPUV3)
547 setup_display();
548#endif
Peng Fanc9498fa2014-12-02 09:55:27 +0800549#ifdef CONFIG_USB_EHCI_MX6
550 setup_usb();
551#endif
552
Fabio Estevamba92ad62014-05-09 13:15:42 -0300553 return 0;
554}
555
Ye.Li75e02f92014-11-06 16:29:00 +0800556int power_init_board(void)
Fabio Estevamba92ad62014-05-09 13:15:42 -0300557{
558 struct pmic *p;
Fabio Estevameffbec12015-07-21 20:02:49 -0300559 unsigned int reg;
560 int ret;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300561
Ye.Li75e02f92014-11-06 16:29:00 +0800562 p = pfuze_common_init(I2C_PMIC);
563 if (!p)
564 return -ENODEV;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300565
Peng Fane5bcd4d2015-01-27 10:14:04 +0800566 ret = pfuze_mode_init(p, APS_PFM);
567 if (ret < 0)
568 return ret;
569
Fabio Estevamba92ad62014-05-09 13:15:42 -0300570 /* Increase VGEN3 from 2.5 to 2.8V */
571 pmic_reg_read(p, PFUZE100_VGEN3VOL, &reg);
Ye.Li75e02f92014-11-06 16:29:00 +0800572 reg &= ~LDO_VOL_MASK;
573 reg |= LDOB_2_80V;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300574 pmic_reg_write(p, PFUZE100_VGEN3VOL, reg);
575
576 /* Increase VGEN5 from 2.8 to 3V */
577 pmic_reg_read(p, PFUZE100_VGEN5VOL, &reg);
Ye.Li75e02f92014-11-06 16:29:00 +0800578 reg &= ~LDO_VOL_MASK;
579 reg |= LDOB_3_00V;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300580 pmic_reg_write(p, PFUZE100_VGEN5VOL, reg);
581
Fabio Estevam77e62892012-09-13 03:18:20 +0000582 return 0;
583}
584
Nikita Kiryanov00cd7382014-08-20 15:08:50 +0300585#ifdef CONFIG_MXC_SPI
586int board_spi_cs_gpio(unsigned bus, unsigned cs)
587{
588 return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
589}
590#endif
591
Otavio Salvador52863372013-03-16 08:05:07 +0000592#ifdef CONFIG_CMD_BMODE
593static const struct boot_mode board_boot_modes[] = {
594 /* 4 bit bus width */
595 {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
596 {"sd3", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
597 /* 8 bit bus width */
Ye Li4ea4a9b2016-01-30 11:53:42 +0800598 {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)},
Otavio Salvador52863372013-03-16 08:05:07 +0000599 {NULL, 0},
600};
601#endif
602
603int board_late_init(void)
604{
605#ifdef CONFIG_CMD_BMODE
606 add_board_boot_modes(board_boot_modes);
607#endif
Peng Fan04321fc2015-07-11 11:38:46 +0800608
609#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Simon Glass6a38e412017-08-03 12:22:09 -0600610 env_set("board_name", "SABRESD");
Peng Fan04321fc2015-07-11 11:38:46 +0800611
Peng Fane27c4db2015-10-15 18:05:59 +0800612 if (is_mx6dqp())
Simon Glass6a38e412017-08-03 12:22:09 -0600613 env_set("board_rev", "MX6QP");
Peng Fan4a597d02016-05-23 18:36:06 +0800614 else if (is_mx6dq())
Simon Glass6a38e412017-08-03 12:22:09 -0600615 env_set("board_rev", "MX6Q");
Peng Fan4a597d02016-05-23 18:36:06 +0800616 else if (is_mx6sdl())
Simon Glass6a38e412017-08-03 12:22:09 -0600617 env_set("board_rev", "MX6DL");
Peng Fan04321fc2015-07-11 11:38:46 +0800618#endif
619
Otavio Salvador52863372013-03-16 08:05:07 +0000620 return 0;
621}
622
Fabio Estevam77e62892012-09-13 03:18:20 +0000623int checkboard(void)
624{
Pierre Aubertec10aed2013-06-04 09:00:15 +0200625 puts("Board: MX6-SabreSD\n");
Fabio Estevam77e62892012-09-13 03:18:20 +0000626 return 0;
627}
John Tobias07491552014-11-12 14:27:45 -0800628
629#ifdef CONFIG_SPL_BUILD
Fabio Estevamc88f1672017-05-12 12:45:23 -0300630#include <asm/arch/mx6-ddr.h>
John Tobias07491552014-11-12 14:27:45 -0800631#include <spl.h>
Masahiro Yamada75f82d02018-03-05 01:20:11 +0900632#include <linux/libfdt.h>
John Tobias07491552014-11-12 14:27:45 -0800633
Diego Dorta466016e2016-10-11 11:09:27 -0300634#ifdef CONFIG_SPL_OS_BOOT
635int spl_start_uboot(void)
636{
Abel Vesa78d974e2019-02-01 16:40:19 +0000637 gpio_request(KEY_VOL_UP, "KEY Volume UP");
Diego Dorta466016e2016-10-11 11:09:27 -0300638 gpio_direction_input(KEY_VOL_UP);
639
640 /* Only enter in Falcon mode if KEY_VOL_UP is pressed */
641 return gpio_get_value(KEY_VOL_UP);
642}
643#endif
644
Fabio Estevamc6ecd0b2014-11-14 09:36:59 -0200645static void ccgr_init(void)
646{
647 struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
648
649 writel(0x00C03F3F, &ccm->CCGR0);
650 writel(0x0030FC03, &ccm->CCGR1);
651 writel(0x0FFFC000, &ccm->CCGR2);
652 writel(0x3FF00000, &ccm->CCGR3);
653 writel(0x00FFF300, &ccm->CCGR4);
654 writel(0x0F0000C3, &ccm->CCGR5);
655 writel(0x000003FF, &ccm->CCGR6);
656}
657
Fabio Estevam9b86c822016-09-26 09:14:25 -0300658static int mx6q_dcd_table[] = {
659 0x020e0798, 0x000C0000,
660 0x020e0758, 0x00000000,
661 0x020e0588, 0x00000030,
662 0x020e0594, 0x00000030,
663 0x020e056c, 0x00000030,
664 0x020e0578, 0x00000030,
665 0x020e074c, 0x00000030,
666 0x020e057c, 0x00000030,
667 0x020e058c, 0x00000000,
668 0x020e059c, 0x00000030,
669 0x020e05a0, 0x00000030,
670 0x020e078c, 0x00000030,
671 0x020e0750, 0x00020000,
672 0x020e05a8, 0x00000030,
673 0x020e05b0, 0x00000030,
674 0x020e0524, 0x00000030,
675 0x020e051c, 0x00000030,
676 0x020e0518, 0x00000030,
677 0x020e050c, 0x00000030,
678 0x020e05b8, 0x00000030,
679 0x020e05c0, 0x00000030,
680 0x020e0774, 0x00020000,
681 0x020e0784, 0x00000030,
682 0x020e0788, 0x00000030,
683 0x020e0794, 0x00000030,
684 0x020e079c, 0x00000030,
685 0x020e07a0, 0x00000030,
686 0x020e07a4, 0x00000030,
687 0x020e07a8, 0x00000030,
688 0x020e0748, 0x00000030,
689 0x020e05ac, 0x00000030,
690 0x020e05b4, 0x00000030,
691 0x020e0528, 0x00000030,
692 0x020e0520, 0x00000030,
693 0x020e0514, 0x00000030,
694 0x020e0510, 0x00000030,
695 0x020e05bc, 0x00000030,
696 0x020e05c4, 0x00000030,
697 0x021b0800, 0xa1390003,
698 0x021b080c, 0x001F001F,
699 0x021b0810, 0x001F001F,
700 0x021b480c, 0x001F001F,
701 0x021b4810, 0x001F001F,
702 0x021b083c, 0x43270338,
703 0x021b0840, 0x03200314,
704 0x021b483c, 0x431A032F,
705 0x021b4840, 0x03200263,
706 0x021b0848, 0x4B434748,
707 0x021b4848, 0x4445404C,
708 0x021b0850, 0x38444542,
709 0x021b4850, 0x4935493A,
710 0x021b081c, 0x33333333,
711 0x021b0820, 0x33333333,
712 0x021b0824, 0x33333333,
713 0x021b0828, 0x33333333,
714 0x021b481c, 0x33333333,
715 0x021b4820, 0x33333333,
716 0x021b4824, 0x33333333,
717 0x021b4828, 0x33333333,
718 0x021b08b8, 0x00000800,
719 0x021b48b8, 0x00000800,
720 0x021b0004, 0x00020036,
721 0x021b0008, 0x09444040,
722 0x021b000c, 0x555A7975,
723 0x021b0010, 0xFF538F64,
724 0x021b0014, 0x01FF00DB,
725 0x021b0018, 0x00001740,
726 0x021b001c, 0x00008000,
727 0x021b002c, 0x000026d2,
728 0x021b0030, 0x005A1023,
729 0x021b0040, 0x00000027,
730 0x021b0000, 0x831A0000,
731 0x021b001c, 0x04088032,
732 0x021b001c, 0x00008033,
733 0x021b001c, 0x00048031,
734 0x021b001c, 0x09408030,
735 0x021b001c, 0x04008040,
736 0x021b0020, 0x00005800,
737 0x021b0818, 0x00011117,
738 0x021b4818, 0x00011117,
739 0x021b0004, 0x00025576,
740 0x021b0404, 0x00011006,
741 0x021b001c, 0x00000000,
742};
743
744static int mx6qp_dcd_table[] = {
745 0x020e0798, 0x000c0000,
746 0x020e0758, 0x00000000,
747 0x020e0588, 0x00000030,
748 0x020e0594, 0x00000030,
749 0x020e056c, 0x00000030,
750 0x020e0578, 0x00000030,
751 0x020e074c, 0x00000030,
752 0x020e057c, 0x00000030,
753 0x020e058c, 0x00000000,
754 0x020e059c, 0x00000030,
755 0x020e05a0, 0x00000030,
756 0x020e078c, 0x00000030,
757 0x020e0750, 0x00020000,
758 0x020e05a8, 0x00000030,
759 0x020e05b0, 0x00000030,
760 0x020e0524, 0x00000030,
761 0x020e051c, 0x00000030,
762 0x020e0518, 0x00000030,
763 0x020e050c, 0x00000030,
764 0x020e05b8, 0x00000030,
765 0x020e05c0, 0x00000030,
766 0x020e0774, 0x00020000,
767 0x020e0784, 0x00000030,
768 0x020e0788, 0x00000030,
769 0x020e0794, 0x00000030,
770 0x020e079c, 0x00000030,
771 0x020e07a0, 0x00000030,
772 0x020e07a4, 0x00000030,
773 0x020e07a8, 0x00000030,
774 0x020e0748, 0x00000030,
775 0x020e05ac, 0x00000030,
776 0x020e05b4, 0x00000030,
777 0x020e0528, 0x00000030,
778 0x020e0520, 0x00000030,
779 0x020e0514, 0x00000030,
780 0x020e0510, 0x00000030,
781 0x020e05bc, 0x00000030,
782 0x020e05c4, 0x00000030,
783 0x021b0800, 0xa1390003,
784 0x021b080c, 0x001b001e,
785 0x021b0810, 0x002e0029,
786 0x021b480c, 0x001b002a,
787 0x021b4810, 0x0019002c,
788 0x021b083c, 0x43240334,
789 0x021b0840, 0x0324031a,
790 0x021b483c, 0x43340344,
791 0x021b4840, 0x03280276,
792 0x021b0848, 0x44383A3E,
793 0x021b4848, 0x3C3C3846,
794 0x021b0850, 0x2e303230,
795 0x021b4850, 0x38283E34,
796 0x021b081c, 0x33333333,
797 0x021b0820, 0x33333333,
798 0x021b0824, 0x33333333,
799 0x021b0828, 0x33333333,
800 0x021b481c, 0x33333333,
801 0x021b4820, 0x33333333,
802 0x021b4824, 0x33333333,
803 0x021b4828, 0x33333333,
804 0x021b08c0, 0x24912249,
805 0x021b48c0, 0x24914289,
806 0x021b08b8, 0x00000800,
807 0x021b48b8, 0x00000800,
808 0x021b0004, 0x00020036,
809 0x021b0008, 0x24444040,
810 0x021b000c, 0x555A7955,
811 0x021b0010, 0xFF320F64,
812 0x021b0014, 0x01ff00db,
813 0x021b0018, 0x00001740,
814 0x021b001c, 0x00008000,
815 0x021b002c, 0x000026d2,
816 0x021b0030, 0x005A1023,
817 0x021b0040, 0x00000027,
818 0x021b0400, 0x14420000,
819 0x021b0000, 0x831A0000,
820 0x021b0890, 0x00400C58,
821 0x00bb0008, 0x00000000,
822 0x00bb000c, 0x2891E41A,
823 0x00bb0038, 0x00000564,
824 0x00bb0014, 0x00000040,
825 0x00bb0028, 0x00000020,
826 0x00bb002c, 0x00000020,
827 0x021b001c, 0x04088032,
828 0x021b001c, 0x00008033,
829 0x021b001c, 0x00048031,
830 0x021b001c, 0x09408030,
831 0x021b001c, 0x04008040,
832 0x021b0020, 0x00005800,
833 0x021b0818, 0x00011117,
834 0x021b4818, 0x00011117,
835 0x021b0004, 0x00025576,
836 0x021b0404, 0x00011006,
837 0x021b001c, 0x00000000,
838};
839
Fabio Estevam15cb6b12017-05-12 12:45:24 -0300840static int mx6dl_dcd_table[] = {
841 0x020e0774, 0x000C0000,
842 0x020e0754, 0x00000000,
843 0x020e04ac, 0x00000030,
844 0x020e04b0, 0x00000030,
845 0x020e0464, 0x00000030,
846 0x020e0490, 0x00000030,
847 0x020e074c, 0x00000030,
848 0x020e0494, 0x00000030,
849 0x020e04a0, 0x00000000,
850 0x020e04b4, 0x00000030,
851 0x020e04b8, 0x00000030,
852 0x020e076c, 0x00000030,
853 0x020e0750, 0x00020000,
854 0x020e04bc, 0x00000030,
855 0x020e04c0, 0x00000030,
856 0x020e04c4, 0x00000030,
857 0x020e04c8, 0x00000030,
858 0x020e04cc, 0x00000030,
859 0x020e04d0, 0x00000030,
860 0x020e04d4, 0x00000030,
861 0x020e04d8, 0x00000030,
862 0x020e0760, 0x00020000,
863 0x020e0764, 0x00000030,
864 0x020e0770, 0x00000030,
865 0x020e0778, 0x00000030,
866 0x020e077c, 0x00000030,
867 0x020e0780, 0x00000030,
868 0x020e0784, 0x00000030,
869 0x020e078c, 0x00000030,
870 0x020e0748, 0x00000030,
871 0x020e0470, 0x00000030,
872 0x020e0474, 0x00000030,
873 0x020e0478, 0x00000030,
874 0x020e047c, 0x00000030,
875 0x020e0480, 0x00000030,
876 0x020e0484, 0x00000030,
877 0x020e0488, 0x00000030,
878 0x020e048c, 0x00000030,
879 0x021b0800, 0xa1390003,
880 0x021b080c, 0x001F001F,
881 0x021b0810, 0x001F001F,
882 0x021b480c, 0x001F001F,
883 0x021b4810, 0x001F001F,
884 0x021b083c, 0x4220021F,
885 0x021b0840, 0x0207017E,
886 0x021b483c, 0x4201020C,
887 0x021b4840, 0x01660172,
888 0x021b0848, 0x4A4D4E4D,
889 0x021b4848, 0x4A4F5049,
890 0x021b0850, 0x3F3C3D31,
891 0x021b4850, 0x3238372B,
892 0x021b081c, 0x33333333,
893 0x021b0820, 0x33333333,
894 0x021b0824, 0x33333333,
895 0x021b0828, 0x33333333,
896 0x021b481c, 0x33333333,
897 0x021b4820, 0x33333333,
898 0x021b4824, 0x33333333,
899 0x021b4828, 0x33333333,
900 0x021b08b8, 0x00000800,
901 0x021b48b8, 0x00000800,
902 0x021b0004, 0x0002002D,
903 0x021b0008, 0x00333030,
904 0x021b000c, 0x3F435313,
905 0x021b0010, 0xB66E8B63,
906 0x021b0014, 0x01FF00DB,
907 0x021b0018, 0x00001740,
908 0x021b001c, 0x00008000,
909 0x021b002c, 0x000026d2,
910 0x021b0030, 0x00431023,
911 0x021b0040, 0x00000027,
912 0x021b0000, 0x831A0000,
913 0x021b001c, 0x04008032,
914 0x021b001c, 0x00008033,
915 0x021b001c, 0x00048031,
916 0x021b001c, 0x05208030,
917 0x021b001c, 0x04008040,
918 0x021b0020, 0x00005800,
919 0x021b0818, 0x00011117,
920 0x021b4818, 0x00011117,
921 0x021b0004, 0x0002556D,
922 0x021b0404, 0x00011006,
923 0x021b001c, 0x00000000,
924};
925
Fabio Estevam9b86c822016-09-26 09:14:25 -0300926static void ddr_init(int *table, int size)
John Tobias07491552014-11-12 14:27:45 -0800927{
Fabio Estevam9b86c822016-09-26 09:14:25 -0300928 int i;
John Tobias07491552014-11-12 14:27:45 -0800929
Fabio Estevam9b86c822016-09-26 09:14:25 -0300930 for (i = 0; i < size / 2 ; i++)
931 writel(table[2 * i + 1], table[2 * i]);
John Tobias07491552014-11-12 14:27:45 -0800932}
933
Fabio Estevam9b86c822016-09-26 09:14:25 -0300934static void spl_dram_init(void)
935{
936 if (is_mx6dq())
937 ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
938 else if (is_mx6dqp())
939 ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
Fabio Estevam15cb6b12017-05-12 12:45:24 -0300940 else if (is_mx6sdl())
941 ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
Fabio Estevam9b86c822016-09-26 09:14:25 -0300942}
943
John Tobias07491552014-11-12 14:27:45 -0800944void board_init_f(ulong dummy)
945{
Fabio Estevam9b86c822016-09-26 09:14:25 -0300946 /* DDR initialization */
947 spl_dram_init();
948
John Tobias07491552014-11-12 14:27:45 -0800949 /* setup AIPS and disable watchdog */
950 arch_cpu_init();
951
Fabio Estevamc6ecd0b2014-11-14 09:36:59 -0200952 ccgr_init();
953 gpr_init();
954
John Tobias07491552014-11-12 14:27:45 -0800955 /* iomux and setup of i2c */
956 board_early_init_f();
957
958 /* setup GP timer */
959 timer_init();
960
961 /* UART clocks enabled and gd valid - init serial console */
962 preloader_console_init();
963
John Tobias07491552014-11-12 14:27:45 -0800964 /* Clear the BSS. */
965 memset(__bss_start, 0, __bss_end - __bss_start);
966
967 /* load/boot image from boot device */
968 board_init_r(NULL, 0);
969}
John Tobias07491552014-11-12 14:27:45 -0800970#endif
Abel Vesa4f5bd302019-02-01 16:40:12 +0000971
972#ifdef CONFIG_SPL_LOAD_FIT
973int board_fit_config_name_match(const char *name)
974{
975 if (is_mx6dq()) {
976 if (!strcmp(name, "imx6q-sabresd"))
977 return 0;
978 } else if (is_mx6dqp()) {
979 if (!strcmp(name, "imx6qp-sabresd"))
980 return 0;
981 } else if (is_mx6dl()) {
982 if (!strcmp(name, "imx6dl-sabresd"))
983 return 0;
984 }
985
986 return -1;
987}
988#endif