Merge tag 'u-boot-atmel-fixes-2021.01-b' of https://gitlab.denx.de/u-boot/custodians...
[platform/kernel/u-boot.git] / board / ge / bx50v3 / bx50v3.c
index edccfd0..4754647 100644 (file)
@@ -35,7 +35,7 @@
 #include <version.h>
 #include <stdlib.h>
 #include <dm/root.h>
-#include "../common/ge_common.h"
+#include "../common/ge_rtc.h"
 #include "../common/vpd_reader.h"
 #include "../../../drivers/net/e1000.h"
 #include <pci.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static int confidx;  /* Default to generic. */
+#define VPD_PRODUCT_B850 1
+#define VPD_PRODUCT_B650 2
+#define VPD_PRODUCT_B450 3
+
+static int productid;  /* Default to generic. */
 static struct vpd_cache vpd;
 
 #define NC_PAD_CTRL (PAD_CTL_PUS_100K_UP |     \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
        PAD_CTL_HYS)
 
-#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE |    \
-       PAD_CTL_SPEED_HIGH | PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST)
-
-#define ENET_CLK_PAD_CTRL (PAD_CTL_SPEED_MED | \
-       PAD_CTL_DSE_120ohm | PAD_CTL_SRE_FAST)
-
-#define ENET_RX_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
-       PAD_CTL_SPEED_HIGH   | PAD_CTL_SRE_FAST)
-
-#define I2C_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
-       PAD_CTL_ODE | PAD_CTL_SRE_FAST)
-
-#define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
-
 int dram_init(void)
 {
        gd->ram_size = imx_ddr_size();
@@ -127,7 +116,7 @@ static void do_enable_hdmi(struct display_info_t const *dev)
 
 static int is_b850v3(void)
 {
-       return confidx == 3;
+       return productid == VPD_PRODUCT_B850;
 }
 
 static int detect_lcd(struct display_info_t const *dev)
@@ -314,9 +303,6 @@ int overwrite_console(void)
 #define VPD_TYPE_INVALID 0x00
 #define VPD_BLOCK_NETWORK 0x20
 #define VPD_BLOCK_HWID 0x44
-#define VPD_PRODUCT_B850 1
-#define VPD_PRODUCT_B650 2
-#define VPD_PRODUCT_B450 3
 #define VPD_HAS_MAC1 0x1
 #define VPD_HAS_MAC2 0x2
 #define VPD_MAC_ADDRESS_LENGTH 6
@@ -398,6 +384,7 @@ static iomux_v3_cfg_t const misc_pads[] = {
        MX6_PAD_GPIO_9__WDOG1_B         | MUX_PAD_CTRL(NC_PAD_CTRL),
 };
 #define SUS_S3_OUT     IMX_GPIO_NR(4, 11)
+#define PWGIN_IN       IMX_GPIO_NR(4, 14)
 #define WIFI_EN        IMX_GPIO_NR(6, 14)
 
 int board_early_init_f(void)
@@ -412,28 +399,13 @@ int board_early_init_f(void)
        return 0;
 }
 
-static void set_confidx(const struct vpd_cache* vpd)
-{
-       switch (vpd->product_id) {
-       case VPD_PRODUCT_B450:
-               confidx = 1;
-               break;
-       case VPD_PRODUCT_B650:
-               confidx = 2;
-               break;
-       case VPD_PRODUCT_B850:
-               confidx = 3;
-               break;
-       }
-}
-
 int board_init(void)
 {
-       if (!read_vpd(&vpd, vpd_callback)) {
+       if (!read_i2c_vpd(&vpd, vpd_callback)) {
                int ret, rescan;
 
                vpd.is_read = true;
-               set_confidx(&vpd);
+               productid = vpd.product_id;
 
                ret = fdtdec_resetup(&rescan);
                if (!ret && rescan) {
@@ -445,6 +417,9 @@ int board_init(void)
        gpio_request(SUS_S3_OUT, "sus_s3_out");
        gpio_direction_output(SUS_S3_OUT, 1);
 
+       gpio_request(PWGIN_IN, "pwgin_in");
+       gpio_direction_input(PWGIN_IN);
+
        gpio_request(WIFI_EN, "wifi_en");
        gpio_direction_output(WIFI_EN, 1);
 
@@ -494,6 +469,17 @@ void pmic_init(void)
        }
 }
 
+static void detect_boot_cause(void)
+{
+       const char *cause = "POR";
+
+       if (is_b850v3())
+               if (!gpio_get_value(PWGIN_IN))
+                       cause = "PM_WDOG";
+
+       env_set("bootcause", cause);
+}
+
 int board_late_init(void)
 {
        process_vpd(&vpd);
@@ -507,6 +493,8 @@ int board_late_init(void)
        else
                env_set("videoargs", "video=LVDS-1:1024x768@65");
 
+       detect_boot_cause();
+
        /* board specific pmic init */
        pmic_init();
 
@@ -551,7 +539,7 @@ int checkboard(void)
 }
 
 #ifdef CONFIG_OF_BOARD_SETUP
-int ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, struct bd_info *bd)
 {
        char *rtc_status = env_get("rtc_status");