All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Nelson <eric.nelson@boundarydevices.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v6] mx6: Read silicon revision from register
Date: Tue, 20 Mar 2012 07:28:24 -0700	[thread overview]
Message-ID: <4F689408.1010108@boundarydevices.com> (raw)
In-Reply-To: <1332253305-28632-1-git-send-email-fabio.estevam@freescale.com>

On 03/20/2012 07:21 AM, Fabio Estevam wrote:
> Instead of hardcoding the mx6 silicon revision, read it in run-time.
>
> Also, besides the silicon version print the mx6 variant type: quad,dual/solo
> or solo-lite.
>
> Tested on a mx6qsabrelite, where it shows:
>
> CPU:   Freescale i.MX6Q rev1.0 at 792 MHz
>
> Signed-off-by: Fabio Estevam<fabio.estevam@freescale.com>
> ---
> Changes since v5:
> - Avoid duplication of code.  Also tested on a mx51evk board.
> Changes since v4:
> - Distinguish the the CPU print depending on the SoC type (MX5 or MX6)
> Changes since v3:
> - Provide a complete struct for anatop registers
> Changes since v2:
> - Read both chip variant and chip silicon version from anatop
> - Create a struct for accessing the anatop registers
> Changes since v1:
> - Fix typo on Subject
>   arch/arm/cpu/armv7/imx-common/cpu.c      |   24 +++++-
>   arch/arm/cpu/armv7/mx6/soc.c             |    8 ++-
>   arch/arm/include/asm/arch-mx6/imx-regs.h |  142 ++++++++++++++++++++++++++++++
>   3 files changed, 171 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/imx-common/cpu.c b/arch/arm/cpu/armv7/imx-common/cpu.c
> index 6d7486b..3d58d8a 100644
> --- a/arch/arm/cpu/armv7/imx-common/cpu.c
> +++ b/arch/arm/cpu/armv7/imx-common/cpu.c
> @@ -64,13 +64,33 @@ static char *get_reset_cause(void)
>   }
>
>   #if defined(CONFIG_DISPLAY_CPUINFO)
> +
> +static char *get_imx_type(u32 imxtype)
> +{
> +	switch (imxtype) {
> +	case 0x63:
> +		return "6Q";	/* Quad-core version of the mx6 */
> +	case 0x61:
> +		return "6DS";	/* Dual/Solo version of the mx6 */
> +	case 0x60:
> +		return "6SL";	/* Solo-Lite version of the mx6 */
> +	case 0x51:
> +		return "51";
> +	case 0x53:
> +		return "53";
> +	default:
> +		return "unknown";
> +	}
> +}
> +
>   int print_cpuinfo(void)
>   {
>   	u32 cpurev;
>
>   	cpurev = get_cpu_rev();
> -	printf("CPU:   Freescale i.MX%x family rev%d.%d at %d MHz\n",
> -		(cpurev&  0xFF000)>>  12,
> +
> +	printf("CPU:   Freescale i.MX%s rev%d.%d at %d MHz\n",
> +		get_imx_type((cpurev&  0xFF000)>>  12),
>   		(cpurev&  0x000F0)>>  4,
>   		(cpurev&  0x0000F)>>  0,
>   		mxc_get_clock(MXC_ARM_CLK) / 1000000);
> diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c
> index 2ac74b5..a81e2bc 100644
> --- a/arch/arm/cpu/armv7/mx6/soc.c
> +++ b/arch/arm/cpu/armv7/mx6/soc.c
> @@ -32,7 +32,13 @@
>
>   u32 get_cpu_rev(void)
>   {
> -	int system_rev = 0x61000 | CHIP_REV_1_0;
> +	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
> +	int reg = readl(&anatop->digprog);
> +
> +	/* Read mx6 variant: quad, dual or solo */
> +	int system_rev = (reg>>  4)&  0xFF000;
> +	/* Read mx6 silicon revision */
> +	system_rev |= (reg&  0xFF) + 0x10;
>
>   	return system_rev;
>   }
> diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
> index 5ba5f39..cad957a 100644
> --- a/arch/arm/include/asm/arch-mx6/imx-regs.h
> +++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
> @@ -294,5 +294,147 @@ struct aipstz_regs {
>   	u32	opacr4;
>   };
>
> +struct anatop_regs {
> +	u32	pll_sys;		/* 0x000 */
> +	u32	pll_sys_set;		/* 0x004 */
> +	u32	pll_sys_clr;		/* 0x008 */
> +	u32	pll_sys_tog;		/* 0x00c */
> +	u32	usb1_pll_480_ctrl;	/* 0x010 */
> +	u32	usb1_pll_480_ctrl_set;	/* 0x014 */
> +	u32	usb1_pll_480_ctrl_clr;	/* 0x018 */
> +	u32	usb1_pll_480_ctrl_tog;	/* 0x01c */
> +	u32	usb2_pll_480_ctrl;	/* 0x020 */
> +	u32	usb2_pll_480_ctrl_set;	/* 0x024 */
> +	u32	usb2_pll_480_ctrl_clr;	/* 0x028 */
> +	u32	usb2_pll_480_ctrl_tog;	/* 0x02c */
> +	u32	pll_528;		/* 0x030 */
> +	u32	pll_528_set;		/* 0x034 */
> +	u32	pll_528_clr;		/* 0x038 */
> +	u32	pll_528_tog;		/* 0x03c */
> +	u32	pll_528_ss;		/* 0x040 */
> +	u32	rsvd0[3];
> +	u32	pll_528_num;		/* 0x050 */
> +	u32	rsvd1[3];
> +	u32	pll_528_denom;		/* 0x060 */
> +	u32	rsvd2[3];
> +	u32	pll_audio;		/* 0x070 */
> +	u32	pll_audio_set;		/* 0x074 */
> +	u32	pll_audio_clr;		/* 0x078 */
> +	u32	pll_audio_tog;		/* 0x07c */
> +	u32	pll_audio_num;		/* 0x080 */
> +	u32	rsvd3[3];
> +	u32	pll_audio_denom;	/* 0x090 */
> +	u32	rsvd4[3];
> +	u32	pll_video;		/* 0x0a0 */
> +	u32	pll_video_set;		/* 0x0a4 */
> +	u32	pll_video_clr;		/* 0x0a8 */
> +	u32	pll_video_tog;		/* 0x0ac */
> +	u32	pll_video_num;		/* 0x0b0 */
> +	u32	rsvd5[3];
> +	u32	pll_video_denom;	/* 0x0c0 */
> +	u32	rsvd6[3];
> +	u32	pll_mlb;		/* 0x0d0 */
> +	u32	pll_mlb_set;		/* 0x0d4 */
> +	u32	pll_mlb_clr;		/* 0x0d8 */
> +	u32	pll_mlb_tog;		/* 0x0dc */
> +	u32	pll_enet;		/* 0x0e0 */
> +	u32	pll_enet_set;		/* 0x0e4 */
> +	u32	pll_enet_clr;		/* 0x0e8 */
> +	u32	pll_enet_tog;		/* 0x0ec */
> +	u32	pfd_480;		/* 0x0f0 */
> +	u32	pfd_480_set;		/* 0x0f4 */
> +	u32	pfd_480_clr;		/* 0x0f8 */
> +	u32	pfd_480_tog;		/* 0x0fc */
> +	u32	pfd_528;		/* 0x100 */
> +	u32	pfd_528_set;		/* 0x104 */
> +	u32	pfd_528_clr;		/* 0x108 */
> +	u32	pfd_528_tog;		/* 0x10c */
> +	u32	reg_1p1;		/* 0x110 */
> +	u32	reg_1p1_set;		/* 0x114 */
> +	u32	reg_1p1_clr;		/* 0x118 */
> +	u32	reg_1p1_tog;		/* 0x11c */
> +	u32	reg_3p0;		/* 0x120 */
> +	u32	reg_3p0_set;		/* 0x124 */
> +	u32	reg_3p0_clr;		/* 0x128 */
> +	u32	reg_3p0_tog;		/* 0x12c */
> +	u32	reg_2p5;		/* 0x130 */
> +	u32	reg_2p5_set;		/* 0x134 */
> +	u32	reg_2p5_clr;		/* 0x138 */
> +	u32	reg_2p5_tog;		/* 0x13c */
> +	u32	reg_core;		/* 0x140 */
> +	u32	reg_core_set;		/* 0x144 */
> +	u32	reg_core_clr;		/* 0x148 */
> +	u32	reg_core_tog;		/* 0x14c */
> +	u32	ana_misc0;		/* 0x150 */
> +	u32	ana_misc0_set;		/* 0x154 */
> +	u32	ana_misc0_clr;		/* 0x158 */
> +	u32	ana_misc0_tog;		/* 0x15c */
> +	u32	ana_misc1;		/* 0x160 */
> +	u32	ana_misc1_set;		/* 0x164 */
> +	u32	ana_misc1_clr;		/* 0x168 */
> +	u32	ana_misc1_tog;		/* 0x16c */
> +	u32	ana_misc2;		/* 0x170 */
> +	u32	ana_misc2_set;		/* 0x174 */
> +	u32	ana_misc2_clr;		/* 0x178 */
> +	u32	ana_misc2_tog;		/* 0x17c */
> +	u32	tempsense0;		/* 0x180 */
> +	u32	tempsense0_set;		/* 0x184 */
> +	u32	tempsense0_clr;		/* 0x188 */
> +	u32	tempsense0_tog;		/* 0x18c */
> +	u32	tempsense1;		/* 0x190 */
> +	u32	tempsense1_set;		/* 0x194 */
> +	u32	tempsense1_clr;		/* 0x198 */
> +	u32	tempsense1_tog;		/* 0x19c */
> +	u32	usb1_vbus_detect;	/* 0x1a0 */
> +	u32	usb1_vbus_detect_set;	/* 0x1a4 */
> +	u32	usb1_vbus_detect_clr;	/* 0x1a8 */
> +	u32	usb1_vbus_detect_tog;	/* 0x1ac */
> +	u32	usb1_chrg_detect;	/* 0x1b0 */
> +	u32	usb1_chrg_detect_set;	/* 0x1b4 */
> +	u32	usb1_chrg_detect_clr;	/* 0x1b8 */
> +	u32	usb1_chrg_detect_tog;	/* 0x1bc */
> +	u32	usb1_vbus_det_stat;	/* 0x1c0 */
> +	u32	usb1_vbus_det_stat_set;	/* 0x1c4 */
> +	u32	usb1_vbus_det_stat_clr;	/* 0x1c8 */
> +	u32	usb1_vbus_det_stat_tog;	/* 0x1cc */
> +	u32	usb1_chrg_det_stat;	/* 0x1d0 */
> +	u32	usb1_chrg_det_stat_set;	/* 0x1d4 */
> +	u32	usb1_chrg_det_stat_clr;	/* 0x1d8 */
> +	u32	usb1_chrg_det_stat_tog;	/* 0x1dc */
> +	u32	usb1_loopback;		/* 0x1e0 */
> +	u32	usb1_loopback_set;	/* 0x1e4 */
> +	u32	usb1_loopback_clr;	/* 0x1e8 */
> +	u32	usb1_loopback_tog;	/* 0x1ec */
> +	u32	usb1_misc;		/* 0x1f0 */
> +	u32	usb1_misc_set;		/* 0x1f4 */
> +	u32	usb1_misc_clr;		/* 0x1f8 */
> +	u32	usb1_misc_tog;		/* 0x1fc */
> +	u32	usb2_vbus_detect;	/* 0x200 */
> +	u32	usb2_vbus_detect_set;	/* 0x204 */
> +	u32	usb2_vbus_detect_clr;	/* 0x208 */
> +	u32	usb2_vbus_detect_tog;	/* 0x20c */
> +	u32	usb2_chrg_detect;	/* 0x210 */
> +	u32	usb2_chrg_detect_set;	/* 0x214 */
> +	u32	usb2_chrg_detect_clr;	/* 0x218 */
> +	u32	usb2_chrg_detect_tog;	/* 0x21c */
> +	u32	usb2_vbus_det_stat;	/* 0x220 */
> +	u32	usb2_vbus_det_stat_set;	/* 0x224 */
> +	u32	usb2_vbus_det_stat_clr;	/* 0x228 */
> +	u32	usb2_vbus_det_stat_tog;	/* 0x22c */
> +	u32	usb2_chrg_det_stat;	/* 0x230 */
> +	u32	usb2_chrg_det_stat_set;	/* 0x234 */
> +	u32	usb2_chrg_det_stat_clr;	/* 0x238 */
> +	u32	usb2_chrg_det_stat_tog;	/* 0x23c */
> +	u32	usb2_loopback;		/* 0x240 */
> +	u32	usb2_loopback_set;	/* 0x244 */
> +	u32	usb2_loopback_clr;	/* 0x248 */
> +	u32	usb2_loopback_tog;	/* 0x24c */
> +	u32	usb2_misc;		/* 0x250 */
> +	u32	usb2_misc_set;		/* 0x254 */
> +	u32	usb2_misc_clr;		/* 0x258 */
> +	u32	usb2_misc_tog;		/* 0x25c */
> +	u32	digprog;		/* 0x260 */
> +};
> +
>   #endif /* __ASSEMBLER__*/
>   #endif /* __ASM_ARCH_MX6_IMX_REGS_H__ */

Nicely done Fabio!

  reply	other threads:[~2012-03-20 14:28 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-20 14:21 [U-Boot] [PATCH v6] mx6: Read silicon revision from register Fabio Estevam
2012-03-20 14:28 ` Eric Nelson [this message]
2012-03-20 14:34 ` Stefano Babic
2012-03-21  2:34   ` Liu Hui-R64343
2012-03-21  8:41 ` Stefano Babic
2012-03-22  7:48   ` Dirk Behme
2012-03-22  8:10     ` Stefano Babic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F689408.1010108@boundarydevices.com \
    --to=eric.nelson@boundarydevices.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.