diff mbox

[1/5] mach-aspeed: Add Zaius BMC-specific early setup

Message ID 1476312288-100725-1-git-send-email-xow@google.com
State Accepted, archived
Headers show

Commit Message

Xo Wang Oct. 12, 2016, 10:44 p.m. UTC
Add initialization for "ingrasys,zaius-bmc" machines to deal with
hardware issues on EVT1 boards. This overrides incorrect straps that
enabled the SPI slave and disables pull down resistors that prevented
buttons inputs from being driven high.

This code reads board revision fuse bits directly from GPIO registers
because GPIO drivers are not available yet.

Signed-off-by: Xo Wang <xow@google.com>
---
 arch/arm/mach-aspeed/aspeed.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

Comments

Joel Stanley Oct. 13, 2016, 2:55 a.m. UTC | #1
On Thu, Oct 13, 2016 at 9:44 AM, Xo Wang <xow@google.com> wrote:
> Add initialization for "ingrasys,zaius-bmc" machines to deal with
> hardware issues on EVT1 boards. This overrides incorrect straps that
> enabled the SPI slave and disables pull down resistors that prevented
> buttons inputs from being driven high.
>
> This code reads board revision fuse bits directly from GPIO registers
> because GPIO drivers are not available yet.

That's unfortunate, but I can't think of another way to make it work.

> Signed-off-by: Xo Wang <xow@google.com>

Reviewed-by: Joel Stanley <joel@jms.id.au>

> ---
>  arch/arm/mach-aspeed/aspeed.c | 27 +++++++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
>
> diff --git a/arch/arm/mach-aspeed/aspeed.c b/arch/arm/mach-aspeed/aspeed.c
> index 12a63db..9bf159c 100644
> --- a/arch/arm/mach-aspeed/aspeed.c
> +++ b/arch/arm/mach-aspeed/aspeed.c
> @@ -170,6 +170,31 @@ static void __init do_witherspoon_setup(void)
>         do_ast2500_common_setup();
>  }
>
> +static void __init do_zaius_setup(void)
> +{
> +       unsigned long reg;
> +       unsigned long board_rev;
> +
> +       do_ast2500_common_setup();
> +
> +       /* Read BOARD_REV[4:0] fuses from GPIOM[7:3] */
> +       reg = readl(AST_IO(AST_BASE_GPIO | 0x78));
> +       board_rev = (reg >> 3) & 0x1F;
> +
> +       /* EVT1 hacks */
> +       if (board_rev == 0) {
> +               /* Set strap[13:12] to 01, Enable SPI master */
> +               /* Set bits in writes to SCU7C are cleared from SCU70 */
> +               writel(BIT(13), AST_IO(AST_BASE_SCU | 0x7C));
> +               /* SCU70 is set-only, so no read-modify-write needed */
> +               writel(BIT(12), AST_IO(AST_BASE_SCU | 0x70));
> +
> +               /* Disable GPIO I, G/AB pulldowns due to weak driving buffers */
> +               reg = readl(AST_IO(AST_BASE_SCU | 0x8C));
> +               writel(reg | BIT(24) | BIT(22), AST_IO(AST_BASE_SCU | 0x8C));
> +       }
> +}
> +
>
>  #define SCU_PASSWORD   0x1688A8A8
>
> @@ -216,6 +241,8 @@ static void __init aspeed_init_early(void)
>                 do_ast2500evb_setup();
>         if (of_machine_is_compatible("ibm,witherspoon-bmc"))
>                 do_witherspoon_setup();
> +       if (of_machine_is_compatible("ingrasys,zaius-bmc"))
> +               do_zaius_setup();
>  }
>
>  static void __init aspeed_map_io(void)
> --
> 2.8.0.rc3.226.g39d4020
>
> _______________________________________________
> openbmc mailing list
> openbmc@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/openbmc
diff mbox

Patch

diff --git a/arch/arm/mach-aspeed/aspeed.c b/arch/arm/mach-aspeed/aspeed.c
index 12a63db..9bf159c 100644
--- a/arch/arm/mach-aspeed/aspeed.c
+++ b/arch/arm/mach-aspeed/aspeed.c
@@ -170,6 +170,31 @@  static void __init do_witherspoon_setup(void)
 	do_ast2500_common_setup();
 }
 
+static void __init do_zaius_setup(void)
+{
+	unsigned long reg;
+	unsigned long board_rev;
+
+	do_ast2500_common_setup();
+
+	/* Read BOARD_REV[4:0] fuses from GPIOM[7:3] */
+	reg = readl(AST_IO(AST_BASE_GPIO | 0x78));
+	board_rev = (reg >> 3) & 0x1F;
+
+	/* EVT1 hacks */
+	if (board_rev == 0) {
+		/* Set strap[13:12] to 01, Enable SPI master */
+		/* Set bits in writes to SCU7C are cleared from SCU70 */
+		writel(BIT(13), AST_IO(AST_BASE_SCU | 0x7C));
+		/* SCU70 is set-only, so no read-modify-write needed */
+		writel(BIT(12), AST_IO(AST_BASE_SCU | 0x70));
+
+		/* Disable GPIO I, G/AB pulldowns due to weak driving buffers */
+		reg = readl(AST_IO(AST_BASE_SCU | 0x8C));
+		writel(reg | BIT(24) | BIT(22), AST_IO(AST_BASE_SCU | 0x8C));
+	}
+}
+
 
 #define SCU_PASSWORD	0x1688A8A8
 
@@ -216,6 +241,8 @@  static void __init aspeed_init_early(void)
 		do_ast2500evb_setup();
 	if (of_machine_is_compatible("ibm,witherspoon-bmc"))
 		do_witherspoon_setup();
+	if (of_machine_is_compatible("ingrasys,zaius-bmc"))
+		do_zaius_setup();
 }
 
 static void __init aspeed_map_io(void)