blob: bb066a5d36c348a2295af4bf9f3f3cfe65cc0fcd [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 Glass2dc9c342020-05-10 11:40:01 -06008#include <image.h>
Simon Glassa7b51302019-11-14 12:57:46 -07009#include <init.h>
Fabio Estevam77e62892012-09-13 03:18:20 +000010#include <asm/arch/clock.h>
11#include <asm/arch/imx-regs.h>
12#include <asm/arch/iomux.h>
Pierre Aubertec10aed2013-06-04 09:00:15 +020013#include <asm/arch/mx6-pins.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060014#include <asm/global_data.h>
Diego Dorta5433ebb2017-09-27 13:12:38 -030015#include <asm/mach-imx/spi.h>
Shiji Yangbb112342023-08-03 09:47:16 +080016#include <asm/sections.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060017#include <env.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090018#include <linux/errno.h>
Fabio Estevam77e62892012-09-13 03:18:20 +000019#include <asm/gpio.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020020#include <asm/mach-imx/iomux-v3.h>
21#include <asm/mach-imx/boot_mode.h>
22#include <asm/mach-imx/video.h>
Fabio Estevam77e62892012-09-13 03:18:20 +000023#include <mmc.h>
Yangbo Lu73340382019-06-21 11:42:28 +080024#include <fsl_esdhc_imx.h>
Fabio Estevam77e62892012-09-13 03:18:20 +000025#include <miiphy.h>
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -050026#include <asm/arch/mxc_hdmi.h>
27#include <asm/arch/crm_regs.h>
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -050028#include <asm/io.h>
29#include <asm/arch/sys_proto.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
Fabio Estevamd82dad42013-11-08 16:20:54 -020047#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
48 PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
49
Fabio Estevam0d29cee2014-10-21 21:14:53 -020050#define DISP0_PWR_EN IMX_GPIO_NR(1, 21)
51
Diego Dorta466016e2016-10-11 11:09:27 -030052#define KEY_VOL_UP IMX_GPIO_NR(1, 4)
53
Fabio Estevam77e62892012-09-13 03:18:20 +000054int dram_init(void)
55{
John Tobias07491552014-11-12 14:27:45 -080056 gd->ram_size = imx_ddr_size();
Fabio Estevam77e62892012-09-13 03:18:20 +000057 return 0;
58}
59
Fabio Estevamf533c2e2014-11-06 12:24:25 -020060static iomux_v3_cfg_t const uart1_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -030061 IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
62 IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
Fabio Estevam77e62892012-09-13 03:18:20 +000063};
64
Fabio Estevamf533c2e2014-11-06 12:24:25 -020065static iomux_v3_cfg_t const usdhc2_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -030066 IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
67 IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
68 IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
69 IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
70 IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
71 IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
72 IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
73 IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
74 IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
75 IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
76 IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
Shawn Guo7e5e8332012-12-30 14:14:59 +000077};
78
Fabio Estevamf533c2e2014-11-06 12:24:25 -020079static iomux_v3_cfg_t const usdhc3_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -030080 IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
81 IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
82 IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
83 IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
84 IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
85 IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
86 IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
87 IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
88 IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
89 IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
90 IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
Fabio Estevam77e62892012-09-13 03:18:20 +000091};
92
Fabio Estevamf533c2e2014-11-06 12:24:25 -020093static iomux_v3_cfg_t const usdhc4_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -030094 IOMUX_PADS(PAD_SD4_CLK__SD4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
95 IOMUX_PADS(PAD_SD4_CMD__SD4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
96 IOMUX_PADS(PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
97 IOMUX_PADS(PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
98 IOMUX_PADS(PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
99 IOMUX_PADS(PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
100 IOMUX_PADS(PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
101 IOMUX_PADS(PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
102 IOMUX_PADS(PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
103 IOMUX_PADS(PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
Shawn Guo7e5e8332012-12-30 14:14:59 +0000104};
105
Fabio Estevamf533c2e2014-11-06 12:24:25 -0200106static iomux_v3_cfg_t const ecspi1_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300107 IOMUX_PADS(PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
108 IOMUX_PADS(PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
109 IOMUX_PADS(PAD_KEY_ROW0__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)),
110 IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevamd82dad42013-11-08 16:20:54 -0200111};
112
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200113static iomux_v3_cfg_t const rgb_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300114 IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL)),
115 IOMUX_PADS(PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
116 IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
117 IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
118 IOMUX_PADS(PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
119 IOMUX_PADS(PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
120 IOMUX_PADS(PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
121 IOMUX_PADS(PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
122 IOMUX_PADS(PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
123 IOMUX_PADS(PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
124 IOMUX_PADS(PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
125 IOMUX_PADS(PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
126 IOMUX_PADS(PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
127 IOMUX_PADS(PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL)),
128 IOMUX_PADS(PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
129 IOMUX_PADS(PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL)),
130 IOMUX_PADS(PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL)),
131 IOMUX_PADS(PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL)),
132 IOMUX_PADS(PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL)),
133 IOMUX_PADS(PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL)),
134 IOMUX_PADS(PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
135 IOMUX_PADS(PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL)),
136 IOMUX_PADS(PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL)),
137 IOMUX_PADS(PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
138 IOMUX_PADS(PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
139 IOMUX_PADS(PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL)),
140 IOMUX_PADS(PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
141 IOMUX_PADS(PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL)),
142 IOMUX_PADS(PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Marco Franchi029d07f2016-06-08 15:05:31 -0300143};
144
145static iomux_v3_cfg_t const bl_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300146 IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200147};
148
Marco Franchi029d07f2016-06-08 15:05:31 -0300149static void enable_backlight(void)
150{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300151 SETUP_IOMUX_PADS(bl_pads);
Abel Vesa78d974e2019-02-01 16:40:19 +0000152 gpio_request(DISP0_PWR_EN, "Display Power Enable");
Marco Franchi029d07f2016-06-08 15:05:31 -0300153 gpio_direction_output(DISP0_PWR_EN, 1);
154}
155
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200156static void enable_rgb(struct display_info_t const *dev)
157{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300158 SETUP_IOMUX_PADS(rgb_pads);
Marco Franchi029d07f2016-06-08 15:05:31 -0300159 enable_backlight();
160}
161
162static void enable_lvds(struct display_info_t const *dev)
163{
164 enable_backlight();
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200165}
166
Fabio Estevamd82dad42013-11-08 16:20:54 -0200167static void setup_spi(void)
168{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300169 SETUP_IOMUX_PADS(ecspi1_pads);
Fabio Estevamd82dad42013-11-08 16:20:54 -0200170}
171
Fabio Estevamdee3c842013-12-04 01:08:16 -0200172iomux_v3_cfg_t const di0_pads[] = {
Fabio Estevamc88f1672017-05-12 12:45:23 -0300173 IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK), /* DISP0_CLK */
174 IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02), /* DISP0_HSYNC */
175 IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03), /* DISP0_VSYNC */
Fabio Estevamdee3c842013-12-04 01:08:16 -0200176};
177
Fabio Estevam77e62892012-09-13 03:18:20 +0000178static void setup_iomux_uart(void)
179{
Fabio Estevamc88f1672017-05-12 12:45:23 -0300180 SETUP_IOMUX_PADS(uart1_pads);
Fabio Estevam77e62892012-09-13 03:18:20 +0000181}
182
Yangbo Lu73340382019-06-21 11:42:28 +0800183#ifdef CONFIG_FSL_ESDHC_IMX
Shawn Guo7e5e8332012-12-30 14:14:59 +0000184struct fsl_esdhc_cfg usdhc_cfg[3] = {
185 {USDHC2_BASE_ADDR},
Fabio Estevam77e62892012-09-13 03:18:20 +0000186 {USDHC3_BASE_ADDR},
Shawn Guo7e5e8332012-12-30 14:14:59 +0000187 {USDHC4_BASE_ADDR},
Fabio Estevam77e62892012-09-13 03:18:20 +0000188};
189
Shawn Guo7e5e8332012-12-30 14:14:59 +0000190#define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2)
191#define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0)
192
Peng Fan03a43df2016-01-28 16:51:27 +0800193int board_mmc_get_env_dev(int devno)
194{
195 return devno - 1;
196}
197
Fabio Estevam77e62892012-09-13 03:18:20 +0000198int board_mmc_getcd(struct mmc *mmc)
199{
Shawn Guo7e5e8332012-12-30 14:14:59 +0000200 struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000201 int ret = 0;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000202
203 switch (cfg->esdhc_base) {
204 case USDHC2_BASE_ADDR:
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000205 ret = !gpio_get_value(USDHC2_CD_GPIO);
206 break;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000207 case USDHC3_BASE_ADDR:
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000208 ret = !gpio_get_value(USDHC3_CD_GPIO);
209 break;
210 case USDHC4_BASE_ADDR:
211 ret = 1; /* eMMC/uSDHC4 is always present */
212 break;
Shawn Guo7e5e8332012-12-30 14:14:59 +0000213 }
Otavio Salvadorc2bed642013-03-16 08:05:06 +0000214
215 return ret;
Fabio Estevam77e62892012-09-13 03:18:20 +0000216}
217
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900218int board_mmc_init(struct bd_info *bis)
Fabio Estevam77e62892012-09-13 03:18:20 +0000219{
Fabio Estevam56cf36a2014-11-18 11:26:06 -0200220 struct src *psrc = (struct src *)SRC_BASE_ADDR;
221 unsigned reg = readl(&psrc->sbmr1) >> 11;
John Tobias07491552014-11-12 14:27:45 -0800222 /*
223 * Upon reading BOOT_CFG register the following map is done:
224 * Bit 11 and 12 of BOOT_CFG register can determine the current
225 * mmc port
226 * 0x1 SD1
227 * 0x2 SD2
228 * 0x3 SD4
229 */
230
231 switch (reg & 0x3) {
232 case 0x1:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300233 SETUP_IOMUX_PADS(usdhc2_pads);
John Tobias07491552014-11-12 14:27:45 -0800234 usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
235 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
236 gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
237 break;
238 case 0x2:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300239 SETUP_IOMUX_PADS(usdhc3_pads);
John Tobias07491552014-11-12 14:27:45 -0800240 usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
241 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
242 gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
243 break;
244 case 0x3:
Fabio Estevamc88f1672017-05-12 12:45:23 -0300245 SETUP_IOMUX_PADS(usdhc4_pads);
John Tobias07491552014-11-12 14:27:45 -0800246 usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR;
247 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
248 gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
249 break;
250 }
251
252 return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
Fabio Estevam77e62892012-09-13 03:18:20 +0000253}
254#endif
255
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500256#if defined(CONFIG_VIDEO_IPUV3)
Fabio Estevam70f84b52013-11-25 10:34:26 -0200257static void disable_lvds(struct display_info_t const *dev)
258{
259 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
260
261 int reg = readl(&iomux->gpr[2]);
262
263 reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
264 IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
265
266 writel(reg, &iomux->gpr[2]);
267}
268
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300269static void do_enable_hdmi(struct display_info_t const *dev)
270{
Fabio Estevam70f84b52013-11-25 10:34:26 -0200271 disable_lvds(dev);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300272 imx_enable_hdmi_phy();
273}
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500274
Eric Benardd6cabb22014-04-04 19:05:54 +0200275struct display_info_t const displays[] = {{
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300276 .bus = -1,
277 .addr = 0,
Fabio Estevam7d66d562013-12-04 01:08:17 -0200278 .pixfmt = IPU_PIX_FMT_RGB666,
Fabio Estevam70f84b52013-11-25 10:34:26 -0200279 .detect = NULL,
Marco Franchi029d07f2016-06-08 15:05:31 -0300280 .enable = enable_lvds,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300281 .mode = {
Fabio Estevam70f84b52013-11-25 10:34:26 -0200282 .name = "Hannstar-XGA",
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300283 .refresh = 60,
284 .xres = 1024,
285 .yres = 768,
Fabio Estevame2b20032016-03-16 12:55:03 -0300286 .pixclock = 15384,
287 .left_margin = 160,
288 .right_margin = 24,
289 .upper_margin = 29,
290 .lower_margin = 3,
291 .hsync_len = 136,
292 .vsync_len = 6,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300293 .sync = FB_SYNC_EXT,
294 .vmode = FB_VMODE_NONINTERLACED
295} }, {
296 .bus = -1,
297 .addr = 0,
Fabio Estevam70f84b52013-11-25 10:34:26 -0200298 .pixfmt = IPU_PIX_FMT_RGB24,
299 .detect = detect_hdmi,
300 .enable = do_enable_hdmi,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300301 .mode = {
Fabio Estevam70f84b52013-11-25 10:34:26 -0200302 .name = "HDMI",
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300303 .refresh = 60,
304 .xres = 1024,
305 .yres = 768,
Fabio Estevame2b20032016-03-16 12:55:03 -0300306 .pixclock = 15384,
307 .left_margin = 160,
308 .right_margin = 24,
309 .upper_margin = 29,
310 .lower_margin = 3,
311 .hsync_len = 136,
312 .vsync_len = 6,
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300313 .sync = FB_SYNC_EXT,
314 .vmode = FB_VMODE_NONINTERLACED
Fabio Estevam0d29cee2014-10-21 21:14:53 -0200315} }, {
316 .bus = 0,
317 .addr = 0,
318 .pixfmt = IPU_PIX_FMT_RGB24,
319 .detect = NULL,
320 .enable = enable_rgb,
321 .mode = {
322 .name = "SEIKO-WVGA",
323 .refresh = 60,
324 .xres = 800,
325 .yres = 480,
326 .pixclock = 29850,
327 .left_margin = 89,
328 .right_margin = 164,
329 .upper_margin = 23,
330 .lower_margin = 10,
331 .hsync_len = 10,
332 .vsync_len = 10,
333 .sync = 0,
334 .vmode = FB_VMODE_NONINTERLACED
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300335} } };
Eric Benardd6cabb22014-04-04 19:05:54 +0200336size_t display_count = ARRAY_SIZE(displays);
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500337
338static void setup_display(void)
339{
340 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300341 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500342 int reg;
343
Fabio Estevamdee3c842013-12-04 01:08:16 -0200344 /* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */
Fabio Estevamc88f1672017-05-12 12:45:23 -0300345 SETUP_IOMUX_PADS(di0_pads);
Fabio Estevamdee3c842013-12-04 01:08:16 -0200346
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500347 enable_ipu_clock();
348 imx_setup_hdmi();
349
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300350 /* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */
Liu Ying6f450632013-11-29 22:38:39 +0800351 reg = readl(&mxc_ccm->CCGR3);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300352 reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
353 writel(reg, &mxc_ccm->CCGR3);
354
355 /* set LDB0, LDB1 clk select to 011/011 */
356 reg = readl(&mxc_ccm->cs2cdr);
357 reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
358 | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
359 reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
360 | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
361 writel(reg, &mxc_ccm->cs2cdr);
362
363 reg = readl(&mxc_ccm->cscmr2);
364 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
365 writel(reg, &mxc_ccm->cscmr2);
366
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500367 reg = readl(&mxc_ccm->chsccdr);
368 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
369 << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300370 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
371 << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500372 writel(reg, &mxc_ccm->chsccdr);
Fabio Estevam9e642cd2013-09-04 15:12:38 -0300373
374 reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
375 | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW
376 | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
377 | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
378 | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
379 | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
380 | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
381 | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED
382 | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0;
383 writel(reg, &iomux->gpr[2]);
384
385 reg = readl(&iomux->gpr[3]);
386 reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK
387 | IOMUXC_GPR3_HDMI_MUX_CTL_MASK))
388 | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
389 << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET);
390 writel(reg, &iomux->gpr[3]);
Pardeep Kumar Singla0b87ba02013-07-25 12:12:14 -0500391}
392#endif /* CONFIG_VIDEO_IPUV3 */
393
394/*
395 * Do not overwrite the console
396 * Use always serial for U-Boot console
397 */
398int overwrite_console(void)
399{
400 return 1;
401}
402
Peng Fanc9498fa2014-12-02 09:55:27 +0800403#ifdef CONFIG_USB_EHCI_MX6
Peng Fanc9498fa2014-12-02 09:55:27 +0800404static void setup_usb(void)
405{
Peng Fanc9498fa2014-12-02 09:55:27 +0800406 /*
407 * set daisy chain for otg_pin_id on 6q.
408 * for 6dl, this bit is reserved
409 */
410 imx_iomux_set_gpr_register(1, 13, 1, 0);
Peng Fanc9498fa2014-12-02 09:55:27 +0800411}
412#endif
413
Fabio Estevam77e62892012-09-13 03:18:20 +0000414int board_early_init_f(void)
415{
416 setup_iomux_uart();
417
418 return 0;
419}
420
421int board_init(void)
422{
423 /* address of boot parameters */
424 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
425
Fabio Estevamd82dad42013-11-08 16:20:54 -0200426#ifdef CONFIG_MXC_SPI
427 setup_spi();
428#endif
Fabio Estevam1b98b212023-02-16 07:08:49 -0300429
Fabio Estevam6f73a292017-09-22 23:45:28 -0300430#if defined(CONFIG_VIDEO_IPUV3)
431 setup_display();
432#endif
Peng Fanc9498fa2014-12-02 09:55:27 +0800433#ifdef CONFIG_USB_EHCI_MX6
434 setup_usb();
435#endif
436
Fabio Estevamba92ad62014-05-09 13:15:42 -0300437 return 0;
438}
439
Ye.Li75e02f92014-11-06 16:29:00 +0800440int power_init_board(void)
Fabio Estevamba92ad62014-05-09 13:15:42 -0300441{
Fabio Estevam1b98b212023-02-16 07:08:49 -0300442 struct udevice *dev;
Fabio Estevameffbec12015-07-21 20:02:49 -0300443 unsigned int reg;
444 int ret;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300445
Fabio Estevam1b98b212023-02-16 07:08:49 -0300446 ret = pmic_get("pfuze100@8", &dev);
447 if (ret == -ENODEV)
448 return 0;
449
450 if (ret != 0)
451 return ret;
Fabio Estevamba92ad62014-05-09 13:15:42 -0300452
Fabio Estevam1b98b212023-02-16 07:08:49 -0300453 ret = pfuze_mode_init(dev, APS_PFM);
Peng Fane5bcd4d2015-01-27 10:14:04 +0800454 if (ret < 0)
455 return ret;
456
Fabio Estevamba92ad62014-05-09 13:15:42 -0300457 /* Increase VGEN3 from 2.5 to 2.8V */
Fabio Estevam1b98b212023-02-16 07:08:49 -0300458 reg = pmic_reg_read(dev, PFUZE100_VGEN3VOL);
Ye.Li75e02f92014-11-06 16:29:00 +0800459 reg &= ~LDO_VOL_MASK;
460 reg |= LDOB_2_80V;
Fabio Estevam1b98b212023-02-16 07:08:49 -0300461 pmic_reg_write(dev, PFUZE100_VGEN3VOL, reg);
Fabio Estevamba92ad62014-05-09 13:15:42 -0300462
463 /* Increase VGEN5 from 2.8 to 3V */
Fabio Estevam1b98b212023-02-16 07:08:49 -0300464 reg = pmic_reg_read(dev, PFUZE100_VGEN5VOL);
Ye.Li75e02f92014-11-06 16:29:00 +0800465 reg &= ~LDO_VOL_MASK;
466 reg |= LDOB_3_00V;
Fabio Estevam1b98b212023-02-16 07:08:49 -0300467 pmic_reg_write(dev, PFUZE100_VGEN5VOL, reg);
Fabio Estevamba92ad62014-05-09 13:15:42 -0300468
Fabio Estevam77e62892012-09-13 03:18:20 +0000469 return 0;
470}
471
Nikita Kiryanov00cd7382014-08-20 15:08:50 +0300472#ifdef CONFIG_MXC_SPI
473int board_spi_cs_gpio(unsigned bus, unsigned cs)
474{
475 return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
476}
477#endif
478
Otavio Salvador52863372013-03-16 08:05:07 +0000479#ifdef CONFIG_CMD_BMODE
480static const struct boot_mode board_boot_modes[] = {
481 /* 4 bit bus width */
482 {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
483 {"sd3", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
484 /* 8 bit bus width */
Ye Li4ea4a9b2016-01-30 11:53:42 +0800485 {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)},
Otavio Salvador52863372013-03-16 08:05:07 +0000486 {NULL, 0},
487};
488#endif
489
490int board_late_init(void)
491{
492#ifdef CONFIG_CMD_BMODE
493 add_board_boot_modes(board_boot_modes);
494#endif
Peng Fan04321fc2015-07-11 11:38:46 +0800495
496#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Simon Glass6a38e412017-08-03 12:22:09 -0600497 env_set("board_name", "SABRESD");
Peng Fan04321fc2015-07-11 11:38:46 +0800498
Peng Fane27c4db2015-10-15 18:05:59 +0800499 if (is_mx6dqp())
Simon Glass6a38e412017-08-03 12:22:09 -0600500 env_set("board_rev", "MX6QP");
Peng Fan4a597d02016-05-23 18:36:06 +0800501 else if (is_mx6dq())
Simon Glass6a38e412017-08-03 12:22:09 -0600502 env_set("board_rev", "MX6Q");
Peng Fan4a597d02016-05-23 18:36:06 +0800503 else if (is_mx6sdl())
Simon Glass6a38e412017-08-03 12:22:09 -0600504 env_set("board_rev", "MX6DL");
Peng Fan04321fc2015-07-11 11:38:46 +0800505#endif
506
Otavio Salvador52863372013-03-16 08:05:07 +0000507 return 0;
508}
509
John Tobias07491552014-11-12 14:27:45 -0800510#ifdef CONFIG_SPL_BUILD
Fabio Estevamc88f1672017-05-12 12:45:23 -0300511#include <asm/arch/mx6-ddr.h>
John Tobias07491552014-11-12 14:27:45 -0800512#include <spl.h>
Masahiro Yamada75f82d02018-03-05 01:20:11 +0900513#include <linux/libfdt.h>
John Tobias07491552014-11-12 14:27:45 -0800514
Diego Dorta466016e2016-10-11 11:09:27 -0300515#ifdef CONFIG_SPL_OS_BOOT
516int spl_start_uboot(void)
517{
Abel Vesa78d974e2019-02-01 16:40:19 +0000518 gpio_request(KEY_VOL_UP, "KEY Volume UP");
Diego Dorta466016e2016-10-11 11:09:27 -0300519 gpio_direction_input(KEY_VOL_UP);
520
521 /* Only enter in Falcon mode if KEY_VOL_UP is pressed */
522 return gpio_get_value(KEY_VOL_UP);
523}
524#endif
525
Fabio Estevamc6ecd0b2014-11-14 09:36:59 -0200526static void ccgr_init(void)
527{
528 struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
529
530 writel(0x00C03F3F, &ccm->CCGR0);
531 writel(0x0030FC03, &ccm->CCGR1);
532 writel(0x0FFFC000, &ccm->CCGR2);
533 writel(0x3FF00000, &ccm->CCGR3);
534 writel(0x00FFF300, &ccm->CCGR4);
535 writel(0x0F0000C3, &ccm->CCGR5);
536 writel(0x000003FF, &ccm->CCGR6);
537}
538
Fabio Estevam9b86c822016-09-26 09:14:25 -0300539static int mx6q_dcd_table[] = {
540 0x020e0798, 0x000C0000,
541 0x020e0758, 0x00000000,
542 0x020e0588, 0x00000030,
543 0x020e0594, 0x00000030,
544 0x020e056c, 0x00000030,
545 0x020e0578, 0x00000030,
546 0x020e074c, 0x00000030,
547 0x020e057c, 0x00000030,
548 0x020e058c, 0x00000000,
549 0x020e059c, 0x00000030,
550 0x020e05a0, 0x00000030,
551 0x020e078c, 0x00000030,
552 0x020e0750, 0x00020000,
553 0x020e05a8, 0x00000030,
554 0x020e05b0, 0x00000030,
555 0x020e0524, 0x00000030,
556 0x020e051c, 0x00000030,
557 0x020e0518, 0x00000030,
558 0x020e050c, 0x00000030,
559 0x020e05b8, 0x00000030,
560 0x020e05c0, 0x00000030,
561 0x020e0774, 0x00020000,
562 0x020e0784, 0x00000030,
563 0x020e0788, 0x00000030,
564 0x020e0794, 0x00000030,
565 0x020e079c, 0x00000030,
566 0x020e07a0, 0x00000030,
567 0x020e07a4, 0x00000030,
568 0x020e07a8, 0x00000030,
569 0x020e0748, 0x00000030,
570 0x020e05ac, 0x00000030,
571 0x020e05b4, 0x00000030,
572 0x020e0528, 0x00000030,
573 0x020e0520, 0x00000030,
574 0x020e0514, 0x00000030,
575 0x020e0510, 0x00000030,
576 0x020e05bc, 0x00000030,
577 0x020e05c4, 0x00000030,
578 0x021b0800, 0xa1390003,
579 0x021b080c, 0x001F001F,
580 0x021b0810, 0x001F001F,
581 0x021b480c, 0x001F001F,
582 0x021b4810, 0x001F001F,
583 0x021b083c, 0x43270338,
584 0x021b0840, 0x03200314,
585 0x021b483c, 0x431A032F,
586 0x021b4840, 0x03200263,
587 0x021b0848, 0x4B434748,
588 0x021b4848, 0x4445404C,
589 0x021b0850, 0x38444542,
590 0x021b4850, 0x4935493A,
591 0x021b081c, 0x33333333,
592 0x021b0820, 0x33333333,
593 0x021b0824, 0x33333333,
594 0x021b0828, 0x33333333,
595 0x021b481c, 0x33333333,
596 0x021b4820, 0x33333333,
597 0x021b4824, 0x33333333,
598 0x021b4828, 0x33333333,
599 0x021b08b8, 0x00000800,
600 0x021b48b8, 0x00000800,
601 0x021b0004, 0x00020036,
602 0x021b0008, 0x09444040,
603 0x021b000c, 0x555A7975,
604 0x021b0010, 0xFF538F64,
605 0x021b0014, 0x01FF00DB,
606 0x021b0018, 0x00001740,
607 0x021b001c, 0x00008000,
608 0x021b002c, 0x000026d2,
609 0x021b0030, 0x005A1023,
610 0x021b0040, 0x00000027,
611 0x021b0000, 0x831A0000,
612 0x021b001c, 0x04088032,
613 0x021b001c, 0x00008033,
614 0x021b001c, 0x00048031,
615 0x021b001c, 0x09408030,
616 0x021b001c, 0x04008040,
617 0x021b0020, 0x00005800,
618 0x021b0818, 0x00011117,
619 0x021b4818, 0x00011117,
620 0x021b0004, 0x00025576,
621 0x021b0404, 0x00011006,
622 0x021b001c, 0x00000000,
623};
624
625static int mx6qp_dcd_table[] = {
626 0x020e0798, 0x000c0000,
627 0x020e0758, 0x00000000,
628 0x020e0588, 0x00000030,
629 0x020e0594, 0x00000030,
630 0x020e056c, 0x00000030,
631 0x020e0578, 0x00000030,
632 0x020e074c, 0x00000030,
633 0x020e057c, 0x00000030,
634 0x020e058c, 0x00000000,
635 0x020e059c, 0x00000030,
636 0x020e05a0, 0x00000030,
637 0x020e078c, 0x00000030,
638 0x020e0750, 0x00020000,
639 0x020e05a8, 0x00000030,
640 0x020e05b0, 0x00000030,
641 0x020e0524, 0x00000030,
642 0x020e051c, 0x00000030,
643 0x020e0518, 0x00000030,
644 0x020e050c, 0x00000030,
645 0x020e05b8, 0x00000030,
646 0x020e05c0, 0x00000030,
647 0x020e0774, 0x00020000,
648 0x020e0784, 0x00000030,
649 0x020e0788, 0x00000030,
650 0x020e0794, 0x00000030,
651 0x020e079c, 0x00000030,
652 0x020e07a0, 0x00000030,
653 0x020e07a4, 0x00000030,
654 0x020e07a8, 0x00000030,
655 0x020e0748, 0x00000030,
656 0x020e05ac, 0x00000030,
657 0x020e05b4, 0x00000030,
658 0x020e0528, 0x00000030,
659 0x020e0520, 0x00000030,
660 0x020e0514, 0x00000030,
661 0x020e0510, 0x00000030,
662 0x020e05bc, 0x00000030,
663 0x020e05c4, 0x00000030,
664 0x021b0800, 0xa1390003,
665 0x021b080c, 0x001b001e,
666 0x021b0810, 0x002e0029,
667 0x021b480c, 0x001b002a,
668 0x021b4810, 0x0019002c,
669 0x021b083c, 0x43240334,
670 0x021b0840, 0x0324031a,
671 0x021b483c, 0x43340344,
672 0x021b4840, 0x03280276,
673 0x021b0848, 0x44383A3E,
674 0x021b4848, 0x3C3C3846,
675 0x021b0850, 0x2e303230,
676 0x021b4850, 0x38283E34,
677 0x021b081c, 0x33333333,
678 0x021b0820, 0x33333333,
679 0x021b0824, 0x33333333,
680 0x021b0828, 0x33333333,
681 0x021b481c, 0x33333333,
682 0x021b4820, 0x33333333,
683 0x021b4824, 0x33333333,
684 0x021b4828, 0x33333333,
685 0x021b08c0, 0x24912249,
686 0x021b48c0, 0x24914289,
687 0x021b08b8, 0x00000800,
688 0x021b48b8, 0x00000800,
689 0x021b0004, 0x00020036,
690 0x021b0008, 0x24444040,
691 0x021b000c, 0x555A7955,
692 0x021b0010, 0xFF320F64,
693 0x021b0014, 0x01ff00db,
694 0x021b0018, 0x00001740,
695 0x021b001c, 0x00008000,
696 0x021b002c, 0x000026d2,
697 0x021b0030, 0x005A1023,
698 0x021b0040, 0x00000027,
699 0x021b0400, 0x14420000,
700 0x021b0000, 0x831A0000,
701 0x021b0890, 0x00400C58,
702 0x00bb0008, 0x00000000,
703 0x00bb000c, 0x2891E41A,
704 0x00bb0038, 0x00000564,
705 0x00bb0014, 0x00000040,
706 0x00bb0028, 0x00000020,
707 0x00bb002c, 0x00000020,
708 0x021b001c, 0x04088032,
709 0x021b001c, 0x00008033,
710 0x021b001c, 0x00048031,
711 0x021b001c, 0x09408030,
712 0x021b001c, 0x04008040,
713 0x021b0020, 0x00005800,
714 0x021b0818, 0x00011117,
715 0x021b4818, 0x00011117,
716 0x021b0004, 0x00025576,
717 0x021b0404, 0x00011006,
718 0x021b001c, 0x00000000,
719};
720
Fabio Estevam15cb6b12017-05-12 12:45:24 -0300721static int mx6dl_dcd_table[] = {
722 0x020e0774, 0x000C0000,
723 0x020e0754, 0x00000000,
724 0x020e04ac, 0x00000030,
725 0x020e04b0, 0x00000030,
726 0x020e0464, 0x00000030,
727 0x020e0490, 0x00000030,
728 0x020e074c, 0x00000030,
729 0x020e0494, 0x00000030,
730 0x020e04a0, 0x00000000,
731 0x020e04b4, 0x00000030,
732 0x020e04b8, 0x00000030,
733 0x020e076c, 0x00000030,
734 0x020e0750, 0x00020000,
735 0x020e04bc, 0x00000030,
736 0x020e04c0, 0x00000030,
737 0x020e04c4, 0x00000030,
738 0x020e04c8, 0x00000030,
739 0x020e04cc, 0x00000030,
740 0x020e04d0, 0x00000030,
741 0x020e04d4, 0x00000030,
742 0x020e04d8, 0x00000030,
743 0x020e0760, 0x00020000,
744 0x020e0764, 0x00000030,
745 0x020e0770, 0x00000030,
746 0x020e0778, 0x00000030,
747 0x020e077c, 0x00000030,
748 0x020e0780, 0x00000030,
749 0x020e0784, 0x00000030,
750 0x020e078c, 0x00000030,
751 0x020e0748, 0x00000030,
752 0x020e0470, 0x00000030,
753 0x020e0474, 0x00000030,
754 0x020e0478, 0x00000030,
755 0x020e047c, 0x00000030,
756 0x020e0480, 0x00000030,
757 0x020e0484, 0x00000030,
758 0x020e0488, 0x00000030,
759 0x020e048c, 0x00000030,
760 0x021b0800, 0xa1390003,
761 0x021b080c, 0x001F001F,
762 0x021b0810, 0x001F001F,
763 0x021b480c, 0x001F001F,
764 0x021b4810, 0x001F001F,
765 0x021b083c, 0x4220021F,
766 0x021b0840, 0x0207017E,
767 0x021b483c, 0x4201020C,
768 0x021b4840, 0x01660172,
769 0x021b0848, 0x4A4D4E4D,
770 0x021b4848, 0x4A4F5049,
771 0x021b0850, 0x3F3C3D31,
772 0x021b4850, 0x3238372B,
773 0x021b081c, 0x33333333,
774 0x021b0820, 0x33333333,
775 0x021b0824, 0x33333333,
776 0x021b0828, 0x33333333,
777 0x021b481c, 0x33333333,
778 0x021b4820, 0x33333333,
779 0x021b4824, 0x33333333,
780 0x021b4828, 0x33333333,
781 0x021b08b8, 0x00000800,
782 0x021b48b8, 0x00000800,
783 0x021b0004, 0x0002002D,
784 0x021b0008, 0x00333030,
785 0x021b000c, 0x3F435313,
786 0x021b0010, 0xB66E8B63,
787 0x021b0014, 0x01FF00DB,
788 0x021b0018, 0x00001740,
789 0x021b001c, 0x00008000,
790 0x021b002c, 0x000026d2,
791 0x021b0030, 0x00431023,
792 0x021b0040, 0x00000027,
793 0x021b0000, 0x831A0000,
794 0x021b001c, 0x04008032,
795 0x021b001c, 0x00008033,
796 0x021b001c, 0x00048031,
797 0x021b001c, 0x05208030,
798 0x021b001c, 0x04008040,
799 0x021b0020, 0x00005800,
800 0x021b0818, 0x00011117,
801 0x021b4818, 0x00011117,
802 0x021b0004, 0x0002556D,
803 0x021b0404, 0x00011006,
804 0x021b001c, 0x00000000,
805};
806
Fabio Estevam9b86c822016-09-26 09:14:25 -0300807static void ddr_init(int *table, int size)
John Tobias07491552014-11-12 14:27:45 -0800808{
Fabio Estevam9b86c822016-09-26 09:14:25 -0300809 int i;
John Tobias07491552014-11-12 14:27:45 -0800810
Fabio Estevam9b86c822016-09-26 09:14:25 -0300811 for (i = 0; i < size / 2 ; i++)
812 writel(table[2 * i + 1], table[2 * i]);
John Tobias07491552014-11-12 14:27:45 -0800813}
814
Fabio Estevam9b86c822016-09-26 09:14:25 -0300815static void spl_dram_init(void)
816{
817 if (is_mx6dq())
818 ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
819 else if (is_mx6dqp())
820 ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
Fabio Estevam15cb6b12017-05-12 12:45:24 -0300821 else if (is_mx6sdl())
822 ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
Fabio Estevam9b86c822016-09-26 09:14:25 -0300823}
824
John Tobias07491552014-11-12 14:27:45 -0800825void board_init_f(ulong dummy)
826{
Fabio Estevam9b86c822016-09-26 09:14:25 -0300827 /* DDR initialization */
828 spl_dram_init();
829
John Tobias07491552014-11-12 14:27:45 -0800830 /* setup AIPS and disable watchdog */
831 arch_cpu_init();
832
Fabio Estevamc6ecd0b2014-11-14 09:36:59 -0200833 ccgr_init();
834 gpr_init();
835
John Tobias07491552014-11-12 14:27:45 -0800836 board_early_init_f();
837
838 /* setup GP timer */
839 timer_init();
840
841 /* UART clocks enabled and gd valid - init serial console */
842 preloader_console_init();
843
John Tobias07491552014-11-12 14:27:45 -0800844 /* Clear the BSS. */
845 memset(__bss_start, 0, __bss_end - __bss_start);
846
847 /* load/boot image from boot device */
848 board_init_r(NULL, 0);
849}
John Tobias07491552014-11-12 14:27:45 -0800850#endif
Abel Vesa4f5bd302019-02-01 16:40:12 +0000851
852#ifdef CONFIG_SPL_LOAD_FIT
853int board_fit_config_name_match(const char *name)
854{
855 if (is_mx6dq()) {
856 if (!strcmp(name, "imx6q-sabresd"))
857 return 0;
858 } else if (is_mx6dqp()) {
859 if (!strcmp(name, "imx6qp-sabresd"))
860 return 0;
861 } else if (is_mx6dl()) {
862 if (!strcmp(name, "imx6dl-sabresd"))
863 return 0;
864 }
865
866 return -1;
867}
868#endif