1c1747970SPierre Aubert /* 2c1747970SPierre Aubert * Copyright (C) 2012 Freescale Semiconductor, Inc. 3c1747970SPierre Aubert * 4c1747970SPierre Aubert * Author: Fabio Estevam <fabio.estevam@freescale.com> 5c1747970SPierre Aubert * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 7c1747970SPierre Aubert */ 8c1747970SPierre Aubert 9c1747970SPierre Aubert #include <asm/arch/clock.h> 10c1747970SPierre Aubert #include <asm/arch/imx-regs.h> 11c1747970SPierre Aubert #include <asm/arch/iomux.h> 12c1747970SPierre Aubert #include <asm/arch/mx6-pins.h> 131221ce45SMasahiro Yamada #include <linux/errno.h> 14c1747970SPierre Aubert #include <asm/gpio.h> 1566ca09fcSFabio Estevam #include <asm/imx-common/mxc_i2c.h> 16c1747970SPierre Aubert #include <asm/imx-common/iomux-v3.h> 17c1747970SPierre Aubert #include <asm/imx-common/boot_mode.h> 18053b795eSEric Benard #include <asm/imx-common/video.h> 19c1747970SPierre Aubert #include <mmc.h> 20c1747970SPierre Aubert #include <fsl_esdhc.h> 21c1747970SPierre Aubert #include <miiphy.h> 22c1747970SPierre Aubert #include <netdev.h> 2358cc9787SPardeep Kumar Singla #include <asm/arch/mxc_hdmi.h> 2458cc9787SPardeep Kumar Singla #include <asm/arch/crm_regs.h> 2558cc9787SPardeep Kumar Singla #include <asm/io.h> 2658cc9787SPardeep Kumar Singla #include <asm/arch/sys_proto.h> 2766ca09fcSFabio Estevam #include <i2c.h> 2866ca09fcSFabio Estevam #include <power/pmic.h> 2966ca09fcSFabio Estevam #include <power/pfuze100_pmic.h> 30f0fabb79SYe.Li #include "../common/pfuze.h" 315a3d63c5SPeng Fan #include <usb.h> 3275f2ba42SJohn Tobias 33c1747970SPierre Aubert DECLARE_GLOBAL_DATA_PTR; 34c1747970SPierre Aubert 35c1747970SPierre Aubert #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ 36c1747970SPierre Aubert PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \ 37c1747970SPierre Aubert PAD_CTL_SRE_FAST | PAD_CTL_HYS) 38c1747970SPierre Aubert 39c1747970SPierre Aubert #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \ 40c1747970SPierre Aubert PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \ 41c1747970SPierre Aubert PAD_CTL_SRE_FAST | PAD_CTL_HYS) 42c1747970SPierre Aubert 43c1747970SPierre Aubert #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ 44c1747970SPierre Aubert PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS) 45c1747970SPierre Aubert 468bfa9c69SFabio Estevam #define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \ 478bfa9c69SFabio Estevam PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST) 488bfa9c69SFabio Estevam 4966ca09fcSFabio Estevam #define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \ 5066ca09fcSFabio Estevam PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \ 5166ca09fcSFabio Estevam PAD_CTL_ODE | PAD_CTL_SRE_FAST) 5266ca09fcSFabio Estevam 5366ca09fcSFabio Estevam #define I2C_PMIC 1 5466ca09fcSFabio Estevam 5566ca09fcSFabio Estevam #define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL) 5666ca09fcSFabio Estevam 57ca9d817aSFabio Estevam #define DISP0_PWR_EN IMX_GPIO_NR(1, 21) 58ca9d817aSFabio Estevam 59d96796caSDiego Dorta #define KEY_VOL_UP IMX_GPIO_NR(1, 4) 60d96796caSDiego Dorta 61c1747970SPierre Aubert int dram_init(void) 62c1747970SPierre Aubert { 6375f2ba42SJohn Tobias gd->ram_size = imx_ddr_size(); 64c1747970SPierre Aubert return 0; 65c1747970SPierre Aubert } 66c1747970SPierre Aubert 673302c275SFabio Estevam static iomux_v3_cfg_t const uart1_pads[] = { 68ff9f71b4SFabio Estevam IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)), 69ff9f71b4SFabio Estevam IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)), 70c1747970SPierre Aubert }; 71c1747970SPierre Aubert 723302c275SFabio Estevam static iomux_v3_cfg_t const enet_pads[] = { 73ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)), 74ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)), 75ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)), 76ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)), 77ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)), 78ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)), 79ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)), 80ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)), 81ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL)), 82ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)), 83ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)), 84ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)), 85ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)), 86ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)), 87ff9f71b4SFabio Estevam IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)), 88c1747970SPierre Aubert /* AR8031 PHY Reset */ 89ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL)), 90c1747970SPierre Aubert }; 91c1747970SPierre Aubert 92c1747970SPierre Aubert static void setup_iomux_enet(void) 93c1747970SPierre Aubert { 94ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(enet_pads); 95c1747970SPierre Aubert 96c1747970SPierre Aubert /* Reset AR8031 PHY */ 97c1747970SPierre Aubert gpio_direction_output(IMX_GPIO_NR(1, 25) , 0); 98a307760aSFabio Estevam mdelay(10); 99c1747970SPierre Aubert gpio_set_value(IMX_GPIO_NR(1, 25), 1); 100a307760aSFabio Estevam udelay(100); 101c1747970SPierre Aubert } 102c1747970SPierre Aubert 1033302c275SFabio Estevam static iomux_v3_cfg_t const usdhc2_pads[] = { 104ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 105ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 106ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 107ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 108ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 109ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 110ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 111ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 112ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 113ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 114ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */ 115c1747970SPierre Aubert }; 116c1747970SPierre Aubert 1173302c275SFabio Estevam static iomux_v3_cfg_t const usdhc3_pads[] = { 118ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 119ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 120ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 121ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 122ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 123ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 124ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 125ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 126ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 127ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 128ff9f71b4SFabio Estevam IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */ 129c1747970SPierre Aubert }; 130c1747970SPierre Aubert 1313302c275SFabio Estevam static iomux_v3_cfg_t const usdhc4_pads[] = { 132ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_CLK__SD4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 133ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_CMD__SD4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 134ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 135ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 136ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 137ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 138ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 139ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 140ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 141ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)), 142c1747970SPierre Aubert }; 143c1747970SPierre Aubert 1443302c275SFabio Estevam static iomux_v3_cfg_t const ecspi1_pads[] = { 145ff9f71b4SFabio Estevam IOMUX_PADS(PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)), 146ff9f71b4SFabio Estevam IOMUX_PADS(PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)), 147ff9f71b4SFabio Estevam IOMUX_PADS(PAD_KEY_ROW0__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)), 148ff9f71b4SFabio Estevam IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL)), 1498bfa9c69SFabio Estevam }; 1508bfa9c69SFabio Estevam 151ca9d817aSFabio Estevam static iomux_v3_cfg_t const rgb_pads[] = { 152ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL)), 153ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL)), 154ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL)), 155ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL)), 156ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL)), 157ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)), 158ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)), 159ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)), 160ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)), 161ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)), 162ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)), 163ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)), 164ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)), 165ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL)), 166ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL)), 167ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL)), 168ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL)), 169ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL)), 170ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL)), 171ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL)), 172ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL)), 173ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL)), 174ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL)), 175ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL)), 176ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL)), 177ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL)), 178ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL)), 179ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL)), 180ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL)), 1816c51a364SMarco Franchi }; 1826c51a364SMarco Franchi 1836c51a364SMarco Franchi static iomux_v3_cfg_t const bl_pads[] = { 184ff9f71b4SFabio Estevam IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL)), 185ca9d817aSFabio Estevam }; 186ca9d817aSFabio Estevam 1876c51a364SMarco Franchi static void enable_backlight(void) 1886c51a364SMarco Franchi { 189ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(bl_pads); 1906c51a364SMarco Franchi gpio_direction_output(DISP0_PWR_EN, 1); 1916c51a364SMarco Franchi } 1926c51a364SMarco Franchi 193ca9d817aSFabio Estevam static void enable_rgb(struct display_info_t const *dev) 194ca9d817aSFabio Estevam { 195ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(rgb_pads); 1966c51a364SMarco Franchi enable_backlight(); 1976c51a364SMarco Franchi } 1986c51a364SMarco Franchi 1996c51a364SMarco Franchi static void enable_lvds(struct display_info_t const *dev) 2006c51a364SMarco Franchi { 2016c51a364SMarco Franchi enable_backlight(); 202ca9d817aSFabio Estevam } 203ca9d817aSFabio Estevam 204ff9f71b4SFabio Estevam static struct i2c_pads_info mx6q_i2c_pad_info1 = { 20566ca09fcSFabio Estevam .scl = { 206ff9f71b4SFabio Estevam .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | I2C_PAD, 207ff9f71b4SFabio Estevam .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD, 20866ca09fcSFabio Estevam .gp = IMX_GPIO_NR(4, 12) 20966ca09fcSFabio Estevam }, 21066ca09fcSFabio Estevam .sda = { 211ff9f71b4SFabio Estevam .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD, 212ff9f71b4SFabio Estevam .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD, 213ff9f71b4SFabio Estevam .gp = IMX_GPIO_NR(4, 13) 214ff9f71b4SFabio Estevam } 215ff9f71b4SFabio Estevam }; 216ff9f71b4SFabio Estevam 217ff9f71b4SFabio Estevam static struct i2c_pads_info mx6dl_i2c_pad_info1 = { 218ff9f71b4SFabio Estevam .scl = { 219ff9f71b4SFabio Estevam .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | I2C_PAD, 220ff9f71b4SFabio Estevam .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD, 221ff9f71b4SFabio Estevam .gp = IMX_GPIO_NR(4, 12) 222ff9f71b4SFabio Estevam }, 223ff9f71b4SFabio Estevam .sda = { 224ff9f71b4SFabio Estevam .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD, 225ff9f71b4SFabio Estevam .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD, 22666ca09fcSFabio Estevam .gp = IMX_GPIO_NR(4, 13) 22766ca09fcSFabio Estevam } 22866ca09fcSFabio Estevam }; 22966ca09fcSFabio Estevam 2308bfa9c69SFabio Estevam static void setup_spi(void) 2318bfa9c69SFabio Estevam { 232ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(ecspi1_pads); 2338bfa9c69SFabio Estevam } 2348bfa9c69SFabio Estevam 235e919aa23SMarek Vasut iomux_v3_cfg_t const pcie_pads[] = { 236ff9f71b4SFabio Estevam IOMUX_PADS(PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* POWER */ 237ff9f71b4SFabio Estevam IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL)), /* RESET */ 238e919aa23SMarek Vasut }; 239e919aa23SMarek Vasut 240e919aa23SMarek Vasut static void setup_pcie(void) 241e919aa23SMarek Vasut { 242ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(pcie_pads); 243e919aa23SMarek Vasut } 244e919aa23SMarek Vasut 245be4ab3ddSFabio Estevam iomux_v3_cfg_t const di0_pads[] = { 246ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK), /* DISP0_CLK */ 247ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02), /* DISP0_HSYNC */ 248ff9f71b4SFabio Estevam IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03), /* DISP0_VSYNC */ 249be4ab3ddSFabio Estevam }; 250be4ab3ddSFabio Estevam 251c1747970SPierre Aubert static void setup_iomux_uart(void) 252c1747970SPierre Aubert { 253ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(uart1_pads); 254c1747970SPierre Aubert } 255c1747970SPierre Aubert 256c1747970SPierre Aubert #ifdef CONFIG_FSL_ESDHC 257c1747970SPierre Aubert struct fsl_esdhc_cfg usdhc_cfg[3] = { 258c1747970SPierre Aubert {USDHC2_BASE_ADDR}, 259c1747970SPierre Aubert {USDHC3_BASE_ADDR}, 260c1747970SPierre Aubert {USDHC4_BASE_ADDR}, 261c1747970SPierre Aubert }; 262c1747970SPierre Aubert 263c1747970SPierre Aubert #define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2) 264c1747970SPierre Aubert #define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0) 265c1747970SPierre Aubert 266fb0d0428SPeng Fan int board_mmc_get_env_dev(int devno) 267fb0d0428SPeng Fan { 268fb0d0428SPeng Fan return devno - 1; 269fb0d0428SPeng Fan } 270fb0d0428SPeng Fan 271c1747970SPierre Aubert int board_mmc_getcd(struct mmc *mmc) 272c1747970SPierre Aubert { 273c1747970SPierre Aubert struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; 274c1747970SPierre Aubert int ret = 0; 275c1747970SPierre Aubert 276c1747970SPierre Aubert switch (cfg->esdhc_base) { 277c1747970SPierre Aubert case USDHC2_BASE_ADDR: 278c1747970SPierre Aubert ret = !gpio_get_value(USDHC2_CD_GPIO); 279c1747970SPierre Aubert break; 280c1747970SPierre Aubert case USDHC3_BASE_ADDR: 281c1747970SPierre Aubert ret = !gpio_get_value(USDHC3_CD_GPIO); 282c1747970SPierre Aubert break; 283c1747970SPierre Aubert case USDHC4_BASE_ADDR: 284c1747970SPierre Aubert ret = 1; /* eMMC/uSDHC4 is always present */ 285c1747970SPierre Aubert break; 286c1747970SPierre Aubert } 287c1747970SPierre Aubert 288c1747970SPierre Aubert return ret; 289c1747970SPierre Aubert } 290c1747970SPierre Aubert 291c1747970SPierre Aubert int board_mmc_init(bd_t *bis) 292c1747970SPierre Aubert { 29375f2ba42SJohn Tobias #ifndef CONFIG_SPL_BUILD 294952fdc4eSFabio Estevam int ret; 295c1747970SPierre Aubert int i; 296c1747970SPierre Aubert 297c1747970SPierre Aubert /* 298c1747970SPierre Aubert * According to the board_mmc_init() the following map is done: 299a187559eSBin Meng * (U-Boot device node) (Physical Port) 300c1747970SPierre Aubert * mmc0 SD2 301c1747970SPierre Aubert * mmc1 SD3 302c1747970SPierre Aubert * mmc2 eMMC 303c1747970SPierre Aubert */ 304c1747970SPierre Aubert for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) { 305c1747970SPierre Aubert switch (i) { 306c1747970SPierre Aubert case 0: 307ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc2_pads); 308c1747970SPierre Aubert gpio_direction_input(USDHC2_CD_GPIO); 309c1747970SPierre Aubert usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK); 310c1747970SPierre Aubert break; 311c1747970SPierre Aubert case 1: 312ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc3_pads); 313c1747970SPierre Aubert gpio_direction_input(USDHC3_CD_GPIO); 314c1747970SPierre Aubert usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK); 315c1747970SPierre Aubert break; 316c1747970SPierre Aubert case 2: 317ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc4_pads); 318c1747970SPierre Aubert usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK); 319c1747970SPierre Aubert break; 320c1747970SPierre Aubert default: 321c1747970SPierre Aubert printf("Warning: you configured more USDHC controllers" 322c1747970SPierre Aubert "(%d) then supported by the board (%d)\n", 323c1747970SPierre Aubert i + 1, CONFIG_SYS_FSL_USDHC_NUM); 324952fdc4eSFabio Estevam return -EINVAL; 325c1747970SPierre Aubert } 326c1747970SPierre Aubert 327952fdc4eSFabio Estevam ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]); 328952fdc4eSFabio Estevam if (ret) 329952fdc4eSFabio Estevam return ret; 330c1747970SPierre Aubert } 331c1747970SPierre Aubert 332952fdc4eSFabio Estevam return 0; 33375f2ba42SJohn Tobias #else 334ae80eeccSFabio Estevam struct src *psrc = (struct src *)SRC_BASE_ADDR; 335ae80eeccSFabio Estevam unsigned reg = readl(&psrc->sbmr1) >> 11; 33675f2ba42SJohn Tobias /* 33775f2ba42SJohn Tobias * Upon reading BOOT_CFG register the following map is done: 33875f2ba42SJohn Tobias * Bit 11 and 12 of BOOT_CFG register can determine the current 33975f2ba42SJohn Tobias * mmc port 34075f2ba42SJohn Tobias * 0x1 SD1 34175f2ba42SJohn Tobias * 0x2 SD2 34275f2ba42SJohn Tobias * 0x3 SD4 34375f2ba42SJohn Tobias */ 34475f2ba42SJohn Tobias 34575f2ba42SJohn Tobias switch (reg & 0x3) { 34675f2ba42SJohn Tobias case 0x1: 347ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc2_pads); 34875f2ba42SJohn Tobias usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR; 34975f2ba42SJohn Tobias usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK); 35075f2ba42SJohn Tobias gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk; 35175f2ba42SJohn Tobias break; 35275f2ba42SJohn Tobias case 0x2: 353ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc3_pads); 35475f2ba42SJohn Tobias usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR; 35575f2ba42SJohn Tobias usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK); 35675f2ba42SJohn Tobias gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk; 35775f2ba42SJohn Tobias break; 35875f2ba42SJohn Tobias case 0x3: 359ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usdhc4_pads); 36075f2ba42SJohn Tobias usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR; 36175f2ba42SJohn Tobias usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK); 36275f2ba42SJohn Tobias gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk; 36375f2ba42SJohn Tobias break; 36475f2ba42SJohn Tobias } 36575f2ba42SJohn Tobias 36675f2ba42SJohn Tobias return fsl_esdhc_initialize(bis, &usdhc_cfg[0]); 36775f2ba42SJohn Tobias #endif 368c1747970SPierre Aubert } 369c1747970SPierre Aubert #endif 370c1747970SPierre Aubert 3714b6035daSFabio Estevam static int ar8031_phy_fixup(struct phy_device *phydev) 3724b6035daSFabio Estevam { 3734b6035daSFabio Estevam unsigned short val; 3744b6035daSFabio Estevam 3754b6035daSFabio Estevam /* To enable AR8031 ouput a 125MHz clk from CLK_25M */ 3764b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7); 3774b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016); 3784b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007); 3794b6035daSFabio Estevam 3804b6035daSFabio Estevam val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe); 3814b6035daSFabio Estevam val &= 0xffe3; 3824b6035daSFabio Estevam val |= 0x18; 3834b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val); 3844b6035daSFabio Estevam 3854b6035daSFabio Estevam /* introduce tx clock delay */ 3864b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5); 3874b6035daSFabio Estevam val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e); 3884b6035daSFabio Estevam val |= 0x0100; 3894b6035daSFabio Estevam phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val); 3904b6035daSFabio Estevam 3914b6035daSFabio Estevam return 0; 3924b6035daSFabio Estevam } 3934b6035daSFabio Estevam 3944b6035daSFabio Estevam int board_phy_config(struct phy_device *phydev) 3954b6035daSFabio Estevam { 3964b6035daSFabio Estevam ar8031_phy_fixup(phydev); 3974b6035daSFabio Estevam 3984b6035daSFabio Estevam if (phydev->drv->config) 3994b6035daSFabio Estevam phydev->drv->config(phydev); 4004b6035daSFabio Estevam 4014b6035daSFabio Estevam return 0; 4024b6035daSFabio Estevam } 4034b6035daSFabio Estevam 40458cc9787SPardeep Kumar Singla #if defined(CONFIG_VIDEO_IPUV3) 405b48e3b04SFabio Estevam static void disable_lvds(struct display_info_t const *dev) 406b48e3b04SFabio Estevam { 407b48e3b04SFabio Estevam struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; 408b48e3b04SFabio Estevam 409b48e3b04SFabio Estevam int reg = readl(&iomux->gpr[2]); 410b48e3b04SFabio Estevam 411b48e3b04SFabio Estevam reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK | 412b48e3b04SFabio Estevam IOMUXC_GPR2_LVDS_CH1_MODE_MASK); 413b48e3b04SFabio Estevam 414b48e3b04SFabio Estevam writel(reg, &iomux->gpr[2]); 415b48e3b04SFabio Estevam } 416b48e3b04SFabio Estevam 417d9b89460SFabio Estevam static void do_enable_hdmi(struct display_info_t const *dev) 418d9b89460SFabio Estevam { 419b48e3b04SFabio Estevam disable_lvds(dev); 420d9b89460SFabio Estevam imx_enable_hdmi_phy(); 421d9b89460SFabio Estevam } 422d9b89460SFabio Estevam 423053b795eSEric Benard struct display_info_t const displays[] = {{ 424d9b89460SFabio Estevam .bus = -1, 425d9b89460SFabio Estevam .addr = 0, 426119e9909SFabio Estevam .pixfmt = IPU_PIX_FMT_RGB666, 427b48e3b04SFabio Estevam .detect = NULL, 4286c51a364SMarco Franchi .enable = enable_lvds, 429d9b89460SFabio Estevam .mode = { 430b48e3b04SFabio Estevam .name = "Hannstar-XGA", 43158cc9787SPardeep Kumar Singla .refresh = 60, 43258cc9787SPardeep Kumar Singla .xres = 1024, 43358cc9787SPardeep Kumar Singla .yres = 768, 434779594d3SFabio Estevam .pixclock = 15384, 435779594d3SFabio Estevam .left_margin = 160, 436779594d3SFabio Estevam .right_margin = 24, 437779594d3SFabio Estevam .upper_margin = 29, 438779594d3SFabio Estevam .lower_margin = 3, 439779594d3SFabio Estevam .hsync_len = 136, 440779594d3SFabio Estevam .vsync_len = 6, 44158cc9787SPardeep Kumar Singla .sync = FB_SYNC_EXT, 44258cc9787SPardeep Kumar Singla .vmode = FB_VMODE_NONINTERLACED 443d9b89460SFabio Estevam } }, { 444d9b89460SFabio Estevam .bus = -1, 445d9b89460SFabio Estevam .addr = 0, 446b48e3b04SFabio Estevam .pixfmt = IPU_PIX_FMT_RGB24, 447b48e3b04SFabio Estevam .detect = detect_hdmi, 448b48e3b04SFabio Estevam .enable = do_enable_hdmi, 449d9b89460SFabio Estevam .mode = { 450b48e3b04SFabio Estevam .name = "HDMI", 451d9b89460SFabio Estevam .refresh = 60, 452d9b89460SFabio Estevam .xres = 1024, 453d9b89460SFabio Estevam .yres = 768, 454779594d3SFabio Estevam .pixclock = 15384, 455779594d3SFabio Estevam .left_margin = 160, 456779594d3SFabio Estevam .right_margin = 24, 457779594d3SFabio Estevam .upper_margin = 29, 458779594d3SFabio Estevam .lower_margin = 3, 459779594d3SFabio Estevam .hsync_len = 136, 460779594d3SFabio Estevam .vsync_len = 6, 461d9b89460SFabio Estevam .sync = FB_SYNC_EXT, 462d9b89460SFabio Estevam .vmode = FB_VMODE_NONINTERLACED 463ca9d817aSFabio Estevam } }, { 464ca9d817aSFabio Estevam .bus = 0, 465ca9d817aSFabio Estevam .addr = 0, 466ca9d817aSFabio Estevam .pixfmt = IPU_PIX_FMT_RGB24, 467ca9d817aSFabio Estevam .detect = NULL, 468ca9d817aSFabio Estevam .enable = enable_rgb, 469ca9d817aSFabio Estevam .mode = { 470ca9d817aSFabio Estevam .name = "SEIKO-WVGA", 471ca9d817aSFabio Estevam .refresh = 60, 472ca9d817aSFabio Estevam .xres = 800, 473ca9d817aSFabio Estevam .yres = 480, 474ca9d817aSFabio Estevam .pixclock = 29850, 475ca9d817aSFabio Estevam .left_margin = 89, 476ca9d817aSFabio Estevam .right_margin = 164, 477ca9d817aSFabio Estevam .upper_margin = 23, 478ca9d817aSFabio Estevam .lower_margin = 10, 479ca9d817aSFabio Estevam .hsync_len = 10, 480ca9d817aSFabio Estevam .vsync_len = 10, 481ca9d817aSFabio Estevam .sync = 0, 482ca9d817aSFabio Estevam .vmode = FB_VMODE_NONINTERLACED 483d9b89460SFabio Estevam } } }; 484053b795eSEric Benard size_t display_count = ARRAY_SIZE(displays); 48558cc9787SPardeep Kumar Singla 48658cc9787SPardeep Kumar Singla static void setup_display(void) 48758cc9787SPardeep Kumar Singla { 48858cc9787SPardeep Kumar Singla struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; 489d9b89460SFabio Estevam struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; 49058cc9787SPardeep Kumar Singla int reg; 49158cc9787SPardeep Kumar Singla 492be4ab3ddSFabio Estevam /* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */ 493ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(di0_pads); 494be4ab3ddSFabio Estevam 49558cc9787SPardeep Kumar Singla enable_ipu_clock(); 49658cc9787SPardeep Kumar Singla imx_setup_hdmi(); 49758cc9787SPardeep Kumar Singla 498d9b89460SFabio Estevam /* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */ 49912307437SLiu Ying reg = readl(&mxc_ccm->CCGR3); 500d9b89460SFabio Estevam reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK; 501d9b89460SFabio Estevam writel(reg, &mxc_ccm->CCGR3); 502d9b89460SFabio Estevam 503d9b89460SFabio Estevam /* set LDB0, LDB1 clk select to 011/011 */ 504d9b89460SFabio Estevam reg = readl(&mxc_ccm->cs2cdr); 505d9b89460SFabio Estevam reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK 506d9b89460SFabio Estevam | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK); 507d9b89460SFabio Estevam reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET) 508d9b89460SFabio Estevam | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET); 509d9b89460SFabio Estevam writel(reg, &mxc_ccm->cs2cdr); 510d9b89460SFabio Estevam 511d9b89460SFabio Estevam reg = readl(&mxc_ccm->cscmr2); 512d9b89460SFabio Estevam reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV; 513d9b89460SFabio Estevam writel(reg, &mxc_ccm->cscmr2); 514d9b89460SFabio Estevam 51558cc9787SPardeep Kumar Singla reg = readl(&mxc_ccm->chsccdr); 51658cc9787SPardeep Kumar Singla reg |= (CHSCCDR_CLK_SEL_LDB_DI0 51758cc9787SPardeep Kumar Singla << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET); 518d9b89460SFabio Estevam reg |= (CHSCCDR_CLK_SEL_LDB_DI0 519d9b89460SFabio Estevam << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET); 52058cc9787SPardeep Kumar Singla writel(reg, &mxc_ccm->chsccdr); 521d9b89460SFabio Estevam 522d9b89460SFabio Estevam reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES 523d9b89460SFabio Estevam | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW 524d9b89460SFabio Estevam | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW 525d9b89460SFabio Estevam | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG 526d9b89460SFabio Estevam | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT 527d9b89460SFabio Estevam | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG 528d9b89460SFabio Estevam | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT 529d9b89460SFabio Estevam | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED 530d9b89460SFabio Estevam | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0; 531d9b89460SFabio Estevam writel(reg, &iomux->gpr[2]); 532d9b89460SFabio Estevam 533d9b89460SFabio Estevam reg = readl(&iomux->gpr[3]); 534d9b89460SFabio Estevam reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK 535d9b89460SFabio Estevam | IOMUXC_GPR3_HDMI_MUX_CTL_MASK)) 536d9b89460SFabio Estevam | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 537d9b89460SFabio Estevam << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET); 538d9b89460SFabio Estevam writel(reg, &iomux->gpr[3]); 53958cc9787SPardeep Kumar Singla } 54058cc9787SPardeep Kumar Singla #endif /* CONFIG_VIDEO_IPUV3 */ 54158cc9787SPardeep Kumar Singla 54258cc9787SPardeep Kumar Singla /* 54358cc9787SPardeep Kumar Singla * Do not overwrite the console 54458cc9787SPardeep Kumar Singla * Use always serial for U-Boot console 54558cc9787SPardeep Kumar Singla */ 54658cc9787SPardeep Kumar Singla int overwrite_console(void) 54758cc9787SPardeep Kumar Singla { 54858cc9787SPardeep Kumar Singla return 1; 54958cc9787SPardeep Kumar Singla } 55058cc9787SPardeep Kumar Singla 551c1747970SPierre Aubert int board_eth_init(bd_t *bis) 552c1747970SPierre Aubert { 553c1747970SPierre Aubert setup_iomux_enet(); 554e919aa23SMarek Vasut setup_pcie(); 555c1747970SPierre Aubert 55692c707a5SFabio Estevam return cpu_eth_init(bis); 557c1747970SPierre Aubert } 558c1747970SPierre Aubert 5595a3d63c5SPeng Fan #ifdef CONFIG_USB_EHCI_MX6 5605a3d63c5SPeng Fan #define USB_OTHERREGS_OFFSET 0x800 5615a3d63c5SPeng Fan #define UCTRL_PWR_POL (1 << 9) 5625a3d63c5SPeng Fan 5635a3d63c5SPeng Fan static iomux_v3_cfg_t const usb_otg_pads[] = { 564ff9f71b4SFabio Estevam IOMUX_PADS(PAD_EIM_D22__USB_OTG_PWR | MUX_PAD_CTRL(NO_PAD_CTRL)), 565ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL)), 5665a3d63c5SPeng Fan }; 5675a3d63c5SPeng Fan 5685a3d63c5SPeng Fan static iomux_v3_cfg_t const usb_hc1_pads[] = { 569ff9f71b4SFabio Estevam IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL)), 5705a3d63c5SPeng Fan }; 5715a3d63c5SPeng Fan 5725a3d63c5SPeng Fan static void setup_usb(void) 5735a3d63c5SPeng Fan { 574ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usb_otg_pads); 5755a3d63c5SPeng Fan 5765a3d63c5SPeng Fan /* 5775a3d63c5SPeng Fan * set daisy chain for otg_pin_id on 6q. 5785a3d63c5SPeng Fan * for 6dl, this bit is reserved 5795a3d63c5SPeng Fan */ 5805a3d63c5SPeng Fan imx_iomux_set_gpr_register(1, 13, 1, 0); 5815a3d63c5SPeng Fan 582ff9f71b4SFabio Estevam SETUP_IOMUX_PADS(usb_hc1_pads); 5835a3d63c5SPeng Fan } 5845a3d63c5SPeng Fan 5855a3d63c5SPeng Fan int board_ehci_hcd_init(int port) 5865a3d63c5SPeng Fan { 5875a3d63c5SPeng Fan u32 *usbnc_usb_ctrl; 5885a3d63c5SPeng Fan 5895a3d63c5SPeng Fan if (port > 1) 5905a3d63c5SPeng Fan return -EINVAL; 5915a3d63c5SPeng Fan 5925a3d63c5SPeng Fan usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET + 5935a3d63c5SPeng Fan port * 4); 5945a3d63c5SPeng Fan 5955a3d63c5SPeng Fan setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL); 5965a3d63c5SPeng Fan 5975a3d63c5SPeng Fan return 0; 5985a3d63c5SPeng Fan } 5995a3d63c5SPeng Fan 6005a3d63c5SPeng Fan int board_ehci_power(int port, int on) 6015a3d63c5SPeng Fan { 6025a3d63c5SPeng Fan switch (port) { 6035a3d63c5SPeng Fan case 0: 6045a3d63c5SPeng Fan break; 6055a3d63c5SPeng Fan case 1: 6065a3d63c5SPeng Fan if (on) 6075a3d63c5SPeng Fan gpio_direction_output(IMX_GPIO_NR(1, 29), 1); 6085a3d63c5SPeng Fan else 6095a3d63c5SPeng Fan gpio_direction_output(IMX_GPIO_NR(1, 29), 0); 6105a3d63c5SPeng Fan break; 6115a3d63c5SPeng Fan default: 6125a3d63c5SPeng Fan printf("MXC USB port %d not yet supported\n", port); 6135a3d63c5SPeng Fan return -EINVAL; 6145a3d63c5SPeng Fan } 6155a3d63c5SPeng Fan 6165a3d63c5SPeng Fan return 0; 6175a3d63c5SPeng Fan } 6185a3d63c5SPeng Fan #endif 6195a3d63c5SPeng Fan 620c1747970SPierre Aubert int board_early_init_f(void) 621c1747970SPierre Aubert { 622c1747970SPierre Aubert setup_iomux_uart(); 62358cc9787SPardeep Kumar Singla #if defined(CONFIG_VIDEO_IPUV3) 62458cc9787SPardeep Kumar Singla setup_display(); 62558cc9787SPardeep Kumar Singla #endif 626c1747970SPierre Aubert 627c1747970SPierre Aubert return 0; 628c1747970SPierre Aubert } 629c1747970SPierre Aubert 630c1747970SPierre Aubert int board_init(void) 631c1747970SPierre Aubert { 632c1747970SPierre Aubert /* address of boot parameters */ 633c1747970SPierre Aubert gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; 634c1747970SPierre Aubert 6358bfa9c69SFabio Estevam #ifdef CONFIG_MXC_SPI 6368bfa9c69SFabio Estevam setup_spi(); 6378bfa9c69SFabio Estevam #endif 638ff9f71b4SFabio Estevam if (is_mx6dq() || is_mx6dqp()) 639ff9f71b4SFabio Estevam setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1); 640ff9f71b4SFabio Estevam else 641ff9f71b4SFabio Estevam setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1); 6425a3d63c5SPeng Fan #ifdef CONFIG_USB_EHCI_MX6 6435a3d63c5SPeng Fan setup_usb(); 6445a3d63c5SPeng Fan #endif 6455a3d63c5SPeng Fan 64666ca09fcSFabio Estevam return 0; 64766ca09fcSFabio Estevam } 64866ca09fcSFabio Estevam 649f0fabb79SYe.Li int power_init_board(void) 65066ca09fcSFabio Estevam { 65166ca09fcSFabio Estevam struct pmic *p; 652e4b984d7SFabio Estevam unsigned int reg; 653e4b984d7SFabio Estevam int ret; 65466ca09fcSFabio Estevam 655f0fabb79SYe.Li p = pfuze_common_init(I2C_PMIC); 656f0fabb79SYe.Li if (!p) 657f0fabb79SYe.Li return -ENODEV; 65866ca09fcSFabio Estevam 659258c98f8SPeng Fan ret = pfuze_mode_init(p, APS_PFM); 660258c98f8SPeng Fan if (ret < 0) 661258c98f8SPeng Fan return ret; 662258c98f8SPeng Fan 66366ca09fcSFabio Estevam /* Increase VGEN3 from 2.5 to 2.8V */ 66466ca09fcSFabio Estevam pmic_reg_read(p, PFUZE100_VGEN3VOL, ®); 665f0fabb79SYe.Li reg &= ~LDO_VOL_MASK; 666f0fabb79SYe.Li reg |= LDOB_2_80V; 66766ca09fcSFabio Estevam pmic_reg_write(p, PFUZE100_VGEN3VOL, reg); 66866ca09fcSFabio Estevam 66966ca09fcSFabio Estevam /* Increase VGEN5 from 2.8 to 3V */ 67066ca09fcSFabio Estevam pmic_reg_read(p, PFUZE100_VGEN5VOL, ®); 671f0fabb79SYe.Li reg &= ~LDO_VOL_MASK; 672f0fabb79SYe.Li reg |= LDOB_3_00V; 67366ca09fcSFabio Estevam pmic_reg_write(p, PFUZE100_VGEN5VOL, reg); 67466ca09fcSFabio Estevam 675c1747970SPierre Aubert return 0; 676c1747970SPierre Aubert } 677c1747970SPierre Aubert 678155fa9afSNikita Kiryanov #ifdef CONFIG_MXC_SPI 679155fa9afSNikita Kiryanov int board_spi_cs_gpio(unsigned bus, unsigned cs) 680155fa9afSNikita Kiryanov { 681155fa9afSNikita Kiryanov return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1; 682155fa9afSNikita Kiryanov } 683155fa9afSNikita Kiryanov #endif 684155fa9afSNikita Kiryanov 685c1747970SPierre Aubert #ifdef CONFIG_CMD_BMODE 686c1747970SPierre Aubert static const struct boot_mode board_boot_modes[] = { 687c1747970SPierre Aubert /* 4 bit bus width */ 688c1747970SPierre Aubert {"sd2", MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)}, 689c1747970SPierre Aubert {"sd3", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)}, 690c1747970SPierre Aubert /* 8 bit bus width */ 691214c3f0fSYe Li {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)}, 692c1747970SPierre Aubert {NULL, 0}, 693c1747970SPierre Aubert }; 694c1747970SPierre Aubert #endif 695c1747970SPierre Aubert 696c1747970SPierre Aubert int board_late_init(void) 697c1747970SPierre Aubert { 698c1747970SPierre Aubert #ifdef CONFIG_CMD_BMODE 699c1747970SPierre Aubert add_board_boot_modes(board_boot_modes); 700c1747970SPierre Aubert #endif 701e6fc8995SPeng Fan 702e6fc8995SPeng Fan #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 703e6fc8995SPeng Fan setenv("board_name", "SABRESD"); 704e6fc8995SPeng Fan 705e469719cSPeng Fan if (is_mx6dqp()) 706e469719cSPeng Fan setenv("board_rev", "MX6QP"); 70783e13942SPeng Fan else if (is_mx6dq()) 708e6fc8995SPeng Fan setenv("board_rev", "MX6Q"); 70983e13942SPeng Fan else if (is_mx6sdl()) 710e6fc8995SPeng Fan setenv("board_rev", "MX6DL"); 711e6fc8995SPeng Fan #endif 712e6fc8995SPeng Fan 713c1747970SPierre Aubert return 0; 714c1747970SPierre Aubert } 715c1747970SPierre Aubert 716c1747970SPierre Aubert int checkboard(void) 717c1747970SPierre Aubert { 718c1747970SPierre Aubert puts("Board: MX6-SabreSD\n"); 719c1747970SPierre Aubert return 0; 720c1747970SPierre Aubert } 72175f2ba42SJohn Tobias 72275f2ba42SJohn Tobias #ifdef CONFIG_SPL_BUILD 723ff9f71b4SFabio Estevam #include <asm/arch/mx6-ddr.h> 72475f2ba42SJohn Tobias #include <spl.h> 72575f2ba42SJohn Tobias #include <libfdt.h> 72675f2ba42SJohn Tobias 727d96796caSDiego Dorta #ifdef CONFIG_SPL_OS_BOOT 728d96796caSDiego Dorta int spl_start_uboot(void) 729d96796caSDiego Dorta { 730d96796caSDiego Dorta gpio_direction_input(KEY_VOL_UP); 731d96796caSDiego Dorta 732d96796caSDiego Dorta /* Only enter in Falcon mode if KEY_VOL_UP is pressed */ 733d96796caSDiego Dorta return gpio_get_value(KEY_VOL_UP); 734d96796caSDiego Dorta } 735d96796caSDiego Dorta #endif 736d96796caSDiego Dorta 7376e9b6bb5SFabio Estevam static void ccgr_init(void) 7386e9b6bb5SFabio Estevam { 7396e9b6bb5SFabio Estevam struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; 7406e9b6bb5SFabio Estevam 7416e9b6bb5SFabio Estevam writel(0x00C03F3F, &ccm->CCGR0); 7426e9b6bb5SFabio Estevam writel(0x0030FC03, &ccm->CCGR1); 7436e9b6bb5SFabio Estevam writel(0x0FFFC000, &ccm->CCGR2); 7446e9b6bb5SFabio Estevam writel(0x3FF00000, &ccm->CCGR3); 7456e9b6bb5SFabio Estevam writel(0x00FFF300, &ccm->CCGR4); 7466e9b6bb5SFabio Estevam writel(0x0F0000C3, &ccm->CCGR5); 7476e9b6bb5SFabio Estevam writel(0x000003FF, &ccm->CCGR6); 7486e9b6bb5SFabio Estevam } 7496e9b6bb5SFabio Estevam 7506e9b6bb5SFabio Estevam static void gpr_init(void) 7516e9b6bb5SFabio Estevam { 7526e9b6bb5SFabio Estevam struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; 7536e9b6bb5SFabio Estevam 7546e9b6bb5SFabio Estevam /* enable AXI cache for VDOA/VPU/IPU */ 7556e9b6bb5SFabio Estevam writel(0xF00000CF, &iomux->gpr[4]); 756e469719cSPeng Fan if (is_mx6dqp()) { 757e469719cSPeng Fan /* set IPU AXI-id1 Qos=0x1 AXI-id0/2/3 Qos=0x7 */ 758e469719cSPeng Fan writel(0x007F007F, &iomux->gpr[6]); 759e469719cSPeng Fan writel(0x007F007F, &iomux->gpr[7]); 760e469719cSPeng Fan } else { 7616e9b6bb5SFabio Estevam /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */ 7626e9b6bb5SFabio Estevam writel(0x007F007F, &iomux->gpr[6]); 7636e9b6bb5SFabio Estevam writel(0x007F007F, &iomux->gpr[7]); 7646e9b6bb5SFabio Estevam } 765e469719cSPeng Fan } 7666e9b6bb5SFabio Estevam 7673b30eeceSFabio Estevam static int mx6q_dcd_table[] = { 7683b30eeceSFabio Estevam 0x020e0798, 0x000C0000, 7693b30eeceSFabio Estevam 0x020e0758, 0x00000000, 7703b30eeceSFabio Estevam 0x020e0588, 0x00000030, 7713b30eeceSFabio Estevam 0x020e0594, 0x00000030, 7723b30eeceSFabio Estevam 0x020e056c, 0x00000030, 7733b30eeceSFabio Estevam 0x020e0578, 0x00000030, 7743b30eeceSFabio Estevam 0x020e074c, 0x00000030, 7753b30eeceSFabio Estevam 0x020e057c, 0x00000030, 7763b30eeceSFabio Estevam 0x020e058c, 0x00000000, 7773b30eeceSFabio Estevam 0x020e059c, 0x00000030, 7783b30eeceSFabio Estevam 0x020e05a0, 0x00000030, 7793b30eeceSFabio Estevam 0x020e078c, 0x00000030, 7803b30eeceSFabio Estevam 0x020e0750, 0x00020000, 7813b30eeceSFabio Estevam 0x020e05a8, 0x00000030, 7823b30eeceSFabio Estevam 0x020e05b0, 0x00000030, 7833b30eeceSFabio Estevam 0x020e0524, 0x00000030, 7843b30eeceSFabio Estevam 0x020e051c, 0x00000030, 7853b30eeceSFabio Estevam 0x020e0518, 0x00000030, 7863b30eeceSFabio Estevam 0x020e050c, 0x00000030, 7873b30eeceSFabio Estevam 0x020e05b8, 0x00000030, 7883b30eeceSFabio Estevam 0x020e05c0, 0x00000030, 7893b30eeceSFabio Estevam 0x020e0774, 0x00020000, 7903b30eeceSFabio Estevam 0x020e0784, 0x00000030, 7913b30eeceSFabio Estevam 0x020e0788, 0x00000030, 7923b30eeceSFabio Estevam 0x020e0794, 0x00000030, 7933b30eeceSFabio Estevam 0x020e079c, 0x00000030, 7943b30eeceSFabio Estevam 0x020e07a0, 0x00000030, 7953b30eeceSFabio Estevam 0x020e07a4, 0x00000030, 7963b30eeceSFabio Estevam 0x020e07a8, 0x00000030, 7973b30eeceSFabio Estevam 0x020e0748, 0x00000030, 7983b30eeceSFabio Estevam 0x020e05ac, 0x00000030, 7993b30eeceSFabio Estevam 0x020e05b4, 0x00000030, 8003b30eeceSFabio Estevam 0x020e0528, 0x00000030, 8013b30eeceSFabio Estevam 0x020e0520, 0x00000030, 8023b30eeceSFabio Estevam 0x020e0514, 0x00000030, 8033b30eeceSFabio Estevam 0x020e0510, 0x00000030, 8043b30eeceSFabio Estevam 0x020e05bc, 0x00000030, 8053b30eeceSFabio Estevam 0x020e05c4, 0x00000030, 8063b30eeceSFabio Estevam 0x021b0800, 0xa1390003, 8073b30eeceSFabio Estevam 0x021b080c, 0x001F001F, 8083b30eeceSFabio Estevam 0x021b0810, 0x001F001F, 8093b30eeceSFabio Estevam 0x021b480c, 0x001F001F, 8103b30eeceSFabio Estevam 0x021b4810, 0x001F001F, 8113b30eeceSFabio Estevam 0x021b083c, 0x43270338, 8123b30eeceSFabio Estevam 0x021b0840, 0x03200314, 8133b30eeceSFabio Estevam 0x021b483c, 0x431A032F, 8143b30eeceSFabio Estevam 0x021b4840, 0x03200263, 8153b30eeceSFabio Estevam 0x021b0848, 0x4B434748, 8163b30eeceSFabio Estevam 0x021b4848, 0x4445404C, 8173b30eeceSFabio Estevam 0x021b0850, 0x38444542, 8183b30eeceSFabio Estevam 0x021b4850, 0x4935493A, 8193b30eeceSFabio Estevam 0x021b081c, 0x33333333, 8203b30eeceSFabio Estevam 0x021b0820, 0x33333333, 8213b30eeceSFabio Estevam 0x021b0824, 0x33333333, 8223b30eeceSFabio Estevam 0x021b0828, 0x33333333, 8233b30eeceSFabio Estevam 0x021b481c, 0x33333333, 8243b30eeceSFabio Estevam 0x021b4820, 0x33333333, 8253b30eeceSFabio Estevam 0x021b4824, 0x33333333, 8263b30eeceSFabio Estevam 0x021b4828, 0x33333333, 8273b30eeceSFabio Estevam 0x021b08b8, 0x00000800, 8283b30eeceSFabio Estevam 0x021b48b8, 0x00000800, 8293b30eeceSFabio Estevam 0x021b0004, 0x00020036, 8303b30eeceSFabio Estevam 0x021b0008, 0x09444040, 8313b30eeceSFabio Estevam 0x021b000c, 0x555A7975, 8323b30eeceSFabio Estevam 0x021b0010, 0xFF538F64, 8333b30eeceSFabio Estevam 0x021b0014, 0x01FF00DB, 8343b30eeceSFabio Estevam 0x021b0018, 0x00001740, 8353b30eeceSFabio Estevam 0x021b001c, 0x00008000, 8363b30eeceSFabio Estevam 0x021b002c, 0x000026d2, 8373b30eeceSFabio Estevam 0x021b0030, 0x005A1023, 8383b30eeceSFabio Estevam 0x021b0040, 0x00000027, 8393b30eeceSFabio Estevam 0x021b0000, 0x831A0000, 8403b30eeceSFabio Estevam 0x021b001c, 0x04088032, 8413b30eeceSFabio Estevam 0x021b001c, 0x00008033, 8423b30eeceSFabio Estevam 0x021b001c, 0x00048031, 8433b30eeceSFabio Estevam 0x021b001c, 0x09408030, 8443b30eeceSFabio Estevam 0x021b001c, 0x04008040, 8453b30eeceSFabio Estevam 0x021b0020, 0x00005800, 8463b30eeceSFabio Estevam 0x021b0818, 0x00011117, 8473b30eeceSFabio Estevam 0x021b4818, 0x00011117, 8483b30eeceSFabio Estevam 0x021b0004, 0x00025576, 8493b30eeceSFabio Estevam 0x021b0404, 0x00011006, 8503b30eeceSFabio Estevam 0x021b001c, 0x00000000, 85175f2ba42SJohn Tobias }; 85275f2ba42SJohn Tobias 8533b30eeceSFabio Estevam static int mx6qp_dcd_table[] = { 8543b30eeceSFabio Estevam 0x020e0798, 0x000c0000, 8553b30eeceSFabio Estevam 0x020e0758, 0x00000000, 8563b30eeceSFabio Estevam 0x020e0588, 0x00000030, 8573b30eeceSFabio Estevam 0x020e0594, 0x00000030, 8583b30eeceSFabio Estevam 0x020e056c, 0x00000030, 8593b30eeceSFabio Estevam 0x020e0578, 0x00000030, 8603b30eeceSFabio Estevam 0x020e074c, 0x00000030, 8613b30eeceSFabio Estevam 0x020e057c, 0x00000030, 8623b30eeceSFabio Estevam 0x020e058c, 0x00000000, 8633b30eeceSFabio Estevam 0x020e059c, 0x00000030, 8643b30eeceSFabio Estevam 0x020e05a0, 0x00000030, 8653b30eeceSFabio Estevam 0x020e078c, 0x00000030, 8663b30eeceSFabio Estevam 0x020e0750, 0x00020000, 8673b30eeceSFabio Estevam 0x020e05a8, 0x00000030, 8683b30eeceSFabio Estevam 0x020e05b0, 0x00000030, 8693b30eeceSFabio Estevam 0x020e0524, 0x00000030, 8703b30eeceSFabio Estevam 0x020e051c, 0x00000030, 8713b30eeceSFabio Estevam 0x020e0518, 0x00000030, 8723b30eeceSFabio Estevam 0x020e050c, 0x00000030, 8733b30eeceSFabio Estevam 0x020e05b8, 0x00000030, 8743b30eeceSFabio Estevam 0x020e05c0, 0x00000030, 8753b30eeceSFabio Estevam 0x020e0774, 0x00020000, 8763b30eeceSFabio Estevam 0x020e0784, 0x00000030, 8773b30eeceSFabio Estevam 0x020e0788, 0x00000030, 8783b30eeceSFabio Estevam 0x020e0794, 0x00000030, 8793b30eeceSFabio Estevam 0x020e079c, 0x00000030, 8803b30eeceSFabio Estevam 0x020e07a0, 0x00000030, 8813b30eeceSFabio Estevam 0x020e07a4, 0x00000030, 8823b30eeceSFabio Estevam 0x020e07a8, 0x00000030, 8833b30eeceSFabio Estevam 0x020e0748, 0x00000030, 8843b30eeceSFabio Estevam 0x020e05ac, 0x00000030, 8853b30eeceSFabio Estevam 0x020e05b4, 0x00000030, 8863b30eeceSFabio Estevam 0x020e0528, 0x00000030, 8873b30eeceSFabio Estevam 0x020e0520, 0x00000030, 8883b30eeceSFabio Estevam 0x020e0514, 0x00000030, 8893b30eeceSFabio Estevam 0x020e0510, 0x00000030, 8903b30eeceSFabio Estevam 0x020e05bc, 0x00000030, 8913b30eeceSFabio Estevam 0x020e05c4, 0x00000030, 8923b30eeceSFabio Estevam 0x021b0800, 0xa1390003, 8933b30eeceSFabio Estevam 0x021b080c, 0x001b001e, 8943b30eeceSFabio Estevam 0x021b0810, 0x002e0029, 8953b30eeceSFabio Estevam 0x021b480c, 0x001b002a, 8963b30eeceSFabio Estevam 0x021b4810, 0x0019002c, 8973b30eeceSFabio Estevam 0x021b083c, 0x43240334, 8983b30eeceSFabio Estevam 0x021b0840, 0x0324031a, 8993b30eeceSFabio Estevam 0x021b483c, 0x43340344, 9003b30eeceSFabio Estevam 0x021b4840, 0x03280276, 9013b30eeceSFabio Estevam 0x021b0848, 0x44383A3E, 9023b30eeceSFabio Estevam 0x021b4848, 0x3C3C3846, 9033b30eeceSFabio Estevam 0x021b0850, 0x2e303230, 9043b30eeceSFabio Estevam 0x021b4850, 0x38283E34, 9053b30eeceSFabio Estevam 0x021b081c, 0x33333333, 9063b30eeceSFabio Estevam 0x021b0820, 0x33333333, 9073b30eeceSFabio Estevam 0x021b0824, 0x33333333, 9083b30eeceSFabio Estevam 0x021b0828, 0x33333333, 9093b30eeceSFabio Estevam 0x021b481c, 0x33333333, 9103b30eeceSFabio Estevam 0x021b4820, 0x33333333, 9113b30eeceSFabio Estevam 0x021b4824, 0x33333333, 9123b30eeceSFabio Estevam 0x021b4828, 0x33333333, 9133b30eeceSFabio Estevam 0x021b08c0, 0x24912249, 9143b30eeceSFabio Estevam 0x021b48c0, 0x24914289, 9153b30eeceSFabio Estevam 0x021b08b8, 0x00000800, 9163b30eeceSFabio Estevam 0x021b48b8, 0x00000800, 9173b30eeceSFabio Estevam 0x021b0004, 0x00020036, 9183b30eeceSFabio Estevam 0x021b0008, 0x24444040, 9193b30eeceSFabio Estevam 0x021b000c, 0x555A7955, 9203b30eeceSFabio Estevam 0x021b0010, 0xFF320F64, 9213b30eeceSFabio Estevam 0x021b0014, 0x01ff00db, 9223b30eeceSFabio Estevam 0x021b0018, 0x00001740, 9233b30eeceSFabio Estevam 0x021b001c, 0x00008000, 9243b30eeceSFabio Estevam 0x021b002c, 0x000026d2, 9253b30eeceSFabio Estevam 0x021b0030, 0x005A1023, 9263b30eeceSFabio Estevam 0x021b0040, 0x00000027, 9273b30eeceSFabio Estevam 0x021b0400, 0x14420000, 9283b30eeceSFabio Estevam 0x021b0000, 0x831A0000, 9293b30eeceSFabio Estevam 0x021b0890, 0x00400C58, 9303b30eeceSFabio Estevam 0x00bb0008, 0x00000000, 9313b30eeceSFabio Estevam 0x00bb000c, 0x2891E41A, 9323b30eeceSFabio Estevam 0x00bb0038, 0x00000564, 9333b30eeceSFabio Estevam 0x00bb0014, 0x00000040, 9343b30eeceSFabio Estevam 0x00bb0028, 0x00000020, 9353b30eeceSFabio Estevam 0x00bb002c, 0x00000020, 9363b30eeceSFabio Estevam 0x021b001c, 0x04088032, 9373b30eeceSFabio Estevam 0x021b001c, 0x00008033, 9383b30eeceSFabio Estevam 0x021b001c, 0x00048031, 9393b30eeceSFabio Estevam 0x021b001c, 0x09408030, 9403b30eeceSFabio Estevam 0x021b001c, 0x04008040, 9413b30eeceSFabio Estevam 0x021b0020, 0x00005800, 9423b30eeceSFabio Estevam 0x021b0818, 0x00011117, 9433b30eeceSFabio Estevam 0x021b4818, 0x00011117, 9443b30eeceSFabio Estevam 0x021b0004, 0x00025576, 9453b30eeceSFabio Estevam 0x021b0404, 0x00011006, 9463b30eeceSFabio Estevam 0x021b001c, 0x00000000, 9473b30eeceSFabio Estevam }; 9483b30eeceSFabio Estevam 949*b22841e5SFabio Estevam static int mx6dl_dcd_table[] = { 950*b22841e5SFabio Estevam 0x020e0774, 0x000C0000, 951*b22841e5SFabio Estevam 0x020e0754, 0x00000000, 952*b22841e5SFabio Estevam 0x020e04ac, 0x00000030, 953*b22841e5SFabio Estevam 0x020e04b0, 0x00000030, 954*b22841e5SFabio Estevam 0x020e0464, 0x00000030, 955*b22841e5SFabio Estevam 0x020e0490, 0x00000030, 956*b22841e5SFabio Estevam 0x020e074c, 0x00000030, 957*b22841e5SFabio Estevam 0x020e0494, 0x00000030, 958*b22841e5SFabio Estevam 0x020e04a0, 0x00000000, 959*b22841e5SFabio Estevam 0x020e04b4, 0x00000030, 960*b22841e5SFabio Estevam 0x020e04b8, 0x00000030, 961*b22841e5SFabio Estevam 0x020e076c, 0x00000030, 962*b22841e5SFabio Estevam 0x020e0750, 0x00020000, 963*b22841e5SFabio Estevam 0x020e04bc, 0x00000030, 964*b22841e5SFabio Estevam 0x020e04c0, 0x00000030, 965*b22841e5SFabio Estevam 0x020e04c4, 0x00000030, 966*b22841e5SFabio Estevam 0x020e04c8, 0x00000030, 967*b22841e5SFabio Estevam 0x020e04cc, 0x00000030, 968*b22841e5SFabio Estevam 0x020e04d0, 0x00000030, 969*b22841e5SFabio Estevam 0x020e04d4, 0x00000030, 970*b22841e5SFabio Estevam 0x020e04d8, 0x00000030, 971*b22841e5SFabio Estevam 0x020e0760, 0x00020000, 972*b22841e5SFabio Estevam 0x020e0764, 0x00000030, 973*b22841e5SFabio Estevam 0x020e0770, 0x00000030, 974*b22841e5SFabio Estevam 0x020e0778, 0x00000030, 975*b22841e5SFabio Estevam 0x020e077c, 0x00000030, 976*b22841e5SFabio Estevam 0x020e0780, 0x00000030, 977*b22841e5SFabio Estevam 0x020e0784, 0x00000030, 978*b22841e5SFabio Estevam 0x020e078c, 0x00000030, 979*b22841e5SFabio Estevam 0x020e0748, 0x00000030, 980*b22841e5SFabio Estevam 0x020e0470, 0x00000030, 981*b22841e5SFabio Estevam 0x020e0474, 0x00000030, 982*b22841e5SFabio Estevam 0x020e0478, 0x00000030, 983*b22841e5SFabio Estevam 0x020e047c, 0x00000030, 984*b22841e5SFabio Estevam 0x020e0480, 0x00000030, 985*b22841e5SFabio Estevam 0x020e0484, 0x00000030, 986*b22841e5SFabio Estevam 0x020e0488, 0x00000030, 987*b22841e5SFabio Estevam 0x020e048c, 0x00000030, 988*b22841e5SFabio Estevam 0x021b0800, 0xa1390003, 989*b22841e5SFabio Estevam 0x021b080c, 0x001F001F, 990*b22841e5SFabio Estevam 0x021b0810, 0x001F001F, 991*b22841e5SFabio Estevam 0x021b480c, 0x001F001F, 992*b22841e5SFabio Estevam 0x021b4810, 0x001F001F, 993*b22841e5SFabio Estevam 0x021b083c, 0x4220021F, 994*b22841e5SFabio Estevam 0x021b0840, 0x0207017E, 995*b22841e5SFabio Estevam 0x021b483c, 0x4201020C, 996*b22841e5SFabio Estevam 0x021b4840, 0x01660172, 997*b22841e5SFabio Estevam 0x021b0848, 0x4A4D4E4D, 998*b22841e5SFabio Estevam 0x021b4848, 0x4A4F5049, 999*b22841e5SFabio Estevam 0x021b0850, 0x3F3C3D31, 1000*b22841e5SFabio Estevam 0x021b4850, 0x3238372B, 1001*b22841e5SFabio Estevam 0x021b081c, 0x33333333, 1002*b22841e5SFabio Estevam 0x021b0820, 0x33333333, 1003*b22841e5SFabio Estevam 0x021b0824, 0x33333333, 1004*b22841e5SFabio Estevam 0x021b0828, 0x33333333, 1005*b22841e5SFabio Estevam 0x021b481c, 0x33333333, 1006*b22841e5SFabio Estevam 0x021b4820, 0x33333333, 1007*b22841e5SFabio Estevam 0x021b4824, 0x33333333, 1008*b22841e5SFabio Estevam 0x021b4828, 0x33333333, 1009*b22841e5SFabio Estevam 0x021b08b8, 0x00000800, 1010*b22841e5SFabio Estevam 0x021b48b8, 0x00000800, 1011*b22841e5SFabio Estevam 0x021b0004, 0x0002002D, 1012*b22841e5SFabio Estevam 0x021b0008, 0x00333030, 1013*b22841e5SFabio Estevam 0x021b000c, 0x3F435313, 1014*b22841e5SFabio Estevam 0x021b0010, 0xB66E8B63, 1015*b22841e5SFabio Estevam 0x021b0014, 0x01FF00DB, 1016*b22841e5SFabio Estevam 0x021b0018, 0x00001740, 1017*b22841e5SFabio Estevam 0x021b001c, 0x00008000, 1018*b22841e5SFabio Estevam 0x021b002c, 0x000026d2, 1019*b22841e5SFabio Estevam 0x021b0030, 0x00431023, 1020*b22841e5SFabio Estevam 0x021b0040, 0x00000027, 1021*b22841e5SFabio Estevam 0x021b0000, 0x831A0000, 1022*b22841e5SFabio Estevam 0x021b001c, 0x04008032, 1023*b22841e5SFabio Estevam 0x021b001c, 0x00008033, 1024*b22841e5SFabio Estevam 0x021b001c, 0x00048031, 1025*b22841e5SFabio Estevam 0x021b001c, 0x05208030, 1026*b22841e5SFabio Estevam 0x021b001c, 0x04008040, 1027*b22841e5SFabio Estevam 0x021b0020, 0x00005800, 1028*b22841e5SFabio Estevam 0x021b0818, 0x00011117, 1029*b22841e5SFabio Estevam 0x021b4818, 0x00011117, 1030*b22841e5SFabio Estevam 0x021b0004, 0x0002556D, 1031*b22841e5SFabio Estevam 0x021b0404, 0x00011006, 1032*b22841e5SFabio Estevam 0x021b001c, 0x00000000, 1033*b22841e5SFabio Estevam }; 1034*b22841e5SFabio Estevam 10353b30eeceSFabio Estevam static void ddr_init(int *table, int size) 10363b30eeceSFabio Estevam { 10373b30eeceSFabio Estevam int i; 10383b30eeceSFabio Estevam 10393b30eeceSFabio Estevam for (i = 0; i < size / 2 ; i++) 10403b30eeceSFabio Estevam writel(table[2 * i + 1], table[2 * i]); 104175f2ba42SJohn Tobias } 10423b30eeceSFabio Estevam 10433b30eeceSFabio Estevam static void spl_dram_init(void) 10443b30eeceSFabio Estevam { 10453b30eeceSFabio Estevam if (is_mx6dq()) 10463b30eeceSFabio Estevam ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table)); 10473b30eeceSFabio Estevam else if (is_mx6dqp()) 10483b30eeceSFabio Estevam ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table)); 1049*b22841e5SFabio Estevam else if (is_mx6sdl()) 1050*b22841e5SFabio Estevam ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table)); 1051e469719cSPeng Fan } 105275f2ba42SJohn Tobias 105375f2ba42SJohn Tobias void board_init_f(ulong dummy) 105475f2ba42SJohn Tobias { 10553b30eeceSFabio Estevam /* DDR initialization */ 10563b30eeceSFabio Estevam spl_dram_init(); 10573b30eeceSFabio Estevam 105875f2ba42SJohn Tobias /* setup AIPS and disable watchdog */ 105975f2ba42SJohn Tobias arch_cpu_init(); 106075f2ba42SJohn Tobias 10616e9b6bb5SFabio Estevam ccgr_init(); 10626e9b6bb5SFabio Estevam gpr_init(); 10636e9b6bb5SFabio Estevam 106475f2ba42SJohn Tobias /* iomux and setup of i2c */ 106575f2ba42SJohn Tobias board_early_init_f(); 106675f2ba42SJohn Tobias 106775f2ba42SJohn Tobias /* setup GP timer */ 106875f2ba42SJohn Tobias timer_init(); 106975f2ba42SJohn Tobias 107075f2ba42SJohn Tobias /* UART clocks enabled and gd valid - init serial console */ 107175f2ba42SJohn Tobias preloader_console_init(); 107275f2ba42SJohn Tobias 107375f2ba42SJohn Tobias /* Clear the BSS. */ 107475f2ba42SJohn Tobias memset(__bss_start, 0, __bss_end - __bss_start); 107575f2ba42SJohn Tobias 107675f2ba42SJohn Tobias /* load/boot image from boot device */ 107775f2ba42SJohn Tobias board_init_r(NULL, 0); 107875f2ba42SJohn Tobias } 107975f2ba42SJohn Tobias #endif 1080