blob: 878e1e7c0b6caa509bd628551f3e8e1dacfabf87 [file] [log] [blame]
Fabio Estevam77e62892012-09-13 03:18:20 +00001/*
2 * Copyright (C) 2012 Freescale Semiconductor, Inc.
3 *
4 * Author: Fabio Estevam <fabio.estevam@freescale.com>
5 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02006 * SPDX-License-Identifier: GPL-2.0+
Fabio Estevam77e62892012-09-13 03:18:20 +00007 */
8
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>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090014#include <linux/errno.h>
Fabio Estevam77e62892012-09-13 03:18:20 +000015#include <asm/gpio.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020016#include <asm/mach-imx/mxc_i2c.h>
17#include <asm/mach-imx/iomux-v3.h>
18#include <asm/mach-imx/boot_mode.h>
19#include <asm/mach-imx/video.h>
Fabio Estevam77e62892012-09-13 03:18:20 +000020#include <mmc.h>
21#include <fsl_esdhc.h>
22#include <miiphy.h>
23#include <netdev.h>
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -050024#include <asm/arch/mxc_hdmi.h>
25#include <asm/arch/crm_regs.h>
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -050026#include <asm/io.h>
27#include <asm/arch/sys_proto.h>
Fabio Estevamba92ad62014-05-09 13:15:42 -030028#include <i2c.h>
Diego Dorta2661c9c2017-09-22 12:12:18 -030029#include <input.h>
Fabio Estevamba92ad62014-05-09 13:15:42 -030030#include <power/pmic.h>
31#include <power/pfuze100_pmic.h>
Ye.Li75e02f92014-11-06 16:29:00 +080032#include "../common/pfuze.h"
Peng Fanc9498fa2014-12-02 09:55:27 +080033#include <usb.h>
Diego Dortade4c6612017-09-27 13:12:40 -030034#include <usb/ehci-ci.h>
John Tobias07491552014-11-12 14:27:45 -080035
Fabio Estevam77e62892012-09-13 03:18:20 +000036DECLARE_GLOBAL_DATA_PTR;
37
Benoît Thébaudeau21670242013-04-26 01:34:47 +000038#define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
39 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
40 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevam77e62892012-09-13 03:18:20 +000041
Benoît Thébaudeau21670242013-04-26 01:34:47 +000042#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
43 PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
44 PAD_CTL_SRE_FAST | PAD_CTL_HYS)
Fabio Estevam77e62892012-09-13 03:18:20 +000045
Benoît Thébaudeau21670242013-04-26 01:34:47 +000046#define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
47 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
Fabio Estevam77e62892012-09-13 03:18:20 +000048
Fabio Estevamd82dad42013-11-08 16:20:54 -020049#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
50 PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
51
Fabio Estevamba92ad62014-05-09 13:15:42 -030052#define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
53 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
54 PAD_CTL_ODE | PAD_CTL_SRE_FAST)
55
56#define I2C_PMIC 1
57
58#define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
59
Fabio Estevam0d29cee2014-10-21 21:14:53 -020060#define DISP0_PWR_EN IMX_GPIO_NR(1, 21)
61
Diego Dorta466016e2016-10-11 11:09:27 -030062#define KEY_VOL_UP IMX_GPIO_NR(1, 4)
63
Fabio Estevam77e62892012-09-13 03:18:20 +000064int dram_init(void)
65{
John Tobias07491552014-11-12 14:27:45 -080066 gd->ram_size = imx_ddr_size();
Fabio Estevam77e62892012-09-13 03:18:20 +000067 return 0;
68}
69
Fabio Estevamf533c2e2014-11-06 12:24:25 -020070static iomux_v3_cfg_t const uart1_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -030071 IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
72 IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
Fabio Estevam77e62892012-09-13 03:18:20 +000073};
74
Fabio Estevamf533c2e2014-11-06 12:24:25 -020075static iomux_v3_cfg_t const enet_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -030076 IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)),
77 IOMUX_PADS(PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
78 IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
79 IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
80 IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
81 IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
82 IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
83 IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
84 IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL)),
85 IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
86 IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
87 IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
88 IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
89 IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
90 IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
Fabio Estevam2ebe2462012-09-18 17:24:23 +000091 /* AR8031 PHY Reset */
Fabio Estevamc88f1672017-05-12 12:45:23 -030092 IOMUX_PADS(PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevam2ebe2462012-09-18 17:24:23 +000093};
94
95static void setup_iomux_enet(void)
96{
Fabio Estevamc88f1672017-05-12 12:45:23 -030097 SETUP_IOMUX_PADS(enet_pads);
Fabio Estevam2ebe2462012-09-18 17:24:23 +000098
99 /* Reset AR8031 PHY */
100 gpio_direction_output(IMX_GPIO_NR(1, 25) , 0);
Fabio Estevam66d42722016-01-05 17:02:53 -0200101 mdelay(10);
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000102 gpio_set_value(IMX_GPIO_NR(1, 25), 1);
Fabio Estevam66d42722016-01-05 17:02:53 -0200103 udelay(100);
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000104}
105
Fabio Estevamf533c2e2014-11-06 12:24:25 -0200106static iomux_v3_cfg_t const usdhc2_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300107 IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
108 IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
109 IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
110 IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
111 IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
112 IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
113 IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
114 IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
115 IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
116 IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
117 IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
Shawn Guo7e5e8332012-12-30 14:14:59 +0000118};
119
Fabio Estevamf533c2e2014-11-06 12:24:25 -0200120static iomux_v3_cfg_t const usdhc3_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300121 IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
122 IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
123 IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
124 IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
125 IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
126 IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
127 IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
128 IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
129 IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
130 IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
131 IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
Fabio Estevam77e62892012-09-13 03:18:20 +0000132};
133
Fabio Estevamf533c2e2014-11-06 12:24:25 -0200134static iomux_v3_cfg_t const usdhc4_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300135 IOMUX_PADS(PAD_SD4_CLK__SD4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
136 IOMUX_PADS(PAD_SD4_CMD__SD4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
137 IOMUX_PADS(PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
138 IOMUX_PADS(PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
139 IOMUX_PADS(PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
140 IOMUX_PADS(PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
141 IOMUX_PADS(PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
142 IOMUX_PADS(PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
143 IOMUX_PADS(PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
144 IOMUX_PADS(PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
Shawn Guo7e5e8332012-12-30 14:14:59 +0000145};
146
Fabio Estevamf533c2e2014-11-06 12:24:25 -0200147static iomux_v3_cfg_t const ecspi1_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300148 IOMUX_PADS(PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
149 IOMUX_PADS(PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
150 IOMUX_PADS(PAD_KEY_ROW0__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)),
151 IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevamd82dad42013-11-08 16:20:54 -0200152};
153
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200154static iomux_v3_cfg_t const rgb_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300155 IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL)),
156 IOMUX_PADS(PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
157 IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
158 IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
159 IOMUX_PADS(PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
160 IOMUX_PADS(PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
161 IOMUX_PADS(PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
162 IOMUX_PADS(PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
163 IOMUX_PADS(PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
164 IOMUX_PADS(PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
165 IOMUX_PADS(PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
166 IOMUX_PADS(PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
167 IOMUX_PADS(PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
168 IOMUX_PADS(PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL)),
169 IOMUX_PADS(PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
170 IOMUX_PADS(PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL)),
171 IOMUX_PADS(PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL)),
172 IOMUX_PADS(PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL)),
173 IOMUX_PADS(PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL)),
174 IOMUX_PADS(PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL)),
175 IOMUX_PADS(PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
176 IOMUX_PADS(PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL)),
177 IOMUX_PADS(PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL)),
178 IOMUX_PADS(PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
179 IOMUX_PADS(PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
180 IOMUX_PADS(PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL)),
181 IOMUX_PADS(PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
182 IOMUX_PADS(PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL)),
183 IOMUX_PADS(PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Marco Franchi029d07f2016-06-08 15:05:31 -0300184};
185
186static iomux_v3_cfg_t const bl_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300187 IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200188};
189
Marco Franchi029d07f2016-06-08 15:05:31 -0300190static void enable_backlight(void)
191{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300192 SETUP_IOMUX_PADS(bl_pads);
Marco Franchi029d07f2016-06-08 15:05:31 -0300193 gpio_direction_output(DISP0_PWR_EN, 1);
194}
195
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200196static void enable_rgb(struct display_info_t const *dev)
197{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300198 SETUP_IOMUX_PADS(rgb_pads);
Marco Franchi029d07f2016-06-08 15:05:31 -0300199 enable_backlight();
200}
201
202static void enable_lvds(struct display_info_t const *dev)
203{
204 enable_backlight();
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200205}
206
Fabio Estevamc88f1672017-05-12 12:45:23 -0300207static struct i2c_pads_info mx6q_i2c_pad_info1 = {
Fabio Estevamba92ad62014-05-09 13:15:42 -0300208 .scl = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300209 .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
210 .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
Fabio Estevamba92ad62014-05-09 13:15:42 -0300211 .gp = IMX_GPIO_NR(4, 12)
212 },
213 .sda = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300214 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
215 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
Fabio Estevamba92ad62014-05-09 13:15:42 -0300216 .gp = IMX_GPIO_NR(4, 13)
217 }
218};
219
Fabio Estevamc88f1672017-05-12 12:45:23 -0300220static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
221 .scl = {
222 .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
223 .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
224 .gp = IMX_GPIO_NR(4, 12)
225 },
226 .sda = {
227 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
228 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
229 .gp = IMX_GPIO_NR(4, 13)
230 }
231};
232
Fabio Estevamd82dad42013-11-08 16:20:54 -0200233static void setup_spi(void)
234{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300235 SETUP_IOMUX_PADS(ecspi1_pads);
Fabio Estevamd82dad42013-11-08 16:20:54 -0200236}
237
Marek Vasut0e99f012014-03-23 22:45:41 +0100238iomux_v3_cfg_t const pcie_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300239 IOMUX_PADS(PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* POWER */
240 IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* RESET */
Marek Vasut0e99f012014-03-23 22:45:41 +0100241};
242
243static void setup_pcie(void)
244{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300245 SETUP_IOMUX_PADS(pcie_pads);
Marek Vasut0e99f012014-03-23 22:45:41 +0100246}
247
Fabio Estevamdee3c842013-12-04 01:08:16 -0200248iomux_v3_cfg_t const di0_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300249 IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK), /* DISP0_CLK */
250 IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02), /* DISP0_HSYNC */
251 IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03), /* DISP0_VSYNC */
Fabio Estevamdee3c842013-12-04 01:08:16 -0200252};
253
Fabio Estevam77e62892012-09-13 03:18:20 +0000254static void setup_iomux_uart(void)
255{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300256 SETUP_IOMUX_PADS(uart1_pads);
Fabio Estevam77e62892012-09-13 03:18:20 +0000257}
258
259#ifdef CONFIG_FSL_ESDHC
Shawn Guo7e5e8332012-12-30 14:14:59 +0000260struct fsl_esdhc_cfg usdhc_cfg[3] = {
261 {USDHC2_BASE_ADDR},
Fabio Estevam77e62892012-09-13 03:18:20 +0000262 {USDHC3_BASE_ADDR},
Shawn Guo7e5e8332012-12-30 14:14:59 +0000263 {USDHC4_BASE_ADDR},
Fabio Estevam77e62892012-09-13 03:18:20 +0000264};
265
Shawn Guo7e5e8332012-12-30 14:14:59 +0000266#define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2)
267#define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0)
268
Peng Fan03a43df2016-01-28 16:51:27 +0800269int board_mmc_get_env_dev(int devno)
270{
271 return devno - 1;
272}
273
Fabio Estevam77e62892012-09-13 03:18:20 +0000274int board_mmc_getcd(struct mmc *mmc)
275{
Shawn Guo7e5e8332012-12-30 14:14:59 +0000276 struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000277 int ret = 0;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000278
279 switch (cfg->esdhc_base) {
280 case USDHC2_BASE_ADDR:
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000281 ret = !gpio_get_value(USDHC2_CD_GPIO);
282 break;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000283 case USDHC3_BASE_ADDR:
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000284 ret = !gpio_get_value(USDHC3_CD_GPIO);
285 break;
286 case USDHC4_BASE_ADDR:
287 ret = 1; /* eMMC/uSDHC4 is always present */
288 break;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000289 }
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000290
291 return ret;
Fabio Estevam77e62892012-09-13 03:18:20 +0000292}
293
294int board_mmc_init(bd_t *bis)
295{
John Tobias07491552014-11-12 14:27:45 -0800296#ifndef CONFIG_SPL_BUILD
Fabio Estevam593d0c82014-11-06 12:24:24 -0200297 int ret;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000298 int i;
299
Otavio Salvadora272dbf2013-03-16 08:05:05 +0000300 /*
301 * According to the board_mmc_init() the following map is done:
Bin Meng75574052016-02-05 19:30:11 -0800302 * (U-Boot device node) (Physical Port)
Otavio Salvadora272dbf2013-03-16 08:05:05 +0000303 * mmc0 SD2
304 * mmc1 SD3
305 * mmc2 eMMC
306 */
Shawn Guo7e5e8332012-12-30 14:14:59 +0000307 for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
308 switch (i) {
309 case 0:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300310 SETUP_IOMUX_PADS(usdhc2_pads);
Shawn Guo7e5e8332012-12-30 14:14:59 +0000311 gpio_direction_input(USDHC2_CD_GPIO);
312 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
313 break;
314 case 1:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300315 SETUP_IOMUX_PADS(usdhc3_pads);
Shawn Guo7e5e8332012-12-30 14:14:59 +0000316 gpio_direction_input(USDHC3_CD_GPIO);
317 usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
318 break;
319 case 2:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300320 SETUP_IOMUX_PADS(usdhc4_pads);
Shawn Guo7e5e8332012-12-30 14:14:59 +0000321 usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
322 break;
323 default:
324 printf("Warning: you configured more USDHC controllers"
Otavio Salvadora937e222013-04-19 03:41:58 +0000325 "(%d) then supported by the board (%d)\n",
326 i + 1, CONFIG_SYS_FSL_USDHC_NUM);
Fabio Estevam593d0c82014-11-06 12:24:24 -0200327 return -EINVAL;
Otavio Salvadora937e222013-04-19 03:41:58 +0000328 }
Shawn Guo7e5e8332012-12-30 14:14:59 +0000329
Fabio Estevam593d0c82014-11-06 12:24:24 -0200330 ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
331 if (ret)
332 return ret;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000333 }
Fabio Estevam77e62892012-09-13 03:18:20 +0000334
Fabio Estevam593d0c82014-11-06 12:24:24 -0200335 return 0;
John Tobias07491552014-11-12 14:27:45 -0800336#else
Fabio Estevam56cf36a2014-11-18 11:26:06 -0200337 struct src *psrc = (struct src *)SRC_BASE_ADDR;
338 unsigned reg = readl(&psrc->sbmr1) >> 11;
John Tobias07491552014-11-12 14:27:45 -0800339 /*
340 * Upon reading BOOT_CFG register the following map is done:
341 * Bit 11 and 12 of BOOT_CFG register can determine the current
342 * mmc port
343 * 0x1 SD1
344 * 0x2 SD2
345 * 0x3 SD4
346 */
347
348 switch (reg & 0x3) {
349 case 0x1:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300350 SETUP_IOMUX_PADS(usdhc2_pads);
John Tobias07491552014-11-12 14:27:45 -0800351 usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
352 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
353 gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
354 break;
355 case 0x2:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300356 SETUP_IOMUX_PADS(usdhc3_pads);
John Tobias07491552014-11-12 14:27:45 -0800357 usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
358 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
359 gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
360 break;
361 case 0x3:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300362 SETUP_IOMUX_PADS(usdhc4_pads);
John Tobias07491552014-11-12 14:27:45 -0800363 usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR;
364 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
365 gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
366 break;
367 }
368
369 return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
370#endif
Fabio Estevam77e62892012-09-13 03:18:20 +0000371}
372#endif
373
Fabio Estevam509c06f2016-10-24 10:22:06 -0200374static int ar8031_phy_fixup(struct phy_device *phydev)
375{
376 unsigned short val;
377
378 /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
379 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
380 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
381 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
382
383 val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
384 val &= 0xffe3;
385 val |= 0x18;
386 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
387
388 /* introduce tx clock delay */
389 phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
390 val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
391 val |= 0x0100;
392 phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
393
394 return 0;
395}
396
397int board_phy_config(struct phy_device *phydev)
398{
399 ar8031_phy_fixup(phydev);
400
401 if (phydev->drv->config)
402 phydev->drv->config(phydev);
403
404 return 0;
405}
406
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500407#if defined(CONFIG_VIDEO_IPUV3)
Fabio Estevam70f84b52013-11-25 10:34:26 -0200408static void disable_lvds(struct display_info_t const *dev)
409{
410 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
411
412 int reg = readl(&iomux->gpr[2]);
413
414 reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
415 IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
416
417 writel(reg, &iomux->gpr[2]);
418}
419
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300420static void do_enable_hdmi(struct display_info_t const *dev)
421{
Fabio Estevam70f84b52013-11-25 10:34:26 -0200422 disable_lvds(dev);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300423 imx_enable_hdmi_phy();
424}
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500425
Eric Benardd6cabb22014-04-04 19:05:54 +0200426struct display_info_t const displays[] = {{
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300427 .bus = -1,
428 .addr = 0,
Fabio Estevam7d66d562013-12-04 01:08:17 -0200429 .pixfmt = IPU_PIX_FMT_RGB666,
Fabio Estevam70f84b52013-11-25 10:34:26 -0200430 .detect = NULL,
Marco Franchi029d07f2016-06-08 15:05:31 -0300431 .enable = enable_lvds,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300432 .mode = {
Fabio Estevam70f84b52013-11-25 10:34:26 -0200433 .name = "Hannstar-XGA",
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300434 .refresh = 60,
435 .xres = 1024,
436 .yres = 768,
Fabio Estevame2b20032016-03-16 12:55:03 -0300437 .pixclock = 15384,
438 .left_margin = 160,
439 .right_margin = 24,
440 .upper_margin = 29,
441 .lower_margin = 3,
442 .hsync_len = 136,
443 .vsync_len = 6,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300444 .sync = FB_SYNC_EXT,
445 .vmode = FB_VMODE_NONINTERLACED
446} }, {
447 .bus = -1,
448 .addr = 0,
Fabio Estevam70f84b52013-11-25 10:34:26 -0200449 .pixfmt = IPU_PIX_FMT_RGB24,
450 .detect = detect_hdmi,
451 .enable = do_enable_hdmi,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300452 .mode = {
Fabio Estevam70f84b52013-11-25 10:34:26 -0200453 .name = "HDMI",
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300454 .refresh = 60,
455 .xres = 1024,
456 .yres = 768,
Fabio Estevame2b20032016-03-16 12:55:03 -0300457 .pixclock = 15384,
458 .left_margin = 160,
459 .right_margin = 24,
460 .upper_margin = 29,
461 .lower_margin = 3,
462 .hsync_len = 136,
463 .vsync_len = 6,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300464 .sync = FB_SYNC_EXT,
465 .vmode = FB_VMODE_NONINTERLACED
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200466} }, {
467 .bus = 0,
468 .addr = 0,
469 .pixfmt = IPU_PIX_FMT_RGB24,
470 .detect = NULL,
471 .enable = enable_rgb,
472 .mode = {
473 .name = "SEIKO-WVGA",
474 .refresh = 60,
475 .xres = 800,
476 .yres = 480,
477 .pixclock = 29850,
478 .left_margin = 89,
479 .right_margin = 164,
480 .upper_margin = 23,
481 .lower_margin = 10,
482 .hsync_len = 10,
483 .vsync_len = 10,
484 .sync = 0,
485 .vmode = FB_VMODE_NONINTERLACED
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300486} } };
Eric Benardd6cabb22014-04-04 19:05:54 +0200487size_t display_count = ARRAY_SIZE(displays);
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500488
489static void setup_display(void)
490{
491 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300492 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500493 int reg;
494
Fabio Estevamdee3c842013-12-04 01:08:16 -0200495 /* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */
Fabio Estevamc88f1672017-05-12 12:45:23 -0300496 SETUP_IOMUX_PADS(di0_pads);
Fabio Estevamdee3c842013-12-04 01:08:16 -0200497
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500498 enable_ipu_clock();
499 imx_setup_hdmi();
500
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300501 /* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */
Liu Ying6f450632013-11-29 22:38:39 +0800502 reg = readl(&mxc_ccm->CCGR3);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300503 reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
504 writel(reg, &mxc_ccm->CCGR3);
505
506 /* set LDB0, LDB1 clk select to 011/011 */
507 reg = readl(&mxc_ccm->cs2cdr);
508 reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
509 | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
510 reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
511 | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
512 writel(reg, &mxc_ccm->cs2cdr);
513
514 reg = readl(&mxc_ccm->cscmr2);
515 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
516 writel(reg, &mxc_ccm->cscmr2);
517
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500518 reg = readl(&mxc_ccm->chsccdr);
519 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
520 << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300521 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
522 << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500523 writel(reg, &mxc_ccm->chsccdr);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300524
525 reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
526 | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW
527 | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
528 | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
529 | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
530 | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
531 | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
532 | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED
533 | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0;
534 writel(reg, &iomux->gpr[2]);
535
536 reg = readl(&iomux->gpr[3]);
537 reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK
538 | IOMUXC_GPR3_HDMI_MUX_CTL_MASK))
539 | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
540 << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET);
541 writel(reg, &iomux->gpr[3]);
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500542}
543#endif /* CONFIG_VIDEO_IPUV3 */
544
545/*
546 * Do not overwrite the console
547 * Use always serial for U-Boot console
548 */
549int overwrite_console(void)
550{
551 return 1;
552}
553
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000554int board_eth_init(bd_t *bis)
555{
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000556 setup_iomux_enet();
Marek Vasut0e99f012014-03-23 22:45:41 +0100557 setup_pcie();
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000558
Fabio Estevamfa3ae402014-01-04 17:36:32 -0200559 return cpu_eth_init(bis);
Fabio Estevam2ebe2462012-09-18 17:24:23 +0000560}
561
Peng Fanc9498fa2014-12-02 09:55:27 +0800562#ifdef CONFIG_USB_EHCI_MX6
563#define USB_OTHERREGS_OFFSET 0x800
564#define UCTRL_PWR_POL (1 << 9)
565
566static iomux_v3_cfg_t const usb_otg_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300567 IOMUX_PADS(PAD_EIM_D22__USB_OTG_PWR | MUX_PAD_CTRL(NO_PAD_CTRL)),
568 IOMUX_PADS(PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL)),
Peng Fanc9498fa2014-12-02 09:55:27 +0800569};
570
571static iomux_v3_cfg_t const usb_hc1_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300572 IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Peng Fanc9498fa2014-12-02 09:55:27 +0800573};
574
575static void setup_usb(void)
576{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300577 SETUP_IOMUX_PADS(usb_otg_pads);
Peng Fanc9498fa2014-12-02 09:55:27 +0800578
579 /*
580 * set daisy chain for otg_pin_id on 6q.
581 * for 6dl, this bit is reserved
582 */
583 imx_iomux_set_gpr_register(1, 13, 1, 0);
584
Fabio Estevamc88f1672017-05-12 12:45:23 -0300585 SETUP_IOMUX_PADS(usb_hc1_pads);
Peng Fanc9498fa2014-12-02 09:55:27 +0800586}
587
588int board_ehci_hcd_init(int port)
589{
590 u32 *usbnc_usb_ctrl;
591
592 if (port > 1)
593 return -EINVAL;
594
595 usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET +
596 port * 4);
597
598 setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL);
599
600 return 0;
601}
602
603int board_ehci_power(int port, int on)
604{
605 switch (port) {
606 case 0:
607 break;
608 case 1:
609 if (on)
610 gpio_direction_output(IMX_GPIO_NR(1, 29), 1);
611 else
612 gpio_direction_output(IMX_GPIO_NR(1, 29), 0);
613 break;
614 default:
615 printf("MXC USB port %d not yet supported\n", port);
616 return -EINVAL;
617 }
618
619 return 0;
620}
621#endif
622
Fabio Estevam77e62892012-09-13 03:18:20 +0000623int board_early_init_f(void)
624{
625 setup_iomux_uart();
626
627 return 0;
628}
629
630int board_init(void)
631{
632 /* address of boot parameters */
633 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
634
Fabio Estevamd82dad42013-11-08 16:20:54 -0200635#ifdef CONFIG_MXC_SPI
636 setup_spi();
637#endif
Fabio Estevamc88f1672017-05-12 12:45:23 -0300638 if (is_mx6dq() || is_mx6dqp())
639 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
640 else
641 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
Fabio Estevam6f73a292017-09-22 23:45:28 -0300642#if defined(CONFIG_VIDEO_IPUV3)
643 setup_display();
644#endif
Peng Fanc9498fa2014-12-02 09:55:27 +0800645#ifdef CONFIG_USB_EHCI_MX6
646 setup_usb();
647#endif
648
Fabio Estevamba92ad62014-05-09 13:15:42 -0300649 return 0;
650}
651
Ye.Li75e02f92014-11-06 16:29:00 +0800652int power_init_board(void)
Fabio Estevamba92ad62014-05-09 13:15:42 -0300653{
654 struct pmic *p;
Fabio Estevameffbec12015-07-21 20:02:49 -0300655 unsigned int reg;
656 int ret;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300657
Ye.Li75e02f92014-11-06 16:29:00 +0800658 p = pfuze_common_init(I2C_PMIC);
659 if (!p)
660 return -ENODEV;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300661
Peng Fane5bcd4d2015-01-27 10:14:04 +0800662 ret = pfuze_mode_init(p, APS_PFM);
663 if (ret < 0)
664 return ret;
665
Fabio Estevamba92ad62014-05-09 13:15:42 -0300666 /* Increase VGEN3 from 2.5 to 2.8V */
667 pmic_reg_read(p, PFUZE100_VGEN3VOL, &reg);
Ye.Li75e02f92014-11-06 16:29:00 +0800668 reg &= ~LDO_VOL_MASK;
669 reg |= LDOB_2_80V;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300670 pmic_reg_write(p, PFUZE100_VGEN3VOL, reg);
671
672 /* Increase VGEN5 from 2.8 to 3V */
673 pmic_reg_read(p, PFUZE100_VGEN5VOL, &reg);
Ye.Li75e02f92014-11-06 16:29:00 +0800674 reg &= ~LDO_VOL_MASK;
675 reg |= LDOB_3_00V;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300676 pmic_reg_write(p, PFUZE100_VGEN5VOL, reg);
677
Fabio Estevam77e62892012-09-13 03:18:20 +0000678 return 0;
679}
680
Nikita Kiryanov00cd7382014-08-20 15:08:50 +0300681#ifdef CONFIG_MXC_SPI
682int board_spi_cs_gpio(unsigned bus, unsigned cs)
683{
684 return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
685}
686#endif
687
Otavio Salvador52863372013-03-16 08:05:07 +0000688#ifdef CONFIG_CMD_BMODE
689static const struct boot_mode board_boot_modes[] = {
690 /* 4 bit bus width */
691 {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
692 {"sd3", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
693 /* 8 bit bus width */
Ye Li4ea4a9b2016-01-30 11:53:42 +0800694 {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)},
Otavio Salvador52863372013-03-16 08:05:07 +0000695 {NULL, 0},
696};
697#endif
698
699int board_late_init(void)
700{
701#ifdef CONFIG_CMD_BMODE
702 add_board_boot_modes(board_boot_modes);
703#endif
Peng Fan04321fc2015-07-11 11:38:46 +0800704
705#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Simon Glass6a38e412017-08-03 12:22:09 -0600706 env_set("board_name", "SABRESD");
Peng Fan04321fc2015-07-11 11:38:46 +0800707
Peng Fane27c4db2015-10-15 18:05:59 +0800708 if (is_mx6dqp())
Simon Glass6a38e412017-08-03 12:22:09 -0600709 env_set("board_rev", "MX6QP");
Peng Fan4a597d02016-05-23 18:36:06 +0800710 else if (is_mx6dq())
Simon Glass6a38e412017-08-03 12:22:09 -0600711 env_set("board_rev", "MX6Q");
Peng Fan4a597d02016-05-23 18:36:06 +0800712 else if (is_mx6sdl())
Simon Glass6a38e412017-08-03 12:22:09 -0600713 env_set("board_rev", "MX6DL");
Peng Fan04321fc2015-07-11 11:38:46 +0800714#endif
715
Otavio Salvador52863372013-03-16 08:05:07 +0000716 return 0;
717}
718
Fabio Estevam77e62892012-09-13 03:18:20 +0000719int checkboard(void)
720{
Pierre Aubertec10aed2013-06-04 09:00:15 +0200721 puts("Board: MX6-SabreSD\n");
Fabio Estevam77e62892012-09-13 03:18:20 +0000722 return 0;
723}
John Tobias07491552014-11-12 14:27:45 -0800724
725#ifdef CONFIG_SPL_BUILD
Fabio Estevamc88f1672017-05-12 12:45:23 -0300726#include <asm/arch/mx6-ddr.h>
John Tobias07491552014-11-12 14:27:45 -0800727#include <spl.h>
728#include <libfdt.h>
729
Diego Dorta466016e2016-10-11 11:09:27 -0300730#ifdef CONFIG_SPL_OS_BOOT
731int spl_start_uboot(void)
732{
733 gpio_direction_input(KEY_VOL_UP);
734
735 /* Only enter in Falcon mode if KEY_VOL_UP is pressed */
736 return gpio_get_value(KEY_VOL_UP);
737}
738#endif
739
Fabio Estevamc6ecd0b2014-11-14 09:36:59 -0200740static void ccgr_init(void)
741{
742 struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
743
744 writel(0x00C03F3F, &ccm->CCGR0);
745 writel(0x0030FC03, &ccm->CCGR1);
746 writel(0x0FFFC000, &ccm->CCGR2);
747 writel(0x3FF00000, &ccm->CCGR3);
748 writel(0x00FFF300, &ccm->CCGR4);
749 writel(0x0F0000C3, &ccm->CCGR5);
750 writel(0x000003FF, &ccm->CCGR6);
751}
752
Fabio Estevam9b86c822016-09-26 09:14:25 -0300753static int mx6q_dcd_table[] = {
754 0x020e0798, 0x000C0000,
755 0x020e0758, 0x00000000,
756 0x020e0588, 0x00000030,
757 0x020e0594, 0x00000030,
758 0x020e056c, 0x00000030,
759 0x020e0578, 0x00000030,
760 0x020e074c, 0x00000030,
761 0x020e057c, 0x00000030,
762 0x020e058c, 0x00000000,
763 0x020e059c, 0x00000030,
764 0x020e05a0, 0x00000030,
765 0x020e078c, 0x00000030,
766 0x020e0750, 0x00020000,
767 0x020e05a8, 0x00000030,
768 0x020e05b0, 0x00000030,
769 0x020e0524, 0x00000030,
770 0x020e051c, 0x00000030,
771 0x020e0518, 0x00000030,
772 0x020e050c, 0x00000030,
773 0x020e05b8, 0x00000030,
774 0x020e05c0, 0x00000030,
775 0x020e0774, 0x00020000,
776 0x020e0784, 0x00000030,
777 0x020e0788, 0x00000030,
778 0x020e0794, 0x00000030,
779 0x020e079c, 0x00000030,
780 0x020e07a0, 0x00000030,
781 0x020e07a4, 0x00000030,
782 0x020e07a8, 0x00000030,
783 0x020e0748, 0x00000030,
784 0x020e05ac, 0x00000030,
785 0x020e05b4, 0x00000030,
786 0x020e0528, 0x00000030,
787 0x020e0520, 0x00000030,
788 0x020e0514, 0x00000030,
789 0x020e0510, 0x00000030,
790 0x020e05bc, 0x00000030,
791 0x020e05c4, 0x00000030,
792 0x021b0800, 0xa1390003,
793 0x021b080c, 0x001F001F,
794 0x021b0810, 0x001F001F,
795 0x021b480c, 0x001F001F,
796 0x021b4810, 0x001F001F,
797 0x021b083c, 0x43270338,
798 0x021b0840, 0x03200314,
799 0x021b483c, 0x431A032F,
800 0x021b4840, 0x03200263,
801 0x021b0848, 0x4B434748,
802 0x021b4848, 0x4445404C,
803 0x021b0850, 0x38444542,
804 0x021b4850, 0x4935493A,
805 0x021b081c, 0x33333333,
806 0x021b0820, 0x33333333,
807 0x021b0824, 0x33333333,
808 0x021b0828, 0x33333333,
809 0x021b481c, 0x33333333,
810 0x021b4820, 0x33333333,
811 0x021b4824, 0x33333333,
812 0x021b4828, 0x33333333,
813 0x021b08b8, 0x00000800,
814 0x021b48b8, 0x00000800,
815 0x021b0004, 0x00020036,
816 0x021b0008, 0x09444040,
817 0x021b000c, 0x555A7975,
818 0x021b0010, 0xFF538F64,
819 0x021b0014, 0x01FF00DB,
820 0x021b0018, 0x00001740,
821 0x021b001c, 0x00008000,
822 0x021b002c, 0x000026d2,
823 0x021b0030, 0x005A1023,
824 0x021b0040, 0x00000027,
825 0x021b0000, 0x831A0000,
826 0x021b001c, 0x04088032,
827 0x021b001c, 0x00008033,
828 0x021b001c, 0x00048031,
829 0x021b001c, 0x09408030,
830 0x021b001c, 0x04008040,
831 0x021b0020, 0x00005800,
832 0x021b0818, 0x00011117,
833 0x021b4818, 0x00011117,
834 0x021b0004, 0x00025576,
835 0x021b0404, 0x00011006,
836 0x021b001c, 0x00000000,
837};
838
839static int mx6qp_dcd_table[] = {
840 0x020e0798, 0x000c0000,
841 0x020e0758, 0x00000000,
842 0x020e0588, 0x00000030,
843 0x020e0594, 0x00000030,
844 0x020e056c, 0x00000030,
845 0x020e0578, 0x00000030,
846 0x020e074c, 0x00000030,
847 0x020e057c, 0x00000030,
848 0x020e058c, 0x00000000,
849 0x020e059c, 0x00000030,
850 0x020e05a0, 0x00000030,
851 0x020e078c, 0x00000030,
852 0x020e0750, 0x00020000,
853 0x020e05a8, 0x00000030,
854 0x020e05b0, 0x00000030,
855 0x020e0524, 0x00000030,
856 0x020e051c, 0x00000030,
857 0x020e0518, 0x00000030,
858 0x020e050c, 0x00000030,
859 0x020e05b8, 0x00000030,
860 0x020e05c0, 0x00000030,
861 0x020e0774, 0x00020000,
862 0x020e0784, 0x00000030,
863 0x020e0788, 0x00000030,
864 0x020e0794, 0x00000030,
865 0x020e079c, 0x00000030,
866 0x020e07a0, 0x00000030,
867 0x020e07a4, 0x00000030,
868 0x020e07a8, 0x00000030,
869 0x020e0748, 0x00000030,
870 0x020e05ac, 0x00000030,
871 0x020e05b4, 0x00000030,
872 0x020e0528, 0x00000030,
873 0x020e0520, 0x00000030,
874 0x020e0514, 0x00000030,
875 0x020e0510, 0x00000030,
876 0x020e05bc, 0x00000030,
877 0x020e05c4, 0x00000030,
878 0x021b0800, 0xa1390003,
879 0x021b080c, 0x001b001e,
880 0x021b0810, 0x002e0029,
881 0x021b480c, 0x001b002a,
882 0x021b4810, 0x0019002c,
883 0x021b083c, 0x43240334,
884 0x021b0840, 0x0324031a,
885 0x021b483c, 0x43340344,
886 0x021b4840, 0x03280276,
887 0x021b0848, 0x44383A3E,
888 0x021b4848, 0x3C3C3846,
889 0x021b0850, 0x2e303230,
890 0x021b4850, 0x38283E34,
891 0x021b081c, 0x33333333,
892 0x021b0820, 0x33333333,
893 0x021b0824, 0x33333333,
894 0x021b0828, 0x33333333,
895 0x021b481c, 0x33333333,
896 0x021b4820, 0x33333333,
897 0x021b4824, 0x33333333,
898 0x021b4828, 0x33333333,
899 0x021b08c0, 0x24912249,
900 0x021b48c0, 0x24914289,
901 0x021b08b8, 0x00000800,
902 0x021b48b8, 0x00000800,
903 0x021b0004, 0x00020036,
904 0x021b0008, 0x24444040,
905 0x021b000c, 0x555A7955,
906 0x021b0010, 0xFF320F64,
907 0x021b0014, 0x01ff00db,
908 0x021b0018, 0x00001740,
909 0x021b001c, 0x00008000,
910 0x021b002c, 0x000026d2,
911 0x021b0030, 0x005A1023,
912 0x021b0040, 0x00000027,
913 0x021b0400, 0x14420000,
914 0x021b0000, 0x831A0000,
915 0x021b0890, 0x00400C58,
916 0x00bb0008, 0x00000000,
917 0x00bb000c, 0x2891E41A,
918 0x00bb0038, 0x00000564,
919 0x00bb0014, 0x00000040,
920 0x00bb0028, 0x00000020,
921 0x00bb002c, 0x00000020,
922 0x021b001c, 0x04088032,
923 0x021b001c, 0x00008033,
924 0x021b001c, 0x00048031,
925 0x021b001c, 0x09408030,
926 0x021b001c, 0x04008040,
927 0x021b0020, 0x00005800,
928 0x021b0818, 0x00011117,
929 0x021b4818, 0x00011117,
930 0x021b0004, 0x00025576,
931 0x021b0404, 0x00011006,
932 0x021b001c, 0x00000000,
933};
934
Fabio Estevam15cb6b12017-05-12 12:45:24 -0300935static int mx6dl_dcd_table[] = {
936 0x020e0774, 0x000C0000,
937 0x020e0754, 0x00000000,
938 0x020e04ac, 0x00000030,
939 0x020e04b0, 0x00000030,
940 0x020e0464, 0x00000030,
941 0x020e0490, 0x00000030,
942 0x020e074c, 0x00000030,
943 0x020e0494, 0x00000030,
944 0x020e04a0, 0x00000000,
945 0x020e04b4, 0x00000030,
946 0x020e04b8, 0x00000030,
947 0x020e076c, 0x00000030,
948 0x020e0750, 0x00020000,
949 0x020e04bc, 0x00000030,
950 0x020e04c0, 0x00000030,
951 0x020e04c4, 0x00000030,
952 0x020e04c8, 0x00000030,
953 0x020e04cc, 0x00000030,
954 0x020e04d0, 0x00000030,
955 0x020e04d4, 0x00000030,
956 0x020e04d8, 0x00000030,
957 0x020e0760, 0x00020000,
958 0x020e0764, 0x00000030,
959 0x020e0770, 0x00000030,
960 0x020e0778, 0x00000030,
961 0x020e077c, 0x00000030,
962 0x020e0780, 0x00000030,
963 0x020e0784, 0x00000030,
964 0x020e078c, 0x00000030,
965 0x020e0748, 0x00000030,
966 0x020e0470, 0x00000030,
967 0x020e0474, 0x00000030,
968 0x020e0478, 0x00000030,
969 0x020e047c, 0x00000030,
970 0x020e0480, 0x00000030,
971 0x020e0484, 0x00000030,
972 0x020e0488, 0x00000030,
973 0x020e048c, 0x00000030,
974 0x021b0800, 0xa1390003,
975 0x021b080c, 0x001F001F,
976 0x021b0810, 0x001F001F,
977 0x021b480c, 0x001F001F,
978 0x021b4810, 0x001F001F,
979 0x021b083c, 0x4220021F,
980 0x021b0840, 0x0207017E,
981 0x021b483c, 0x4201020C,
982 0x021b4840, 0x01660172,
983 0x021b0848, 0x4A4D4E4D,
984 0x021b4848, 0x4A4F5049,
985 0x021b0850, 0x3F3C3D31,
986 0x021b4850, 0x3238372B,
987 0x021b081c, 0x33333333,
988 0x021b0820, 0x33333333,
989 0x021b0824, 0x33333333,
990 0x021b0828, 0x33333333,
991 0x021b481c, 0x33333333,
992 0x021b4820, 0x33333333,
993 0x021b4824, 0x33333333,
994 0x021b4828, 0x33333333,
995 0x021b08b8, 0x00000800,
996 0x021b48b8, 0x00000800,
997 0x021b0004, 0x0002002D,
998 0x021b0008, 0x00333030,
999 0x021b000c, 0x3F435313,
1000 0x021b0010, 0xB66E8B63,
1001 0x021b0014, 0x01FF00DB,
1002 0x021b0018, 0x00001740,
1003 0x021b001c, 0x00008000,
1004 0x021b002c, 0x000026d2,
1005 0x021b0030, 0x00431023,
1006 0x021b0040, 0x00000027,
1007 0x021b0000, 0x831A0000,
1008 0x021b001c, 0x04008032,
1009 0x021b001c, 0x00008033,
1010 0x021b001c, 0x00048031,
1011 0x021b001c, 0x05208030,
1012 0x021b001c, 0x04008040,
1013 0x021b0020, 0x00005800,
1014 0x021b0818, 0x00011117,
1015 0x021b4818, 0x00011117,
1016 0x021b0004, 0x0002556D,
1017 0x021b0404, 0x00011006,
1018 0x021b001c, 0x00000000,
1019};
1020
Fabio Estevam9b86c822016-09-26 09:14:25 -03001021static void ddr_init(int *table, int size)
John Tobias07491552014-11-12 14:27:45 -08001022{
Fabio Estevam9b86c822016-09-26 09:14:25 -03001023 int i;
John Tobias07491552014-11-12 14:27:45 -08001024
Fabio Estevam9b86c822016-09-26 09:14:25 -03001025 for (i = 0; i < size / 2 ; i++)
1026 writel(table[2 * i + 1], table[2 * i]);
John Tobias07491552014-11-12 14:27:45 -08001027}
1028
Fabio Estevam9b86c822016-09-26 09:14:25 -03001029static void spl_dram_init(void)
1030{
1031 if (is_mx6dq())
1032 ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
1033 else if (is_mx6dqp())
1034 ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
Fabio Estevam15cb6b12017-05-12 12:45:24 -03001035 else if (is_mx6sdl())
1036 ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
Fabio Estevam9b86c822016-09-26 09:14:25 -03001037}
1038
John Tobias07491552014-11-12 14:27:45 -08001039void board_init_f(ulong dummy)
1040{
Fabio Estevam9b86c822016-09-26 09:14:25 -03001041 /* DDR initialization */
1042 spl_dram_init();
1043
John Tobias07491552014-11-12 14:27:45 -08001044 /* setup AIPS and disable watchdog */
1045 arch_cpu_init();
1046
Fabio Estevamc6ecd0b2014-11-14 09:36:59 -02001047 ccgr_init();
1048 gpr_init();
1049
John Tobias07491552014-11-12 14:27:45 -08001050 /* iomux and setup of i2c */
1051 board_early_init_f();
1052
1053 /* setup GP timer */
1054 timer_init();
1055
1056 /* UART clocks enabled and gd valid - init serial console */
1057 preloader_console_init();
1058
John Tobias07491552014-11-12 14:27:45 -08001059 /* Clear the BSS. */
1060 memset(__bss_start, 0, __bss_end - __bss_start);
1061
1062 /* load/boot image from boot device */
1063 board_init_r(NULL, 0);
1064}
John Tobias07491552014-11-12 14:27:45 -08001065#endif