1938080dcSJason Liu /* 2938080dcSJason Liu * Copyright (C) 2011 Freescale Semiconductor, Inc. 3938080dcSJason Liu * Jason Liu <r64343@freescale.com> 4938080dcSJason Liu * 5938080dcSJason Liu * See file CREDITS for list of people who contributed to this 6938080dcSJason Liu * project. 7938080dcSJason Liu * 8938080dcSJason Liu * This program is free software; you can redistribute it and/or 9938080dcSJason Liu * modify it under the terms of the GNU General Public License as 10938080dcSJason Liu * published by the Free Software Foundation; either version 2 of 11938080dcSJason Liu * the License, or (at your option) any later version. 12938080dcSJason Liu * 13938080dcSJason Liu * This program is distributed in the hope that it will be useful, 14938080dcSJason Liu * but WITHOUT ANY WARRANTY; without even the implied warranty of 15938080dcSJason Liu * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16938080dcSJason Liu * GNU General Public License for more details. 17938080dcSJason Liu * 18938080dcSJason Liu * You should have received a copy of the GNU General Public License 19938080dcSJason Liu * along with this program; if not, write to the Free Software 20938080dcSJason Liu * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21938080dcSJason Liu * MA 02111-1307 USA 22938080dcSJason Liu */ 23938080dcSJason Liu 24938080dcSJason Liu #include <common.h> 25938080dcSJason Liu #include <asm/io.h> 26938080dcSJason Liu #include <asm/arch/imx-regs.h> 27938080dcSJason Liu #include <asm/arch/mx5x_pins.h> 28938080dcSJason Liu #include <asm/arch/sys_proto.h> 29938080dcSJason Liu #include <asm/arch/crm_regs.h> 30*f92e4e6cSStefano Babic #include <asm/arch/clock.h> 31938080dcSJason Liu #include <asm/arch/iomux.h> 32938080dcSJason Liu #include <asm/arch/clock.h> 33938080dcSJason Liu #include <asm/errno.h> 34938080dcSJason Liu #include <netdev.h> 35938080dcSJason Liu #include <i2c.h> 36938080dcSJason Liu #include <mmc.h> 37938080dcSJason Liu #include <fsl_esdhc.h> 3850410078SStefano Babic #include <asm/gpio.h> 39938080dcSJason Liu 40938080dcSJason Liu DECLARE_GLOBAL_DATA_PTR; 41938080dcSJason Liu 42938080dcSJason Liu int dram_init(void) 43938080dcSJason Liu { 44938080dcSJason Liu u32 size1, size2; 45938080dcSJason Liu 46a55d23ccSAlbert ARIBAUD size1 = get_ram_size((void *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE); 47a55d23ccSAlbert ARIBAUD size2 = get_ram_size((void *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE); 48938080dcSJason Liu 49938080dcSJason Liu gd->ram_size = size1 + size2; 50938080dcSJason Liu 51938080dcSJason Liu return 0; 52938080dcSJason Liu } 53938080dcSJason Liu void dram_init_banksize(void) 54938080dcSJason Liu { 55938080dcSJason Liu gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 56938080dcSJason Liu gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 57938080dcSJason Liu 58938080dcSJason Liu gd->bd->bi_dram[1].start = PHYS_SDRAM_2; 59938080dcSJason Liu gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE; 60938080dcSJason Liu } 61938080dcSJason Liu 62938080dcSJason Liu static void setup_iomux_uart(void) 63938080dcSJason Liu { 64938080dcSJason Liu /* UART1 RXD */ 65938080dcSJason Liu mxc_request_iomux(MX53_PIN_CSI0_D11, IOMUX_CONFIG_ALT2); 66938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_CSI0_D11, 67938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 68938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 69938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU | 70938080dcSJason Liu PAD_CTL_ODE_OPENDRAIN_ENABLE); 71938080dcSJason Liu mxc_iomux_set_input(MX53_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, 0x1); 72938080dcSJason Liu 73938080dcSJason Liu /* UART1 TXD */ 74938080dcSJason Liu mxc_request_iomux(MX53_PIN_CSI0_D10, IOMUX_CONFIG_ALT2); 75938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_CSI0_D10, 76938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 77938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 78938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU | 79938080dcSJason Liu PAD_CTL_ODE_OPENDRAIN_ENABLE); 80938080dcSJason Liu } 81938080dcSJason Liu 8245cf6adaSWolfgang Grandegger #ifdef CONFIG_USB_EHCI_MX5 8360bae5efSAnatolij Gustschin int board_ehci_hcd_init(int port) 8445cf6adaSWolfgang Grandegger { 8545cf6adaSWolfgang Grandegger /* request VBUS power enable pin, GPIO[8}, gpio7 */ 8645cf6adaSWolfgang Grandegger mxc_request_iomux(MX53_PIN_ATA_DA_2, IOMUX_CONFIG_ALT1); 8745cf6adaSWolfgang Grandegger gpio_direction_output(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 0); 8845cf6adaSWolfgang Grandegger gpio_set_value(IOMUX_TO_GPIO(MX53_PIN_ATA_DA_2), 1); 8960bae5efSAnatolij Gustschin return 0; 9045cf6adaSWolfgang Grandegger } 9145cf6adaSWolfgang Grandegger #endif 9245cf6adaSWolfgang Grandegger 93938080dcSJason Liu static void setup_iomux_fec(void) 94938080dcSJason Liu { 95938080dcSJason Liu /*FEC_MDIO*/ 96938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_MDIO, IOMUX_CONFIG_ALT0); 97938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_MDIO, 98938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 99938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 100938080dcSJason Liu PAD_CTL_22K_PU | PAD_CTL_ODE_OPENDRAIN_ENABLE); 101938080dcSJason Liu mxc_iomux_set_input(MX53_FEC_FEC_MDI_SELECT_INPUT, 0x1); 102938080dcSJason Liu 103938080dcSJason Liu /*FEC_MDC*/ 104938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_MDC, IOMUX_CONFIG_ALT0); 105938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_MDC, PAD_CTL_DRV_HIGH); 106938080dcSJason Liu 107938080dcSJason Liu /* FEC RXD1 */ 108938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_RXD1, IOMUX_CONFIG_ALT0); 109938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_RXD1, 110938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE); 111938080dcSJason Liu 112938080dcSJason Liu /* FEC RXD0 */ 113938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_RXD0, IOMUX_CONFIG_ALT0); 114938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_RXD0, 115938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE); 116938080dcSJason Liu 117938080dcSJason Liu /* FEC TXD1 */ 118938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_TXD1, IOMUX_CONFIG_ALT0); 119938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_TXD1, PAD_CTL_DRV_HIGH); 120938080dcSJason Liu 121938080dcSJason Liu /* FEC TXD0 */ 122938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_TXD0, IOMUX_CONFIG_ALT0); 123938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_TXD0, PAD_CTL_DRV_HIGH); 124938080dcSJason Liu 125938080dcSJason Liu /* FEC TX_EN */ 126938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_TX_EN, IOMUX_CONFIG_ALT0); 127938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_TX_EN, PAD_CTL_DRV_HIGH); 128938080dcSJason Liu 129938080dcSJason Liu /* FEC TX_CLK */ 130938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_REF_CLK, IOMUX_CONFIG_ALT0); 131938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_REF_CLK, 132938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE); 133938080dcSJason Liu 134938080dcSJason Liu /* FEC RX_ER */ 135938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_RX_ER, IOMUX_CONFIG_ALT0); 136938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_RX_ER, 137938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE); 138938080dcSJason Liu 139938080dcSJason Liu /* FEC CRS */ 140938080dcSJason Liu mxc_request_iomux(MX53_PIN_FEC_CRS_DV, IOMUX_CONFIG_ALT0); 141938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_FEC_CRS_DV, 142938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE); 143938080dcSJason Liu } 144938080dcSJason Liu 145938080dcSJason Liu #ifdef CONFIG_FSL_ESDHC 146938080dcSJason Liu struct fsl_esdhc_cfg esdhc_cfg[2] = { 147938080dcSJason Liu {MMC_SDHC1_BASE_ADDR, 1}, 148938080dcSJason Liu {MMC_SDHC3_BASE_ADDR, 1}, 149938080dcSJason Liu }; 150938080dcSJason Liu 151314284b1SThierry Reding int board_mmc_getcd(struct mmc *mmc) 152938080dcSJason Liu { 153938080dcSJason Liu struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; 154314284b1SThierry Reding int ret; 155938080dcSJason Liu 15673128aadSFabio Estevam mxc_request_iomux(MX53_PIN_EIM_DA11, IOMUX_CONFIG_ALT1); 157a091be76SFabio Estevam gpio_direction_input(75); 15873128aadSFabio Estevam mxc_request_iomux(MX53_PIN_EIM_DA13, IOMUX_CONFIG_ALT1); 159a091be76SFabio Estevam gpio_direction_input(77); 16073128aadSFabio Estevam 161938080dcSJason Liu if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR) 162314284b1SThierry Reding ret = !gpio_get_value(77); /* GPIO3_13 */ 163938080dcSJason Liu else 164314284b1SThierry Reding ret = !gpio_get_value(75); /* GPIO3_11 */ 165938080dcSJason Liu 166314284b1SThierry Reding return ret; 167938080dcSJason Liu } 168938080dcSJason Liu 169938080dcSJason Liu int board_mmc_init(bd_t *bis) 170938080dcSJason Liu { 171938080dcSJason Liu u32 index; 172938080dcSJason Liu s32 status = 0; 173938080dcSJason Liu 174938080dcSJason Liu for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; index++) { 175938080dcSJason Liu switch (index) { 176938080dcSJason Liu case 0: 177938080dcSJason Liu mxc_request_iomux(MX53_PIN_SD1_CMD, IOMUX_CONFIG_ALT0); 178938080dcSJason Liu mxc_request_iomux(MX53_PIN_SD1_CLK, IOMUX_CONFIG_ALT0); 179938080dcSJason Liu mxc_request_iomux(MX53_PIN_SD1_DATA0, 180938080dcSJason Liu IOMUX_CONFIG_ALT0); 181938080dcSJason Liu mxc_request_iomux(MX53_PIN_SD1_DATA1, 182938080dcSJason Liu IOMUX_CONFIG_ALT0); 183938080dcSJason Liu mxc_request_iomux(MX53_PIN_SD1_DATA2, 184938080dcSJason Liu IOMUX_CONFIG_ALT0); 185938080dcSJason Liu mxc_request_iomux(MX53_PIN_SD1_DATA3, 186938080dcSJason Liu IOMUX_CONFIG_ALT0); 187938080dcSJason Liu mxc_request_iomux(MX53_PIN_EIM_DA13, 188938080dcSJason Liu IOMUX_CONFIG_ALT1); 189938080dcSJason Liu 190938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_SD1_CMD, 191938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 192938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 193938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU); 194938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_SD1_CLK, 195938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 196938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU | 197938080dcSJason Liu PAD_CTL_DRV_HIGH); 198938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_SD1_DATA0, 199938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 200938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 201938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 202938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_SD1_DATA1, 203938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 204938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 205938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 206938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_SD1_DATA2, 207938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 208938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 209938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 210938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_SD1_DATA3, 211938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 212938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 213938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 214938080dcSJason Liu break; 215938080dcSJason Liu case 1: 216938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_RESET_B, 217938080dcSJason Liu IOMUX_CONFIG_ALT2); 218938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_IORDY, 219938080dcSJason Liu IOMUX_CONFIG_ALT2); 220938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_DATA8, 221938080dcSJason Liu IOMUX_CONFIG_ALT4); 222938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_DATA9, 223938080dcSJason Liu IOMUX_CONFIG_ALT4); 224938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_DATA10, 225938080dcSJason Liu IOMUX_CONFIG_ALT4); 226938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_DATA11, 227938080dcSJason Liu IOMUX_CONFIG_ALT4); 228938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_DATA0, 229938080dcSJason Liu IOMUX_CONFIG_ALT4); 230938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_DATA1, 231938080dcSJason Liu IOMUX_CONFIG_ALT4); 232938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_DATA2, 233938080dcSJason Liu IOMUX_CONFIG_ALT4); 234938080dcSJason Liu mxc_request_iomux(MX53_PIN_ATA_DATA3, 235938080dcSJason Liu IOMUX_CONFIG_ALT4); 236938080dcSJason Liu mxc_request_iomux(MX53_PIN_EIM_DA11, 237938080dcSJason Liu IOMUX_CONFIG_ALT1); 238938080dcSJason Liu 239938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_RESET_B, 240938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 241938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 242938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_100K_PU); 243938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_IORDY, 244938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 245938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU | 246938080dcSJason Liu PAD_CTL_DRV_HIGH); 247938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_DATA8, 248938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 249938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 250938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 251938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_DATA9, 252938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 253938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 254938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 255938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_DATA10, 256938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 257938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 258938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 259938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_DATA11, 260938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 261938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 262938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 263938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_DATA0, 264938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 265938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 266938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 267938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_DATA1, 268938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 269938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 270938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 271938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_DATA2, 272938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 273938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 274938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 275938080dcSJason Liu mxc_iomux_set_pad(MX53_PIN_ATA_DATA3, 276938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_HIGH | 277938080dcSJason Liu PAD_CTL_PUE_PULL | PAD_CTL_PKE_ENABLE | 278938080dcSJason Liu PAD_CTL_HYS_ENABLE | PAD_CTL_47K_PU); 279938080dcSJason Liu 280938080dcSJason Liu break; 281938080dcSJason Liu default: 282938080dcSJason Liu printf("Warning: you configured more ESDHC controller" 283938080dcSJason Liu "(%d) as supported by the board(2)\n", 284938080dcSJason Liu CONFIG_SYS_FSL_ESDHC_NUM); 285938080dcSJason Liu return status; 286938080dcSJason Liu } 287938080dcSJason Liu status |= fsl_esdhc_initialize(bis, &esdhc_cfg[index]); 288938080dcSJason Liu } 289938080dcSJason Liu 290938080dcSJason Liu return status; 291938080dcSJason Liu } 292938080dcSJason Liu #endif 293938080dcSJason Liu 294938080dcSJason Liu int board_early_init_f(void) 295938080dcSJason Liu { 296938080dcSJason Liu setup_iomux_uart(); 297938080dcSJason Liu setup_iomux_fec(); 298938080dcSJason Liu 299938080dcSJason Liu return 0; 300938080dcSJason Liu } 301938080dcSJason Liu 302938080dcSJason Liu int board_init(void) 303938080dcSJason Liu { 304938080dcSJason Liu gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 305938080dcSJason Liu 306*f92e4e6cSStefano Babic mxc_set_sata_internal_clock(); 307*f92e4e6cSStefano Babic 308938080dcSJason Liu return 0; 309938080dcSJason Liu } 310938080dcSJason Liu 311938080dcSJason Liu int checkboard(void) 312938080dcSJason Liu { 313938080dcSJason Liu puts("Board: MX53 LOCO\n"); 314938080dcSJason Liu 315938080dcSJason Liu return 0; 316938080dcSJason Liu } 317