blob: b0c20fe56d68ee4518d0946ee45ba62dcf8e69bb [file] [log] [blame]
Rob Herring37fc0ed2011-10-24 08:50:20 +00001/*
2 * Copyright 2010-2011 Calxeda, Inc.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the Free
6 * Software Foundation; either version 2 of the License, or (at your option)
7 * any later version.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include <common.h>
19#include <ahci.h>
Rob Herringbd0d90e2012-02-21 12:52:26 +000020#include <netdev.h>
Rob Herring37fc0ed2011-10-24 08:50:20 +000021#include <scsi.h>
22
23#include <asm/sizes.h>
Rob Herring877012d2012-02-01 16:57:54 +000024#include <asm/io.h>
Rob Herring37fc0ed2011-10-24 08:50:20 +000025
Rob Herring76c39992013-06-12 22:24:52 -050026#define HB_AHCI_BASE 0xffe08000
27
Rob Herring0c34e692012-02-01 16:57:55 +000028#define HB_SREG_A9_PWR_REQ 0xfff3cf00
Rob Herring4a3ea212012-02-01 16:57:57 +000029#define HB_SREG_A9_BOOT_SRC_STAT 0xfff3cf04
Rob Herring76c39992013-06-12 22:24:52 -050030#define HB_SREG_A9_PWRDOM_STAT 0xfff3cf20
31
Rob Herring0c34e692012-02-01 16:57:55 +000032#define HB_PWR_SUSPEND 0
33#define HB_PWR_SOFT_RESET 1
34#define HB_PWR_HARD_RESET 2
35#define HB_PWR_SHUTDOWN 3
36
Rob Herring76c39992013-06-12 22:24:52 -050037#define PWRDOM_STAT_SATA 0x80000000
38#define PWRDOM_STAT_PCI 0x40000000
39#define PWRDOM_STAT_EMMC 0x20000000
40
Rob Herring37fc0ed2011-10-24 08:50:20 +000041DECLARE_GLOBAL_DATA_PTR;
42
43/*
44 * Miscellaneous platform dependent initialisations
45 */
46int board_init(void)
47{
48 icache_enable();
49
50 return 0;
51}
52
Rob Herring9a420982011-12-15 11:15:50 +000053/* We know all the init functions have been run now */
54int board_eth_init(bd_t *bis)
55{
56 int rc = 0;
57
58#ifdef CONFIG_CALXEDA_XGMAC
59 rc += calxedaxgmac_initialize(0, 0xfff50000);
60 rc += calxedaxgmac_initialize(1, 0xfff51000);
61#endif
62 return rc;
63}
64
Rob Herring95395022013-06-12 22:24:53 -050065#ifdef CONFIG_MISC_INIT_R
Rob Herring37fc0ed2011-10-24 08:50:20 +000066int misc_init_r(void)
67{
Rob Herring4a3ea212012-02-01 16:57:57 +000068 char envbuffer[16];
69 u32 boot_choice;
Rob Herring76c39992013-06-12 22:24:52 -050070 u32 reg = readl(HB_SREG_A9_PWRDOM_STAT);
Rob Herring4a3ea212012-02-01 16:57:57 +000071
Rob Herring76c39992013-06-12 22:24:52 -050072 if (reg & PWRDOM_STAT_SATA) {
73 ahci_init(HB_AHCI_BASE);
74 scsi_scan(1);
75 }
Rob Herring4a3ea212012-02-01 16:57:57 +000076
77 boot_choice = readl(HB_SREG_A9_BOOT_SRC_STAT) & 0xff;
78 sprintf(envbuffer, "bootcmd%d", boot_choice);
79 if (getenv(envbuffer)) {
80 sprintf(envbuffer, "run bootcmd%d", boot_choice);
81 setenv("bootcmd", envbuffer);
82 } else
83 setenv("bootcmd", "");
84
Rob Herring37fc0ed2011-10-24 08:50:20 +000085 return 0;
86}
Rob Herring95395022013-06-12 22:24:53 -050087#endif
Rob Herring37fc0ed2011-10-24 08:50:20 +000088
89int dram_init(void)
90{
91 gd->ram_size = SZ_512M;
92 return 0;
93}
94
95void dram_init_banksize(void)
96{
97 gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
98 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
99}
100
Rob Herring76c39992013-06-12 22:24:52 -0500101#if defined(CONFIG_OF_BOARD_SETUP)
102void ft_board_setup(void *fdt, bd_t *bd)
103{
104 static const char disabled[] = "disabled";
105 u32 reg = readl(HB_SREG_A9_PWRDOM_STAT);
106
107 if (!(reg & PWRDOM_STAT_SATA))
108 do_fixup_by_compat(fdt, "calxeda,hb-ahci", "status",
109 disabled, sizeof(disabled), 1);
110
111 if (!(reg & PWRDOM_STAT_EMMC))
112 do_fixup_by_compat(fdt, "calxeda,hb-sdhci", "status",
113 disabled, sizeof(disabled), 1);
114}
115#endif
116
Rob Herring37fc0ed2011-10-24 08:50:20 +0000117void reset_cpu(ulong addr)
118{
Rob Herring0c34e692012-02-01 16:57:55 +0000119 writel(HB_PWR_HARD_RESET, HB_SREG_A9_PWR_REQ);
Rob Herring5bedf882012-12-02 17:06:22 +0000120
121 wfi();
Rob Herring37fc0ed2011-10-24 08:50:20 +0000122}