diff mbox

[linux,dev-4.7,v2] ARM: dts: aspeed: Modify Laanyang BMC device tree

Message ID 20170426051358.1909-1-chen.kenyy@inventec.com
State Superseded, archived
Headers show

Commit Message

ChenKenYY 陳永營 TAO April 26, 2017, 5:13 a.m. UTC
Modify Lanyang dts and add lanyang initial in aspeed.c

Signed-off-by: Ken Chen <chen.kenyy@inventec.com>
---
 arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts | 13 +++---
 arch/arm/mach-aspeed/aspeed.c                | 65 ++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+), 7 deletions(-)

Comments

Joel Stanley April 26, 2017, 8:15 a.m. UTC | #1
Hi Ken,

Thank you for your patch. I have some questions below.

On Wed, Apr 26, 2017 at 2:43 PM, Ken Chen <chen.kenyy@inventec.com> wrote:
> Modify Lanyang dts and add lanyang initial in aspeed.c
>
> Signed-off-by: Ken Chen <chen.kenyy@inventec.com>
> ---
>  arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts | 13 +++---
>  arch/arm/mach-aspeed/aspeed.c                | 65 ++++++++++++++++++++++++++++
>  2 files changed, 71 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts b/arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts
> index 176e4b4..6456458 100644
> --- a/arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts
> +++ b/arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts
> @@ -1,4 +1,4 @@
> -/dts-v1/;
> +/dts-v3/;
>
>  #include "aspeed-g5.dtsi"
>  #include <dt-bindings/gpio/aspeed-gpio.h>
> @@ -302,18 +302,17 @@
>  };
>
>  &gpio {
> -       line_apss_reset {
> -               gpio-hog;
> -               gpios = <ASPEED_GPIO(E, 4) GPIO_ACTIVE_HIGH>;
> -               output-high;
> -               line-name = "BMC_APSS_RESET_N";
> -       };
> +
>  };
>
>  &vuart {
>         status = "okay";
>  };
>
> +&gfx {
> +        status = "okay";
> +};
> +
>  &pinctrl {
>         aspeed,external-nodes = <&gfx &lhc>;
>  };
> diff --git a/arch/arm/mach-aspeed/aspeed.c b/arch/arm/mach-aspeed/aspeed.c
> index a7b03a0..b1073e5 100644
> --- a/arch/arm/mach-aspeed/aspeed.c
> +++ b/arch/arm/mach-aspeed/aspeed.c
> @@ -238,6 +238,69 @@ static void __init do_romulus_setup(void)
>      writel(reg & ~BIT(4), AST_IO(AST_BASE_LPC | 0x98));
>  }
>
> +static void __init do_lanyang_setup(void)
> +{
> +        unsigned long reg;
> +        unsigned long board_rev;
> +        /* D3 in GPIOA/B/C/D direction and data registers */
> +        unsigned long phy_reset_mask = BIT(27);
> +
> +        do_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;

Can you check that the board uses GPIOM for revision GPIOs? The
version of the schematic that I saw does not.

> +
> +        /* EVT1 hacks */
> +        if (board_rev == 0) {
> +                /* 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));
> +        }
> +
> +        /* Disable GPIO H/AC pulldowns to float 1-wire interface pins */
> +        reg = readl(AST_IO(AST_BASE_SCU | 0x8C));
> +        writel(reg | BIT(23), AST_IO(AST_BASE_SCU | 0x8C));
> +
> +        /* Assert MAC2 PHY hardware reset */

It looks like GPIOD3 is not used for PHY hardware reset.

> +        /* Set pin low */
> +        reg = readl(AST_IO(AST_BASE_GPIO | 0x00));
> +        writel(reg & ~phy_reset_mask, AST_IO(AST_BASE_GPIO | 0x00));
> +        /* Enable pin for output */
> +        reg = readl(AST_IO(AST_BASE_GPIO | 0x04));
> +        writel(reg | phy_reset_mask, AST_IO(AST_BASE_GPIO | 0x04));
> +        udelay(3);
> +        /* Set pin high */
> +        reg = readl(AST_IO(AST_BASE_GPIO | 0x00));
> +        writel(reg | phy_reset_mask, AST_IO(AST_BASE_GPIO | 0x00));
> +
> +        /* Setup PNOR address mapping for 64M flash
> +         *
> +         *   ADRBASE: 0x3000 (0x30000000)
> +         *   HWMBASE: 0x0C00 (0x0C000000)
> +         *  ADDRMASK: 0xFC00 (0xFC000000)
> +         *   HWNCARE: 0x03FF (0x03FF0000)
> +         *
> +         * Mapping appears at 0x60300fc000000 on the host
> +         */
> +        writel(0x30000C00, AST_IO(AST_BASE_LPC | 0x88));
> +        writel(0xFC0003FF, AST_IO(AST_BASE_LPC | 0x8C));
> +
> +        /* Set SPI1 CE1 decoding window to 0x34000000 */
> +        writel(0x70680000, AST_IO(AST_BASE_SPI | 0x34));
> +
> +        /* Set SPI1 CE0 decoding window to 0x30000000 */
> +        writel(0x68600000, AST_IO(AST_BASE_SPI | 0x30));

We should not need to do this. mboxd will set them.

Cheers,

Joel

> +
> +        /* Disable default behavior of UART1 being held in reset by LPCRST#.
> +         * By releasing UART1 from being controlled by LPC reset, it becomes
> +         * immediately available regardless of the host being up.
> +         */
> +        reg = readl(AST_IO(AST_BASE_LPC | 0x98));
> +        /* Clear "Enable UART1 reset source from LPC" */
> +        writel(reg & ~BIT(4), AST_IO(AST_BASE_LPC | 0x98));
> +}
> +
>  #define SCU_PASSWORD   0x1688A8A8
>
>  static void __init aspeed_init_early(void)
> @@ -275,6 +338,8 @@ static void __init aspeed_init_early(void)
>                 do_witherspoon_setup();
>         if (of_machine_is_compatible("ibm,romulus-bmc"))
>                 do_romulus_setup();
> +        if (of_machine_is_compatible("inventec,lanyang-bmc"))
> +                do_romulus_setup();
>  }
>
>  static void __init aspeed_map_io(void)
> --
> 2.9.3
>
Andrew Jeffery April 26, 2017, 11:23 a.m. UTC | #2
On Wed, 2017-04-26 at 17:45 +0930, Joel Stanley wrote:
> Hi Ken,
> 
> Thank you for your patch. I have some questions below.
> 
> > On Wed, Apr 26, 2017 at 2:43 PM, Ken Chen <chen.kenyy@inventec.com> wrote:
> > 
> > +        /* Setup PNOR address mapping for 64M flash
> > +         *
> > +         *   ADRBASE: 0x3000 (0x30000000)
> > +         *   HWMBASE: 0x0C00 (0x0C000000)
> > +         *  ADDRMASK: 0xFC00 (0xFC000000)
> > +         *   HWNCARE: 0x03FF (0x03FF0000)
> > +         *
> > +         * Mapping appears at 0x60300fc000000 on the host
> > +         */
> > +        writel(0x30000C00, AST_IO(AST_BASE_LPC | 0x88));
> > +        writel(0xFC0003FF, AST_IO(AST_BASE_LPC | 0x8C));
> > +
> > +        /* Set SPI1 CE1 decoding window to 0x34000000 */
> > +        writel(0x70680000, AST_IO(AST_BASE_SPI | 0x34));
> > +
> > +        /* Set SPI1 CE0 decoding window to 0x30000000 */
> > +        writel(0x68600000, AST_IO(AST_BASE_SPI | 0x30));
> 
> We should not need to do this. mboxd will set them.

