wandboard: Add support for the latest revd1 revision
Subsystems (2)
Fabio Estevam
reviewerPATCH v4 1/2 wandboard: Add support for the latest revd1 revision
From: Fabio Estevam <[email protected]>
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.
---
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(-)
board/wandboard/wandboard.c +103 -5
@@ -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" );
configs/wandboard_defconfig +1 -0
@@ -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
include/configs/wandboard.h +11 -0
@@ -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 " \
Signature · 1 line
2.7.4
Fabio Estevam
reviewerPATCH v4 2/2 wandboard: Add support for the MX6QP variant
From: Fabio Estevam <[email protected]>
Add support for the latest MX6QP wandboard variant.
Based on Richard Hu's work from Technexion's U-Boot tree.
---
Changes since v3:
- Rebased against latest u-boot-imx
arch/arm/include/asm/arch-mx6/imx-regs.h | 3 + board/wandboard/spl.c | 135 ++++++++++++++++++++++++++++++- board/wandboard/wandboard.c | 6 +- include/configs/wandboard.h | 2 + 4 files changed, 142 insertions(+), 4 deletions(-)
arch/arm/include/asm/arch-mx6/imx-regs.h +3 -0
@@ -346,6 +346,9 @@#define IOMUXC_SNVS_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x90000)#define SNVS_GPR_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x94000)#endif + +#define NOC_DDR_BASE_ADDR (GPV0_BASE_ADDR + 0xB0000) +/* Only for i.MX6SX */ #define LCDIF2_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x24000)#define MX6SX_LCDIF1_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x20000)
board/wandboard/spl.c +133 -2
154 lines not on this page · raw message
board/wandboard/wandboard.c +4 -2
@@ -512,7 +512,9 @@ int board_late_init(void)#endif #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG -if (is_mx6dq ()) +if (is_mx6dqp ()) +env_set ("board_rev" ,"MX6QP" ); +else if (is_mx6dq ())env_set ("board_rev" ,"MX6Q" );else env_set ("board_rev" ,"MX6DL" );
@@ -534,7 +536,7 @@ 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 () ||is_mx6dqp ()) {setup_i2c (1 ,CONFIG_SYS_I2C_SPEED ,0x7f , &mx6q_i2c2_pad_info);setup_i2c (2 ,CONFIG_SYS_I2C_SPEED ,0x7f , &mx6q_i2c3_pad_info); }else {
include/configs/wandboard.h +2 -0
@@ -109,6 +109,8 @@"fi; " \"fi\0" \"findfdt=" \ +"if test $board_name = D1 && test $board_rev = MX6QP ; then " \ +"setenv fdtfile imx6qp-wandboard-revd1.dtb; fi; " \"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 " \
Signature · 1 line
2.7.4
PATCH v4 2/2 wandboard: Add support for the MX6QP variant
Hi Fabio,
Quoted 64 lines · Fabio Estevam
From: Fabio Estevam <[email protected]>
Add support for the latest MX6QP wandboard variant.
Based on Richard Hu's work from Technexion's U-Boot tree.
Signed-off-by Fabio Estevam <[email protected]>---
Changes since v3:
- Rebased against latest u-boot-imxarch/arm/include/asm/arch-mx6/imx-regs.h | 3 + board/wandboard/spl.c | 135 ++++++++++++++++++++++++++++++- board/wandboard/wandboard.c | 6 +- include/configs/wandboard.h | 2 + 4 files changed, 142 insertions(+), 4 deletions(-)arch/arm/include/asm/arch-mx6/imx-regs.h +3
-0@@ -346,6 +346,9 @@#define IOMUXC_SNVS_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x90000)#define SNVS_GPR_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x94000)#endif + +#define NOC_DDR_BASE_ADDR (GPV0_BASE_ADDR + 0xB0000) +/* Only for i.MX6SX */ #define LCDIF2_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x24000)#define MX6SX_LCDIF1_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x20000)board/wandboard/spl.c +12
-1@@ -32,6 +32,7 @@ DECLARE_GLOBAL_DATA_PTR;#define IMX6DQ_DRIVE_STRENGTH 0x30#define IMX6SDL_DRIVE_STRENGTH 0x28 +#define IMX6QP_DRIVE_STRENGTH 0x28/* configure MX6Q/DUAL mmdc DDR io registers */ static struct mx6dq_iomux_ddr_regs mx6dq_ddr_ioregs = {@@ -260,15 +261,145 @@ static void ccgr_init(void)writel (0x00C03F3F , &ccm->CCGR0);writel (0x0030FC03 , &ccm->CCGR1);writel (0x0FFFC000 , &ccm->CCGR2); -writel (0x3FF00000 , &ccm->CCGR3); +writel (0x3FF03000 , &ccm->CCGR3);writel (0x00FFF300 , &ccm->CCGR4);writel (0x0F0000C3 , &ccm->CCGR5);writel (0x000003FF , &ccm->CCGR6); } +static void spl_dram_init_imx6qp_lpddr3 (void ) +{ +/* DDR IO TYPE */ +writel (0x000C0000 ,IOMUXC_BASE_ADDR +0x798 ); +writel (0x00000000 ,IOMUXC_BASE_ADDR +0x758 ); +/* Clock */ +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x588 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x594 ); +/* Address */ +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x56c );
board/wandboard/spl.c static void ccgr_init(void) · line 289
Quoted 10 lines
board/wandboard/spl.c +10
-0+writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x578 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x74c ); +/* Control */ +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x57c ); +writel (0x00000000 ,IOMUXC_BASE_ADDR +0x58c ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x59c ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x5a0 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x78c ); +/* Data Strobe */ +writel (0x00020000 ,IOMUXC_BASE_ADDR +0x750 );
mmhhh...it looks to me we are diverging with this SOC. I understand that current funtions are not suitable for the new SOC. However, we were able to manage up now to write tables (mx6dq_iomux_ddr_regs) and use functions to setup the strength and the other parameters. As your tests has proofed that these functions do not work for MX6QP, the logical way to do is to modify these functions instead of putting back all this code in the board file. Do you agree ?
Quoted 21 lines
board/wandboard/spl.c +21
-0+ +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x5a8 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x5b0 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x524 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x51c ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x518 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x50c ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x5b8 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x5c0 ); +/* Data */ +writel (0x00020000 ,IOMUXC_BASE_ADDR +0x774 ); + +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x784 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x788 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x794 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x79c ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x7a0 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x7a4 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x7a8 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x748 ); +
board/wandboard/spl.c static void ccgr_init(void) · line 321
Quoted 10 lines
board/wandboard/spl.c +10
-0+writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x5ac ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x5b4 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x528 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x520 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x514 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x510 ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x5bc ); +writel (IMX6QP_DRIVE_STRENGTH ,IOMUXC_BASE_ADDR +0x5c4 ); +> + /* MMDC0_MDSCR set the Configuration request bit during MMDC set up */ +writel (0x00008000 ,MMDC_P0_BASE_ADDR +0x01c );
Then we are starting with a custom version of mx6_dram_cfg(). But again, we should change the common code, and let the board maintainer to simply call these function.
I am sure that if we let this code in, we will get in short time a lot of boards doing exactly in the same way. :-(
board/wandboard/spl.c static void ccgr_init(void) · line 330
Quoted 9 lines
board/wandboard/spl.c +9
-0+ +/* Calibrations - ZQ */ +writel (0xa1390003 ,MMDC_P0_BASE_ADDR +0x800 ); +/* write leveling */ +writel (0x00060004 ,MMDC_P0_BASE_ADDR +0x80c ); +writel (0x000B0004 ,MMDC_P0_BASE_ADDR +0x810 ); +writel (0x00000004 ,MMDC_P1_BASE_ADDR +0x80c ); +writel (0x00000000 ,MMDC_P1_BASE_ADDR +0x810 ); +/*
Calibration is also part of mx6_dram_cfg(). I want to avoid that MX6QP is an island in the MX6 infrastructure.
Quoted 106 lines
board/wandboard/spl.c +70
-1+* DQS gating, read delay, write delay calibration values +* based on calibration compare of 0x00ffff00 +*/ +writel (0x03040314 ,MMDC_P0_BASE_ADDR +0x83c ); +writel (0x03080300 ,MMDC_P0_BASE_ADDR +0x840 ); +writel (0x03000310 ,MMDC_P1_BASE_ADDR +0x83c ); +writel (0x0268023C ,MMDC_P1_BASE_ADDR +0x840 ); + +writel (0x4034363A ,MMDC_P0_BASE_ADDR +0x848 ); +writel (0x36302C3C ,MMDC_P1_BASE_ADDR +0x848 ); + +writel (0x3E3E4046 ,MMDC_P0_BASE_ADDR +0x850 ); +writel (0x483A4844 ,MMDC_P1_BASE_ADDR +0x850 ); + +writel (0x33333333 ,MMDC_P0_BASE_ADDR +0x81c ); +writel (0x33333333 ,MMDC_P0_BASE_ADDR +0x820 ); +writel (0x33333333 ,MMDC_P0_BASE_ADDR +0x824 ); +writel (0x33333333 ,MMDC_P0_BASE_ADDR +0x828 ); +writel (0x33333333 ,MMDC_P1_BASE_ADDR +0x81c ); +writel (0x33333333 ,MMDC_P1_BASE_ADDR +0x820 ); +writel (0x33333333 ,MMDC_P1_BASE_ADDR +0x824 ); +writel (0x33333333 ,MMDC_P1_BASE_ADDR +0x828 ); + +writel (0x24912489 ,MMDC_P0_BASE_ADDR +0x8c0 ); +writel (0x24914452 ,MMDC_P1_BASE_ADDR +0x8c0 ); + +writel (0x00000800 ,MMDC_P0_BASE_ADDR +0x8b8 ); +writel (0x00000800 ,MMDC_P1_BASE_ADDR +0x8b8 ); +/* MMDC init: in DDR3, 64-bit mode, only MMDC0 is initiated */ +writel (0x00020036 ,MMDC_P0_BASE_ADDR +0x004 ); +writel (0x09444040 ,MMDC_P0_BASE_ADDR +0x008 ); +writel (0x898E79A4 ,MMDC_P0_BASE_ADDR +0x00c ); +writel (0xDB538F64 ,MMDC_P0_BASE_ADDR +0x010 ); +writel (0x01FF00DD ,MMDC_P0_BASE_ADDR +0x014 ); + +writel (0x00011740 ,MMDC_P0_BASE_ADDR +0x018 ); +writel (0x00008000 ,MMDC_P0_BASE_ADDR +0x01c ); +writel (0x000026D2 ,MMDC_P0_BASE_ADDR +0x02c ); +writel (0x008E1023 ,MMDC_P0_BASE_ADDR +0x030 ); +writel (0x00000047 ,MMDC_P0_BASE_ADDR +0x040 ); + +writel (0x14420000 ,MMDC_P0_BASE_ADDR +0x400 ); +writel (0x841A0000 ,MMDC_P0_BASE_ADDR +0x000 ); +writel (0x00400c58 ,MMDC_P0_BASE_ADDR +0x890 ); + +/* add NOC DDR configuration */ +writel (0x00000000 ,NOC_DDR_BASE_ADDR +0x008 ); +writel (0x2871C39B ,NOC_DDR_BASE_ADDR +0x00c ); +writel (0x000005B4 ,NOC_DDR_BASE_ADDR +0x038 ); +writel (0x00000040 ,NOC_DDR_BASE_ADDR +0x014 ); +writel (0x00000020 ,NOC_DDR_BASE_ADDR +0x028 ); +writel (0x00000020 ,NOC_DDR_BASE_ADDR +0x02c ); + +writel (0x02088032 ,MMDC_P0_BASE_ADDR +0x01c ); +writel (0x00008033 ,MMDC_P0_BASE_ADDR +0x01c ); +writel (0x00048031 ,MMDC_P0_BASE_ADDR +0x01c ); +writel (0x19308030 ,MMDC_P0_BASE_ADDR +0x01c ); +writel (0x04008040 ,MMDC_P0_BASE_ADDR +0x01c ); + +writel (0x00007800 ,MMDC_P0_BASE_ADDR +0x020 ); +writel (0x00022227 ,MMDC_P0_BASE_ADDR +0x818 ); +writel (0x00022227 ,MMDC_P1_BASE_ADDR +0x818 ); +writel (0x00025576 ,MMDC_P0_BASE_ADDR +0x004 ); +writel (0x00011006 ,MMDC_P0_BASE_ADDR +0x404 ); +writel (0x00000000 ,MMDC_P0_BASE_ADDR +0x01c ); +} +static void spl_dram_init (void ) { -if (is_cpu_type (MXC_CPU_MX6SOLO )) { +if (is_mx6dqp ()) { +spl_dram_init_imx6qp_lpddr3 (); + }else if (is_cpu_type (MXC_CPU_MX6SOLO )) {mx6sdl_dram_iocfg (32 , &mx6sdl_ddr_ioregs, &mx6sdl_grp_ioregs);mx6_dram_cfg (&mem_s, &mx6s_512m_mmdc_calib, &h5tq2g63dfr); }else if (is_cpu_type (MXC_CPU_MX6DL )) {board/wandboard/wandboard.c +4
-2@@ -512,7 +512,9 @@ int board_late_init(void)#endif #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG -if (is_mx6dq ()) +if (is_mx6dqp ()) +env_set ("board_rev" ,"MX6QP" ); +else if (is_mx6dq ())env_set ("board_rev" ,"MX6Q" );else env_set ("board_rev" ,"MX6DL" );@@ -534,7 +536,7 @@ 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 () ||is_mx6dqp ()) {setup_i2c (1 ,CONFIG_SYS_I2C_SPEED ,0x7f , &mx6q_i2c2_pad_info);setup_i2c (2 ,CONFIG_SYS_I2C_SPEED ,0x7f , &mx6q_i2c3_pad_info); }else {include/configs/wandboard.h +0
-0
include/configs/wandboard.h line 116
Quoted 8 lines
include/configs/wandboard.h +2
-0@@ -109,6 +109,8 @@"fi; " \"fi\0" \"findfdt=" \ +"if test $board_name = D1 && test $board_rev = MX6QP ; then " \ +"setenv fdtfile imx6qp-wandboard-revd1.dtb; fi; " \"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 " \
Best regards,
Stefano
Signature · 5 lines
===================================================================== 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 =====================================================================
Fabio Estevam
reviewerPATCH v4 2/2 wandboard: Add support for the MX6QP variant
Hi Stefano,
Quoted 7 lines · Stefano Babic
mmhhh...it looks to me we are diverging with this SOC. I understand that current funtions are not suitable for the new SOC. However, we were able to manage up now to write tables (
mx6dq_iomux_ddr_regs) and use functions to setup the strength and the other parameters. As your tests has proofed that these functions do not work for MX6QP, the logical way to do is to modify these functions instead of putting back all this code in the board file. Do you agree ?
Sure, I will work on using the common code for imx6qp here too.
Thanks
Fabio Estevam
reviewerPATCH v4 2/2 wandboard: Add support for the MX6QP variant
Hi Stefano,
Quoted 12 lines · Fabio Estevam
Hi Stefano,
Quoted 7 lines · Stefano Babic
mmhhh...it looks to me we are diverging with this SOC. I understand that current funtions are not suitable for the new SOC. However, we were able to manage up now to write tables (
mx6dq_iomux_ddr_regs) and use functions to setup the strength and the other parameters. As your tests has proofed that these functions do not work for MX6QP, the logical way to do is to modify these functions instead of putting back all this code in the board file. Do you agree ?
Quoted 1 line
Sure, I will work on using the common code for imx6qp here too.
I worked on converting this patch to using the existing DDR setup functions:
https://pastebin.com/6PGx0pMx
However I do see instability: after lauching the kernel I see a hang after "Starting the kernel..." sometimes.
The original DDR configuration that I used from Technexion in the original patch is very stable and never hangs.
The DDR iomux function can be used, but the mx6_dram_cfg() is the one that gives trouble.
I understand that using the common framework is preferred, but it seems it will require a great amount of effort to make the qp board variant stable.
Regards,
Fabio Estevam
Fabio Estevam
reviewerPATCH v4 2/2 wandboard: Add support for the MX6QP variant
Hi Stefano,
Quoted 11 lines · Fabio Estevam
I worked on converting this patch to using the existing DDR setup functions:
https://pastebin.com/6PGx0pMxHowever I do see instability: after lauching the kernel I see a hang after "Starting the kernel..." sometimes.
The original DDR configuration that I used from Technexion in the original patch is very stable and never hangs.
The DDR iomux function can be used, but the
mx6_dram_cfg()is the one that gives trouble.
I sent a v5 where I use the existing mx6dq_dram_iocfg() and a custom spl_dram_init_imx6qp_lpddr3() for the DDR timings.
Hopefully it is a little bit better :-)
PATCH v4 1/2 wandboard: Add support for the latest revd1 revision
In reply to Fabio EstevamQuoted 269 lines · Fabio Estevam
From: Fabio Estevam <[email protected]>
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_LATEand also need to disableCONFIG_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 <[email protected]>---
Changes since v3:
- Rebased against latest u-boot-imxboard/wandboard/wandboard.c | 108 ++++++++++++++++++++++++++++++++++++++++++-- configs/wandboard_defconfig | 1 + include/configs/wandboard.h | 11 +++++ 3 files changed, 115 insertions(+), 5 deletions(-)board/wandboard/wandboard.c +103
-5@@ -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" );configs/wandboard_defconfig +1
-0@@ -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=yinclude/configs/wandboard.h +7
-0@@ -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
include/configs/wandboard.h line 118
Quoted 10 lines
include/configs/wandboard.h +4
-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
Signature · 5 lines
===================================================================== 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 =====================================================================