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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 436*3f0a1042SFabio Estevam static int ar8031_phy_fixup(struct phy_device *phydev) 437*3f0a1042SFabio Estevam { 438*3f0a1042SFabio Estevam unsigned short val; 439*3f0a1042SFabio Estevam 440*3f0a1042SFabio Estevam /* To enable AR8031 ouput a 125MHz clk from CLK_25M */ 441*3f0a1042SFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7); 442*3f0a1042SFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016); 443*3f0a1042SFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007); 444*3f0a1042SFabio Estevam 445*3f0a1042SFabio Estevam val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe); 446*3f0a1042SFabio Estevam val &= 0xffe3; 447*3f0a1042SFabio Estevam val |= 0x18; 448*3f0a1042SFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val); 449*3f0a1042SFabio Estevam 450*3f0a1042SFabio Estevam /* introduce tx clock delay */ 451*3f0a1042SFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5); 452*3f0a1042SFabio Estevam val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e); 453*3f0a1042SFabio Estevam val |= 0x0100; 454*3f0a1042SFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val); 455*3f0a1042SFabio Estevam 456*3f0a1042SFabio Estevam return 0; 457*3f0a1042SFabio Estevam } 458*3f0a1042SFabio Estevam 459*3f0a1042SFabio Estevam int board_phy_config(struct phy_device *phydev) 460*3f0a1042SFabio Estevam { 461*3f0a1042SFabio Estevam ar8031_phy_fixup(phydev); 462*3f0a1042SFabio Estevam 463*3f0a1042SFabio Estevam if (phydev->drv->config) 464*3f0a1042SFabio Estevam phydev->drv->config(phydev); 465*3f0a1042SFabio Estevam 466*3f0a1042SFabio Estevam return 0; 467*3f0a1042SFabio Estevam } 468*3f0a1042SFabio Estevam 469d7c11502SVanessa Maegima #if defined(CONFIG_VIDEO_IPUV3) 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 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 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 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 */ 597d7c11502SVanessa Maegima int overwrite_console(void) 598d7c11502SVanessa Maegima { 599d7c11502SVanessa Maegima return 1; 600d7c11502SVanessa Maegima } 601d7c11502SVanessa Maegima 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 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 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 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 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 690d7c11502SVanessa Maegima setenv("board_name", "SABREAUTO"); 691d7c11502SVanessa Maegima 692d7c11502SVanessa Maegima if (is_mx6dqp()) 693d7c11502SVanessa Maegima setenv("board_rev", "MX6QP"); 694d7c11502SVanessa Maegima else if (is_mx6dq()) 695d7c11502SVanessa Maegima setenv("board_rev", "MX6Q"); 696d7c11502SVanessa Maegima else if (is_mx6sdl()) 697d7c11502SVanessa Maegima setenv("board_rev", "MX6DL"); 698d7c11502SVanessa Maegima #endif 699d7c11502SVanessa Maegima 700d7c11502SVanessa Maegima return 0; 701d7c11502SVanessa Maegima } 702d7c11502SVanessa Maegima 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 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 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> 779d7c11502SVanessa Maegima #include <libfdt.h> 780d7c11502SVanessa Maegima 78107f6ddb6SDiego Dorta #ifdef CONFIG_SPL_OS_BOOT 78207f6ddb6SDiego Dorta int spl_start_uboot(void) 78307f6ddb6SDiego Dorta { 78407f6ddb6SDiego Dorta return 0; 78507f6ddb6SDiego Dorta } 78607f6ddb6SDiego Dorta #endif 78707f6ddb6SDiego Dorta 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 void gpr_init(void) 802d7c11502SVanessa Maegima { 803d7c11502SVanessa Maegima struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; 804d7c11502SVanessa Maegima 805d7c11502SVanessa Maegima /* enable AXI cache for VDOA/VPU/IPU */ 806d7c11502SVanessa Maegima writel(0xF00000CF, &iomux->gpr[4]); 807d7c11502SVanessa Maegima if (is_mx6dqp()) { 808d7c11502SVanessa Maegima /* set IPU AXI-id1 Qos=0x1 AXI-id0/2/3 Qos=0x7 */ 809d7c11502SVanessa Maegima writel(0x007F007F, &iomux->gpr[6]); 810d7c11502SVanessa Maegima writel(0x007F007F, &iomux->gpr[7]); 811d7c11502SVanessa Maegima } else { 812d7c11502SVanessa Maegima /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */ 813d7c11502SVanessa Maegima writel(0x007F007F, &iomux->gpr[6]); 814d7c11502SVanessa Maegima writel(0x007F007F, &iomux->gpr[7]); 815d7c11502SVanessa Maegima } 816d7c11502SVanessa Maegima } 817d7c11502SVanessa Maegima 818d7c11502SVanessa Maegima static int mx6q_dcd_table[] = { 819d7c11502SVanessa Maegima 0x020e0798, 0x000C0000, 820d7c11502SVanessa Maegima 0x020e0758, 0x00000000, 821d7c11502SVanessa Maegima 0x020e0588, 0x00000030, 822d7c11502SVanessa Maegima 0x020e0594, 0x00000030, 823d7c11502SVanessa Maegima 0x020e056c, 0x00000030, 824d7c11502SVanessa Maegima 0x020e0578, 0x00000030, 825d7c11502SVanessa Maegima 0x020e074c, 0x00000030, 826d7c11502SVanessa Maegima 0x020e057c, 0x00000030, 827d7c11502SVanessa Maegima 0x020e058c, 0x00000000, 828d7c11502SVanessa Maegima 0x020e059c, 0x00000030, 829d7c11502SVanessa Maegima 0x020e05a0, 0x00000030, 830d7c11502SVanessa Maegima 0x020e078c, 0x00000030, 831d7c11502SVanessa Maegima 0x020e0750, 0x00020000, 832d7c11502SVanessa Maegima 0x020e05a8, 0x00000028, 833d7c11502SVanessa Maegima 0x020e05b0, 0x00000028, 834d7c11502SVanessa Maegima 0x020e0524, 0x00000028, 835d7c11502SVanessa Maegima 0x020e051c, 0x00000028, 836d7c11502SVanessa Maegima 0x020e0518, 0x00000028, 837d7c11502SVanessa Maegima 0x020e050c, 0x00000028, 838d7c11502SVanessa Maegima 0x020e05b8, 0x00000028, 839d7c11502SVanessa Maegima 0x020e05c0, 0x00000028, 840d7c11502SVanessa Maegima 0x020e0774, 0x00020000, 841d7c11502SVanessa Maegima 0x020e0784, 0x00000028, 842d7c11502SVanessa Maegima 0x020e0788, 0x00000028, 843d7c11502SVanessa Maegima 0x020e0794, 0x00000028, 844d7c11502SVanessa Maegima 0x020e079c, 0x00000028, 845d7c11502SVanessa Maegima 0x020e07a0, 0x00000028, 846d7c11502SVanessa Maegima 0x020e07a4, 0x00000028, 847d7c11502SVanessa Maegima 0x020e07a8, 0x00000028, 848d7c11502SVanessa Maegima 0x020e0748, 0x00000028, 849d7c11502SVanessa Maegima 0x020e05ac, 0x00000028, 850d7c11502SVanessa Maegima 0x020e05b4, 0x00000028, 851d7c11502SVanessa Maegima 0x020e0528, 0x00000028, 852d7c11502SVanessa Maegima 0x020e0520, 0x00000028, 853d7c11502SVanessa Maegima 0x020e0514, 0x00000028, 854d7c11502SVanessa Maegima 0x020e0510, 0x00000028, 855d7c11502SVanessa Maegima 0x020e05bc, 0x00000028, 856d7c11502SVanessa Maegima 0x020e05c4, 0x00000028, 857d7c11502SVanessa Maegima 0x021b0800, 0xa1390003, 858d7c11502SVanessa Maegima 0x021b080c, 0x001F001F, 859d7c11502SVanessa Maegima 0x021b0810, 0x001F001F, 860d7c11502SVanessa Maegima 0x021b480c, 0x001F001F, 861d7c11502SVanessa Maegima 0x021b4810, 0x001F001F, 862d7c11502SVanessa Maegima 0x021b083c, 0x43260335, 863d7c11502SVanessa Maegima 0x021b0840, 0x031A030B, 864d7c11502SVanessa Maegima 0x021b483c, 0x4323033B, 865d7c11502SVanessa Maegima 0x021b4840, 0x0323026F, 866d7c11502SVanessa Maegima 0x021b0848, 0x483D4545, 867d7c11502SVanessa Maegima 0x021b4848, 0x44433E48, 868d7c11502SVanessa Maegima 0x021b0850, 0x41444840, 869d7c11502SVanessa Maegima 0x021b4850, 0x4835483E, 870d7c11502SVanessa Maegima 0x021b081c, 0x33333333, 871d7c11502SVanessa Maegima 0x021b0820, 0x33333333, 872d7c11502SVanessa Maegima 0x021b0824, 0x33333333, 873d7c11502SVanessa Maegima 0x021b0828, 0x33333333, 874d7c11502SVanessa Maegima 0x021b481c, 0x33333333, 875d7c11502SVanessa Maegima 0x021b4820, 0x33333333, 876d7c11502SVanessa Maegima 0x021b4824, 0x33333333, 877d7c11502SVanessa Maegima 0x021b4828, 0x33333333, 878d7c11502SVanessa Maegima 0x021b08b8, 0x00000800, 879d7c11502SVanessa Maegima 0x021b48b8, 0x00000800, 880d7c11502SVanessa Maegima 0x021b0004, 0x00020036, 881d7c11502SVanessa Maegima 0x021b0008, 0x09444040, 882d7c11502SVanessa Maegima 0x021b000c, 0x8A8F7955, 883d7c11502SVanessa Maegima 0x021b0010, 0xFF328F64, 884d7c11502SVanessa Maegima 0x021b0014, 0x01FF00DB, 885d7c11502SVanessa Maegima 0x021b0018, 0x00001740, 886d7c11502SVanessa Maegima 0x021b001c, 0x00008000, 887d7c11502SVanessa Maegima 0x021b002c, 0x000026d2, 888d7c11502SVanessa Maegima 0x021b0030, 0x008F1023, 889d7c11502SVanessa Maegima 0x021b0040, 0x00000047, 890d7c11502SVanessa Maegima 0x021b0000, 0x841A0000, 891d7c11502SVanessa Maegima 0x021b001c, 0x04088032, 892d7c11502SVanessa Maegima 0x021b001c, 0x00008033, 893d7c11502SVanessa Maegima 0x021b001c, 0x00048031, 894d7c11502SVanessa Maegima 0x021b001c, 0x09408030, 895d7c11502SVanessa Maegima 0x021b001c, 0x04008040, 896d7c11502SVanessa Maegima 0x021b0020, 0x00005800, 897d7c11502SVanessa Maegima 0x021b0818, 0x00011117, 898d7c11502SVanessa Maegima 0x021b4818, 0x00011117, 899d7c11502SVanessa Maegima 0x021b0004, 0x00025576, 900d7c11502SVanessa Maegima 0x021b0404, 0x00011006, 901d7c11502SVanessa Maegima 0x021b001c, 0x00000000, 902d7c11502SVanessa Maegima 0x020c4068, 0x00C03F3F, 903d7c11502SVanessa Maegima 0x020c406c, 0x0030FC03, 904d7c11502SVanessa Maegima 0x020c4070, 0x0FFFC000, 905d7c11502SVanessa Maegima 0x020c4074, 0x3FF00000, 906d7c11502SVanessa Maegima 0x020c4078, 0xFFFFF300, 907d7c11502SVanessa Maegima 0x020c407c, 0x0F0000F3, 908d7c11502SVanessa Maegima 0x020c4080, 0x00000FFF, 909d7c11502SVanessa Maegima 0x020e0010, 0xF00000CF, 910d7c11502SVanessa Maegima 0x020e0018, 0x007F007F, 911d7c11502SVanessa Maegima 0x020e001c, 0x007F007F, 912d7c11502SVanessa Maegima }; 913d7c11502SVanessa Maegima 914d7c11502SVanessa Maegima static int mx6qp_dcd_table[] = { 915d7c11502SVanessa Maegima 0x020e0798, 0x000C0000, 916d7c11502SVanessa Maegima 0x020e0758, 0x00000000, 917d7c11502SVanessa Maegima 0x020e0588, 0x00000030, 918d7c11502SVanessa Maegima 0x020e0594, 0x00000030, 919d7c11502SVanessa Maegima 0x020e056c, 0x00000030, 920d7c11502SVanessa Maegima 0x020e0578, 0x00000030, 921d7c11502SVanessa Maegima 0x020e074c, 0x00000030, 922d7c11502SVanessa Maegima 0x020e057c, 0x00000030, 923d7c11502SVanessa Maegima 0x020e058c, 0x00000000, 924d7c11502SVanessa Maegima 0x020e059c, 0x00000030, 925d7c11502SVanessa Maegima 0x020e05a0, 0x00000030, 926d7c11502SVanessa Maegima 0x020e078c, 0x00000030, 927d7c11502SVanessa Maegima 0x020e0750, 0x00020000, 928d7c11502SVanessa Maegima 0x020e05a8, 0x00000030, 929d7c11502SVanessa Maegima 0x020e05b0, 0x00000030, 930d7c11502SVanessa Maegima 0x020e0524, 0x00000030, 931d7c11502SVanessa Maegima 0x020e051c, 0x00000030, 932d7c11502SVanessa Maegima 0x020e0518, 0x00000030, 933d7c11502SVanessa Maegima 0x020e050c, 0x00000030, 934d7c11502SVanessa Maegima 0x020e05b8, 0x00000030, 935d7c11502SVanessa Maegima 0x020e05c0, 0x00000030, 936d7c11502SVanessa Maegima 0x020e0774, 0x00020000, 937d7c11502SVanessa Maegima 0x020e0784, 0x00000030, 938d7c11502SVanessa Maegima 0x020e0788, 0x00000030, 939d7c11502SVanessa Maegima 0x020e0794, 0x00000030, 940d7c11502SVanessa Maegima 0x020e079c, 0x00000030, 941d7c11502SVanessa Maegima 0x020e07a0, 0x00000030, 942d7c11502SVanessa Maegima 0x020e07a4, 0x00000030, 943d7c11502SVanessa Maegima 0x020e07a8, 0x00000030, 944d7c11502SVanessa Maegima 0x020e0748, 0x00000030, 945d7c11502SVanessa Maegima 0x020e05ac, 0x00000030, 946d7c11502SVanessa Maegima 0x020e05b4, 0x00000030, 947d7c11502SVanessa Maegima 0x020e0528, 0x00000030, 948d7c11502SVanessa Maegima 0x020e0520, 0x00000030, 949d7c11502SVanessa Maegima 0x020e0514, 0x00000030, 950d7c11502SVanessa Maegima 0x020e0510, 0x00000030, 951d7c11502SVanessa Maegima 0x020e05bc, 0x00000030, 952d7c11502SVanessa Maegima 0x020e05c4, 0x00000030, 953d7c11502SVanessa Maegima 0x021b0800, 0xa1390003, 954d7c11502SVanessa Maegima 0x021b080c, 0x001b001e, 955d7c11502SVanessa Maegima 0x021b0810, 0x002e0029, 956d7c11502SVanessa Maegima 0x021b480c, 0x001b002a, 957d7c11502SVanessa Maegima 0x021b4810, 0x0019002c, 958d7c11502SVanessa Maegima 0x021b083c, 0x43240334, 959d7c11502SVanessa Maegima 0x021b0840, 0x0324031a, 960d7c11502SVanessa Maegima 0x021b483c, 0x43340344, 961d7c11502SVanessa Maegima 0x021b4840, 0x03280276, 962d7c11502SVanessa Maegima 0x021b0848, 0x44383A3E, 963d7c11502SVanessa Maegima 0x021b4848, 0x3C3C3846, 964d7c11502SVanessa Maegima 0x021b0850, 0x2e303230, 965d7c11502SVanessa Maegima 0x021b4850, 0x38283E34, 966d7c11502SVanessa Maegima 0x021b081c, 0x33333333, 967d7c11502SVanessa Maegima 0x021b0820, 0x33333333, 968d7c11502SVanessa Maegima 0x021b0824, 0x33333333, 969d7c11502SVanessa Maegima 0x021b0828, 0x33333333, 970d7c11502SVanessa Maegima 0x021b481c, 0x33333333, 971d7c11502SVanessa Maegima 0x021b4820, 0x33333333, 972d7c11502SVanessa Maegima 0x021b4824, 0x33333333, 973d7c11502SVanessa Maegima 0x021b4828, 0x33333333, 974d7c11502SVanessa Maegima 0x021b08c0, 0x24912492, 975d7c11502SVanessa Maegima 0x021b48c0, 0x24912492, 976d7c11502SVanessa Maegima 0x021b08b8, 0x00000800, 977d7c11502SVanessa Maegima 0x021b48b8, 0x00000800, 978d7c11502SVanessa Maegima 0x021b0004, 0x00020036, 979d7c11502SVanessa Maegima 0x021b0008, 0x09444040, 980d7c11502SVanessa Maegima 0x021b000c, 0x898E7955, 981d7c11502SVanessa Maegima 0x021b0010, 0xFF328F64, 982d7c11502SVanessa Maegima 0x021b0014, 0x01FF00DB, 983d7c11502SVanessa Maegima 0x021b0018, 0x00001740, 984d7c11502SVanessa Maegima 0x021b001c, 0x00008000, 985d7c11502SVanessa Maegima 0x021b002c, 0x000026d2, 986d7c11502SVanessa Maegima 0x021b0030, 0x008E1023, 987d7c11502SVanessa Maegima 0x021b0040, 0x00000047, 988d7c11502SVanessa Maegima 0x021b0400, 0x14420000, 989d7c11502SVanessa Maegima 0x021b0000, 0x841A0000, 990d7c11502SVanessa Maegima 0x00bb0008, 0x00000004, 991d7c11502SVanessa Maegima 0x00bb000c, 0x2891E41A, 992d7c11502SVanessa Maegima 0x00bb0038, 0x00000564, 993d7c11502SVanessa Maegima 0x00bb0014, 0x00000040, 994d7c11502SVanessa Maegima 0x00bb0028, 0x00000020, 995d7c11502SVanessa Maegima 0x00bb002c, 0x00000020, 996d7c11502SVanessa Maegima 0x021b001c, 0x04088032, 997d7c11502SVanessa Maegima 0x021b001c, 0x00008033, 998d7c11502SVanessa Maegima 0x021b001c, 0x00048031, 999d7c11502SVanessa Maegima 0x021b001c, 0x09408030, 1000d7c11502SVanessa Maegima 0x021b001c, 0x04008040, 1001d7c11502SVanessa Maegima 0x021b0020, 0x00005800, 1002d7c11502SVanessa Maegima 0x021b0818, 0x00011117, 1003d7c11502SVanessa Maegima 0x021b4818, 0x00011117, 1004d7c11502SVanessa Maegima 0x021b0004, 0x00025576, 1005d7c11502SVanessa Maegima 0x021b0404, 0x00011006, 1006d7c11502SVanessa Maegima 0x021b001c, 0x00000000, 1007d7c11502SVanessa Maegima 0x020c4068, 0x00C03F3F, 1008d7c11502SVanessa Maegima 0x020c406c, 0x0030FC03, 1009d7c11502SVanessa Maegima 0x020c4070, 0x0FFFC000, 1010d7c11502SVanessa Maegima 0x020c4074, 0x3FF00000, 1011d7c11502SVanessa Maegima 0x020c4078, 0xFFFFF300, 1012d7c11502SVanessa Maegima 0x020c407c, 0x0F0000F3, 1013d7c11502SVanessa Maegima 0x020c4080, 0x00000FFF, 1014d7c11502SVanessa Maegima 0x020e0010, 0xF00000CF, 1015d7c11502SVanessa Maegima 0x020e0018, 0x77177717, 1016d7c11502SVanessa Maegima 0x020e001c, 0x77177717, 1017d7c11502SVanessa Maegima }; 1018d7c11502SVanessa Maegima 1019d7c11502SVanessa Maegima static int mx6dl_dcd_table[] = { 1020d7c11502SVanessa Maegima 0x020e0774, 0x000C0000, 1021d7c11502SVanessa Maegima 0x020e0754, 0x00000000, 1022d7c11502SVanessa Maegima 0x020e04ac, 0x00000030, 1023d7c11502SVanessa Maegima 0x020e04b0, 0x00000030, 1024d7c11502SVanessa Maegima 0x020e0464, 0x00000030, 1025d7c11502SVanessa Maegima 0x020e0490, 0x00000030, 1026d7c11502SVanessa Maegima 0x020e074c, 0x00000030, 1027d7c11502SVanessa Maegima 0x020e0494, 0x00000030, 1028d7c11502SVanessa Maegima 0x020e04a0, 0x00000000, 1029d7c11502SVanessa Maegima 0x020e04b4, 0x00000030, 1030d7c11502SVanessa Maegima 0x020e04b8, 0x00000030, 1031d7c11502SVanessa Maegima 0x020e076c, 0x00000030, 1032d7c11502SVanessa Maegima 0x020e0750, 0x00020000, 1033d7c11502SVanessa Maegima 0x020e04bc, 0x00000028, 1034d7c11502SVanessa Maegima 0x020e04c0, 0x00000028, 1035d7c11502SVanessa Maegima 0x020e04c4, 0x00000028, 1036d7c11502SVanessa Maegima 0x020e04c8, 0x00000028, 1037d7c11502SVanessa Maegima 0x020e04cc, 0x00000028, 1038d7c11502SVanessa Maegima 0x020e04d0, 0x00000028, 1039d7c11502SVanessa Maegima 0x020e04d4, 0x00000028, 1040d7c11502SVanessa Maegima 0x020e04d8, 0x00000028, 1041d7c11502SVanessa Maegima 0x020e0760, 0x00020000, 1042d7c11502SVanessa Maegima 0x020e0764, 0x00000028, 1043d7c11502SVanessa Maegima 0x020e0770, 0x00000028, 1044d7c11502SVanessa Maegima 0x020e0778, 0x00000028, 1045d7c11502SVanessa Maegima 0x020e077c, 0x00000028, 1046d7c11502SVanessa Maegima 0x020e0780, 0x00000028, 1047d7c11502SVanessa Maegima 0x020e0784, 0x00000028, 1048d7c11502SVanessa Maegima 0x020e078c, 0x00000028, 1049d7c11502SVanessa Maegima 0x020e0748, 0x00000028, 1050d7c11502SVanessa Maegima 0x020e0470, 0x00000028, 1051d7c11502SVanessa Maegima 0x020e0474, 0x00000028, 1052d7c11502SVanessa Maegima 0x020e0478, 0x00000028, 1053d7c11502SVanessa Maegima 0x020e047c, 0x00000028, 1054d7c11502SVanessa Maegima 0x020e0480, 0x00000028, 1055d7c11502SVanessa Maegima 0x020e0484, 0x00000028, 1056d7c11502SVanessa Maegima 0x020e0488, 0x00000028, 1057d7c11502SVanessa Maegima 0x020e048c, 0x00000028, 1058d7c11502SVanessa Maegima 0x021b0800, 0xa1390003, 1059d7c11502SVanessa Maegima 0x021b080c, 0x001F001F, 1060d7c11502SVanessa Maegima 0x021b0810, 0x001F001F, 1061d7c11502SVanessa Maegima 0x021b480c, 0x001F001F, 1062d7c11502SVanessa Maegima 0x021b4810, 0x001F001F, 1063d7c11502SVanessa Maegima 0x021b083c, 0x42190217, 1064d7c11502SVanessa Maegima 0x021b0840, 0x017B017B, 1065d7c11502SVanessa Maegima 0x021b483c, 0x4176017B, 1066d7c11502SVanessa Maegima 0x021b4840, 0x015F016C, 1067d7c11502SVanessa Maegima 0x021b0848, 0x4C4C4D4C, 1068d7c11502SVanessa Maegima 0x021b4848, 0x4A4D4C48, 1069d7c11502SVanessa Maegima 0x021b0850, 0x3F3F3F40, 1070d7c11502SVanessa Maegima 0x021b4850, 0x3538382E, 1071d7c11502SVanessa Maegima 0x021b081c, 0x33333333, 1072d7c11502SVanessa Maegima 0x021b0820, 0x33333333, 1073d7c11502SVanessa Maegima 0x021b0824, 0x33333333, 1074d7c11502SVanessa Maegima 0x021b0828, 0x33333333, 1075d7c11502SVanessa Maegima 0x021b481c, 0x33333333, 1076d7c11502SVanessa Maegima 0x021b4820, 0x33333333, 1077d7c11502SVanessa Maegima 0x021b4824, 0x33333333, 1078d7c11502SVanessa Maegima 0x021b4828, 0x33333333, 1079d7c11502SVanessa Maegima 0x021b08b8, 0x00000800, 1080d7c11502SVanessa Maegima 0x021b48b8, 0x00000800, 1081d7c11502SVanessa Maegima 0x021b0004, 0x00020025, 1082d7c11502SVanessa Maegima 0x021b0008, 0x00333030, 1083d7c11502SVanessa Maegima 0x021b000c, 0x676B5313, 1084d7c11502SVanessa Maegima 0x021b0010, 0xB66E8B63, 1085d7c11502SVanessa Maegima 0x021b0014, 0x01FF00DB, 1086d7c11502SVanessa Maegima 0x021b0018, 0x00001740, 1087d7c11502SVanessa Maegima 0x021b001c, 0x00008000, 1088d7c11502SVanessa Maegima 0x021b002c, 0x000026d2, 1089d7c11502SVanessa Maegima 0x021b0030, 0x006B1023, 1090d7c11502SVanessa Maegima 0x021b0040, 0x00000047, 1091d7c11502SVanessa Maegima 0x021b0000, 0x841A0000, 1092d7c11502SVanessa Maegima 0x021b001c, 0x04008032, 1093d7c11502SVanessa Maegima 0x021b001c, 0x00008033, 1094d7c11502SVanessa Maegima 0x021b001c, 0x00048031, 1095d7c11502SVanessa Maegima 0x021b001c, 0x05208030, 1096d7c11502SVanessa Maegima 0x021b001c, 0x04008040, 1097d7c11502SVanessa Maegima 0x021b0020, 0x00005800, 1098d7c11502SVanessa Maegima 0x021b0818, 0x00011117, 1099d7c11502SVanessa Maegima 0x021b4818, 0x00011117, 1100d7c11502SVanessa Maegima 0x021b0004, 0x00025565, 1101d7c11502SVanessa Maegima 0x021b0404, 0x00011006, 1102d7c11502SVanessa Maegima 0x021b001c, 0x00000000, 1103d7c11502SVanessa Maegima 0x020c4068, 0x00C03F3F, 1104d7c11502SVanessa Maegima 0x020c406c, 0x0030FC03, 1105d7c11502SVanessa Maegima 0x020c4070, 0x0FFFC000, 1106d7c11502SVanessa Maegima 0x020c4074, 0x3FF00000, 1107d7c11502SVanessa Maegima 0x020c4078, 0xFFFFF300, 1108d7c11502SVanessa Maegima 0x020c407c, 0x0F0000C3, 1109d7c11502SVanessa Maegima 0x020c4080, 0x00000FFF, 1110d7c11502SVanessa Maegima 0x020e0010, 0xF00000CF, 1111d7c11502SVanessa Maegima 0x020e0018, 0x007F007F, 1112d7c11502SVanessa Maegima 0x020e001c, 0x007F007F, 1113d7c11502SVanessa Maegima }; 1114d7c11502SVanessa Maegima 1115d7c11502SVanessa Maegima static void ddr_init(int *table, int size) 1116d7c11502SVanessa Maegima { 1117d7c11502SVanessa Maegima int i; 1118d7c11502SVanessa Maegima 1119d7c11502SVanessa Maegima for (i = 0; i < size / 2 ; i++) 1120d7c11502SVanessa Maegima writel(table[2 * i + 1], table[2 * i]); 1121d7c11502SVanessa Maegima } 1122d7c11502SVanessa Maegima 1123d7c11502SVanessa Maegima static void spl_dram_init(void) 1124d7c11502SVanessa Maegima { 1125d7c11502SVanessa Maegima if (is_mx6dq()) 1126d7c11502SVanessa Maegima ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table)); 1127d7c11502SVanessa Maegima else if (is_mx6dqp()) 1128d7c11502SVanessa Maegima ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table)); 1129d7c11502SVanessa Maegima else if (is_mx6sdl()) 1130d7c11502SVanessa Maegima ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table)); 1131d7c11502SVanessa Maegima } 1132d7c11502SVanessa Maegima 1133d7c11502SVanessa Maegima void board_init_f(ulong dummy) 1134d7c11502SVanessa Maegima { 1135d7c11502SVanessa Maegima /* DDR initialization */ 1136d7c11502SVanessa Maegima spl_dram_init(); 1137d7c11502SVanessa Maegima 1138d7c11502SVanessa Maegima /* setup AIPS and disable watchdog */ 1139d7c11502SVanessa Maegima arch_cpu_init(); 1140d7c11502SVanessa Maegima 1141d7c11502SVanessa Maegima ccgr_init(); 1142d7c11502SVanessa Maegima gpr_init(); 1143d7c11502SVanessa Maegima 1144d7c11502SVanessa Maegima /* iomux and setup of i2c */ 1145d7c11502SVanessa Maegima board_early_init_f(); 1146d7c11502SVanessa Maegima 1147d7c11502SVanessa Maegima /* setup GP timer */ 1148d7c11502SVanessa Maegima timer_init(); 1149d7c11502SVanessa Maegima 1150d7c11502SVanessa Maegima /* UART clocks enabled and gd valid - init serial console */ 1151d7c11502SVanessa Maegima preloader_console_init(); 1152d7c11502SVanessa Maegima 1153d7c11502SVanessa Maegima /* Clear the BSS. */ 1154d7c11502SVanessa Maegima memset(__bss_start, 0, __bss_end - __bss_start); 1155d7c11502SVanessa Maegima 1156d7c11502SVanessa Maegima /* load/boot image from boot device */ 1157d7c11502SVanessa Maegima board_init_r(NULL, 0); 1158d7c11502SVanessa Maegima } 1159d7c11502SVanessa Maegima #endif 1160