blob: 8ca57e0b2ac9b92d827d650b0598b73c8d463189 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Fabio Estevamafe20bf2012-09-24 08:09:33 +00002/*
3 * Copyright (C) 2012 Freescale Semiconductor, Inc.
4 *
5 * Author: Fabio Estevam <fabio.estevam@freescale.com>
Fabio Estevamafe20bf2012-09-24 08:09:33 +00006 */
7
Simon Glass2dc9c342020-05-10 11:40:01 -06008#include <image.h>
Simon Glassa7b51302019-11-14 12:57:46 -07009#include <init.h>
Simon Glass274e0b02020-05-10 11:39:56 -060010#include <net.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060011#include <asm/global_data.h>
Fabio Estevamafe20bf2012-09-24 08:09:33 +000012#include <asm/io.h>
13#include <asm/arch/clock.h>
14#include <asm/arch/imx-regs.h>
15#include <asm/arch/iomux.h>
Eric Nelson24ded0c2013-11-13 16:36:19 -070016#include <asm/arch/mx6-pins.h>
Shiji Yangbb112342023-08-03 09:47:16 +080017#include <asm/sections.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060018#include <env.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090019#include <linux/errno.h>
Fabio Estevamafe20bf2012-09-24 08:09:33 +000020#include <asm/gpio.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020021#include <asm/mach-imx/iomux-v3.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020022#include <asm/mach-imx/boot_mode.h>
23#include <asm/mach-imx/spi.h>
Fabio Estevamafe20bf2012-09-24 08:09:33 +000024#include <mmc.h>
Yangbo Lu73340382019-06-21 11:42:28 +080025#include <fsl_esdhc_imx.h>
Fabio Estevambe59b6a2012-09-25 08:43:57 +000026#include <miiphy.h>
Fabio Estevam96ad33d2012-10-02 11:20:12 +000027#include <asm/arch/sys_proto.h>
Diego Dorta2661c9c2017-09-22 12:12:18 -030028#include <input.h>
Fabio Estevam5a6c8c42014-09-22 13:55:52 -030029#include <asm/arch/mxc_hdmi.h>
Stefano Babic33731bc2017-06-29 10:16:06 +020030#include <asm/mach-imx/video.h>
Fabio Estevam5a6c8c42014-09-22 13:55:52 -030031#include <asm/arch/crm_regs.h>
Ye.Li700020e2014-10-30 18:53:49 +080032#include <pca953x.h>
Ye.Licfaa23b2014-11-06 16:29:02 +080033#include <power/pmic.h>
Peng Fane5bcd4d2015-01-27 10:14:04 +080034#include <power/pfuze100_pmic.h>
Ye.Licfaa23b2014-11-06 16:29:02 +080035#include "../common/pfuze.h"
Fabio Estevam96ad33d2012-10-02 11:20:12 +000036
Fabio Estevamafe20bf2012-09-24 08:09:33 +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 Estevamafe20bf2012-09-24 08:09:33 +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 Estevamafe20bf2012-09-24 08:09:33 +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 Estevambe59b6a2012-09-25 08:43:57 +000049
Ye.Li4a1f9222014-11-12 14:02:05 +080050#define GPMI_PAD_CTRL0 (PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_PUS_100K_UP)
51#define GPMI_PAD_CTRL1 (PAD_CTL_DSE_40ohm | PAD_CTL_SPEED_MED | \
52 PAD_CTL_SRE_FAST)
53#define GPMI_PAD_CTRL2 (GPMI_PAD_CTRL0 | GPMI_PAD_CTRL1)
54
Fabio Estevam2623cb12014-11-14 11:27:23 -020055#define WEIM_NOR_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
56 PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
57 PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
58
Fabio Estevamafe20bf2012-09-24 08:09:33 +000059int dram_init(void)
60{
Vanessa Maegima627c0e52016-06-08 15:17:54 -030061 gd->ram_size = imx_ddr_size();
Fabio Estevamafe20bf2012-09-24 08:09:33 +000062
63 return 0;
64}
65
Fabio Estevam6bfdb102014-09-13 18:21:36 -030066static iomux_v3_cfg_t const uart4_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -030067 IOMUX_PADS(PAD_KEY_COL0__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
68 IOMUX_PADS(PAD_KEY_ROW0__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
Fabio Estevamafe20bf2012-09-24 08:09:33 +000069};
70
Fabio Estevam6bfdb102014-09-13 18:21:36 -030071static iomux_v3_cfg_t const port_exp[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -030072 IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Renato Frias7cbaae82013-05-13 18:01:13 +000073};
74
Fabio Estevama03035f2017-07-10 15:59:11 -030075#ifdef CONFIG_MTD_NOR_FLASH
Fabio Estevam2623cb12014-11-14 11:27:23 -020076static iomux_v3_cfg_t const eimnor_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -030077 IOMUX_PADS(PAD_EIM_D16__EIM_DATA16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
78 IOMUX_PADS(PAD_EIM_D17__EIM_DATA17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
79 IOMUX_PADS(PAD_EIM_D18__EIM_DATA18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
80 IOMUX_PADS(PAD_EIM_D19__EIM_DATA19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
81 IOMUX_PADS(PAD_EIM_D20__EIM_DATA20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
82 IOMUX_PADS(PAD_EIM_D21__EIM_DATA21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
83 IOMUX_PADS(PAD_EIM_D22__EIM_DATA22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
84 IOMUX_PADS(PAD_EIM_D23__EIM_DATA23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
85 IOMUX_PADS(PAD_EIM_D24__EIM_DATA24 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
86 IOMUX_PADS(PAD_EIM_D25__EIM_DATA25 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
87 IOMUX_PADS(PAD_EIM_D26__EIM_DATA26 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
88 IOMUX_PADS(PAD_EIM_D27__EIM_DATA27 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
89 IOMUX_PADS(PAD_EIM_D28__EIM_DATA28 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
90 IOMUX_PADS(PAD_EIM_D29__EIM_DATA29 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
91 IOMUX_PADS(PAD_EIM_D30__EIM_DATA30 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
92 IOMUX_PADS(PAD_EIM_D31__EIM_DATA31 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
93 IOMUX_PADS(PAD_EIM_DA0__EIM_AD00 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
94 IOMUX_PADS(PAD_EIM_DA1__EIM_AD01 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
95 IOMUX_PADS(PAD_EIM_DA2__EIM_AD02 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
96 IOMUX_PADS(PAD_EIM_DA3__EIM_AD03 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
97 IOMUX_PADS(PAD_EIM_DA4__EIM_AD04 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
98 IOMUX_PADS(PAD_EIM_DA5__EIM_AD05 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
99 IOMUX_PADS(PAD_EIM_DA6__EIM_AD06 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
100 IOMUX_PADS(PAD_EIM_DA7__EIM_AD07 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
101 IOMUX_PADS(PAD_EIM_DA8__EIM_AD08 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
102 IOMUX_PADS(PAD_EIM_DA9__EIM_AD09 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
103 IOMUX_PADS(PAD_EIM_DA10__EIM_AD10 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
104 IOMUX_PADS(PAD_EIM_DA11__EIM_AD11 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
105 IOMUX_PADS(PAD_EIM_DA12__EIM_AD12 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
106 IOMUX_PADS(PAD_EIM_DA13__EIM_AD13 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
107 IOMUX_PADS(PAD_EIM_DA14__EIM_AD14 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
108 IOMUX_PADS(PAD_EIM_DA15__EIM_AD15 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
109 IOMUX_PADS(PAD_EIM_A16__EIM_ADDR16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
110 IOMUX_PADS(PAD_EIM_A17__EIM_ADDR17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
111 IOMUX_PADS(PAD_EIM_A18__EIM_ADDR18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
112 IOMUX_PADS(PAD_EIM_A19__EIM_ADDR19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
113 IOMUX_PADS(PAD_EIM_A20__EIM_ADDR20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
114 IOMUX_PADS(PAD_EIM_A21__EIM_ADDR21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
115 IOMUX_PADS(PAD_EIM_A22__EIM_ADDR22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
116 IOMUX_PADS(PAD_EIM_A23__EIM_ADDR23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
117 IOMUX_PADS(PAD_EIM_OE__EIM_OE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
118 IOMUX_PADS(PAD_EIM_RW__EIM_RW | MUX_PAD_CTRL(NO_PAD_CTRL)),
119 IOMUX_PADS(PAD_EIM_CS0__EIM_CS0_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevam2623cb12014-11-14 11:27:23 -0200120};
121
122static void eimnor_cs_setup(void)
123{
124 struct weim *weim_regs = (struct weim *)WEIM_BASE_ADDR;
125
126 writel(0x00020181, &weim_regs->cs0gcr1);
127 writel(0x00000001, &weim_regs->cs0gcr2);
128 writel(0x0a020000, &weim_regs->cs0rcr1);
129 writel(0x0000c000, &weim_regs->cs0rcr2);
130 writel(0x0804a240, &weim_regs->cs0wcr1);
131 writel(0x00000120, &weim_regs->wcr);
132
133 set_chipselect_size(CS0_128);
134}
135
Fabio Estevame795b6d2016-12-26 23:04:41 -0200136static void eim_clk_setup(void)
137{
138 struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
139 int cscmr1, ccgr6;
140
Fabio Estevame795b6d2016-12-26 23:04:41 -0200141 /* Turn off EIM clock */
142 ccgr6 = readl(&imx_ccm->CCGR6);
143 ccgr6 &= ~(0x3 << 10);
144 writel(ccgr6, &imx_ccm->CCGR6);
145
146 /*
147 * Configure clk_eim_slow_sel = 00 --> derive clock from AXI clk root
148 * and aclk_eim_slow_podf = 01 --> divide by 2
149 * so that we can have EIM at the maximum clock of 132MHz
150 */
151 cscmr1 = readl(&imx_ccm->cscmr1);
152 cscmr1 &= ~(MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK |
153 MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK);
154 cscmr1 |= (1 << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET);
155 writel(cscmr1, &imx_ccm->cscmr1);
156
157 /* Turn on EIM clock */
158 ccgr6 |= (0x3 << 10);
159 writel(ccgr6, &imx_ccm->CCGR6);
160}
161
Fabio Estevam2623cb12014-11-14 11:27:23 -0200162static void setup_iomux_eimnor(void)
163{
Vanessa Maegima65779d32017-06-29 09:33:45 -0300164 SETUP_IOMUX_PADS(eimnor_pads);
Fabio Estevam2623cb12014-11-14 11:27:23 -0200165
166 gpio_direction_output(IMX_GPIO_NR(5, 4), 0);
167
168 eimnor_cs_setup();
169}
Fabio Estevama03035f2017-07-10 15:59:11 -0300170#endif
Fabio Estevam2623cb12014-11-14 11:27:23 -0200171
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300172static iomux_v3_cfg_t const usdhc3_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300173 IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
174 IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
175 IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
176 IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
177 IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
178 IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
179 IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
180 IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
181 IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
182 IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
183 IOMUX_PADS(PAD_GPIO_18__SD3_VSELECT | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
184 IOMUX_PADS(PAD_NANDF_CS2__GPIO6_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000185};
186
187static void setup_iomux_uart(void)
188{
Vanessa Maegima65779d32017-06-29 09:33:45 -0300189 SETUP_IOMUX_PADS(uart4_pads);
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000190}
191
Yangbo Lu73340382019-06-21 11:42:28 +0800192#ifdef CONFIG_FSL_ESDHC_IMX
Fabio Estevam6bfdb102014-09-13 18:21:36 -0300193static struct fsl_esdhc_cfg usdhc_cfg[1] = {
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000194 {USDHC3_BASE_ADDR},
195};
196
197int board_mmc_getcd(struct mmc *mmc)
198{
199 gpio_direction_input(IMX_GPIO_NR(6, 15));
200 return !gpio_get_value(IMX_GPIO_NR(6, 15));
201}
202
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900203int board_mmc_init(struct bd_info *bis)
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000204{
Vanessa Maegima65779d32017-06-29 09:33:45 -0300205 SETUP_IOMUX_PADS(usdhc3_pads);
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000206
Benoît Thébaudeauc58ff342012-10-01 08:36:25 +0000207 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000208 return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
209}
210#endif
211
Ye.Li4a1f9222014-11-12 14:02:05 +0800212#ifdef CONFIG_NAND_MXS
213static iomux_v3_cfg_t gpmi_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300214 IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
215 IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
216 IOMUX_PADS(PAD_NANDF_WP_B__NAND_WP_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
217 IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(GPMI_PAD_CTRL0)),
218 IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
219 IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
220 IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
221 IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
222 IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
223 IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
224 IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
225 IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
226 IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
227 IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
228 IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07 | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
229 IOMUX_PADS(PAD_SD4_DAT0__NAND_DQS | MUX_PAD_CTRL(GPMI_PAD_CTRL1)),
Ye.Li4a1f9222014-11-12 14:02:05 +0800230};
231
232static void setup_gpmi_nand(void)
233{
234 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
235
236 /* config gpmi nand iomux */
Vanessa Maegima65779d32017-06-29 09:33:45 -0300237 SETUP_IOMUX_PADS(gpmi_pads);
Ye.Li4a1f9222014-11-12 14:02:05 +0800238
Ye.Li2dea0402015-01-12 17:37:13 +0800239 setup_gpmi_io_clk((MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
Ye.Li4a1f9222014-11-12 14:02:05 +0800240 MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
Ye.Li2dea0402015-01-12 17:37:13 +0800241 MXC_CCM_CS2CDR_ENFC_CLK_SEL(3)));
Ye.Li4a1f9222014-11-12 14:02:05 +0800242
243 /* enable apbh clock gating */
244 setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
245}
246#endif
247
Tom Rini4cc38852021-08-30 09:16:30 -0400248#ifdef CONFIG_REVISION_TAG
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000249u32 get_board_rev(void)
250{
Fabio Estevam49bcdd72017-11-27 10:25:09 -0200251 int rev = nxp_board_rev();
Fabio Estevam96ad33d2012-10-02 11:20:12 +0000252
253 return (get_cpu_rev() & ~(0xF << 8)) | rev;
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000254}
Tom Rini4cc38852021-08-30 09:16:30 -0400255#endif
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000256
Fabio Estevam9af078f2017-07-12 18:31:45 -0300257static int ar8031_phy_fixup(struct phy_device *phydev)
258{
259 unsigned short val;
260
261 /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
262 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
263 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
264 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
265
266 val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
267 val &= 0xffe3;
268 val |= 0x18;
269 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
270
271 /* introduce tx clock delay */
272 phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
273 val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
274 val |= 0x0100;
275 phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
276
277 return 0;
278}
279
280int board_phy_config(struct phy_device *phydev)
281{
282 ar8031_phy_fixup(phydev);
283
284 if (phydev->drv->config)
285 phydev->drv->config(phydev);
286
287 return 0;
288}
289
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300290#if defined(CONFIG_VIDEO_IPUV3)
Peng Fan03f8d152015-12-15 16:27:18 +0800291static void disable_lvds(struct display_info_t const *dev)
292{
293 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
294
295 clrbits_le32(&iomux->gpr[2],
296 IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
297 IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
298}
299
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300300static void do_enable_hdmi(struct display_info_t const *dev)
301{
Peng Fan03f8d152015-12-15 16:27:18 +0800302 disable_lvds(dev);
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300303 imx_enable_hdmi_phy();
304}
305
306struct display_info_t const displays[] = {{
307 .bus = -1,
308 .addr = 0,
Peng Fan03f8d152015-12-15 16:27:18 +0800309 .pixfmt = IPU_PIX_FMT_RGB666,
310 .detect = NULL,
311 .enable = NULL,
312 .mode = {
313 .name = "Hannstar-XGA",
314 .refresh = 60,
315 .xres = 1024,
316 .yres = 768,
317 .pixclock = 15385,
318 .left_margin = 220,
319 .right_margin = 40,
320 .upper_margin = 21,
321 .lower_margin = 7,
322 .hsync_len = 60,
323 .vsync_len = 10,
324 .sync = FB_SYNC_EXT,
325 .vmode = FB_VMODE_NONINTERLACED
326} }, {
327 .bus = -1,
328 .addr = 0,
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300329 .pixfmt = IPU_PIX_FMT_RGB24,
330 .detect = detect_hdmi,
331 .enable = do_enable_hdmi,
332 .mode = {
333 .name = "HDMI",
334 .refresh = 60,
335 .xres = 1024,
336 .yres = 768,
337 .pixclock = 15385,
338 .left_margin = 220,
339 .right_margin = 40,
340 .upper_margin = 21,
341 .lower_margin = 7,
342 .hsync_len = 60,
343 .vsync_len = 10,
344 .sync = FB_SYNC_EXT,
345 .vmode = FB_VMODE_NONINTERLACED,
346} } };
347size_t display_count = ARRAY_SIZE(displays);
348
Peng Fan03f8d152015-12-15 16:27:18 +0800349iomux_v3_cfg_t const backlight_pads[] = {
Vanessa Maegima65779d32017-06-29 09:33:45 -0300350 IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
Peng Fan03f8d152015-12-15 16:27:18 +0800351};
352
353static void setup_iomux_backlight(void)
354{
Abel Vesa5d6f33d2019-02-01 16:40:19 +0000355 gpio_request(IMX_GPIO_NR(2, 9), "backlight");
Peng Fan03f8d152015-12-15 16:27:18 +0800356 gpio_direction_output(IMX_GPIO_NR(2, 9), 1);
Vanessa Maegima65779d32017-06-29 09:33:45 -0300357 SETUP_IOMUX_PADS(backlight_pads);
Peng Fan03f8d152015-12-15 16:27:18 +0800358}
359
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300360static void setup_display(void)
361{
362 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
Peng Fan03f8d152015-12-15 16:27:18 +0800363 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300364 int reg;
365
Peng Fan03f8d152015-12-15 16:27:18 +0800366 setup_iomux_backlight();
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300367 enable_ipu_clock();
368 imx_setup_hdmi();
369
Peng Fan03f8d152015-12-15 16:27:18 +0800370 /* Turn on LDB_DI0 and LDB_DI1 clocks */
371 reg = readl(&mxc_ccm->CCGR3);
372 reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
373 writel(reg, &mxc_ccm->CCGR3);
374
375 /* Set LDB_DI0 and LDB_DI1 clk select to 3b'011 */
376 reg = readl(&mxc_ccm->cs2cdr);
377 reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK |
378 MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
379 reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET) |
380 (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
381 writel(reg, &mxc_ccm->cs2cdr);
382
383 reg = readl(&mxc_ccm->cscmr2);
384 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
385 writel(reg, &mxc_ccm->cscmr2);
386
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300387 reg = readl(&mxc_ccm->chsccdr);
388 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
389 << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
Peng Fan03f8d152015-12-15 16:27:18 +0800390 reg |= (CHSCCDR_CLK_SEL_LDB_DI0 <<
391 MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300392 writel(reg, &mxc_ccm->chsccdr);
Peng Fan03f8d152015-12-15 16:27:18 +0800393
394 reg = IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW |
395 IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW |
396 IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG |
397 IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT |
398 IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG |
399 IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT |
400 IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0 |
401 IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED;
402 writel(reg, &iomux->gpr[2]);
403
404 reg = readl(&iomux->gpr[3]);
405 reg &= ~(IOMUXC_GPR3_LVDS0_MUX_CTL_MASK |
406 IOMUXC_GPR3_HDMI_MUX_CTL_MASK);
407 reg |= (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
408 IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET) |
409 (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
410 IOMUXC_GPR3_HDMI_MUX_CTL_OFFSET);
411 writel(reg, &iomux->gpr[3]);
Fabio Estevam5a6c8c42014-09-22 13:55:52 -0300412}
413#endif /* CONFIG_VIDEO_IPUV3 */
414
415/*
416 * Do not overwrite the console
417 * Use always serial for U-Boot console
418 */
419int overwrite_console(void)
420{
421 return 1;
422}
423
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000424int board_early_init_f(void)
425{
426 setup_iomux_uart();
Ye.Li4a1f9222014-11-12 14:02:05 +0800427
428#ifdef CONFIG_NAND_MXS
429 setup_gpmi_nand();
430#endif
Fabio Estevam2623cb12014-11-14 11:27:23 -0200431
Fabio Estevama03035f2017-07-10 15:59:11 -0300432#ifdef CONFIG_MTD_NOR_FLASH
433 eim_clk_setup();
434#endif
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000435 return 0;
436}
437
438int board_init(void)
439{
440 /* address of boot parameters */
441 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
442
Renato Friasbf084322013-05-13 18:01:12 +0000443 /* I2C 3 Steer */
Abel Vesa5d6f33d2019-02-01 16:40:19 +0000444 gpio_request(IMX_GPIO_NR(5, 4), "steer logic");
Renato Friasbf084322013-05-13 18:01:12 +0000445 gpio_direction_output(IMX_GPIO_NR(5, 4), 1);
Fabio Estevame625cf12023-02-16 07:08:48 -0300446
Abel Vesa5d6f33d2019-02-01 16:40:19 +0000447 gpio_request(IMX_GPIO_NR(1, 15), "expander en");
Renato Frias7cbaae82013-05-13 18:01:13 +0000448 gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
Vanessa Maegima65779d32017-06-29 09:33:45 -0300449 SETUP_IOMUX_PADS(port_exp);
Renato Frias7cbaae82013-05-13 18:01:13 +0000450
Peng Fan03f8d152015-12-15 16:27:18 +0800451#ifdef CONFIG_VIDEO_IPUV3
452 setup_display();
453#endif
Fabio Estevama03035f2017-07-10 15:59:11 -0300454
455#ifdef CONFIG_MTD_NOR_FLASH
Fabio Estevam2623cb12014-11-14 11:27:23 -0200456 setup_iomux_eimnor();
Fabio Estevama03035f2017-07-10 15:59:11 -0300457#endif
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000458 return 0;
459}
460
Nikita Kiryanov00cd7382014-08-20 15:08:50 +0300461#ifdef CONFIG_MXC_SPI
462int board_spi_cs_gpio(unsigned bus, unsigned cs)
463{
464 return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
465}
466#endif
467
Ye.Licfaa23b2014-11-06 16:29:02 +0800468int power_init_board(void)
469{
Fabio Estevame625cf12023-02-16 07:08:48 -0300470 struct udevice *dev;
Peng Fand4947e32015-07-11 11:38:47 +0800471 unsigned int value;
Fabio Estevame625cf12023-02-16 07:08:48 -0300472 int ret;
473
474 ret = pmic_get("pfuze100@8", &dev);
475 if (ret == -ENODEV)
476 return 0;
Ye.Licfaa23b2014-11-06 16:29:02 +0800477
Fabio Estevame625cf12023-02-16 07:08:48 -0300478 if (ret != 0)
479 return ret;
480
Peng Fand4947e32015-07-11 11:38:47 +0800481 if (is_mx6dqp()) {
482 /* set SW2 staby volatage 0.975V*/
Fabio Estevame625cf12023-02-16 07:08:48 -0300483 value = pmic_reg_read(dev, PFUZE100_SW2STBY);
Peng Fand4947e32015-07-11 11:38:47 +0800484 value &= ~0x3f;
485 value |= 0x17;
Fabio Estevame625cf12023-02-16 07:08:48 -0300486 pmic_reg_write(dev, PFUZE100_SW2STBY, value);
Peng Fand4947e32015-07-11 11:38:47 +0800487 }
Peng Fane5bcd4d2015-01-27 10:14:04 +0800488
Fabio Estevame625cf12023-02-16 07:08:48 -0300489 return pfuze_mode_init(dev, APS_PFM);
Ye.Licfaa23b2014-11-06 16:29:02 +0800490}
491
Otavio Salvador52863372013-03-16 08:05:07 +0000492#ifdef CONFIG_CMD_BMODE
493static const struct boot_mode board_boot_modes[] = {
494 /* 4 bit bus width */
495 {"mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
496 {NULL, 0},
497};
498#endif
499
500int board_late_init(void)
501{
502#ifdef CONFIG_CMD_BMODE
503 add_board_boot_modes(board_boot_modes);
504#endif
505
Peng Fan04321fc2015-07-11 11:38:46 +0800506#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Simon Glass6a38e412017-08-03 12:22:09 -0600507 env_set("board_name", "SABREAUTO");
Peng Fan04321fc2015-07-11 11:38:46 +0800508
Peng Fand4947e32015-07-11 11:38:47 +0800509 if (is_mx6dqp())
Simon Glass6a38e412017-08-03 12:22:09 -0600510 env_set("board_rev", "MX6QP");
Peng Fan4a597d02016-05-23 18:36:06 +0800511 else if (is_mx6dq())
Simon Glass6a38e412017-08-03 12:22:09 -0600512 env_set("board_rev", "MX6Q");
Peng Fan4a597d02016-05-23 18:36:06 +0800513 else if (is_mx6sdl())
Simon Glass6a38e412017-08-03 12:22:09 -0600514 env_set("board_rev", "MX6DL");
Peng Fan04321fc2015-07-11 11:38:46 +0800515#endif
516
Otavio Salvador52863372013-03-16 08:05:07 +0000517 return 0;
518}
519
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000520int checkboard(void)
521{
Fabio Estevam49bcdd72017-11-27 10:25:09 -0200522 printf("Board: MX6Q-Sabreauto rev%c\n", nxp_board_rev_string());
Fabio Estevamafe20bf2012-09-24 08:09:33 +0000523
524 return 0;
525}
Ye.Li700020e2014-10-30 18:53:49 +0800526
527#ifdef CONFIG_USB_EHCI_MX6
Ye.Li700020e2014-10-30 18:53:49 +0800528int board_ehci_hcd_init(int port)
529{
530 switch (port) {
531 case 0:
Ye.Li700020e2014-10-30 18:53:49 +0800532 /*
533 * Set daisy chain for otg_pin_id on 6q.
534 * For 6dl, this bit is reserved.
535 */
536 imx_iomux_set_gpr_register(1, 13, 1, 0);
537 break;
538 case 1:
539 break;
540 default:
541 printf("MXC USB port %d not yet supported\n", port);
542 return -EINVAL;
543 }
544 return 0;
545}
Ye.Li700020e2014-10-30 18:53:49 +0800546#endif
Vanessa Maegima65779d32017-06-29 09:33:45 -0300547
Simon Glass49c24a82024-09-29 19:49:47 -0600548#ifdef CONFIG_XPL_BUILD
Vanessa Maegima65779d32017-06-29 09:33:45 -0300549#include <asm/arch/mx6-ddr.h>
550#include <spl.h>
Masahiro Yamada75f82d02018-03-05 01:20:11 +0900551#include <linux/libfdt.h>
Vanessa Maegima65779d32017-06-29 09:33:45 -0300552
Diego Dorta614c2832017-07-07 15:38:34 -0300553#ifdef CONFIG_SPL_OS_BOOT
554int spl_start_uboot(void)
555{
556 return 0;
557}
558#endif
559
Vanessa Maegima65779d32017-06-29 09:33:45 -0300560static void ccgr_init(void)
561{
562 struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
563
564 writel(0x00C03F3F, &ccm->CCGR0);
565 writel(0x0030FC03, &ccm->CCGR1);
566 writel(0x0FFFC000, &ccm->CCGR2);
567 writel(0x3FF00000, &ccm->CCGR3);
568 writel(0x00FFF300, &ccm->CCGR4);
569 writel(0x0F0000C3, &ccm->CCGR5);
570 writel(0x000003FF, &ccm->CCGR6);
571}
572
Vanessa Maegima65779d32017-06-29 09:33:45 -0300573static int mx6q_dcd_table[] = {
574 0x020e0798, 0x000C0000,
575 0x020e0758, 0x00000000,
576 0x020e0588, 0x00000030,
577 0x020e0594, 0x00000030,
578 0x020e056c, 0x00000030,
579 0x020e0578, 0x00000030,
580 0x020e074c, 0x00000030,
581 0x020e057c, 0x00000030,
582 0x020e058c, 0x00000000,
583 0x020e059c, 0x00000030,
584 0x020e05a0, 0x00000030,
585 0x020e078c, 0x00000030,
586 0x020e0750, 0x00020000,
587 0x020e05a8, 0x00000028,
588 0x020e05b0, 0x00000028,
589 0x020e0524, 0x00000028,
590 0x020e051c, 0x00000028,
591 0x020e0518, 0x00000028,
592 0x020e050c, 0x00000028,
593 0x020e05b8, 0x00000028,
594 0x020e05c0, 0x00000028,
595 0x020e0774, 0x00020000,
596 0x020e0784, 0x00000028,
597 0x020e0788, 0x00000028,
598 0x020e0794, 0x00000028,
599 0x020e079c, 0x00000028,
600 0x020e07a0, 0x00000028,
601 0x020e07a4, 0x00000028,
602 0x020e07a8, 0x00000028,
603 0x020e0748, 0x00000028,
604 0x020e05ac, 0x00000028,
605 0x020e05b4, 0x00000028,
606 0x020e0528, 0x00000028,
607 0x020e0520, 0x00000028,
608 0x020e0514, 0x00000028,
609 0x020e0510, 0x00000028,
610 0x020e05bc, 0x00000028,
611 0x020e05c4, 0x00000028,
612 0x021b0800, 0xa1390003,
613 0x021b080c, 0x001F001F,
614 0x021b0810, 0x001F001F,
615 0x021b480c, 0x001F001F,
616 0x021b4810, 0x001F001F,
617 0x021b083c, 0x43260335,
618 0x021b0840, 0x031A030B,
619 0x021b483c, 0x4323033B,
620 0x021b4840, 0x0323026F,
621 0x021b0848, 0x483D4545,
622 0x021b4848, 0x44433E48,
623 0x021b0850, 0x41444840,
624 0x021b4850, 0x4835483E,
625 0x021b081c, 0x33333333,
626 0x021b0820, 0x33333333,
627 0x021b0824, 0x33333333,
628 0x021b0828, 0x33333333,
629 0x021b481c, 0x33333333,
630 0x021b4820, 0x33333333,
631 0x021b4824, 0x33333333,
632 0x021b4828, 0x33333333,
633 0x021b08b8, 0x00000800,
634 0x021b48b8, 0x00000800,
635 0x021b0004, 0x00020036,
636 0x021b0008, 0x09444040,
637 0x021b000c, 0x8A8F7955,
638 0x021b0010, 0xFF328F64,
639 0x021b0014, 0x01FF00DB,
640 0x021b0018, 0x00001740,
641 0x021b001c, 0x00008000,
642 0x021b002c, 0x000026d2,
643 0x021b0030, 0x008F1023,
644 0x021b0040, 0x00000047,
645 0x021b0000, 0x841A0000,
646 0x021b001c, 0x04088032,
647 0x021b001c, 0x00008033,
648 0x021b001c, 0x00048031,
649 0x021b001c, 0x09408030,
650 0x021b001c, 0x04008040,
651 0x021b0020, 0x00005800,
652 0x021b0818, 0x00011117,
653 0x021b4818, 0x00011117,
654 0x021b0004, 0x00025576,
655 0x021b0404, 0x00011006,
656 0x021b001c, 0x00000000,
657 0x020c4068, 0x00C03F3F,
658 0x020c406c, 0x0030FC03,
659 0x020c4070, 0x0FFFC000,
660 0x020c4074, 0x3FF00000,
661 0x020c4078, 0xFFFFF300,
662 0x020c407c, 0x0F0000F3,
663 0x020c4080, 0x00000FFF,
664 0x020e0010, 0xF00000CF,
665 0x020e0018, 0x007F007F,
666 0x020e001c, 0x007F007F,
667};
668
669static int mx6qp_dcd_table[] = {
670 0x020e0798, 0x000C0000,
671 0x020e0758, 0x00000000,
672 0x020e0588, 0x00000030,
673 0x020e0594, 0x00000030,
674 0x020e056c, 0x00000030,
675 0x020e0578, 0x00000030,
676 0x020e074c, 0x00000030,
677 0x020e057c, 0x00000030,
678 0x020e058c, 0x00000000,
679 0x020e059c, 0x00000030,
680 0x020e05a0, 0x00000030,
681 0x020e078c, 0x00000030,
682 0x020e0750, 0x00020000,
683 0x020e05a8, 0x00000030,
684 0x020e05b0, 0x00000030,
685 0x020e0524, 0x00000030,
686 0x020e051c, 0x00000030,
687 0x020e0518, 0x00000030,
688 0x020e050c, 0x00000030,
689 0x020e05b8, 0x00000030,
690 0x020e05c0, 0x00000030,
691 0x020e0774, 0x00020000,
692 0x020e0784, 0x00000030,
693 0x020e0788, 0x00000030,
694 0x020e0794, 0x00000030,
695 0x020e079c, 0x00000030,
696 0x020e07a0, 0x00000030,
697 0x020e07a4, 0x00000030,
698 0x020e07a8, 0x00000030,
699 0x020e0748, 0x00000030,
700 0x020e05ac, 0x00000030,
701 0x020e05b4, 0x00000030,
702 0x020e0528, 0x00000030,
703 0x020e0520, 0x00000030,
704 0x020e0514, 0x00000030,
705 0x020e0510, 0x00000030,
706 0x020e05bc, 0x00000030,
707 0x020e05c4, 0x00000030,
708 0x021b0800, 0xa1390003,
709 0x021b080c, 0x001b001e,
710 0x021b0810, 0x002e0029,
711 0x021b480c, 0x001b002a,
712 0x021b4810, 0x0019002c,
713 0x021b083c, 0x43240334,
714 0x021b0840, 0x0324031a,
715 0x021b483c, 0x43340344,
716 0x021b4840, 0x03280276,
717 0x021b0848, 0x44383A3E,
718 0x021b4848, 0x3C3C3846,
719 0x021b0850, 0x2e303230,
720 0x021b4850, 0x38283E34,
721 0x021b081c, 0x33333333,
722 0x021b0820, 0x33333333,
723 0x021b0824, 0x33333333,
724 0x021b0828, 0x33333333,
725 0x021b481c, 0x33333333,
726 0x021b4820, 0x33333333,
727 0x021b4824, 0x33333333,
728 0x021b4828, 0x33333333,
729 0x021b08c0, 0x24912492,
730 0x021b48c0, 0x24912492,
731 0x021b08b8, 0x00000800,
732 0x021b48b8, 0x00000800,
733 0x021b0004, 0x00020036,
734 0x021b0008, 0x09444040,
735 0x021b000c, 0x898E7955,
736 0x021b0010, 0xFF328F64,
737 0x021b0014, 0x01FF00DB,
738 0x021b0018, 0x00001740,
739 0x021b001c, 0x00008000,
740 0x021b002c, 0x000026d2,
741 0x021b0030, 0x008E1023,
742 0x021b0040, 0x00000047,
743 0x021b0400, 0x14420000,
744 0x021b0000, 0x841A0000,
745 0x00bb0008, 0x00000004,
746 0x00bb000c, 0x2891E41A,
747 0x00bb0038, 0x00000564,
748 0x00bb0014, 0x00000040,
749 0x00bb0028, 0x00000020,
750 0x00bb002c, 0x00000020,
751 0x021b001c, 0x04088032,
752 0x021b001c, 0x00008033,
753 0x021b001c, 0x00048031,
754 0x021b001c, 0x09408030,
755 0x021b001c, 0x04008040,
756 0x021b0020, 0x00005800,
757 0x021b0818, 0x00011117,
758 0x021b4818, 0x00011117,
759 0x021b0004, 0x00025576,
760 0x021b0404, 0x00011006,
761 0x021b001c, 0x00000000,
762 0x020c4068, 0x00C03F3F,
763 0x020c406c, 0x0030FC03,
764 0x020c4070, 0x0FFFC000,
765 0x020c4074, 0x3FF00000,
766 0x020c4078, 0xFFFFF300,
767 0x020c407c, 0x0F0000F3,
768 0x020c4080, 0x00000FFF,
769 0x020e0010, 0xF00000CF,
770 0x020e0018, 0x77177717,
771 0x020e001c, 0x77177717,
772};
773
774static int mx6dl_dcd_table[] = {
775 0x020e0774, 0x000C0000,
776 0x020e0754, 0x00000000,
777 0x020e04ac, 0x00000030,
778 0x020e04b0, 0x00000030,
779 0x020e0464, 0x00000030,
780 0x020e0490, 0x00000030,
781 0x020e074c, 0x00000030,
782 0x020e0494, 0x00000030,
783 0x020e04a0, 0x00000000,
784 0x020e04b4, 0x00000030,
785 0x020e04b8, 0x00000030,
786 0x020e076c, 0x00000030,
787 0x020e0750, 0x00020000,
788 0x020e04bc, 0x00000028,
789 0x020e04c0, 0x00000028,
790 0x020e04c4, 0x00000028,
791 0x020e04c8, 0x00000028,
792 0x020e04cc, 0x00000028,
793 0x020e04d0, 0x00000028,
794 0x020e04d4, 0x00000028,
795 0x020e04d8, 0x00000028,
796 0x020e0760, 0x00020000,
797 0x020e0764, 0x00000028,
798 0x020e0770, 0x00000028,
799 0x020e0778, 0x00000028,
800 0x020e077c, 0x00000028,
801 0x020e0780, 0x00000028,
802 0x020e0784, 0x00000028,
803 0x020e078c, 0x00000028,
804 0x020e0748, 0x00000028,
805 0x020e0470, 0x00000028,
806 0x020e0474, 0x00000028,
807 0x020e0478, 0x00000028,
808 0x020e047c, 0x00000028,
809 0x020e0480, 0x00000028,
810 0x020e0484, 0x00000028,
811 0x020e0488, 0x00000028,
812 0x020e048c, 0x00000028,
813 0x021b0800, 0xa1390003,
814 0x021b080c, 0x001F001F,
815 0x021b0810, 0x001F001F,
816 0x021b480c, 0x001F001F,
817 0x021b4810, 0x001F001F,
818 0x021b083c, 0x42190217,
819 0x021b0840, 0x017B017B,
820 0x021b483c, 0x4176017B,
821 0x021b4840, 0x015F016C,
822 0x021b0848, 0x4C4C4D4C,
823 0x021b4848, 0x4A4D4C48,
824 0x021b0850, 0x3F3F3F40,
825 0x021b4850, 0x3538382E,
826 0x021b081c, 0x33333333,
827 0x021b0820, 0x33333333,
828 0x021b0824, 0x33333333,
829 0x021b0828, 0x33333333,
830 0x021b481c, 0x33333333,
831 0x021b4820, 0x33333333,
832 0x021b4824, 0x33333333,
833 0x021b4828, 0x33333333,
834 0x021b08b8, 0x00000800,
835 0x021b48b8, 0x00000800,
836 0x021b0004, 0x00020025,
837 0x021b0008, 0x00333030,
838 0x021b000c, 0x676B5313,
839 0x021b0010, 0xB66E8B63,
840 0x021b0014, 0x01FF00DB,
841 0x021b0018, 0x00001740,
842 0x021b001c, 0x00008000,
843 0x021b002c, 0x000026d2,
844 0x021b0030, 0x006B1023,
845 0x021b0040, 0x00000047,
846 0x021b0000, 0x841A0000,
847 0x021b001c, 0x04008032,
848 0x021b001c, 0x00008033,
849 0x021b001c, 0x00048031,
850 0x021b001c, 0x05208030,
851 0x021b001c, 0x04008040,
852 0x021b0020, 0x00005800,
853 0x021b0818, 0x00011117,
854 0x021b4818, 0x00011117,
855 0x021b0004, 0x00025565,
856 0x021b0404, 0x00011006,
857 0x021b001c, 0x00000000,
858 0x020c4068, 0x00C03F3F,
859 0x020c406c, 0x0030FC03,
860 0x020c4070, 0x0FFFC000,
861 0x020c4074, 0x3FF00000,
862 0x020c4078, 0xFFFFF300,
863 0x020c407c, 0x0F0000C3,
864 0x020c4080, 0x00000FFF,
865 0x020e0010, 0xF00000CF,
866 0x020e0018, 0x007F007F,
867 0x020e001c, 0x007F007F,
868};
869
870static void ddr_init(int *table, int size)
871{
872 int i;
873
874 for (i = 0; i < size / 2 ; i++)
875 writel(table[2 * i + 1], table[2 * i]);
876}
877
878static void spl_dram_init(void)
879{
880 if (is_mx6dq())
881 ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
882 else if (is_mx6dqp())
883 ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
884 else if (is_mx6sdl())
885 ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
886}
887
888void board_init_f(ulong dummy)
889{
890 /* DDR initialization */
891 spl_dram_init();
892
893 /* setup AIPS and disable watchdog */
894 arch_cpu_init();
895
896 ccgr_init();
897 gpr_init();
898
Vanessa Maegima65779d32017-06-29 09:33:45 -0300899 board_early_init_f();
900
901 /* setup GP timer */
902 timer_init();
903
904 /* UART clocks enabled and gd valid - init serial console */
905 preloader_console_init();
906
907 /* Clear the BSS. */
908 memset(__bss_start, 0, __bss_end - __bss_start);
909
910 /* load/boot image from boot device */
911 board_init_r(NULL, 0);
912}
913#endif
Abel Vesa9fe4c852019-02-01 16:40:13 +0000914
915#ifdef CONFIG_SPL_LOAD_FIT
916int board_fit_config_name_match(const char *name)
917{
918 if (is_mx6dq()) {
919 if (!strcmp(name, "imx6q-sabreauto"))
920 return 0;
921 } else if (is_mx6dqp()) {
922 if (!strcmp(name, "imx6qp-sabreauto"))
923 return 0;
924 } else if (is_mx6dl()) {
925 if (!strcmp(name, "imx6dl-sabreauto"))
926 return 0;
927 }
928
929 return -1;
930}
931#endif