meta-nicole: u-boot: add bmc position support

This brings:
 - GPIO support in u-boot
 - BMC position is determined by the GPIOE1 and stored as a boot
   argument.

(From meta-yadro rev: 1b68cd934fe58ce3c33b272b45497d2a1b4e35e6)

Change-Id: Ieaf5bda2267b533327618330760431e66224092a
End-User-Impact: In the u-boot shell now available `gpio` command
Signed-off-by: Alexander Filippov <a.filippov@yadro.com>
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/meta-yadro/meta-nicole/recipes-bsp/u-boot/files/0004-aspeed-add-bmc-position-support.patch b/meta-yadro/meta-nicole/recipes-bsp/u-boot/files/0004-aspeed-add-bmc-position-support.patch
new file mode 100644
index 0000000..423092b
--- /dev/null
+++ b/meta-yadro/meta-nicole/recipes-bsp/u-boot/files/0004-aspeed-add-bmc-position-support.patch
@@ -0,0 +1,61 @@
+From 8098310be5887bd5e80830f105b63ed59dc10421 Mon Sep 17 00:00:00 2001
+From: Alexander Filippov <a.filippov@yadro.com>
+Date: Fri, 22 May 2020 11:45:31 +0300
+Subject: [PATCH] aspeed: add bmc position support
+
+There are two Nicoles in one chassis in the Tatlin hardware.
+The position is encoded by a pin, read by an MCU, and then translated
+to the BMC via GPIO pin GPIOE1.
+
+This reads the GPIO pin state and put is as a bootargs item.
+
+Signed-off-by: Alexander Filippov <a.filippov@yadro.com>
+---
+ arch/arm/mach-aspeed/ast-late-init.c | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+diff --git a/arch/arm/mach-aspeed/ast-late-init.c b/arch/arm/mach-aspeed/ast-late-init.c
+index 5646c0e882..7d36dc0d8a 100644
+--- a/arch/arm/mach-aspeed/ast-late-init.c
++++ b/arch/arm/mach-aspeed/ast-late-init.c
+@@ -7,6 +7,7 @@
+ 
+ #include <asm/arch/ast_scu.h>
+ #include <asm/arch/regs-scu.h>
++#include <asm/gpio.h>
+ #include <malloc.h>
+ 
+ static void update_bootargs_cmd(const char *key, const char *value)
+@@ -106,9 +107,29 @@ static void set_reset_reason(void)
+     }
+ }
+ 
++static void set_bmc_position(void)
++{
++    unsigned gpio = ASPEED_GPIO(E, 1);
++
++    /* Init GPIO */
++    if (gpio_request(gpio, "bmcposition") == 0 &&
++        gpio_direction_input(gpio) == 0)
++    {
++        int position = gpio_get_value(gpio);
++        if (position >= 0)
++        {
++            printf("BMC Position: %d\n", position);
++            update_bootargs_cmd("bmcposition", position ? "1" : "0");
++        }
++    }
++
++    gpio_free(gpio);
++}
++
+ int board_late_init(void)
+ {
+     set_reset_reason();
++    set_bmc_position();
+ 
+     return 0;
+ }
+-- 
+2.25.4
+