Patchwork [U-Boot,08/10] ARM: highbank: setup peripherals based on power domain status

login
register
mail settings
Submitter Rob Herring
Date May 15, 2013, 7:56 p.m.
Message ID <1368647776-12940-8-git-send-email-robherring2@gmail.com>
Download mbox | patch
Permalink /patch/244167/
State Superseded
Delegated to: Albert ARIBAUD
Headers show

Comments

Rob Herring - May 15, 2013, 7:56 p.m.
From: Rob Herring <rob.herring@calxeda.com>

Accessing powered down peripherals will hang the bus, so check power
domain status before initializing SATA and fixup the FDT to disable
unused peripherals.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 board/highbank/highbank.c  | 29 +++++++++++++++++++++++++++--
 include/configs/highbank.h |  1 +
 2 files changed, 28 insertions(+), 2 deletions(-)
Tom Rini - May 16, 2013, 3:48 p.m.
On Wed, May 15, 2013 at 02:56:14PM -0500, Rob Herring wrote:

> From: Rob Herring <rob.herring@calxeda.com>
> 
> Accessing powered down peripherals will hang the bus, so check power
> domain status before initializing SATA and fixup the FDT to disable
> unused peripherals.
[snip]
> -	ahci_init(0xffe08000);
> -	scsi_scan(1);
> +	if (reg & PWRDOM_STAT_SATA) {
> +		ahci_init(0xffe08000);
> +		scsi_scan(1);
> +	}

Define the magic value to something while you're in here cleaning up
please, thanks!

Patch

diff --git a/board/highbank/highbank.c b/board/highbank/highbank.c
index 09cd45d..4cc4b1c 100644
--- a/board/highbank/highbank.c
+++ b/board/highbank/highbank.c
@@ -25,11 +25,17 @@ 
 
 #define HB_SREG_A9_PWR_REQ		0xfff3cf00
 #define HB_SREG_A9_BOOT_SRC_STAT	0xfff3cf04
+#define HB_SREG_A9_PWRDOM_STAT		0xfff3cf20
+
 #define HB_PWR_SUSPEND			0
 #define HB_PWR_SOFT_RESET		1
 #define HB_PWR_HARD_RESET		2
 #define HB_PWR_SHUTDOWN			3
 
+#define PWRDOM_STAT_SATA		0x80000000
+#define PWRDOM_STAT_PCI			0x40000000
+#define PWRDOM_STAT_EMMC		0x20000000
+
 DECLARE_GLOBAL_DATA_PTR;
 
 /*
@@ -58,9 +64,12 @@  int misc_init_r(void)
 {
 	char envbuffer[16];
 	u32 boot_choice;
+	u32 reg = readl(HB_SREG_A9_PWRDOM_STAT);
 
-	ahci_init(0xffe08000);
-	scsi_scan(1);
+	if (reg & PWRDOM_STAT_SATA) {
+		ahci_init(0xffe08000);
+		scsi_scan(1);
+	}
 
 	boot_choice = readl(HB_SREG_A9_BOOT_SRC_STAT) & 0xff;
 	sprintf(envbuffer, "bootcmd%d", boot_choice);
@@ -85,6 +94,22 @@  void dram_init_banksize(void)
 	gd->bd->bi_dram[0].size =  PHYS_SDRAM_1_SIZE;
 }
 
+#if defined(CONFIG_OF_BOARD_SETUP)
+void ft_board_setup(void *fdt, bd_t *bd)
+{
+	static const char disabled[] = "disabled";
+	u32 reg = readl(HB_SREG_A9_PWRDOM_STAT);
+
+	if (!(reg & PWRDOM_STAT_SATA))
+		do_fixup_by_compat(fdt, "calxeda,hb-ahci", "status",
+			disabled, sizeof(disabled), 1);
+
+	if (!(reg & PWRDOM_STAT_EMMC))
+		do_fixup_by_compat(fdt, "calxeda,hb-sdhci", "status",
+			disabled, sizeof(disabled), 1);
+}
+#endif
+
 void reset_cpu(ulong addr)
 {
 	writel(HB_PWR_HARD_RESET, HB_SREG_A9_PWR_REQ);
diff --git a/include/configs/highbank.h b/include/configs/highbank.h
index 978681e..06c13f2 100644
--- a/include/configs/highbank.h
+++ b/include/configs/highbank.h
@@ -27,6 +27,7 @@ 
 #define CONFIG_SYS_HZ			CFG_HZ
 
 #define CONFIG_OF_LIBFDT
+#define CONFIG_OF_BOARD_SETUP
 #define CONFIG_FIT
 #define CONFIG_SUPPORT_RAW_INITRD
 #define CONFIG_SYS_BOOTMAPSZ		(16 << 20)