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

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
...@@ -18,4 +18,5 @@ ...@@ -18,4 +18,5 @@
#define HW_DIGCTL_CTRL 0x0 #define HW_DIGCTL_CTRL 0x0
#define BP_DIGCTL_CTRL_SAIF_CLKMUX 10 #define BP_DIGCTL_CTRL_SAIF_CLKMUX 10
#define BM_DIGCTL_CTRL_SAIF_CLKMUX (0x3 << 10) #define BM_DIGCTL_CTRL_SAIF_CLKMUX (0x3 << 10)
#define HW_DIGCTL_CHIPID 0x310
#endif #endif
...@@ -23,21 +23,9 @@ ...@@ -23,21 +23,9 @@
#include <linux/io.h> #include <linux/io.h>
#endif #endif
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <mach/digctl.h>
#include <mach/hardware.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 * IO addresses common to MXS-based
*/ */
...@@ -109,6 +97,21 @@ static inline void __mxs_togl(u32 mask, void __iomem *reg) ...@@ -109,6 +97,21 @@ static inline void __mxs_togl(u32 mask, void __iomem *reg)
{ {
__raw_writel(mask, reg + MXS_TOG_ADDR); __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
#endif /* __MACH_MXS_H__ */ #endif /* __MACH_MXS_H__ */
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
#ifndef __MACH_MXS_UNCOMPRESS_H__ #ifndef __MACH_MXS_UNCOMPRESS_H__
#define __MACH_MXS_UNCOMPRESS_H__ #define __MACH_MXS_UNCOMPRESS_H__
#include <asm/mach-types.h>
unsigned long mxs_duart_base; unsigned long mxs_duart_base;
#define MXS_DUART(x) (*(volatile unsigned long *)(mxs_duart_base + (x))) #define MXS_DUART(x) (*(volatile unsigned long *)(mxs_duart_base + (x)))
...@@ -55,16 +53,17 @@ static inline void flush(void) ...@@ -55,16 +53,17 @@ static inline void flush(void)
#define MX23_DUART_BASE_ADDR 0x80070000 #define MX23_DUART_BASE_ADDR 0x80070000
#define MX28_DUART_BASE_ADDR 0x80074000 #define MX28_DUART_BASE_ADDR 0x80074000
#define MXS_DIGCTL_CHIPID 0x8001c310
static inline void __arch_decomp_setup(unsigned long arch_id) static inline void __arch_decomp_setup(unsigned long arch_id)
{ {
switch (arch_id) { u16 chipid = (*(volatile unsigned long *) MXS_DIGCTL_CHIPID) >> 16;
case MACH_TYPE_MX23EVK:
switch (chipid) {
case 0x3780:
mxs_duart_base = MX23_DUART_BASE_ADDR; mxs_duart_base = MX23_DUART_BASE_ADDR;
break; break;
case MACH_TYPE_MX28EVK: case 0x2800:
case MACH_TYPE_M28EVK:
case MACH_TYPE_TX28:
mxs_duart_base = MX28_DUART_BASE_ADDR; mxs_duart_base = MX28_DUART_BASE_ADDR;
break; break;
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment