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
38ef51c416SMark Langsdorf void cphy_disable_overrides(void);
39ef51c416SMark Langsdorf
4037fc0ed2SRob Herring /*
4137fc0ed2SRob Herring * Miscellaneous platform dependent initialisations
4237fc0ed2SRob Herring */
board_init(void)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 */
board_eth_init(bd_t * bis)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
scsi_init(void)63b9463226SIan Campbell void scsi_init(void)
6437fc0ed2SRob Herring {
6576c3999dSRob Herring u32 reg = readl(HB_SREG_A9_PWRDOM_STAT);
664a3ea216SRob Herring
67ef51c416SMark Langsdorf cphy_disable_overrides();
6876c3999dSRob Herring if (reg & PWRDOM_STAT_SATA) {
699efaca3eSScott Wood ahci_init((void __iomem *)HB_AHCI_BASE);
708eab1a58SSimon Glass scsi_scan(true);
7176c3999dSRob Herring }
72b9463226SIan Campbell }
73b9463226SIan Campbell #endif
74b9463226SIan Campbell
75b9463226SIan Campbell #ifdef CONFIG_MISC_INIT_R
misc_init_r(void)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);
83*00caae6dSSimon Glass if (env_get(envbuffer)) {
844a3ea216SRob Herring sprintf(envbuffer, "run bootcmd%d", boot_choice);
85382bee57SSimon Glass env_set("bootcmd", envbuffer);
864a3ea216SRob Herring } else
87382bee57SSimon Glass env_set("bootcmd", "");
884a3ea216SRob Herring
8937fc0ed2SRob Herring return 0;
9037fc0ed2SRob Herring }
9195395023SRob Herring #endif
9237fc0ed2SRob Herring
dram_init(void)9337fc0ed2SRob Herring int dram_init(void)
9437fc0ed2SRob Herring {
9537fc0ed2SRob Herring gd->ram_size = SZ_512M;
9637fc0ed2SRob Herring return 0;
9737fc0ed2SRob Herring }
9837fc0ed2SRob Herring
9976c3999dSRob Herring #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * fdt,bd_t * bd)100e895a4b0SSimon Glass int ft_board_setup(void *fdt, bd_t *bd)
10176c3999dSRob Herring {
10276c3999dSRob Herring static const char disabled[] = "disabled";
10376c3999dSRob Herring u32 reg = readl(HB_SREG_A9_PWRDOM_STAT);
10476c3999dSRob Herring
10576c3999dSRob Herring if (!(reg & PWRDOM_STAT_SATA))
10676c3999dSRob Herring do_fixup_by_compat(fdt, "calxeda,hb-ahci", "status",
10776c3999dSRob Herring disabled, sizeof(disabled), 1);
10876c3999dSRob Herring
10976c3999dSRob Herring if (!(reg & PWRDOM_STAT_EMMC))
11076c3999dSRob Herring do_fixup_by_compat(fdt, "calxeda,hb-sdhci", "status",
11176c3999dSRob Herring disabled, sizeof(disabled), 1);
112e895a4b0SSimon Glass
113e895a4b0SSimon Glass return 0;
11476c3999dSRob Herring }
11576c3999dSRob Herring #endif
11676c3999dSRob Herring
is_highbank(void)117f8973325SMark Langsdorf static int is_highbank(void)
118f8973325SMark Langsdorf {
119f8973325SMark Langsdorf uint32_t midr;
120f8973325SMark Langsdorf
121f8973325SMark Langsdorf asm volatile ("mrc p15, 0, %0, c0, c0, 0\n" : "=r"(midr));
122f8973325SMark Langsdorf
123f8973325SMark Langsdorf return (midr & 0xfff0) == 0xc090;
124f8973325SMark Langsdorf }
125f8973325SMark Langsdorf
reset_cpu(ulong addr)12637fc0ed2SRob Herring void reset_cpu(ulong addr)
12737fc0ed2SRob Herring {
1280c34e69fSRob Herring writel(HB_PWR_HARD_RESET, HB_SREG_A9_PWR_REQ);
129f8973325SMark Langsdorf if (is_highbank())
130083ffd65SRob Herring writeb(HB_SCU_A9_PWR_OFF, HB_SCU_A9_PWR_STATUS);
131f8973325SMark Langsdorf else
132f8973325SMark Langsdorf writel(0x1, HB_SREG_A15_PWR_CTRL);
1335bedf884SRob Herring
1345bedf884SRob Herring wfi();
13537fc0ed2SRob Herring }
136ef51c416SMark Langsdorf
137ef51c416SMark Langsdorf /*
138ef51c416SMark Langsdorf * turn off the override before transferring control to Linux, since Linux
139ef51c416SMark Langsdorf * may not support spread spectrum.
140ef51c416SMark Langsdorf */
arch_preboot_os(void)141ef51c416SMark Langsdorf void arch_preboot_os(void)
142ef51c416SMark Langsdorf {
143ef51c416SMark Langsdorf cphy_disable_overrides();
144ef51c416SMark Langsdorf }
145