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