1e66c49faSVikas Manocha /* 2e66c49faSVikas Manocha * (C) Copyright 2016 3e66c49faSVikas Manocha * Vikas Manocha, <vikas.manocha@st.com> 4e66c49faSVikas Manocha * 5e66c49faSVikas Manocha * SPDX-License-Identifier: GPL-2.0+ 6e66c49faSVikas Manocha */ 7e66c49faSVikas Manocha 8e66c49faSVikas Manocha #include <common.h> 9e66c49faSVikas Manocha #include <asm/io.h> 10e66c49faSVikas Manocha #include <asm/armv7m.h> 11e66c49faSVikas Manocha #include <asm/arch/stm32.h> 12e66c49faSVikas Manocha #include <asm/arch/gpio.h> 1325c1b135SToshifumi NISHINAGA #include <asm/arch/fmc.h> 14e66c49faSVikas Manocha #include <dm/platdata.h> 15e66c49faSVikas Manocha #include <dm/platform_data/serial_stm32x7.h> 16e66c49faSVikas Manocha #include <asm/arch/stm32_periph.h> 17e66c49faSVikas Manocha #include <asm/arch/stm32_defs.h> 18b20b70fcSMichael Kurz #include <asm/arch/syscfg.h> 19e66c49faSVikas Manocha 20e66c49faSVikas Manocha DECLARE_GLOBAL_DATA_PTR; 21e66c49faSVikas Manocha 22e66c49faSVikas Manocha const struct stm32_gpio_ctl gpio_ctl_gpout = { 23e66c49faSVikas Manocha .mode = STM32_GPIO_MODE_OUT, 24e66c49faSVikas Manocha .otype = STM32_GPIO_OTYPE_PP, 25e66c49faSVikas Manocha .speed = STM32_GPIO_SPEED_50M, 26e66c49faSVikas Manocha .pupd = STM32_GPIO_PUPD_NO, 27e66c49faSVikas Manocha .af = STM32_GPIO_AF0 28e66c49faSVikas Manocha }; 29e66c49faSVikas Manocha 3025c1b135SToshifumi NISHINAGA const struct stm32_gpio_ctl gpio_ctl_fmc = { 3125c1b135SToshifumi NISHINAGA .mode = STM32_GPIO_MODE_AF, 3225c1b135SToshifumi NISHINAGA .otype = STM32_GPIO_OTYPE_PP, 3325c1b135SToshifumi NISHINAGA .speed = STM32_GPIO_SPEED_100M, 3425c1b135SToshifumi NISHINAGA .pupd = STM32_GPIO_PUPD_NO, 3525c1b135SToshifumi NISHINAGA .af = STM32_GPIO_AF12 3625c1b135SToshifumi NISHINAGA }; 3725c1b135SToshifumi NISHINAGA 3825c1b135SToshifumi NISHINAGA static const struct stm32_gpio_dsc ext_ram_fmc_gpio[] = { 3925c1b135SToshifumi NISHINAGA /* Chip is LQFP144, see DM00077036.pdf for details */ 4025c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_D, STM32_GPIO_PIN_10}, /* 79, FMC_D15 */ 4125c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_D, STM32_GPIO_PIN_9}, /* 78, FMC_D14 */ 4225c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_D, STM32_GPIO_PIN_8}, /* 77, FMC_D13 */ 4325c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_15}, /* 68, FMC_D12 */ 4425c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_14}, /* 67, FMC_D11 */ 4525c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_13}, /* 66, FMC_D10 */ 4625c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_12}, /* 65, FMC_D9 */ 4725c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_11}, /* 64, FMC_D8 */ 4825c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_10}, /* 63, FMC_D7 */ 4925c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_9}, /* 60, FMC_D6 */ 5025c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_8}, /* 59, FMC_D5 */ 5125c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_7}, /* 58, FMC_D4 */ 5225c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_D, STM32_GPIO_PIN_1}, /* 115, FMC_D3 */ 5325c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_D, STM32_GPIO_PIN_0}, /* 114, FMC_D2 */ 5425c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_D, STM32_GPIO_PIN_15}, /* 86, FMC_D1 */ 5525c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_D, STM32_GPIO_PIN_14}, /* 85, FMC_D0 */ 5625c1b135SToshifumi NISHINAGA 5725c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_1}, /* 142, FMC_NBL1 */ 5825c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_E, STM32_GPIO_PIN_0}, /* 141, FMC_NBL0 */ 5925c1b135SToshifumi NISHINAGA 6025c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_G, STM32_GPIO_PIN_5}, /* 90, FMC_A15, BA1 */ 6125c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_G, STM32_GPIO_PIN_4}, /* 89, FMC_A14, BA0 */ 6225c1b135SToshifumi NISHINAGA 6325c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_G, STM32_GPIO_PIN_1}, /* 57, FMC_A11 */ 6425c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_G, STM32_GPIO_PIN_0}, /* 56, FMC_A10 */ 6525c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_15}, /* 55, FMC_A9 */ 6625c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_14}, /* 54, FMC_A8 */ 6725c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_13}, /* 53, FMC_A7 */ 6825c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_12}, /* 50, FMC_A6 */ 6925c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_5}, /* 15, FMC_A5 */ 7025c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_4}, /* 14, FMC_A4 */ 7125c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_3}, /* 13, FMC_A3 */ 7225c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_2}, /* 12, FMC_A2 */ 7325c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_1}, /* 11, FMC_A1 */ 7425c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_0}, /* 10, FMC_A0 */ 7525c1b135SToshifumi NISHINAGA 7625c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_H, STM32_GPIO_PIN_3}, /* 136, SDRAM_NE */ 7725c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_F, STM32_GPIO_PIN_11}, /* 49, SDRAM_NRAS */ 7825c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_G, STM32_GPIO_PIN_15}, /* 132, SDRAM_NCAS */ 7925c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_H, STM32_GPIO_PIN_5}, /* 26, SDRAM_NWE */ 8025c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_C, STM32_GPIO_PIN_3}, /* 135, SDRAM_CKE */ 8125c1b135SToshifumi NISHINAGA 8225c1b135SToshifumi NISHINAGA {STM32_GPIO_PORT_G, STM32_GPIO_PIN_8}, /* 93, SDRAM_CLK */ 8325c1b135SToshifumi NISHINAGA }; 8425c1b135SToshifumi NISHINAGA 8525c1b135SToshifumi NISHINAGA static int fmc_setup_gpio(void) 8625c1b135SToshifumi NISHINAGA { 8725c1b135SToshifumi NISHINAGA int rv = 0; 8825c1b135SToshifumi NISHINAGA int i; 8925c1b135SToshifumi NISHINAGA 9025c1b135SToshifumi NISHINAGA clock_setup(GPIO_B_CLOCK_CFG); 9125c1b135SToshifumi NISHINAGA clock_setup(GPIO_C_CLOCK_CFG); 9225c1b135SToshifumi NISHINAGA clock_setup(GPIO_D_CLOCK_CFG); 9325c1b135SToshifumi NISHINAGA clock_setup(GPIO_E_CLOCK_CFG); 9425c1b135SToshifumi NISHINAGA clock_setup(GPIO_F_CLOCK_CFG); 9525c1b135SToshifumi NISHINAGA clock_setup(GPIO_G_CLOCK_CFG); 9625c1b135SToshifumi NISHINAGA clock_setup(GPIO_H_CLOCK_CFG); 9725c1b135SToshifumi NISHINAGA 9825c1b135SToshifumi NISHINAGA for (i = 0; i < ARRAY_SIZE(ext_ram_fmc_gpio); i++) { 9925c1b135SToshifumi NISHINAGA rv = stm32_gpio_config(&ext_ram_fmc_gpio[i], 10025c1b135SToshifumi NISHINAGA &gpio_ctl_fmc); 10125c1b135SToshifumi NISHINAGA if (rv) 10225c1b135SToshifumi NISHINAGA goto out; 10325c1b135SToshifumi NISHINAGA } 10425c1b135SToshifumi NISHINAGA 10525c1b135SToshifumi NISHINAGA out: 10625c1b135SToshifumi NISHINAGA return rv; 10725c1b135SToshifumi NISHINAGA } 10825c1b135SToshifumi NISHINAGA 10925c1b135SToshifumi NISHINAGA static inline u32 _ns2clk(u32 ns, u32 freq) 11025c1b135SToshifumi NISHINAGA { 11125c1b135SToshifumi NISHINAGA u32 tmp = freq/1000000; 11225c1b135SToshifumi NISHINAGA return (tmp * ns) / 1000; 11325c1b135SToshifumi NISHINAGA } 11425c1b135SToshifumi NISHINAGA 11525c1b135SToshifumi NISHINAGA #define NS2CLK(ns) (_ns2clk(ns, freq)) 11625c1b135SToshifumi NISHINAGA 11725c1b135SToshifumi NISHINAGA /* 11825c1b135SToshifumi NISHINAGA * Following are timings for IS42S16400J, from corresponding datasheet 11925c1b135SToshifumi NISHINAGA */ 12025c1b135SToshifumi NISHINAGA #define SDRAM_CAS 3 /* 3 cycles */ 12125c1b135SToshifumi NISHINAGA #define SDRAM_NB 1 /* Number of banks */ 12225c1b135SToshifumi NISHINAGA #define SDRAM_MWID 1 /* 16 bit memory */ 12325c1b135SToshifumi NISHINAGA 12425c1b135SToshifumi NISHINAGA #define SDRAM_NR 0x1 /* 12-bit row */ 12525c1b135SToshifumi NISHINAGA #define SDRAM_NC 0x0 /* 8-bit col */ 12625c1b135SToshifumi NISHINAGA #define SDRAM_RBURST 0x1 /* Single read requests always as bursts */ 12725c1b135SToshifumi NISHINAGA #define SDRAM_RPIPE 0x0 /* No HCLK clock cycle delay */ 12825c1b135SToshifumi NISHINAGA 12925c1b135SToshifumi NISHINAGA #define SDRAM_TRRD NS2CLK(12) 13025c1b135SToshifumi NISHINAGA #define SDRAM_TRCD NS2CLK(18) 13125c1b135SToshifumi NISHINAGA #define SDRAM_TRP NS2CLK(18) 13225c1b135SToshifumi NISHINAGA #define SDRAM_TRAS NS2CLK(42) 13325c1b135SToshifumi NISHINAGA #define SDRAM_TRC NS2CLK(60) 13425c1b135SToshifumi NISHINAGA #define SDRAM_TRFC NS2CLK(60) 13525c1b135SToshifumi NISHINAGA #define SDRAM_TCDL (1 - 1) 13625c1b135SToshifumi NISHINAGA #define SDRAM_TRDL NS2CLK(12) 13725c1b135SToshifumi NISHINAGA #define SDRAM_TBDL (1 - 1) 13825c1b135SToshifumi NISHINAGA #define SDRAM_TREF (NS2CLK(64000000 / 8192) - 20) 13925c1b135SToshifumi NISHINAGA #define SDRAM_TCCD (1 - 1) 14025c1b135SToshifumi NISHINAGA 14125c1b135SToshifumi NISHINAGA #define SDRAM_TXSR SDRAM_TRFC /* Row cycle time after precharge */ 14225c1b135SToshifumi NISHINAGA #define SDRAM_TMRD 1 /* Page 10, Mode Register Set */ 14325c1b135SToshifumi NISHINAGA 14425c1b135SToshifumi NISHINAGA 14525c1b135SToshifumi NISHINAGA /* Last data in to row precharge, need also comply ineq on page 1648 */ 14625c1b135SToshifumi NISHINAGA #define SDRAM_TWR max(\ 14725c1b135SToshifumi NISHINAGA (int)max((int)SDRAM_TRDL, (int)(SDRAM_TRAS - SDRAM_TRCD)), \ 14825c1b135SToshifumi NISHINAGA (int)(SDRAM_TRC - SDRAM_TRCD - SDRAM_TRP)\ 14925c1b135SToshifumi NISHINAGA ) 15025c1b135SToshifumi NISHINAGA 15125c1b135SToshifumi NISHINAGA 15225c1b135SToshifumi NISHINAGA #define SDRAM_MODE_BL_SHIFT 0 15325c1b135SToshifumi NISHINAGA #define SDRAM_MODE_CAS_SHIFT 4 15425c1b135SToshifumi NISHINAGA #define SDRAM_MODE_BL 0 15525c1b135SToshifumi NISHINAGA #define SDRAM_MODE_CAS SDRAM_CAS 15625c1b135SToshifumi NISHINAGA 15725c1b135SToshifumi NISHINAGA int dram_init(void) 15825c1b135SToshifumi NISHINAGA { 15925c1b135SToshifumi NISHINAGA u32 freq; 16025c1b135SToshifumi NISHINAGA int rv; 16125c1b135SToshifumi NISHINAGA 16225c1b135SToshifumi NISHINAGA rv = fmc_setup_gpio(); 16325c1b135SToshifumi NISHINAGA if (rv) 16425c1b135SToshifumi NISHINAGA return rv; 16525c1b135SToshifumi NISHINAGA 166081de09dSMichael Kurz clock_setup(FMC_CLOCK_CFG); 16725c1b135SToshifumi NISHINAGA 16825c1b135SToshifumi NISHINAGA /* 16925c1b135SToshifumi NISHINAGA * Get frequency for NS2CLK calculation. 17025c1b135SToshifumi NISHINAGA */ 17125c1b135SToshifumi NISHINAGA freq = clock_get(CLOCK_AHB) / CONFIG_SYS_RAM_FREQ_DIV; 17225c1b135SToshifumi NISHINAGA 17325c1b135SToshifumi NISHINAGA writel( 17425c1b135SToshifumi NISHINAGA CONFIG_SYS_RAM_FREQ_DIV << FMC_SDCR_SDCLK_SHIFT 17525c1b135SToshifumi NISHINAGA | SDRAM_CAS << FMC_SDCR_CAS_SHIFT 17625c1b135SToshifumi NISHINAGA | SDRAM_NB << FMC_SDCR_NB_SHIFT 17725c1b135SToshifumi NISHINAGA | SDRAM_MWID << FMC_SDCR_MWID_SHIFT 17825c1b135SToshifumi NISHINAGA | SDRAM_NR << FMC_SDCR_NR_SHIFT 17925c1b135SToshifumi NISHINAGA | SDRAM_NC << FMC_SDCR_NC_SHIFT 18025c1b135SToshifumi NISHINAGA | SDRAM_RPIPE << FMC_SDCR_RPIPE_SHIFT 18125c1b135SToshifumi NISHINAGA | SDRAM_RBURST << FMC_SDCR_RBURST_SHIFT, 18225c1b135SToshifumi NISHINAGA &STM32_SDRAM_FMC->sdcr1); 18325c1b135SToshifumi NISHINAGA 18425c1b135SToshifumi NISHINAGA writel( 18525c1b135SToshifumi NISHINAGA SDRAM_TRCD << FMC_SDTR_TRCD_SHIFT 18625c1b135SToshifumi NISHINAGA | SDRAM_TRP << FMC_SDTR_TRP_SHIFT 18725c1b135SToshifumi NISHINAGA | SDRAM_TWR << FMC_SDTR_TWR_SHIFT 18825c1b135SToshifumi NISHINAGA | SDRAM_TRC << FMC_SDTR_TRC_SHIFT 18925c1b135SToshifumi NISHINAGA | SDRAM_TRAS << FMC_SDTR_TRAS_SHIFT 19025c1b135SToshifumi NISHINAGA | SDRAM_TXSR << FMC_SDTR_TXSR_SHIFT 19125c1b135SToshifumi NISHINAGA | SDRAM_TMRD << FMC_SDTR_TMRD_SHIFT, 19225c1b135SToshifumi NISHINAGA &STM32_SDRAM_FMC->sdtr1); 19325c1b135SToshifumi NISHINAGA 19425c1b135SToshifumi NISHINAGA writel(FMC_SDCMR_BANK_1 | FMC_SDCMR_MODE_START_CLOCK, 19525c1b135SToshifumi NISHINAGA &STM32_SDRAM_FMC->sdcmr); 19625c1b135SToshifumi NISHINAGA 19725c1b135SToshifumi NISHINAGA udelay(200); /* 200 us delay, page 10, "Power-Up" */ 19825c1b135SToshifumi NISHINAGA FMC_BUSY_WAIT(); 19925c1b135SToshifumi NISHINAGA 20025c1b135SToshifumi NISHINAGA writel(FMC_SDCMR_BANK_1 | FMC_SDCMR_MODE_PRECHARGE, 20125c1b135SToshifumi NISHINAGA &STM32_SDRAM_FMC->sdcmr); 20225c1b135SToshifumi NISHINAGA 20325c1b135SToshifumi NISHINAGA udelay(100); 20425c1b135SToshifumi NISHINAGA FMC_BUSY_WAIT(); 20525c1b135SToshifumi NISHINAGA 20625c1b135SToshifumi NISHINAGA writel((FMC_SDCMR_BANK_1 | FMC_SDCMR_MODE_AUTOREFRESH 20725c1b135SToshifumi NISHINAGA | 7 << FMC_SDCMR_NRFS_SHIFT), &STM32_SDRAM_FMC->sdcmr); 20825c1b135SToshifumi NISHINAGA 20925c1b135SToshifumi NISHINAGA udelay(100); 21025c1b135SToshifumi NISHINAGA FMC_BUSY_WAIT(); 21125c1b135SToshifumi NISHINAGA 21225c1b135SToshifumi NISHINAGA writel(FMC_SDCMR_BANK_1 | (SDRAM_MODE_BL << SDRAM_MODE_BL_SHIFT 21325c1b135SToshifumi NISHINAGA | SDRAM_MODE_CAS << SDRAM_MODE_CAS_SHIFT) 21425c1b135SToshifumi NISHINAGA << FMC_SDCMR_MODE_REGISTER_SHIFT | FMC_SDCMR_MODE_WRITE_MODE, 21525c1b135SToshifumi NISHINAGA &STM32_SDRAM_FMC->sdcmr); 21625c1b135SToshifumi NISHINAGA 21725c1b135SToshifumi NISHINAGA udelay(100); 21825c1b135SToshifumi NISHINAGA 21925c1b135SToshifumi NISHINAGA FMC_BUSY_WAIT(); 22025c1b135SToshifumi NISHINAGA 22125c1b135SToshifumi NISHINAGA writel(FMC_SDCMR_BANK_1 | FMC_SDCMR_MODE_NORMAL, 22225c1b135SToshifumi NISHINAGA &STM32_SDRAM_FMC->sdcmr); 22325c1b135SToshifumi NISHINAGA 22425c1b135SToshifumi NISHINAGA FMC_BUSY_WAIT(); 22525c1b135SToshifumi NISHINAGA 22625c1b135SToshifumi NISHINAGA /* Refresh timer */ 22725c1b135SToshifumi NISHINAGA writel(SDRAM_TREF, &STM32_SDRAM_FMC->sdrtr); 22825c1b135SToshifumi NISHINAGA 22925c1b135SToshifumi NISHINAGA /* 23025c1b135SToshifumi NISHINAGA * Fill in global info with description of SRAM configuration 23125c1b135SToshifumi NISHINAGA */ 23225c1b135SToshifumi NISHINAGA gd->bd->bi_dram[0].start = CONFIG_SYS_RAM_BASE; 23325c1b135SToshifumi NISHINAGA gd->bd->bi_dram[0].size = CONFIG_SYS_RAM_SIZE; 23425c1b135SToshifumi NISHINAGA 23525c1b135SToshifumi NISHINAGA gd->ram_size = CONFIG_SYS_RAM_SIZE; 23625c1b135SToshifumi NISHINAGA 23725c1b135SToshifumi NISHINAGA return rv; 23825c1b135SToshifumi NISHINAGA } 23925c1b135SToshifumi NISHINAGA 240e66c49faSVikas Manocha int uart_setup_gpio(void) 241e66c49faSVikas Manocha { 24295d52733STom Rini clock_setup(GPIO_A_CLOCK_CFG); 24395d52733STom Rini clock_setup(GPIO_B_CLOCK_CFG); 244*e34e19feSVikas Manocha return 0; 245e66c49faSVikas Manocha } 246e66c49faSVikas Manocha 247b20b70fcSMichael Kurz #ifdef CONFIG_ETH_DESIGNWARE 248b20b70fcSMichael Kurz const struct stm32_gpio_ctl gpio_ctl_eth = { 249b20b70fcSMichael Kurz .mode = STM32_GPIO_MODE_AF, 250b20b70fcSMichael Kurz .otype = STM32_GPIO_OTYPE_PP, 251b20b70fcSMichael Kurz .speed = STM32_GPIO_SPEED_100M, 252b20b70fcSMichael Kurz .pupd = STM32_GPIO_PUPD_NO, 253b20b70fcSMichael Kurz .af = STM32_GPIO_AF11 254b20b70fcSMichael Kurz }; 255b20b70fcSMichael Kurz 256b20b70fcSMichael Kurz static const struct stm32_gpio_dsc eth_gpio[] = { 257b20b70fcSMichael Kurz {STM32_GPIO_PORT_A, STM32_GPIO_PIN_1}, /* ETH_RMII_REF_CLK */ 258b20b70fcSMichael Kurz {STM32_GPIO_PORT_A, STM32_GPIO_PIN_2}, /* ETH_MDIO */ 259b20b70fcSMichael Kurz {STM32_GPIO_PORT_A, STM32_GPIO_PIN_7}, /* ETH_RMII_CRS_DV */ 260b20b70fcSMichael Kurz 261b20b70fcSMichael Kurz {STM32_GPIO_PORT_C, STM32_GPIO_PIN_1}, /* ETH_MDC */ 262b20b70fcSMichael Kurz {STM32_GPIO_PORT_C, STM32_GPIO_PIN_4}, /* ETH_RMII_RXD0 */ 263b20b70fcSMichael Kurz {STM32_GPIO_PORT_C, STM32_GPIO_PIN_5}, /* ETH_RMII_RXD1 */ 264b20b70fcSMichael Kurz 265b20b70fcSMichael Kurz {STM32_GPIO_PORT_G, STM32_GPIO_PIN_11}, /* ETH_RMII_TX_EN */ 266b20b70fcSMichael Kurz {STM32_GPIO_PORT_G, STM32_GPIO_PIN_13}, /* ETH_RMII_TXD0 */ 267b20b70fcSMichael Kurz {STM32_GPIO_PORT_G, STM32_GPIO_PIN_14}, /* ETH_RMII_TXD1 */ 268b20b70fcSMichael Kurz }; 269b20b70fcSMichael Kurz 270b20b70fcSMichael Kurz static int stmmac_setup(void) 271b20b70fcSMichael Kurz { 272b20b70fcSMichael Kurz int res = 0; 273b20b70fcSMichael Kurz int i; 274b20b70fcSMichael Kurz 275b20b70fcSMichael Kurz clock_setup(SYSCFG_CLOCK_CFG); 276b20b70fcSMichael Kurz 277b20b70fcSMichael Kurz /* Set >RMII mode */ 278b20b70fcSMichael Kurz STM32_SYSCFG->pmc |= SYSCFG_PMC_MII_RMII_SEL; 279b20b70fcSMichael Kurz 280b20b70fcSMichael Kurz clock_setup(GPIO_A_CLOCK_CFG); 281b20b70fcSMichael Kurz clock_setup(GPIO_C_CLOCK_CFG); 282b20b70fcSMichael Kurz clock_setup(GPIO_G_CLOCK_CFG); 283b20b70fcSMichael Kurz 284b20b70fcSMichael Kurz for (i = 0; i < ARRAY_SIZE(eth_gpio); i++) { 285b20b70fcSMichael Kurz res = stm32_gpio_config(ð_gpio[i], &gpio_ctl_eth); 286b20b70fcSMichael Kurz if (res) 287b20b70fcSMichael Kurz return res; 288b20b70fcSMichael Kurz } 289b20b70fcSMichael Kurz 290b20b70fcSMichael Kurz clock_setup(STMMAC_CLOCK_CFG); 291b20b70fcSMichael Kurz 292b20b70fcSMichael Kurz return 0; 293b20b70fcSMichael Kurz } 294b20b70fcSMichael Kurz #endif 295b20b70fcSMichael Kurz 296d4363baaSMichael Kurz #ifdef CONFIG_STM32_QSPI 297d4363baaSMichael Kurz const struct stm32_gpio_ctl gpio_ctl_qspi_9 = { 298d4363baaSMichael Kurz .mode = STM32_GPIO_MODE_AF, 299d4363baaSMichael Kurz .otype = STM32_GPIO_OTYPE_PP, 300d4363baaSMichael Kurz .speed = STM32_GPIO_SPEED_100M, 301d4363baaSMichael Kurz .pupd = STM32_GPIO_PUPD_NO, 302d4363baaSMichael Kurz .af = STM32_GPIO_AF9 303d4363baaSMichael Kurz }; 304d4363baaSMichael Kurz 305d4363baaSMichael Kurz const struct stm32_gpio_ctl gpio_ctl_qspi_10 = { 306d4363baaSMichael Kurz .mode = STM32_GPIO_MODE_AF, 307d4363baaSMichael Kurz .otype = STM32_GPIO_OTYPE_PP, 308d4363baaSMichael Kurz .speed = STM32_GPIO_SPEED_100M, 309d4363baaSMichael Kurz .pupd = STM32_GPIO_PUPD_NO, 310d4363baaSMichael Kurz .af = STM32_GPIO_AF10 311d4363baaSMichael Kurz }; 312d4363baaSMichael Kurz 313d4363baaSMichael Kurz static const struct stm32_gpio_dsc qspi_af9_gpio[] = { 314d4363baaSMichael Kurz {STM32_GPIO_PORT_B, STM32_GPIO_PIN_2}, /* QUADSPI_CLK */ 315d4363baaSMichael Kurz {STM32_GPIO_PORT_D, STM32_GPIO_PIN_11}, /* QUADSPI_BK1_IO0 */ 316d4363baaSMichael Kurz {STM32_GPIO_PORT_D, STM32_GPIO_PIN_12}, /* QUADSPI_BK1_IO1 */ 317d4363baaSMichael Kurz {STM32_GPIO_PORT_D, STM32_GPIO_PIN_13}, /* QUADSPI_BK1_IO3 */ 318d4363baaSMichael Kurz {STM32_GPIO_PORT_E, STM32_GPIO_PIN_2}, /* QUADSPI_BK1_IO2 */ 319d4363baaSMichael Kurz }; 320d4363baaSMichael Kurz 321d4363baaSMichael Kurz static const struct stm32_gpio_dsc qspi_af10_gpio[] = { 322d4363baaSMichael Kurz {STM32_GPIO_PORT_B, STM32_GPIO_PIN_6}, /* QUADSPI_BK1_NCS */ 323d4363baaSMichael Kurz }; 324d4363baaSMichael Kurz 325d4363baaSMichael Kurz static int qspi_setup(void) 326d4363baaSMichael Kurz { 327d4363baaSMichael Kurz int res = 0; 328d4363baaSMichael Kurz int i; 329d4363baaSMichael Kurz 330d4363baaSMichael Kurz clock_setup(GPIO_B_CLOCK_CFG); 331d4363baaSMichael Kurz clock_setup(GPIO_D_CLOCK_CFG); 332d4363baaSMichael Kurz clock_setup(GPIO_E_CLOCK_CFG); 333d4363baaSMichael Kurz 334d4363baaSMichael Kurz for (i = 0; i < ARRAY_SIZE(qspi_af9_gpio); i++) { 335d4363baaSMichael Kurz res = stm32_gpio_config(&qspi_af9_gpio[i], &gpio_ctl_qspi_9); 336d4363baaSMichael Kurz if (res) 337d4363baaSMichael Kurz return res; 338d4363baaSMichael Kurz } 339d4363baaSMichael Kurz 340d4363baaSMichael Kurz for (i = 0; i < ARRAY_SIZE(qspi_af10_gpio); i++) { 341d4363baaSMichael Kurz res = stm32_gpio_config(&qspi_af10_gpio[i], &gpio_ctl_qspi_10); 342d4363baaSMichael Kurz if (res) 343d4363baaSMichael Kurz return res; 344d4363baaSMichael Kurz } 345d4363baaSMichael Kurz 346d4363baaSMichael Kurz return 0; 347d4363baaSMichael Kurz } 348d4363baaSMichael Kurz #endif 349d4363baaSMichael Kurz 350e66c49faSVikas Manocha u32 get_board_rev(void) 351e66c49faSVikas Manocha { 352e66c49faSVikas Manocha return 0; 353e66c49faSVikas Manocha } 354e66c49faSVikas Manocha 355e66c49faSVikas Manocha int board_early_init_f(void) 356e66c49faSVikas Manocha { 357e66c49faSVikas Manocha int res; 358e66c49faSVikas Manocha 359e66c49faSVikas Manocha res = uart_setup_gpio(); 360e66c49faSVikas Manocha if (res) 361e66c49faSVikas Manocha return res; 362e66c49faSVikas Manocha 363b20b70fcSMichael Kurz #ifdef CONFIG_ETH_DESIGNWARE 364b20b70fcSMichael Kurz res = stmmac_setup(); 365b20b70fcSMichael Kurz if (res) 366b20b70fcSMichael Kurz return res; 367b20b70fcSMichael Kurz #endif 368b20b70fcSMichael Kurz 369d4363baaSMichael Kurz #ifdef CONFIG_STM32_QSPI 370d4363baaSMichael Kurz res = qspi_setup(); 371d4363baaSMichael Kurz if (res) 372d4363baaSMichael Kurz return res; 373d4363baaSMichael Kurz #endif 374d4363baaSMichael Kurz 375e66c49faSVikas Manocha return 0; 376e66c49faSVikas Manocha } 377e66c49faSVikas Manocha 378e66c49faSVikas Manocha int board_init(void) 379e66c49faSVikas Manocha { 380e66c49faSVikas Manocha gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 381e66c49faSVikas Manocha 382e66c49faSVikas Manocha return 0; 383e66c49faSVikas Manocha } 384