To clarify, there are two different cases here, but the outcome remains
that we don't need the above. We don't need to set the two LPC
registers because mboxd will set them via the interface exposed by
drivers/misc/aspeed-lpc-ctrl.c. We also don't need to set the two SPI
registers because the SMC driver will configure them based on the
chip(s) detected on the bus during driver probe.

Cheers,

Andrew
diff mbox

Patch

diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts b/arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts
index 176e4b4..6456458 100644
--- a/arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts
+++ b/arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts
@@ -1,4 +1,4 @@ 
-/dts-v1/;
+/dts-v3/;
 
 #include "aspeed-g5.dtsi"
 #include <dt-bindings/gpio/aspeed-gpio.h>
@@ -302,18 +302,17 @@ 
 };
 
 &gpio {
-	line_apss_reset {
-		gpio-hog;
-		gpios = <ASPEED_GPIO(E, 4) GPIO_ACTIVE_HIGH>;
-		output-high;
-		line-name = "BMC_APSS_RESET_N";
-	};
+
 };
 
 &vuart {
 	status = "okay";
 };
 
+&gfx {
+        status = "okay";
+};
+
 &pinctrl {
 	aspeed,external-nodes = <&gfx &lhc>;
 };
diff --git a/arch/arm/mach-aspeed/aspeed.c b/arch/arm/mach-aspeed/aspeed.c
index a7b03a0..b1073e5 100644
--- a/arch/arm/mach-aspeed/aspeed.c
+++ b/arch/arm/mach-aspeed/aspeed.c
@@ -238,6 +238,69 @@  static void __init do_romulus_setup(void)
     writel(reg & ~BIT(4), AST_IO(AST_BASE_LPC | 0x98));
 }
 
