[U-Boot] [PATCH v4 1/2] wandboard: Add support for the latest revd1 revision

Stefano Babic sbabic at denx.de
Wed Oct 4 09:27:02 UTC 2017


On 02/10/2017 20:47, Fabio Estevam wrote:
> From: Fabio Estevam <fabio.estevam at 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.estevam at 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, &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");
> 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: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list