1cba69eeeSIan Campbell /* 2cba69eeeSIan Campbell * (C) Copyright 2012-2013 Henrik Nordstrom <henrik@henriknordstrom.net> 3cba69eeeSIan Campbell * (C) Copyright 2013 Luke Kenneth Casson Leighton <lkcl@lkcl.net> 4cba69eeeSIan Campbell * 5cba69eeeSIan Campbell * (C) Copyright 2007-2011 6cba69eeeSIan Campbell * Allwinner Technology Co., Ltd. <www.allwinnertech.com> 7cba69eeeSIan Campbell * Tom Cubie <tangliang@allwinnertech.com> 8cba69eeeSIan Campbell * 9cba69eeeSIan Campbell * Some board init for the Allwinner A10-evb board. 10cba69eeeSIan Campbell * 11cba69eeeSIan Campbell * SPDX-License-Identifier: GPL-2.0+ 12cba69eeeSIan Campbell */ 13cba69eeeSIan Campbell 14cba69eeeSIan Campbell #include <common.h> 1524289208SHans de Goede #ifdef CONFIG_AXP152_POWER 1624289208SHans de Goede #include <axp152.h> 1724289208SHans de Goede #endif 1814bc66bdSHenrik Nordstrom #ifdef CONFIG_AXP209_POWER 1914bc66bdSHenrik Nordstrom #include <axp209.h> 2014bc66bdSHenrik Nordstrom #endif 21cba69eeeSIan Campbell #include <asm/arch/clock.h> 22b41d7d05SJonathan Liu #include <asm/arch/cpu.h> 23cba69eeeSIan Campbell #include <asm/arch/dram.h> 24e24ea55cSIan Campbell #include <asm/arch/gpio.h> 25e24ea55cSIan Campbell #include <asm/arch/mmc.h> 26b41d7d05SJonathan Liu #include <asm/io.h> 27b41d7d05SJonathan Liu #include <net.h> 28cba69eeeSIan Campbell 29cba69eeeSIan Campbell DECLARE_GLOBAL_DATA_PTR; 30cba69eeeSIan Campbell 31cba69eeeSIan Campbell /* add board specific code here */ 32cba69eeeSIan Campbell int board_init(void) 33cba69eeeSIan Campbell { 34cba69eeeSIan Campbell int id_pfr1; 35cba69eeeSIan Campbell 36cba69eeeSIan Campbell gd->bd->bi_boot_params = (PHYS_SDRAM_0 + 0x100); 37cba69eeeSIan Campbell 38cba69eeeSIan Campbell asm volatile("mrc p15, 0, %0, c0, c1, 1" : "=r"(id_pfr1)); 39cba69eeeSIan Campbell debug("id_pfr1: 0x%08x\n", id_pfr1); 40cba69eeeSIan Campbell /* Generic Timer Extension available? */ 41cba69eeeSIan Campbell if ((id_pfr1 >> 16) & 0xf) { 42cba69eeeSIan Campbell debug("Setting CNTFRQ\n"); 43cba69eeeSIan Campbell /* CNTFRQ == 24 MHz */ 44cba69eeeSIan Campbell asm volatile("mcr p15, 0, %0, c14, c0, 0" : : "r"(24000000)); 45cba69eeeSIan Campbell } 46cba69eeeSIan Campbell 47cba69eeeSIan Campbell return 0; 48cba69eeeSIan Campbell } 49cba69eeeSIan Campbell 50cba69eeeSIan Campbell int dram_init(void) 51cba69eeeSIan Campbell { 52cba69eeeSIan Campbell gd->ram_size = get_ram_size((long *)PHYS_SDRAM_0, PHYS_SDRAM_0_SIZE); 53cba69eeeSIan Campbell 54cba69eeeSIan Campbell return 0; 55cba69eeeSIan Campbell } 56cba69eeeSIan Campbell 57e24ea55cSIan Campbell #ifdef CONFIG_GENERIC_MMC 58e24ea55cSIan Campbell static void mmc_pinmux_setup(int sdc) 59e24ea55cSIan Campbell { 60e24ea55cSIan Campbell unsigned int pin; 61e24ea55cSIan Campbell 62e24ea55cSIan Campbell switch (sdc) { 63e24ea55cSIan Campbell case 0: 64e24ea55cSIan Campbell /* D1-PF0, D0-PF1, CLK-PF2, CMD-PF3, D3-PF4, D4-PF5 */ 65e24ea55cSIan Campbell for (pin = SUNXI_GPF(0); pin <= SUNXI_GPF(5); pin++) { 66e24ea55cSIan Campbell sunxi_gpio_set_cfgpin(pin, SUNXI_GPF0_SDC0); 67e24ea55cSIan Campbell sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP); 68e24ea55cSIan Campbell sunxi_gpio_set_drv(pin, 2); 69e24ea55cSIan Campbell } 70e24ea55cSIan Campbell break; 71e24ea55cSIan Campbell 72e24ea55cSIan Campbell case 1: 73e24ea55cSIan Campbell /* CMD-PH22, CLK-PH23, D0~D3-PH24~27 : 5 */ 74e24ea55cSIan Campbell for (pin = SUNXI_GPH(22); pin <= SUNXI_GPH(27); pin++) { 75e24ea55cSIan Campbell sunxi_gpio_set_cfgpin(pin, SUN4I_GPH22_SDC1); 76e24ea55cSIan Campbell sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP); 77e24ea55cSIan Campbell sunxi_gpio_set_drv(pin, 2); 78e24ea55cSIan Campbell } 79e24ea55cSIan Campbell break; 80e24ea55cSIan Campbell 81e24ea55cSIan Campbell case 2: 82e24ea55cSIan Campbell /* CMD-PC6, CLK-PC7, D0-PC8, D1-PC9, D2-PC10, D3-PC11 */ 83e24ea55cSIan Campbell for (pin = SUNXI_GPC(6); pin <= SUNXI_GPC(11); pin++) { 84e24ea55cSIan Campbell sunxi_gpio_set_cfgpin(pin, SUNXI_GPC6_SDC2); 85e24ea55cSIan Campbell sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP); 86e24ea55cSIan Campbell sunxi_gpio_set_drv(pin, 2); 87e24ea55cSIan Campbell } 88e24ea55cSIan Campbell break; 89e24ea55cSIan Campbell 90e24ea55cSIan Campbell case 3: 91e24ea55cSIan Campbell /* CMD-PI4, CLK-PI5, D0~D3-PI6~9 : 2 */ 92e24ea55cSIan Campbell for (pin = SUNXI_GPI(4); pin <= SUNXI_GPI(9); pin++) { 93e24ea55cSIan Campbell sunxi_gpio_set_cfgpin(pin, SUN4I_GPI4_SDC3); 94e24ea55cSIan Campbell sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP); 95e24ea55cSIan Campbell sunxi_gpio_set_drv(pin, 2); 96e24ea55cSIan Campbell } 97e24ea55cSIan Campbell break; 98e24ea55cSIan Campbell 99e24ea55cSIan Campbell default: 100e24ea55cSIan Campbell printf("sunxi: invalid MMC slot %d for pinmux setup\n", sdc); 101e24ea55cSIan Campbell break; 102e24ea55cSIan Campbell } 103e24ea55cSIan Campbell } 104e24ea55cSIan Campbell 105e24ea55cSIan Campbell int board_mmc_init(bd_t *bis) 106e24ea55cSIan Campbell { 107e24ea55cSIan Campbell mmc_pinmux_setup(CONFIG_MMC_SUNXI_SLOT); 108e24ea55cSIan Campbell sunxi_mmc_init(CONFIG_MMC_SUNXI_SLOT); 109*2ccfac01SHans de Goede #if CONFIG_MMC_SUNXI_SLOT_EXTRA != -1 110e24ea55cSIan Campbell mmc_pinmux_setup(CONFIG_MMC_SUNXI_SLOT_EXTRA); 111e24ea55cSIan Campbell sunxi_mmc_init(CONFIG_MMC_SUNXI_SLOT_EXTRA); 112e24ea55cSIan Campbell #endif 113e24ea55cSIan Campbell 114e24ea55cSIan Campbell return 0; 115e24ea55cSIan Campbell } 116e24ea55cSIan Campbell #endif 117e24ea55cSIan Campbell 1186620377eSHans de Goede void i2c_init_board(void) 1196620377eSHans de Goede { 1206620377eSHans de Goede sunxi_gpio_set_cfgpin(SUNXI_GPB(0), SUNXI_GPB0_TWI0); 1216620377eSHans de Goede sunxi_gpio_set_cfgpin(SUNXI_GPB(1), SUNXI_GPB0_TWI0); 1226620377eSHans de Goede clock_twi_onoff(0, 1); 1236620377eSHans de Goede } 1246620377eSHans de Goede 125cba69eeeSIan Campbell #ifdef CONFIG_SPL_BUILD 126cba69eeeSIan Campbell void sunxi_board_init(void) 127cba69eeeSIan Campbell { 12814bc66bdSHenrik Nordstrom int power_failed = 0; 129cba69eeeSIan Campbell unsigned long ramsize; 130cba69eeeSIan Campbell 13124289208SHans de Goede #ifdef CONFIG_AXP152_POWER 13224289208SHans de Goede power_failed = axp152_init(); 13324289208SHans de Goede power_failed |= axp152_set_dcdc2(1400); 13424289208SHans de Goede power_failed |= axp152_set_dcdc3(1500); 13524289208SHans de Goede power_failed |= axp152_set_dcdc4(1250); 13624289208SHans de Goede power_failed |= axp152_set_ldo2(3000); 13724289208SHans de Goede #endif 13814bc66bdSHenrik Nordstrom #ifdef CONFIG_AXP209_POWER 13914bc66bdSHenrik Nordstrom power_failed |= axp209_init(); 14014bc66bdSHenrik Nordstrom power_failed |= axp209_set_dcdc2(1400); 14114bc66bdSHenrik Nordstrom power_failed |= axp209_set_dcdc3(1250); 14214bc66bdSHenrik Nordstrom power_failed |= axp209_set_ldo2(3000); 14314bc66bdSHenrik Nordstrom power_failed |= axp209_set_ldo3(2800); 14414bc66bdSHenrik Nordstrom power_failed |= axp209_set_ldo4(2800); 14514bc66bdSHenrik Nordstrom #endif 14614bc66bdSHenrik Nordstrom 147cba69eeeSIan Campbell printf("DRAM:"); 148cba69eeeSIan Campbell ramsize = sunxi_dram_init(); 149cba69eeeSIan Campbell printf(" %lu MiB\n", ramsize >> 20); 150cba69eeeSIan Campbell if (!ramsize) 151cba69eeeSIan Campbell hang(); 15214bc66bdSHenrik Nordstrom 15314bc66bdSHenrik Nordstrom /* 15414bc66bdSHenrik Nordstrom * Only clock up the CPU to full speed if we are reasonably 15514bc66bdSHenrik Nordstrom * assured it's being powered with suitable core voltage 15614bc66bdSHenrik Nordstrom */ 15714bc66bdSHenrik Nordstrom if (!power_failed) 15814bc66bdSHenrik Nordstrom clock_set_pll1(CONFIG_CLK_FULL_SPEED); 15914bc66bdSHenrik Nordstrom else 16014bc66bdSHenrik Nordstrom printf("Failed to set core voltage! Can't set CPU frequency\n"); 161cba69eeeSIan Campbell } 162cba69eeeSIan Campbell #endif 163b41d7d05SJonathan Liu 164b41d7d05SJonathan Liu #ifdef CONFIG_MISC_INIT_R 165b41d7d05SJonathan Liu int misc_init_r(void) 166b41d7d05SJonathan Liu { 167b41d7d05SJonathan Liu if (!getenv("ethaddr")) { 168b41d7d05SJonathan Liu uint32_t reg_val = readl(SUNXI_SID_BASE); 169b41d7d05SJonathan Liu 170b41d7d05SJonathan Liu if (reg_val) { 171b41d7d05SJonathan Liu uint8_t mac_addr[6]; 172b41d7d05SJonathan Liu 173b41d7d05SJonathan Liu mac_addr[0] = 0x02; /* Non OUI / registered MAC address */ 174b41d7d05SJonathan Liu mac_addr[1] = (reg_val >> 0) & 0xff; 175b41d7d05SJonathan Liu reg_val = readl(SUNXI_SID_BASE + 0x0c); 176b41d7d05SJonathan Liu mac_addr[2] = (reg_val >> 24) & 0xff; 177b41d7d05SJonathan Liu mac_addr[3] = (reg_val >> 16) & 0xff; 178b41d7d05SJonathan Liu mac_addr[4] = (reg_val >> 8) & 0xff; 179b41d7d05SJonathan Liu mac_addr[5] = (reg_val >> 0) & 0xff; 180b41d7d05SJonathan Liu 181b41d7d05SJonathan Liu eth_setenv_enetaddr("ethaddr", mac_addr); 182b41d7d05SJonathan Liu } 183b41d7d05SJonathan Liu } 184b41d7d05SJonathan Liu 185b41d7d05SJonathan Liu return 0; 186b41d7d05SJonathan Liu } 187b41d7d05SJonathan Liu #endif 188