]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
wandboard: Add support for the latest revd1 revision
authorFabio Estevam <fabio.estevam@nxp.com>
Mon, 2 Oct 2017 18:47:29 +0000 (15:47 -0300)
committerStefano Babic <sbabic@denx.de>
Thu, 12 Oct 2017 15:31:16 +0000 (17:31 +0200)
Latest wandboard hardware revision is revd1, which brings the following
new features:

- PFUZE100 PMIC
- AR8035 Ethernet PHY
- Upgrade Wifi/BT chip to BCM4339/BCM43430.

The detection mechanism is to probe the PMIC and when it is
found, then the revision of the board is revd1.

As the detection is done via PMIC, we need to print the board version
at a later stage via CONFIG_DISPLAY_BOARDINFO_LATE and also need
to disable CONFIG_DISPLAY_BOARDINFO, which is done much earlier.

Make the necessary adjustments for the AR8035 PHY to work on revd1.

Based on Richard Hu's work from Technexion's U-Boot tree.

Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
board/wandboard/wandboard.c
configs/wandboard_defconfig
include/configs/wandboard.h

index dde49889895a84fe5c6f888e6871952c25374c3d..6d2609ce119639fd1e916cc16ed854369cca4af6 100644 (file)
@@ -30,6 +30,8 @@
 #include <phy.h>
 #include <input.h>
 #include <i2c.h>
+#include <power/pmic.h>
+#include <power/pfuze100_pmic.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -51,8 +53,11 @@ DECLARE_GLOBAL_DATA_PTR;
 #define USDHC1_CD_GPIO         IMX_GPIO_NR(1, 2)
 #define USDHC3_CD_GPIO         IMX_GPIO_NR(3, 9)
 #define ETH_PHY_RESET          IMX_GPIO_NR(3, 29)
+#define ETH_PHY_AR8035_POWER   IMX_GPIO_NR(7, 13)
 #define REV_DETECTION          IMX_GPIO_NR(2, 28)
 
+static bool with_pmic;
+
 int dram_init(void)
 {
        gd->ram_size = imx_ddr_size();
@@ -107,6 +112,11 @@ static iomux_v3_cfg_t const enet_pads[] = {
        IOMUX_PADS(PAD_EIM_D29__GPIO3_IO29    | MUX_PAD_CTRL(NO_PAD_CTRL)),
 };
 
+static iomux_v3_cfg_t const enet_ar8035_power_pads[] = {
+       /* AR8035 POWER */
+       IOMUX_PADS(PAD_GPIO_18__GPIO7_IO13    | MUX_PAD_CTRL(NO_PAD_CTRL)),
+};
+
 static iomux_v3_cfg_t const rev_detection_pad[] = {
        IOMUX_PADS(PAD_EIM_EB0__GPIO2_IO28  | MUX_PAD_CTRL(NO_PAD_CTRL)),
 };
@@ -120,6 +130,14 @@ static void setup_iomux_enet(void)
 {
        SETUP_IOMUX_PADS(enet_pads);
 
+       if (with_pmic) {
+               SETUP_IOMUX_PADS(enet_ar8035_power_pads);
+               /* enable AR8035 POWER */
+               gpio_direction_output(ETH_PHY_AR8035_POWER, 0);
+       }
+       /* wait until 3.3V of PHY and clock become stable */
+       mdelay(10);
+
        /* Reset AR8031 PHY */
        gpio_direction_output(ETH_PHY_RESET, 0);
        mdelay(10);
@@ -192,6 +210,7 @@ int board_mmc_init(bd_t *bis)
 static int ar8031_phy_fixup(struct phy_device *phydev)
 {
        unsigned short val;
+       int mask;
 
        /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
        phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
@@ -199,7 +218,12 @@ static int ar8031_phy_fixup(struct phy_device *phydev)
        phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
 
        val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
-       val &= 0xffe3;
+       if (with_pmic)
+               mask = 0xffe7;  /* AR8035 */
+       else
+               mask = 0xffe3;  /* AR8031 */
+
+       val &= mask;
        val |= 0x18;
        phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
 
@@ -257,6 +281,40 @@ struct i2c_pads_info mx6dl_i2c2_pad_info = {
        }
 };
 
+struct i2c_pads_info mx6q_i2c3_pad_info = {
+       .scl = {
+               .i2c_mode = MX6Q_PAD_GPIO_5__I2C3_SCL
+                       | MUX_PAD_CTRL(I2C_PAD_CTRL),
+               .gpio_mode = MX6Q_PAD_GPIO_5__GPIO1_IO05
+                       | MUX_PAD_CTRL(I2C_PAD_CTRL),
+               .gp = IMX_GPIO_NR(1, 5)
+       },
+       .sda = {
+               .i2c_mode = MX6Q_PAD_GPIO_16__I2C3_SDA
+                       | MUX_PAD_CTRL(I2C_PAD_CTRL),
+               .gpio_mode = MX6Q_PAD_GPIO_16__GPIO7_IO11
+                       | MUX_PAD_CTRL(I2C_PAD_CTRL),
+               .gp = IMX_GPIO_NR(7, 11)
+       }
+};
+
+struct i2c_pads_info mx6dl_i2c3_pad_info = {
+       .scl = {
+               .i2c_mode = MX6DL_PAD_GPIO_5__I2C3_SCL
+                       | MUX_PAD_CTRL(I2C_PAD_CTRL),
+               .gpio_mode = MX6DL_PAD_GPIO_5__GPIO1_IO05
+                       | MUX_PAD_CTRL(I2C_PAD_CTRL),
+               .gp = IMX_GPIO_NR(1, 5)
+       },
+       .sda = {
+               .i2c_mode = MX6DL_PAD_GPIO_16__I2C3_SDA
+                       | MUX_PAD_CTRL(I2C_PAD_CTRL),
+               .gpio_mode = MX6DL_PAD_GPIO_16__GPIO7_IO11
+                       | MUX_PAD_CTRL(I2C_PAD_CTRL),
+               .gp = IMX_GPIO_NR(7, 11)
+       }
+};
+
 static iomux_v3_cfg_t const fwadapt_7wvga_pads[] = {
        IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK),
        IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02), /* HSync */
@@ -385,6 +443,31 @@ int board_early_init_f(void)
        return 0;
 }
 
