c8f126377ccc20dd5caf46427c917ba7e2150c97
[pandora-u-boot.git] / board / freescale / mx6sabreauto / mx6sabreauto.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2012 Freescale Semiconductor, Inc.
4  *
5  * Author: Fabio Estevam <fabio.estevam@freescale.com>
6  */
7
8 #include <common.h>
9 #include <asm/io.h>
10 #include <asm/arch/clock.h>
11 #include <asm/arch/imx-regs.h>
12 #include <asm/arch/iomux.h>
13 #include <asm/arch/mx6-pins.h>
14 #include <linux/errno.h>
15 #include <asm/gpio.h>
16 #include <asm/mach-imx/iomux-v3.h>
17 #include <asm/mach-imx/mxc_i2c.h>
18 #include <asm/mach-imx/boot_mode.h>
19 #include <asm/mach-imx/spi.h>
20 #include <mmc.h>
21 #include <fsl_esdhc.h>
22 #include <miiphy.h>
23 #include <netdev.h>
24 #include <asm/arch/sys_proto.h>
25 #include <i2c.h>
26 #include <input.h>
27 #include <asm/arch/mxc_hdmi.h>
28 #include <asm/mach-imx/video.h>
29 #include <asm/arch/crm_regs.h>
30 #include <pca953x.h>
31 #include <power/pmic.h>
32 #include <power/pfuze100_pmic.h>
33 #include "../common/pfuze.h"
34
35 DECLARE_GLOBAL_DATA_PTR;
36
37 #define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
38         PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
39         PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
40
41 #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                    \
42         PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
43         PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
44
45 #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
46         PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
47
48 #define I2C_PAD_CTRL    (PAD_CTL_PUS_100K_UP |                  \
49         PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
50         PAD_CTL_ODE | PAD_CTL_SRE_FAST)
51
52 #define GPMI_PAD_CTRL0 (PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_PUS_100K_UP)
53 #define GPMI_PAD_CTRL1 (PAD_CTL_DSE_40ohm | PAD_CTL_SPEED_MED | \
54                         PAD_CTL_SRE_FAST)
55 #define GPMI_PAD_CTRL2 (GPMI_PAD_CTRL0 | GPMI_PAD_CTRL1)
56
57 #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
58
59 #define WEIM_NOR_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |          \
60         PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
61         PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST)
62
63 #define I2C_PMIC        1
64
65 int dram_init(void)
66 {
67         gd->ram_size = imx_ddr_size();
68
69         return 0;
70 }
71
72 static iomux_v3_cfg_t const uart4_pads[] = {
73         IOMUX_PADS(PAD_KEY_COL0__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
74         IOMUX_PADS(PAD_KEY_ROW0__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
75 };
76
77 static iomux_v3_cfg_t const enet_pads[] = {
78         IOMUX_PADS(PAD_KEY_COL1__ENET_MDIO              | MUX_PAD_CTRL(ENET_PAD_CTRL)),
79         IOMUX_PADS(PAD_KEY_COL2__ENET_MDC               | MUX_PAD_CTRL(ENET_PAD_CTRL)),
80         IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
81         IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
82         IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
83         IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
84         IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
85         IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL       | MUX_PAD_CTRL(ENET_PAD_CTRL)),
86         IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK        | MUX_PAD_CTRL(ENET_PAD_CTRL)),
87         IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
88         IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
89         IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
90         IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
91         IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3             | MUX_PAD_CTRL(ENET_PAD_CTRL)),
92         IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL       | MUX_PAD_CTRL(ENET_PAD_CTRL)),
93 };
94
95 /* I2C2 PMIC, iPod, Tuner, Codec, Touch, HDMI EDID, MIPI CSI2 card */
96 static struct i2c_pads_info mx6q_i2c_pad_info1 = {
97         .scl = {
98                 .i2c_mode = MX6Q_PAD_EIM_EB2__I2C2_SCL | PC,
99                 .gpio_mode = MX6Q_PAD_EIM_EB2__GPIO2_IO30 | PC,
100                 .gp = IMX_GPIO_NR(2, 30)
101         },
102         .sda = {
103                 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
104                 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
105                 .gp = IMX_GPIO_NR(4, 13)
106         }
107 };
108
109 static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
110         .scl = {
111                 .i2c_mode = MX6DL_PAD_EIM_EB2__I2C2_SCL | PC,
112                 .gpio_mode = MX6DL_PAD_EIM_EB2__GPIO2_IO30 | PC,
113                 .gp = IMX_GPIO_NR(2, 30)
114         },
115         .sda = {
116                 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
117                 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
118                 .gp = IMX_GPIO_NR(4, 13)
119         }
120 };
121
122 #ifndef CONFIG_SYS_FLASH_CFI
123 /*
124  * I2C3 MLB, Port Expanders (A, B, C), Video ADC, Light Sensor,
125  * Compass Sensor, Accelerometer, Res Touch
126  */
127 static struct i2c_pads_info mx6q_i2c_pad_info2 = {
128         .scl = {
129                 .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
130                 .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
131                 .gp = IMX_GPIO_NR(1, 3)
132         },
133         .sda = {
134                 .i2c_mode = MX6Q_PAD_EIM_D18__I2C3_SDA | PC,
135                 .gpio_mode = MX6Q_PAD_EIM_D18__GPIO3_IO18 | PC,
136                 .gp = IMX_GPIO_NR(3, 18)
137         }
138 };
139
140 static struct i2c_pads_info mx6dl_i2c_pad_info2 = {
141         .scl = {
142                 .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
143                 .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
144                 .gp = IMX_GPIO_NR(1, 3)
145         },
146         .sda = {
147                 .i2c_mode = MX6DL_PAD_EIM_D18__I2C3_SDA | PC,
148                 .gpio_mode = MX6DL_PAD_EIM_D18__GPIO3_IO18 | PC,
149                 .gp = IMX_GPIO_NR(3, 18)
150         }
151 };
152 #endif
153
154 static iomux_v3_cfg_t const i2c3_pads[] = {
155         IOMUX_PADS(PAD_EIM_A24__GPIO5_IO04      | MUX_PAD_CTRL(NO_PAD_CTRL)),
156 };
157
158 static iomux_v3_cfg_t const port_exp[] = {
159         IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15     | MUX_PAD_CTRL(NO_PAD_CTRL)),
160 };
161
162 /*Define for building port exp gpio, pin starts from 0*/
163 #define PORTEXP_IO_NR(chip, pin) \
164         ((chip << 5) + pin)
165
166 /*Get the chip addr from a ioexp gpio*/
167 #define PORTEXP_IO_TO_CHIP(gpio_nr) \
168         (gpio_nr >> 5)
169
170 /*Get the pin number from a ioexp gpio*/
171 #define PORTEXP_IO_TO_PIN(gpio_nr) \
172         (gpio_nr & 0x1f)
173
174 static int port_exp_direction_output(unsigned gpio, int value)
175 {
176         int ret;
177
178         i2c_set_bus_num(2);
179         ret = i2c_probe(PORTEXP_IO_TO_CHIP(gpio));
180         if (ret)
181                 return ret;
182
183         ret = pca953x_set_dir(PORTEXP_IO_TO_CHIP(gpio),
184                 (1 << PORTEXP_IO_TO_PIN(gpio)),
185                 (PCA953X_DIR_OUT << PORTEXP_IO_TO_PIN(gpio)));
186
187         if (ret)
188                 return ret;
189
190         ret = pca953x_set_val(PORTEXP_IO_TO_CHIP(gpio),
191                 (1 << PORTEXP_IO_TO_PIN(gpio)),
192                 (value << PORTEXP_IO_TO_PIN(gpio)));
193
194         if (ret)
195                 return ret;
196
197         return 0;
198 }
199
200 #ifdef CONFIG_MTD_NOR_FLASH
201 static iomux_v3_cfg_t const eimnor_pads[] = {
202         IOMUX_PADS(PAD_EIM_D16__EIM_DATA16      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
203         IOMUX_PADS(PAD_EIM_D17__EIM_DATA17      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
204         IOMUX_PADS(PAD_EIM_D18__EIM_DATA18      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
205         IOMUX_PADS(PAD_EIM_D19__EIM_DATA19      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
206         IOMUX_PADS(PAD_EIM_D20__EIM_DATA20      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
207         IOMUX_PADS(PAD_EIM_D21__EIM_DATA21      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
208         IOMUX_PADS(PAD_EIM_D22__EIM_DATA22      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
209         IOMUX_PADS(PAD_EIM_D23__EIM_DATA23      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
210         IOMUX_PADS(PAD_EIM_D24__EIM_DATA24      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
211         IOMUX_PADS(PAD_EIM_D25__EIM_DATA25      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
212         IOMUX_PADS(PAD_EIM_D26__EIM_DATA26      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
213         IOMUX_PADS(PAD_EIM_D27__EIM_DATA27      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
214         IOMUX_PADS(PAD_EIM_D28__EIM_DATA28      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
215         IOMUX_PADS(PAD_EIM_D29__EIM_DATA29      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
216         IOMUX_PADS(PAD_EIM_D30__EIM_DATA30      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
217         IOMUX_PADS(PAD_EIM_D31__EIM_DATA31      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
218         IOMUX_PADS(PAD_EIM_DA0__EIM_AD00        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
219         IOMUX_PADS(PAD_EIM_DA1__EIM_AD01        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
220         IOMUX_PADS(PAD_EIM_DA2__EIM_AD02        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
221         IOMUX_PADS(PAD_EIM_DA3__EIM_AD03        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
222         IOMUX_PADS(PAD_EIM_DA4__EIM_AD04        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
223         IOMUX_PADS(PAD_EIM_DA5__EIM_AD05        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
224         IOMUX_PADS(PAD_EIM_DA6__EIM_AD06        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
225         IOMUX_PADS(PAD_EIM_DA7__EIM_AD07        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
226         IOMUX_PADS(PAD_EIM_DA8__EIM_AD08        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
227         IOMUX_PADS(PAD_EIM_DA9__EIM_AD09        | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
228         IOMUX_PADS(PAD_EIM_DA10__EIM_AD10       | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
229         IOMUX_PADS(PAD_EIM_DA11__EIM_AD11       | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
230         IOMUX_PADS(PAD_EIM_DA12__EIM_AD12       | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
231         IOMUX_PADS(PAD_EIM_DA13__EIM_AD13       | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
232         IOMUX_PADS(PAD_EIM_DA14__EIM_AD14       | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
233         IOMUX_PADS(PAD_EIM_DA15__EIM_AD15       | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
234         IOMUX_PADS(PAD_EIM_A16__EIM_ADDR16      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
235         IOMUX_PADS(PAD_EIM_A17__EIM_ADDR17      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
236         IOMUX_PADS(PAD_EIM_A18__EIM_ADDR18      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
237         IOMUX_PADS(PAD_EIM_A19__EIM_ADDR19      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
238         IOMUX_PADS(PAD_EIM_A20__EIM_ADDR20      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
239         IOMUX_PADS(PAD_EIM_A21__EIM_ADDR21      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
240         IOMUX_PADS(PAD_EIM_A22__EIM_ADDR22      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
241         IOMUX_PADS(PAD_EIM_A23__EIM_ADDR23      | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
242         IOMUX_PADS(PAD_EIM_OE__EIM_OE_B         | MUX_PAD_CTRL(NO_PAD_CTRL)),
243         IOMUX_PADS(PAD_EIM_RW__EIM_RW           | MUX_PAD_CTRL(NO_PAD_CTRL)),
244         IOMUX_PADS(PAD_EIM_CS0__EIM_CS0_B       | MUX_PAD_CTRL(NO_PAD_CTRL)),
245 };
246
247 static void eimnor_cs_setup(void)
248 {
249         struct weim *weim_regs = (struct weim *)WEIM_BASE_ADDR;
250
251         writel(0x00020181, &weim_regs->cs0gcr1);
252         writel(0x00000001, &weim_regs->cs0gcr2);
253         writel(0x0a020000, &weim_regs->cs0rcr1);
254         writel(0x0000c000, &weim_regs->cs0rcr2);
255         writel(0x0804a240, &weim_regs->cs0wcr1);
256         writel(0x00000120, &weim_regs->wcr);
257
258         set_chipselect_size(CS0_128);
259 }
260
261 static void eim_clk_setup(void)
262 {
263         struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
264         int cscmr1, ccgr6;
265
266
267         /* Turn off EIM clock */
268         ccgr6 = readl(&imx_ccm->CCGR6);
269         ccgr6 &= ~(0x3 << 10);
270         writel(ccgr6, &imx_ccm->CCGR6);
271
272         /*
273          * Configure clk_eim_slow_sel = 00 --> derive clock from AXI clk root
274          * and aclk_eim_slow_podf = 01 --> divide by 2
275          * so that we can have EIM at the maximum clock of 132MHz
276          */
277         cscmr1 = readl(&imx_ccm->cscmr1);
278         cscmr1 &= ~(MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK |
279                     MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK);
280         cscmr1 |= (1 << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET);
281         writel(cscmr1, &imx_ccm->cscmr1);
282
283         /* Turn on EIM clock */
284         ccgr6 |= (0x3 << 10);
285         writel(ccgr6, &imx_ccm->CCGR6);
286 }
287
288 static void setup_iomux_eimnor(void)
289 {
290         SETUP_IOMUX_PADS(eimnor_pads);
291
292         gpio_direction_output(IMX_GPIO_NR(5, 4), 0);
293
294         eimnor_cs_setup();
295 }
296 #endif
297
298 static void setup_iomux_enet(void)
299 {
300         SETUP_IOMUX_PADS(enet_pads);
301 }
302
303 static iomux_v3_cfg_t const usdhc3_pads[] = {
304         IOMUX_PADS(PAD_SD3_CLK__SD3_CLK         | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
305         IOMUX_PADS(PAD_SD3_CMD__SD3_CMD         | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
306         IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
307         IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
308         IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
309         IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
310         IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
311         IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
312         IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
313         IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
314         IOMUX_PADS(PAD_GPIO_18__SD3_VSELECT     | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
315         IOMUX_PADS(PAD_NANDF_CS2__GPIO6_IO15    | MUX_PAD_CTRL(NO_PAD_CTRL)),
316 };
317
318 static void setup_iomux_uart(void)
319 {
320         SETUP_IOMUX_PADS(uart4_pads);
321 }
322
323 #ifdef CONFIG_FSL_ESDHC
324 static struct fsl_esdhc_cfg usdhc_cfg[1] = {
325         {USDHC3_BASE_ADDR},
326 };
327
328 int board_mmc_getcd(struct mmc *mmc)
329 {
330         gpio_direction_input(IMX_GPIO_NR(6, 15));
331         return !gpio_get_value(IMX_GPIO_NR(6, 15));
332 }
333
334 int board_mmc_init(bd_t *bis)
335 {
336         SETUP_IOMUX_PADS(usdhc3_pads);
337
338         usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
339         return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
340 }
341 #endif
342
343 #ifdef CONFIG_NAND_MXS
344 static iomux_v3_cfg_t gpmi_pads[] = {
345         IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE      | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
346         IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE      | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
347         IOMUX_PADS(PAD_NANDF_WP_B__NAND_WP_B    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
348         IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B  | MUX_PAD_CTRL(GPMI_PAD_CTRL0)),
349         IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
350         IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B       | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
351         IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B       | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
352         IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
353         IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
354         IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
355         IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
356         IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
357         IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
358         IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
359         IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07    | MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
360         IOMUX_PADS(PAD_SD4_DAT0__NAND_DQS       | MUX_PAD_CTRL(GPMI_PAD_CTRL1)),
361 };
362
363 static void setup_gpmi_nand(void)
364 {
365         struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
366
367         /* config gpmi nand iomux */
368         SETUP_IOMUX_PADS(gpmi_pads);
369
370         setup_gpmi_io_clk((MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
371                         MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
372                         MXC_CCM_CS2CDR_ENFC_CLK_SEL(3)));
373
374         /* enable apbh clock gating */
375         setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
376 }
377 #endif
378
379 static void setup_fec(void)
380 {
381         if (is_mx6dqp()) {
382                 /*
383                  * select ENET MAC0 TX clock from PLL
384                  */
385                 imx_iomux_set_gpr_register(5, 9, 1, 1);
386                 enable_fec_anatop_clock(0, ENET_125MHZ);
387         }
388
389         setup_iomux_enet();
390 }
391
392 int board_eth_init(bd_t *bis)
393 {
394         setup_fec();
395
396         return cpu_eth_init(bis);
397 }
398
399 u32 get_board_rev(void)
400 {
401         int rev = nxp_board_rev();
402
403         return (get_cpu_rev() & ~(0xF << 8)) | rev;
404 }
405
406 static int ar8031_phy_fixup(struct phy_device *phydev)
407 {
408         unsigned short val;
409
410         /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
411         phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
412         phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
413         phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
414
415         val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
416         val &= 0xffe3;
417         val |= 0x18;
418         phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
419
420         /* introduce tx clock delay */
421         phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
422         val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
423         val |= 0x0100;
424         phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
425
426         return 0;
427 }
428
429 int board_phy_config(struct phy_device *phydev)
430 {
431         ar8031_phy_fixup(phydev);
432
433         if (phydev->drv->config)
434                 phydev->drv->config(phydev);
435
436         return 0;
437 }
438
439 #if defined(CONFIG_VIDEO_IPUV3)
440 static void disable_lvds(struct display_info_t const *dev)
441 {
442         struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
443
444         clrbits_le32(&iomux->gpr[2],
445                      IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
446                      IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
447 }
448
449 static void do_enable_hdmi(struct display_info_t const *dev)
450 {
451         disable_lvds(dev);
452         imx_enable_hdmi_phy();
453 }
454
455 struct display_info_t const displays[] = {{
456         .bus    = -1,
457         .addr   = 0,
458         .pixfmt = IPU_PIX_FMT_RGB666,
459         .detect = NULL,
460         .enable = NULL,
461         .mode   = {
462                 .name           = "Hannstar-XGA",
463                 .refresh        = 60,
464                 .xres           = 1024,
465                 .yres           = 768,
466                 .pixclock       = 15385,
467                 .left_margin    = 220,
468                 .right_margin   = 40,
469                 .upper_margin   = 21,
470                 .lower_margin   = 7,
471                 .hsync_len      = 60,
472                 .vsync_len      = 10,
473                 .sync           = FB_SYNC_EXT,
474                 .vmode          = FB_VMODE_NONINTERLACED
475 } }, {
476         .bus    = -1,
477         .addr   = 0,
478         .pixfmt = IPU_PIX_FMT_RGB24,
479         .detect = detect_hdmi,
480         .enable = do_enable_hdmi,
481         .mode   = {
482                 .name           = "HDMI",
483                 .refresh        = 60,
484                 .xres           = 1024,
485                 .yres           = 768,
486                 .pixclock       = 15385,
487                 .left_margin    = 220,
488                 .right_margin   = 40,
489                 .upper_margin   = 21,
490                 .lower_margin   = 7,
491                 .hsync_len      = 60,
492                 .vsync_len      = 10,
493                 .sync           = FB_SYNC_EXT,
494                 .vmode          = FB_VMODE_NONINTERLACED,
495 } } };
496 size_t display_count = ARRAY_SIZE(displays);
497
498 iomux_v3_cfg_t const backlight_pads[] = {
499         IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
500 };
501
502 static void setup_iomux_backlight(void)
503 {
504         gpio_direction_output(IMX_GPIO_NR(2, 9), 1);
505         SETUP_IOMUX_PADS(backlight_pads);
506 }
507
508 static void setup_display(void)
509 {
510         struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
511         struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
512         int reg;
513
514         setup_iomux_backlight();
515         enable_ipu_clock();
516         imx_setup_hdmi();
517
518         /* Turn on LDB_DI0 and LDB_DI1 clocks */
519         reg = readl(&mxc_ccm->CCGR3);
520         reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
521         writel(reg, &mxc_ccm->CCGR3);
522
523         /* Set LDB_DI0 and LDB_DI1 clk select to 3b'011 */
524         reg = readl(&mxc_ccm->cs2cdr);
525         reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK |
526                  MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
527         reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET) |
528                (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
529         writel(reg, &mxc_ccm->cs2cdr);
530
531         reg = readl(&mxc_ccm->cscmr2);
532         reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
533         writel(reg, &mxc_ccm->cscmr2);
534
535         reg = readl(&mxc_ccm->chsccdr);
536         reg |= (CHSCCDR_CLK_SEL_LDB_DI0
537                 << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
538         reg |= (CHSCCDR_CLK_SEL_LDB_DI0 <<
539                 MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
540         writel(reg, &mxc_ccm->chsccdr);
541
542         reg = IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW |
543               IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW |
544               IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG |
545               IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT |
546               IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG |
547               IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT |
548               IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0 |
549               IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED;
550         writel(reg, &iomux->gpr[2]);
551
552         reg = readl(&iomux->gpr[3]);
553         reg &= ~(IOMUXC_GPR3_LVDS0_MUX_CTL_MASK |
554                  IOMUXC_GPR3_HDMI_MUX_CTL_MASK);
555         reg |= (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
556                 IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET) |
557                (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
558                 IOMUXC_GPR3_HDMI_MUX_CTL_OFFSET);
559         writel(reg, &iomux->gpr[3]);
560 }
561 #endif /* CONFIG_VIDEO_IPUV3 */
562
563 /*
564  * Do not overwrite the console
565  * Use always serial for U-Boot console
566  */
567 int overwrite_console(void)
568 {
569         return 1;
570 }
571
572 int board_early_init_f(void)
573 {
574         setup_iomux_uart();
575
576 #ifdef CONFIG_NAND_MXS
577         setup_gpmi_nand();
578 #endif
579
580 #ifdef CONFIG_MTD_NOR_FLASH
581         eim_clk_setup();
582 #endif
583         return 0;
584 }
585
586 int board_init(void)
587 {
588         /* address of boot parameters */
589         gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
590
591         /* I2C 2 and 3 setup - I2C 3 hw mux with EIM */
592         if (is_mx6dq() || is_mx6dqp())
593                 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
594         else
595                 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
596         /* I2C 3 Steer */
597         gpio_direction_output(IMX_GPIO_NR(5, 4), 1);
598         SETUP_IOMUX_PADS(i2c3_pads);
599 #ifndef CONFIG_SYS_FLASH_CFI
600         if (is_mx6dq() || is_mx6dqp())
601                 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info2);
602         else
603                 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info2);
604 #endif
605         gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
606         SETUP_IOMUX_PADS(port_exp);
607
608 #ifdef CONFIG_VIDEO_IPUV3
609         setup_display();
610 #endif
611
612 #ifdef CONFIG_MTD_NOR_FLASH
613         setup_iomux_eimnor();
614 #endif
615         return 0;
616 }
617
618 #ifdef CONFIG_MXC_SPI
619 int board_spi_cs_gpio(unsigned bus, unsigned cs)
620 {
621         return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
622 }
623 #endif
624
625 int power_init_board(void)
626 {
627         struct pmic *p;
628         unsigned int value;
629
630         p = pfuze_common_init(I2C_PMIC);
631         if (!p)
632                 return -ENODEV;
633
634         if (is_mx6dqp()) {
635                 /* set SW2 staby volatage 0.975V*/
636                 pmic_reg_read(p, PFUZE100_SW2STBY, &value);
637                 value &= ~0x3f;
638                 value |= 0x17;
639                 pmic_reg_write(p, PFUZE100_SW2STBY, value);
640         }
641
642         return pfuze_mode_init(p, APS_PFM);
643 }
644
645 #ifdef CONFIG_CMD_BMODE
646 static const struct boot_mode board_boot_modes[] = {
647         /* 4 bit bus width */
648         {"mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
649         {NULL,   0},
650 };
651 #endif
652
653 int board_late_init(void)
654 {
655 #ifdef CONFIG_CMD_BMODE
656         add_board_boot_modes(board_boot_modes);
657 #endif
658
659 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
660         env_set("board_name", "SABREAUTO");
661
662         if (is_mx6dqp())
663                 env_set("board_rev", "MX6QP");
664         else if (is_mx6dq())
665                 env_set("board_rev", "MX6Q");
666         else if (is_mx6sdl())
667                 env_set("board_rev", "MX6DL");
668 #endif
669
670         return 0;
671 }
672
673 int checkboard(void)
674 {
675         printf("Board: MX6Q-Sabreauto rev%c\n", nxp_board_rev_string());
676
677         return 0;
678 }
679
680 #ifdef CONFIG_USB_EHCI_MX6
681 #define USB_HOST1_PWR     PORTEXP_IO_NR(0x32, 7)
682 #define USB_OTG_PWR       PORTEXP_IO_NR(0x34, 1)
683
684 iomux_v3_cfg_t const usb_otg_pads[] = {
685         IOMUX_PADS(PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL)),
686 };
687
688 int board_ehci_hcd_init(int port)
689 {
690         switch (port) {
691         case 0:
692                 SETUP_IOMUX_PADS(usb_otg_pads);
693
694                 /*
695                   * Set daisy chain for otg_pin_id on 6q.
696                  *  For 6dl, this bit is reserved.
697                  */
698                 imx_iomux_set_gpr_register(1, 13, 1, 0);
699                 break;
700         case 1:
701                 break;
702         default:
703                 printf("MXC USB port %d not yet supported\n", port);
704                 return -EINVAL;
705         }
706         return 0;
707 }
708
709 int board_ehci_power(int port, int on)
710 {
711         switch (port) {
712         case 0:
713                 if (on)
714                         port_exp_direction_output(USB_OTG_PWR, 1);
715                 else
716                         port_exp_direction_output(USB_OTG_PWR, 0);
717                 break;
718         case 1:
719                 if (on)
720                         port_exp_direction_output(USB_HOST1_PWR, 1);
721                 else
722                         port_exp_direction_output(USB_HOST1_PWR, 0);
723                 break;
724         default:
725                 printf("MXC USB port %d not yet supported\n", port);
726                 return -EINVAL;
727         }
728
729         return 0;
730 }
731 #endif
732
733 #ifdef CONFIG_SPL_BUILD
734 #include <asm/arch/mx6-ddr.h>
735 #include <spl.h>
736 #include <linux/libfdt.h>
737
738 #ifdef CONFIG_SPL_OS_BOOT
739 int spl_start_uboot(void)
740 {
741         return 0;
742 }
743 #endif
744
745 static void ccgr_init(void)
746 {
747         struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
748
749         writel(0x00C03F3F, &ccm->CCGR0);
750         writel(0x0030FC03, &ccm->CCGR1);
751         writel(0x0FFFC000, &ccm->CCGR2);
752         writel(0x3FF00000, &ccm->CCGR3);
753         writel(0x00FFF300, &ccm->CCGR4);
754         writel(0x0F0000C3, &ccm->CCGR5);
755         writel(0x000003FF, &ccm->CCGR6);
756 }
757
758 static int mx6q_dcd_table[] = {
759         0x020e0798, 0x000C0000,
760         0x020e0758, 0x00000000,
761         0x020e0588, 0x00000030,
762         0x020e0594, 0x00000030,
763         0x020e056c, 0x00000030,
764         0x020e0578, 0x00000030,
765         0x020e074c, 0x00000030,
766         0x020e057c, 0x00000030,
767         0x020e058c, 0x00000000,
768         0x020e059c, 0x00000030,
769         0x020e05a0, 0x00000030,
770         0x020e078c, 0x00000030,
771         0x020e0750, 0x00020000,
772         0x020e05a8, 0x00000028,
773         0x020e05b0, 0x00000028,
774         0x020e0524, 0x00000028,
775         0x020e051c, 0x00000028,
776         0x020e0518, 0x00000028,
777         0x020e050c, 0x00000028,
778         0x020e05b8, 0x00000028,
779         0x020e05c0, 0x00000028,
780         0x020e0774, 0x00020000,
781         0x020e0784, 0x00000028,
782         0x020e0788, 0x00000028,
783         0x020e0794, 0x00000028,
784         0x020e079c, 0x00000028,
785         0x020e07a0, 0x00000028,
786         0x020e07a4, 0x00000028,
787         0x020e07a8, 0x00000028,
788         0x020e0748, 0x00000028,
789         0x020e05ac, 0x00000028,
790         0x020e05b4, 0x00000028,
791         0x020e0528, 0x00000028,
792         0x020e0520, 0x00000028,
793         0x020e0514, 0x00000028,
794         0x020e0510, 0x00000028,
795         0x020e05bc, 0x00000028,
796         0x020e05c4, 0x00000028,
797         0x021b0800, 0xa1390003,
798         0x021b080c, 0x001F001F,
799         0x021b0810, 0x001F001F,
800         0x021b480c, 0x001F001F,
801         0x021b4810, 0x001F001F,
802         0x021b083c, 0x43260335,
803         0x021b0840, 0x031A030B,
804         0x021b483c, 0x4323033B,
805         0x021b4840, 0x0323026F,
806         0x021b0848, 0x483D4545,
807         0x021b4848, 0x44433E48,
808         0x021b0850, 0x41444840,
809         0x021b4850, 0x4835483E,
810         0x021b081c, 0x33333333,
811         0x021b0820, 0x33333333,
812         0x021b0824, 0x33333333,
813         0x021b0828, 0x33333333,
814         0x021b481c, 0x33333333,
815         0x021b4820, 0x33333333,
816         0x021b4824, 0x33333333,
817         0x021b4828, 0x33333333,
818         0x021b08b8, 0x00000800,
819         0x021b48b8, 0x00000800,
820         0x021b0004, 0x00020036,
821         0x021b0008, 0x09444040,
822         0x021b000c, 0x8A8F7955,
823         0x021b0010, 0xFF328F64,
824         0x021b0014, 0x01FF00DB,
825         0x021b0018, 0x00001740,
826         0x021b001c, 0x00008000,
827         0x021b002c, 0x000026d2,
828         0x021b0030, 0x008F1023,
829         0x021b0040, 0x00000047,
830         0x021b0000, 0x841A0000,
831         0x021b001c, 0x04088032,
832         0x021b001c, 0x00008033,
833         0x021b001c, 0x00048031,
834         0x021b001c, 0x09408030,
835         0x021b001c, 0x04008040,
836         0x021b0020, 0x00005800,
837         0x021b0818, 0x00011117,
838         0x021b4818, 0x00011117,
839         0x021b0004, 0x00025576,
840         0x021b0404, 0x00011006,
841         0x021b001c, 0x00000000,
842         0x020c4068, 0x00C03F3F,
843         0x020c406c, 0x0030FC03,
844         0x020c4070, 0x0FFFC000,
845         0x020c4074, 0x3FF00000,
846         0x020c4078, 0xFFFFF300,
847         0x020c407c, 0x0F0000F3,
848         0x020c4080, 0x00000FFF,
849         0x020e0010, 0xF00000CF,
850         0x020e0018, 0x007F007F,
851         0x020e001c, 0x007F007F,
852 };
853
854 static int mx6qp_dcd_table[] = {
855         0x020e0798, 0x000C0000,
856         0x020e0758, 0x00000000,
857         0x020e0588, 0x00000030,
858         0x020e0594, 0x00000030,
859         0x020e056c, 0x00000030,
860         0x020e0578, 0x00000030,
861         0x020e074c, 0x00000030,
862         0x020e057c, 0x00000030,
863         0x020e058c, 0x00000000,
864         0x020e059c, 0x00000030,
865         0x020e05a0, 0x00000030,
866         0x020e078c, 0x00000030,
867         0x020e0750, 0x00020000,
868         0x020e05a8, 0x00000030,
869         0x020e05b0, 0x00000030,
870         0x020e0524, 0x00000030,
871         0x020e051c, 0x00000030,
872         0x020e0518, 0x00000030,
873         0x020e050c, 0x00000030,
874         0x020e05b8, 0x00000030,
875         0x020e05c0, 0x00000030,
876         0x020e0774, 0x00020000,
877         0x020e0784, 0x00000030,
878         0x020e0788, 0x00000030,
879         0x020e0794, 0x00000030,
880         0x020e079c, 0x00000030,
881         0x020e07a0, 0x00000030,
882         0x020e07a4, 0x00000030,
883         0x020e07a8, 0x00000030,
884         0x020e0748, 0x00000030,
885         0x020e05ac, 0x00000030,
886         0x020e05b4, 0x00000030,
887         0x020e0528, 0x00000030,
888         0x020e0520, 0x00000030,
889         0x020e0514, 0x00000030,
890         0x020e0510, 0x00000030,
891         0x020e05bc, 0x00000030,
892         0x020e05c4, 0x00000030,
893         0x021b0800, 0xa1390003,
894         0x021b080c, 0x001b001e,
895         0x021b0810, 0x002e0029,
896         0x021b480c, 0x001b002a,
897         0x021b4810, 0x0019002c,
898         0x021b083c, 0x43240334,
899         0x021b0840, 0x0324031a,
900         0x021b483c, 0x43340344,
901         0x021b4840, 0x03280276,
902         0x021b0848, 0x44383A3E,
903         0x021b4848, 0x3C3C3846,
904         0x021b0850, 0x2e303230,
905         0x021b4850, 0x38283E34,
906         0x021b081c, 0x33333333,
907         0x021b0820, 0x33333333,
908         0x021b0824, 0x33333333,
909         0x021b0828, 0x33333333,
910         0x021b481c, 0x33333333,
911         0x021b4820, 0x33333333,
912         0x021b4824, 0x33333333,
913         0x021b4828, 0x33333333,
914         0x021b08c0, 0x24912492,
915         0x021b48c0, 0x24912492,
916         0x021b08b8, 0x00000800,
917         0x021b48b8, 0x00000800,
918         0x021b0004, 0x00020036,
919         0x021b0008, 0x09444040,
920         0x021b000c, 0x898E7955,
921         0x021b0010, 0xFF328F64,
922         0x021b0014, 0x01FF00DB,
923         0x021b0018, 0x00001740,
924         0x021b001c, 0x00008000,
925         0x021b002c, 0x000026d2,
926         0x021b0030, 0x008E1023,
927         0x021b0040, 0x00000047,
928         0x021b0400, 0x14420000,
929         0x021b0000, 0x841A0000,
930         0x00bb0008, 0x00000004,
931         0x00bb000c, 0x2891E41A,
932         0x00bb0038, 0x00000564,
933         0x00bb0014, 0x00000040,
934         0x00bb0028, 0x00000020,
935         0x00bb002c, 0x00000020,
936         0x021b001c, 0x04088032,
937         0x021b001c, 0x00008033,
938         0x021b001c, 0x00048031,
939         0x021b001c, 0x09408030,
940         0x021b001c, 0x04008040,
941         0x021b0020, 0x00005800,
942         0x021b0818, 0x00011117,
943         0x021b4818, 0x00011117,
944         0x021b0004, 0x00025576,
945         0x021b0404, 0x00011006,
946         0x021b001c, 0x00000000,
947         0x020c4068, 0x00C03F3F,
948         0x020c406c, 0x0030FC03,
949         0x020c4070, 0x0FFFC000,
950         0x020c4074, 0x3FF00000,
951         0x020c4078, 0xFFFFF300,
952         0x020c407c, 0x0F0000F3,
953         0x020c4080, 0x00000FFF,
954         0x020e0010, 0xF00000CF,
955         0x020e0018, 0x77177717,
956         0x020e001c, 0x77177717,
957 };
958
959 static int mx6dl_dcd_table[] = {
960         0x020e0774, 0x000C0000,
961         0x020e0754, 0x00000000,
962         0x020e04ac, 0x00000030,
963         0x020e04b0, 0x00000030,
964         0x020e0464, 0x00000030,
965         0x020e0490, 0x00000030,
966         0x020e074c, 0x00000030,
967         0x020e0494, 0x00000030,
968         0x020e04a0, 0x00000000,
969         0x020e04b4, 0x00000030,
970         0x020e04b8, 0x00000030,
971         0x020e076c, 0x00000030,
972         0x020e0750, 0x00020000,
973         0x020e04bc, 0x00000028,
974         0x020e04c0, 0x00000028,
975         0x020e04c4, 0x00000028,
976         0x020e04c8, 0x00000028,
977         0x020e04cc, 0x00000028,
978         0x020e04d0, 0x00000028,
979         0x020e04d4, 0x00000028,
980         0x020e04d8, 0x00000028,
981         0x020e0760, 0x00020000,
982         0x020e0764, 0x00000028,
983         0x020e0770, 0x00000028,
984         0x020e0778, 0x00000028,
985         0x020e077c, 0x00000028,
986         0x020e0780, 0x00000028,
987         0x020e0784, 0x00000028,
988         0x020e078c, 0x00000028,
989         0x020e0748, 0x00000028,
990         0x020e0470, 0x00000028,
991         0x020e0474, 0x00000028,
992         0x020e0478, 0x00000028,
993         0x020e047c, 0x00000028,
994         0x020e0480, 0x00000028,
995         0x020e0484, 0x00000028,
996         0x020e0488, 0x00000028,
997         0x020e048c, 0x00000028,
998         0x021b0800, 0xa1390003,
999         0x021b080c, 0x001F001F,
1000         0x021b0810, 0x001F001F,
1001         0x021b480c, 0x001F001F,
1002         0x021b4810, 0x001F001F,
1003         0x021b083c, 0x42190217,
1004         0x021b0840, 0x017B017B,
1005         0x021b483c, 0x4176017B,
1006         0x021b4840, 0x015F016C,
1007         0x021b0848, 0x4C4C4D4C,
1008         0x021b4848, 0x4A4D4C48,
1009         0x021b0850, 0x3F3F3F40,
1010         0x021b4850, 0x3538382E,
1011         0x021b081c, 0x33333333,
1012         0x021b0820, 0x33333333,
1013         0x021b0824, 0x33333333,
1014         0x021b0828, 0x33333333,
1015         0x021b481c, 0x33333333,
1016         0x021b4820, 0x33333333,
1017         0x021b4824, 0x33333333,
1018         0x021b4828, 0x33333333,
1019         0x021b08b8, 0x00000800,
1020         0x021b48b8, 0x00000800,
1021         0x021b0004, 0x00020025,
1022         0x021b0008, 0x00333030,
1023         0x021b000c, 0x676B5313,
1024         0x021b0010, 0xB66E8B63,
1025         0x021b0014, 0x01FF00DB,
1026         0x021b0018, 0x00001740,
1027         0x021b001c, 0x00008000,
1028         0x021b002c, 0x000026d2,
1029         0x021b0030, 0x006B1023,
1030         0x021b0040, 0x00000047,
1031         0x021b0000, 0x841A0000,
1032         0x021b001c, 0x04008032,
1033         0x021b001c, 0x00008033,
1034         0x021b001c, 0x00048031,
1035         0x021b001c, 0x05208030,
1036         0x021b001c, 0x04008040,
1037         0x021b0020, 0x00005800,
1038         0x021b0818, 0x00011117,
1039         0x021b4818, 0x00011117,
1040         0x021b0004, 0x00025565,
1041         0x021b0404, 0x00011006,
1042         0x021b001c, 0x00000000,
1043         0x020c4068, 0x00C03F3F,
1044         0x020c406c, 0x0030FC03,
1045         0x020c4070, 0x0FFFC000,
1046         0x020c4074, 0x3FF00000,
1047         0x020c4078, 0xFFFFF300,
1048         0x020c407c, 0x0F0000C3,
1049         0x020c4080, 0x00000FFF,
1050         0x020e0010, 0xF00000CF,
1051         0x020e0018, 0x007F007F,
1052         0x020e001c, 0x007F007F,
1053 };
1054
1055 static void ddr_init(int *table, int size)
1056 {
1057         int i;
1058
1059         for (i = 0; i < size / 2 ; i++)
1060                 writel(table[2 * i + 1], table[2 * i]);
1061 }
1062
1063 static void spl_dram_init(void)
1064 {
1065         if (is_mx6dq())
1066                 ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
1067         else if (is_mx6dqp())
1068                 ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
1069         else if (is_mx6sdl())
1070                 ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
1071 }
1072
1073 void board_init_f(ulong dummy)
1074 {
1075         /* DDR initialization */
1076         spl_dram_init();
1077
1078         /* setup AIPS and disable watchdog */
1079         arch_cpu_init();
1080
1081         ccgr_init();
1082         gpr_init();
1083
1084         /* iomux and setup of i2c */
1085         board_early_init_f();
1086
1087         /* setup GP timer */
1088         timer_init();
1089
1090         /* UART clocks enabled and gd valid - init serial console */
1091         preloader_console_init();
1092
1093         /* Clear the BSS. */
1094         memset(__bss_start, 0, __bss_end - __bss_start);
1095
1096         /* load/boot image from boot device */
1097         board_init_r(NULL, 0);
1098 }
1099 #endif
1100
1101 #ifdef CONFIG_SPL_LOAD_FIT
1102 int board_fit_config_name_match(const char *name)
1103 {
1104         if (is_mx6dq()) {
1105                 if (!strcmp(name, "imx6q-sabreauto"))
1106                         return 0;
1107         } else if (is_mx6dqp()) {
1108                 if (!strcmp(name, "imx6qp-sabreauto"))
1109                         return 0;
1110         } else if (is_mx6dl()) {
1111                 if (!strcmp(name, "imx6dl-sabreauto"))
1112                         return 0;
1113         }
1114
1115         return -1;
1116 }
1117 #endif