On 02/10/2017 20:47, Fabio Estevam wrote: > From: Fabio Estevam <fabio.este...@nxp.com> > > 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.este...@nxp.com> > --- > Changes since v3: > - Rebased against latest u-boot-imx > > board/wandboard/wandboard.c | 108 > ++++++++++++++++++++++++++++++++++++++++++-- > configs/wandboard_defconfig | 1 + > include/configs/wandboard.h | 11 +++++ > 3 files changed, 115 insertions(+), 5 deletions(-) > > diff --git a/board/wandboard/wandboard.c b/board/wandboard/wandboard.c > index dde4988..6d2609c 100644 > --- a/board/wandboard/wandboard.c > +++ b/board/wandboard/wandboard.c > @@ -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, ®); > + 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 &= ~(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"); > diff --git a/configs/wandboard_defconfig b/configs/wandboard_defconfig > index 9765f13..8097e6e 100644 > --- a/configs/wandboard_defconfig > +++ b/configs/wandboard_defconfig > @@ -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 > diff --git a/include/configs/wandboard.h b/include/configs/wandboard.h > index 3ba4c29..ba88d02 100644 > --- a/include/configs/wandboard.h > +++ b/include/configs/wandboard.h > @@ -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 > > @@ -44,6 +45,12 @@ > #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 > @@ -102,6 +109,10 @@ > "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 " \ >
Applied to u-boot-imx, -master, thanks ! Best regards, Stefano Babic -- ===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sba...@denx.de ===================================================================== _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot