137fc0ed2SRob Herring /* 237fc0ed2SRob Herring * Copyright 2010-2011 Calxeda, Inc. 337fc0ed2SRob Herring * 41a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 537fc0ed2SRob Herring */ 637fc0ed2SRob Herring 737fc0ed2SRob Herring #include <common.h> 837fc0ed2SRob Herring #include <ahci.h> 9bd0d90efSRob Herring #include <netdev.h> 1037fc0ed2SRob Herring #include <scsi.h> 1137fc0ed2SRob Herring 121ace4022SAlexey Brodkin #include <linux/sizes.h> 13877012dfSRob Herring #include <asm/io.h> 1437fc0ed2SRob Herring 1576c3999dSRob Herring #define HB_AHCI_BASE 0xffe08000 1676c3999dSRob Herring 17083ffd65SRob Herring #define HB_SCU_A9_PWR_STATUS 0xfff10008 180c34e69fSRob Herring #define HB_SREG_A9_PWR_REQ 0xfff3cf00 194a3ea216SRob Herring #define HB_SREG_A9_BOOT_SRC_STAT 0xfff3cf04 2076c3999dSRob Herring #define HB_SREG_A9_PWRDOM_STAT 0xfff3cf20 21f8973325SMark Langsdorf #define HB_SREG_A15_PWR_CTRL 0xfff3c200 2276c3999dSRob Herring 230c34e69fSRob Herring #define HB_PWR_SUSPEND 0 240c34e69fSRob Herring #define HB_PWR_SOFT_RESET 1 250c34e69fSRob Herring #define HB_PWR_HARD_RESET 2 260c34e69fSRob Herring #define HB_PWR_SHUTDOWN 3 270c34e69fSRob Herring 2876c3999dSRob Herring #define PWRDOM_STAT_SATA 0x80000000 2976c3999dSRob Herring #define PWRDOM_STAT_PCI 0x40000000 3076c3999dSRob Herring #define PWRDOM_STAT_EMMC 0x20000000 3176c3999dSRob Herring 32083ffd65SRob Herring #define HB_SCU_A9_PWR_NORMAL 0 33083ffd65SRob Herring #define HB_SCU_A9_PWR_DORMANT 2 34083ffd65SRob Herring #define HB_SCU_A9_PWR_OFF 3 35083ffd65SRob Herring 3637fc0ed2SRob Herring DECLARE_GLOBAL_DATA_PTR; 3737fc0ed2SRob Herring 38*ef51c416SMark Langsdorf void cphy_disable_overrides(void); 39*ef51c416SMark Langsdorf 4037fc0ed2SRob Herring /* 4137fc0ed2SRob Herring * Miscellaneous platform dependent initialisations 4237fc0ed2SRob Herring */ 4337fc0ed2SRob Herring int board_init(void) 4437fc0ed2SRob Herring { 4537fc0ed2SRob Herring icache_enable(); 4637fc0ed2SRob Herring 4737fc0ed2SRob Herring return 0; 4837fc0ed2SRob Herring } 4937fc0ed2SRob Herring 509a420986SRob Herring /* We know all the init functions have been run now */ 519a420986SRob Herring int board_eth_init(bd_t *bis) 529a420986SRob Herring { 539a420986SRob Herring int rc = 0; 549a420986SRob Herring 559a420986SRob Herring #ifdef CONFIG_CALXEDA_XGMAC 569a420986SRob Herring rc += calxedaxgmac_initialize(0, 0xfff50000); 579a420986SRob Herring rc += calxedaxgmac_initialize(1, 0xfff51000); 589a420986SRob Herring #endif 599a420986SRob Herring return rc; 609a420986SRob Herring } 619a420986SRob Herring 62b9463226SIan Campbell #ifdef CONFIG_SCSI_AHCI_PLAT 63b9463226SIan Campbell void scsi_init(void) 6437fc0ed2SRob Herring { 6576c3999dSRob Herring u32 reg = readl(HB_SREG_A9_PWRDOM_STAT); 664a3ea216SRob Herring 67*ef51c416SMark Langsdorf cphy_disable_overrides(); 6876c3999dSRob Herring if (reg & PWRDOM_STAT_SATA) { 699efaca3eSScott Wood ahci_init((void __iomem *)HB_AHCI_BASE); 7037fc0ed2SRob Herring scsi_scan(1); 7176c3999dSRob Herring } 72b9463226SIan Campbell } 73b9463226SIan Campbell #endif 74b9463226SIan Campbell 75b9463226SIan Campbell #ifdef CONFIG_MISC_INIT_R 76b9463226SIan Campbell int misc_init_r(void) 77b9463226SIan Campbell { 78b9463226SIan Campbell char envbuffer[16]; 79b9463226SIan Campbell u32 boot_choice; 804a3ea216SRob Herring 814a3ea216SRob Herring boot_choice = readl(HB_SREG_A9_BOOT_SRC_STAT) & 0xff; 824a3ea216SRob Herring sprintf(envbuffer, "bootcmd%d", boot_choice); 834a3ea216SRob Herring if (getenv(envbuffer)) { 844a3ea216SRob Herring sprintf(envbuffer, "run bootcmd%d", boot_choice); 854a3ea216SRob Herring setenv("bootcmd", envbuffer); 864a3ea216SRob Herring } else 874a3ea216SRob Herring setenv("bootcmd", ""); 884a3ea216SRob Herring 8937fc0ed2SRob Herring return 0; 9037fc0ed2SRob Herring } 9195395023SRob Herring #endif 9237fc0ed2SRob Herring 9337fc0ed2SRob Herring int dram_init(void) 9437fc0ed2SRob Herring { 9537fc0ed2SRob Herring gd->ram_size = SZ_512M; 9637fc0ed2SRob Herring return 0; 9737fc0ed2SRob Herring } 9837fc0ed2SRob Herring 9937fc0ed2SRob Herring void dram_init_banksize(void) 10037fc0ed2SRob Herring { 10137fc0ed2SRob Herring gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE; 10237fc0ed2SRob Herring gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 10337fc0ed2SRob Herring } 10437fc0ed2SRob Herring 10576c3999dSRob Herring #if defined(CONFIG_OF_BOARD_SETUP) 106e895a4b0SSimon Glass int ft_board_setup(void *fdt, bd_t *bd) 10776c3999dSRob Herring { 10876c3999dSRob Herring static const char disabled[] = "disabled"; 10976c3999dSRob Herring u32 reg = readl(HB_SREG_A9_PWRDOM_STAT); 11076c3999dSRob Herring 11176c3999dSRob Herring if (!(reg & PWRDOM_STAT_SATA)) 11276c3999dSRob Herring do_fixup_by_compat(fdt, "calxeda,hb-ahci", "status", 11376c3999dSRob Herring disabled, sizeof(disabled), 1); 11476c3999dSRob Herring 11576c3999dSRob Herring if (!(reg & PWRDOM_STAT_EMMC)) 11676c3999dSRob Herring do_fixup_by_compat(fdt, "calxeda,hb-sdhci", "status", 11776c3999dSRob Herring disabled, sizeof(disabled), 1); 118e895a4b0SSimon Glass 119e895a4b0SSimon Glass return 0; 12076c3999dSRob Herring } 12176c3999dSRob Herring #endif 12276c3999dSRob Herring 123f8973325SMark Langsdorf static int is_highbank(void) 124f8973325SMark Langsdorf { 125f8973325SMark Langsdorf uint32_t midr; 126f8973325SMark Langsdorf 127f8973325SMark Langsdorf asm volatile ("mrc p15, 0, %0, c0, c0, 0\n" : "=r"(midr)); 128f8973325SMark Langsdorf 129f8973325SMark Langsdorf return (midr & 0xfff0) == 0xc090; 130f8973325SMark Langsdorf } 131f8973325SMark Langsdorf 13237fc0ed2SRob Herring void reset_cpu(ulong addr) 13337fc0ed2SRob Herring { 1340c34e69fSRob Herring writel(HB_PWR_HARD_RESET, HB_SREG_A9_PWR_REQ); 135f8973325SMark Langsdorf if (is_highbank()) 136083ffd65SRob Herring writeb(HB_SCU_A9_PWR_OFF, HB_SCU_A9_PWR_STATUS); 137f8973325SMark Langsdorf else 138f8973325SMark Langsdorf writel(0x1, HB_SREG_A15_PWR_CTRL); 1395bedf884SRob Herring 1405bedf884SRob Herring wfi(); 14137fc0ed2SRob Herring } 142*ef51c416SMark Langsdorf 143*ef51c416SMark Langsdorf /* 144*ef51c416SMark Langsdorf * turn off the override before transferring control to Linux, since Linux 145*ef51c416SMark Langsdorf * may not support spread spectrum. 146*ef51c416SMark Langsdorf */ 147*ef51c416SMark Langsdorf void arch_preboot_os(void) 148*ef51c416SMark Langsdorf { 149*ef51c416SMark Langsdorf cphy_disable_overrides(); 150*ef51c416SMark Langsdorf } 151