Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 845da6bf authored by Shawn Guo's avatar Shawn Guo
Browse files

ARM: mxs: detect SoC by checking CHIPID register



Both imx23 and imx28 have CHIPID register at address 0x8001c310, which
can be used to identify the SoC.  This patch changes cpu_is_xxx and
__arch_decomp_setup to use this CHIPID register than machine type to
detect the chip between imx23 and imx28, so that we do not need to
change these functions whenever a new board/machine gets added.

Suggested-by: default avatarWolfram Sang <w.sang@pengutronix.de>
Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
Acked-by: default avatarWolfram Sang <w.sang@pengutronix.de>
parent dcd6c922
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -18,4 +18,5 @@
#define HW_DIGCTL_CTRL			0x0
#define  BP_DIGCTL_CTRL_SAIF_CLKMUX	10
#define  BM_DIGCTL_CTRL_SAIF_CLKMUX	(0x3 << 10)
#define HW_DIGCTL_CHIPID		0x310
#endif
+16 −13
Original line number Diff line number Diff line
@@ -23,21 +23,9 @@
#include <linux/io.h>
#endif
#include <asm/mach-types.h>
#include <mach/digctl.h>
#include <mach/hardware.h>

/*
 * MXS CPU types
 */
#define cpu_is_mx23()		(					\
		machine_is_mx23evk() ||					\
		machine_is_stmp378x() ||				\
		0)
#define cpu_is_mx28()		(					\
		machine_is_mx28evk() ||					\
		machine_is_m28evk() ||					\
		machine_is_tx28() ||					\
		0)

/*
 * IO addresses common to MXS-based
 */
@@ -109,6 +97,21 @@ static inline void __mxs_togl(u32 mask, void __iomem *reg)
{
	__raw_writel(mask, reg + MXS_TOG_ADDR);
}

/*
 * MXS CPU types
 */
#define MXS_CHIPID (MXS_IO_ADDRESS(MXS_DIGCTL_BASE_ADDR) + HW_DIGCTL_CHIPID)

static inline int cpu_is_mx23(void)
{
	return ((__raw_readl(MXS_CHIPID) >> 16) == 0x3780);
}

static inline int cpu_is_mx28(void)
{
	return ((__raw_readl(MXS_CHIPID) >> 16) == 0x2800);
}
#endif

#endif /* __MACH_MXS_H__ */
+6 −7
Original line number Diff line number Diff line
@@ -18,8 +18,6 @@
#ifndef __MACH_MXS_UNCOMPRESS_H__
#define __MACH_MXS_UNCOMPRESS_H__

#include <asm/mach-types.h>

unsigned long mxs_duart_base;

#define MXS_DUART(x)	(*(volatile unsigned long *)(mxs_duart_base + (x)))
@@ -55,16 +53,17 @@ static inline void flush(void)

#define MX23_DUART_BASE_ADDR	0x80070000
#define MX28_DUART_BASE_ADDR	0x80074000
#define MXS_DIGCTL_CHIPID	0x8001c310

static inline void __arch_decomp_setup(unsigned long arch_id)
{
	switch (arch_id) {
	case MACH_TYPE_MX23EVK:
	u16 chipid = (*(volatile unsigned long *) MXS_DIGCTL_CHIPID) >> 16;

	switch (chipid) {
	case 0x3780:
		mxs_duart_base = MX23_DUART_BASE_ADDR;
		break;
	case MACH_TYPE_MX28EVK:
	case MACH_TYPE_M28EVK:
	case MACH_TYPE_TX28:
	case 0x2800:
		mxs_duart_base = MX28_DUART_BASE_ADDR;
		break;
	default: