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