+static void __init do_lanyang_setup(void)
+{
+        unsigned long reg;
+        unsigned long board_rev;
+        /* D3 in GPIOA/B/C/D direction and data registers */
+        unsigned long phy_reset_mask = BIT(27);
+
+        do_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) {
+                /* 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));
+        }
+
+        /* Disable GPIO H/AC pulldowns to float 1-wire interface pins */
+        reg = readl(AST_IO(AST_BASE_SCU | 0x8C));
+        writel(reg | BIT(23), AST_IO(AST_BASE_SCU | 0x8C));
+
+        /* Assert MAC2 PHY hardware reset */
+        /* Set pin low */
+        reg = readl(AST_IO(AST_BASE_GPIO | 0x00));
+        writel(reg & ~phy_reset_mask, AST_IO(AST_BASE_GPIO | 0x00));
+        /* Enable pin for output */
+        reg = readl(AST_IO(AST_BASE_GPIO | 0x04));
+        writel(reg | phy_reset_mask, AST_IO(AST_BASE_GPIO | 0x04));
+        udelay(3);
+        /* Set pin high */
+        reg = readl(AST_IO(AST_BASE_GPIO | 0x00));
+        writel(reg | phy_reset_mask, AST_IO(AST_BASE_GPIO | 0x00));
+
+        /* Setup PNOR address mapping for 64M flash
+         *
+         *   ADRBASE: 0x3000 (0x30000000)
+         *   HWMBASE: 0x0C00 (0x0C000000)
+         *  ADDRMASK: 0xFC00 (0xFC000000)
+         *   HWNCARE: 0x03FF (0x03FF0000)
+         *
+         * Mapping appears at 0x60300fc000000 on the host
+         */
+        writel(0x30000C00, AST_IO(AST_BASE_LPC | 0x88));
+        writel(0xFC0003FF, AST_IO(AST_BASE_LPC | 0x8C));
+
+        /* Set SPI1 CE1 decoding window to 0x34000000 */
+        writel(0x70680000, AST_IO(AST_BASE_SPI | 0x34));
+
+        /* Set SPI1 CE0 decoding window to 0x30000000 */
+        writel(0x68600000, AST_IO(AST_BASE_SPI | 0x30));
+
+        /* Disable default behavior of UART1 being held in reset by LPCRST#.
+         * By releasing UART1 from being controlled by LPC reset, it becomes
+         * immediately available regardless of the host being up.
+         */
+        reg = readl(AST_IO(AST_BASE_LPC | 0x98));
+        /* Clear "Enable UART1 reset source from LPC" */
+        writel(reg & ~BIT(4), AST_IO(AST_BASE_LPC | 0x98));
+}
+
 #define SCU_PASSWORD	0x1688A8A8
 
 static void __init aspeed_init_early(void)
@@ -275,6 +338,8 @@  static void __init aspeed_init_early(void)
 		do_witherspoon_setup();
 	if (of_machine_is_compatible("ibm,romulus-bmc"))
 		do_romulus_setup();
+        if (of_machine_is_compatible("inventec,lanyang-bmc"))
+                do_romulus_setup();
 }
 
 static void __init aspeed_map_io(void)