+#define PMIC_I2C_BUS           2
+
+int power_init_board(void)
+{
+       struct pmic *p;
+       u32 reg;
+
+       /* configure PFUZE100 PMIC */
+       power_pfuze100_init(PMIC_I2C_BUS);
+       p = pmic_get("PFUZE100");
+       if (p && !pmic_probe(p)) {
+               pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
+               printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
+               with_pmic = true;
+
+               /* Set VGEN2 to 1.5V and enable */
+               pmic_reg_read(p, PFUZE100_VGEN2VOL, &reg);
+               reg &= ~(LDO_VOL_MASK);
+               reg |= (LDOA_1_50V | (1 << (LDO_EN)));
+               pmic_reg_write(p, PFUZE100_VGEN2VOL, reg);
+       }
+
+       return 0;
+}
+
 /*
  * Do not overwrite the console
  * Use always serial for U-Boot console
@@ -414,6 +497,14 @@ static bool is_revc1(void)
                return false;
 }
 
+static bool is_revd1(void)
+{
+       if (with_pmic)
+               return true;
+       else
+               return false;
+}
+
 int board_late_init(void)
 {
 #ifdef CONFIG_CMD_BMODE
@@ -426,7 +517,9 @@ int board_late_init(void)
        else
                env_set("board_rev", "MX6DL");
 
-       if (is_revc1())
+       if (is_revd1())
+               env_set("board_name", "D1");
+       else if (is_revc1())
                env_set("board_name", "C1");
        else
                env_set("board_name", "B1");
@@ -441,10 +534,13 @@ int board_init(void)
 
 #if defined(CONFIG_VIDEO_IPUV3)
        setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c2_pad_info);
-       if (is_mx6dq())
+       if (is_mx6dq()) {
                setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c2_pad_info);
-       else
+               setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c3_pad_info);
+       } else {
                setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c2_pad_info);
+               setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c3_pad_info);
+       }
 
        setup_display();
 #endif
@@ -454,7 +550,9 @@ int board_init(void)
 
 int checkboard(void)
 {
-       if (is_revc1())
+       if (is_revd1())
+               puts("Board: Wandboard rev D1\n");
+       else if (is_revc1())
                puts("Board: Wandboard rev C1\n");
        else
                puts("Board: Wandboard rev B1\n");
index 72ff721b6cdc69000bae6b3005be3d2d9544186a..e12f87033373ee694d2ec35d14188d5ba0b97d2b 100644 (file)
@@ -15,6 +15,7 @@ CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg,MX6QDL"
 # CONFIG_CONSOLE_MUX is not set
 CONFIG_SYS_CONSOLE_IS_IN_ENV=y
 CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y
+# CONFIG_DISPLAY_BOARDINFO is not set
 CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_SPL=y
 CONFIG_SPL_EXT_SUPPORT=y
index 3ba4c29f6745cf74d70d97f8bd49d1b3f816e406..ba88d02b88b874a052e29c76a8921648b622a99b 100644 (file)
@@ -13,6 +13,7 @@
 #include "mx6_common.h"
 
 #include "imx6_spl.h"
+#define CONFIG_DISPLAY_BOARDINFO_LATE
 
 #define CONFIG_MACH_TYPE               MACH_TYPE_WANDBOARD_IMX6
 
 #define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 
+/* PMIC */
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_PFUZE100
+#define CONFIG_POWER_PFUZE100_I2C_ADDR 0x08
+
 /* MMC Configuration */
 #define CONFIG_SYS_FSL_USDHC_NUM       2
 #define CONFIG_SYS_FSL_ESDHC_ADDR      0
                        "fi; "  \
                "fi\0" \
        "findfdt="\
+               "if test $board_name = D1 && test $board_rev = MX6Q ; then " \
+                       "setenv fdtfile imx6q-wandboard-revd1.dtb; fi; " \
+               "if test $board_name = D1 && test $board_rev = MX6DL ; then " \
+                       "setenv fdtfile imx6dl-wandboard-revd1.dtb; fi; " \
                "if test $board_name = C1 && test $board_rev = MX6Q ; then " \
                        "setenv fdtfile imx6q-wandboard.dtb; fi; " \
                "if test $board_name = C1 && test $board_rev = MX6DL ; then " \