[U-Boot] [PATCH 1/3] imx: Add a common way for detecting NXP boards revision

Lukasz Majewski lukma at denx.de
Thu Nov 23 09:08:42 UTC 2017


On Wed, 22 Nov 2017 11:15:26 -0200
Fabio Estevam <festevam at gmail.com> wrote:

> From: Fabio Estevam <fabio.estevam at nxp.com>
> 
> NXP development boards based on i.MX6/i.MX7 contain the board
> revision information stored in the fuses.
> 
> Introduce a common function that can be shared by different boards and
> convert mx6sabreauto to use this new mechanism.
> 
> Signed-off-by: Fabio Estevam <fabio.estevam at nxp.com>
> ---
>  arch/arm/include/asm/mach-imx/sys_proto.h   |  3 ++
>  arch/arm/mach-imx/Kconfig                   |  8 +++++
>  arch/arm/mach-imx/cpu.c                     | 27 +++++++++++++++++
>  board/freescale/mx6sabreauto/mx6sabreauto.c | 47
> ++---------------------------
> configs/mx6sabreauto_defconfig              |  1 + 5 files changed,
> 41 insertions(+), 45 deletions(-)
> 
> diff --git a/arch/arm/include/asm/mach-imx/sys_proto.h
> b/arch/arm/include/asm/mach-imx/sys_proto.h index 7036343..d5e3eec
> 100644 --- a/arch/arm/include/asm/mach-imx/sys_proto.h
> +++ b/arch/arm/include/asm/mach-imx/sys_proto.h
> @@ -109,6 +109,9 @@ void imx_set_wdog_powerdown(bool enable);
>  
>  int board_mmc_get_env_dev(int devno);
>  
> +int nxp_board_rev(void);
> +const char *nxp_board_rev_string(void);
> +
>  /*
>   * Initializes on-chip ethernet controllers.
>   * to override, implement board_eth_init()
> diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
> index cd8b8d2..81ab125 100644
> --- a/arch/arm/mach-imx/Kconfig
> +++ b/arch/arm/mach-imx/Kconfig
> @@ -61,3 +61,11 @@ config CMD_HDMIDETECT
>  	help
>  	  This enables the 'hdmidet' command which detects if an
> HDMI monitor is connected.
> +
> +config NXP_BOARD_REVISION
> +	bool "Read NXP board revision from fuses"
> +	depends on ARCH_MX6 || ARCH_MX7
> +	help
> +	  NXP boards based on i.MX6/7 contain the board revision
> information
> +	  stored in the fuses. Select this option if you want to be
> able to
> +	  retrieve the board revision information.
> diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c
> index 18205dc..84e829e 100644
> --- a/arch/arm/mach-imx/cpu.c
> +++ b/arch/arm/mach-imx/cpu.c
> @@ -323,3 +323,30 @@ void set_chipselect_size(int const cs_size)
>  
>  	writel(reg, &iomuxc_regs->gpr[1]);
>  }
> +
> +#ifdef CONFIG_NXP_BOARD_REVISION
> +int nxp_board_rev(void)
> +{
> +	/*
> +	 * Get Board ID information from OCOTP_GP1[15:8]
> +	 * RevA: 0x1
> +	 * RevB: 0x2
> +	 * RevC: 0x3
> +	 */
> +	struct ocotp_regs *ocotp = (struct ocotp_regs
> *)OCOTP_BASE_ADDR;
> +	struct fuse_bank *bank = &ocotp->bank[4];
> +	struct fuse_bank4_regs *fuse =
> +			(struct fuse_bank4_regs *)bank->fuse_regs;
> +
> +	return (readl(&fuse->gp1) >> 8 & 0x0F);
> +}
> +
> +const char *nxp_board_rev_string(void)
> +{
> +	char *rev = "A" - 1;
> +
> +	rev += nxp_board_rev();
> +
> +	return rev;
> +}
> +#endif
> diff --git a/board/freescale/mx6sabreauto/mx6sabreauto.c
> b/board/freescale/mx6sabreauto/mx6sabreauto.c index bdeb5f7..ced254a
> 100644 --- a/board/freescale/mx6sabreauto/mx6sabreauto.c
> +++ b/board/freescale/mx6sabreauto/mx6sabreauto.c
> @@ -397,39 +397,9 @@ int board_eth_init(bd_t *bis)
>  	return cpu_eth_init(bis);
>  }
>  
> -#define BOARD_REV_B  0x200
> -#define BOARD_REV_A  0x100
> -
> -static int mx6sabre_rev(void)
> -{
> -	/*
> -	 * Get Board ID information from OCOTP_GP1[15:8]
> -	 * i.MX6Q ARD RevA: 0x01
> -	 * i.MX6Q ARD RevB: 0x02
> -	 */
> -	struct ocotp_regs *ocotp = (struct ocotp_regs
> *)OCOTP_BASE_ADDR;
> -	struct fuse_bank *bank = &ocotp->bank[4];
> -	struct fuse_bank4_regs *fuse =
> -			(struct fuse_bank4_regs *)bank->fuse_regs;
> -	int reg = readl(&fuse->gp1);
> -	int ret;
> -
> -	switch (reg >> 8 & 0x0F) {
> -	case 0x02:
> -		ret = BOARD_REV_B;
> -		break;
> -	case 0x01:
> -	default:
> -		ret = BOARD_REV_A;
> -		break;
> -	}
> -
> -	return ret;
> -}
> -
>  u32 get_board_rev(void)
>  {
> -	int rev = mx6sabre_rev();
> +	int rev = nxp_board_rev();
>  
>  	return (get_cpu_rev() & ~(0xF << 8)) | rev;
>  }
> @@ -703,20 +673,7 @@ int board_late_init(void)
>  
>  int checkboard(void)
>  {
> -	int rev = mx6sabre_rev();
> -	char *revname;
> -
> -	switch (rev) {
> -	case BOARD_REV_B:
> -		revname = "B";
> -		break;
> -	case BOARD_REV_A:
> -	default:
> -		revname = "A";
> -		break;
> -	}
> -
> -	printf("Board: MX6Q-Sabreauto rev%s\n", revname);
> +	printf("Board: MX6Q-Sabreauto rev%s\n",
> nxp_board_rev_string()); 
>  	return 0;
>  }
> diff --git a/configs/mx6sabreauto_defconfig
> b/configs/mx6sabreauto_defconfig index 418a836..215700b 100644
> --- a/configs/mx6sabreauto_defconfig
> +++ b/configs/mx6sabreauto_defconfig
> @@ -8,6 +8,7 @@ CONFIG_SPL_MMC_SUPPORT=y
>  CONFIG_SPL_SERIAL_SUPPORT=y
>  CONFIG_SPL_LIBDISK_SUPPORT=y
>  CONFIG_SPL_WATCHDOG_SUPPORT=y
> +CONFIG_NXP_BOARD_REVISION=y
>  CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg"
>  # CONFIG_CONSOLE_MUX is not set
>  CONFIG_SYS_CONSOLE_IS_IN_ENV=y

Reviewed-by: Lukasz Majewski <lukma at denx.de>

Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20171123/def0e992/attachment.sig>


More information about the U-Boot mailing list