diff options
author | Anson Huang <Anson.Huang@nxp.com> | 2018-09-29 23:32:26 -0400 |
---|---|---|
committer | Shawn Guo <shawnguo@kernel.org> | 2018-09-30 03:31:40 -0400 |
commit | c90dec00cc84942614bc41f75dc24a87b6d5763b (patch) | |
tree | d71ca7638f11ab7bbe50666da755c6bc357774b2 | |
parent | 8148d2136002da2e2887caf6a07bbd9c033f14f3 (diff) |
ARM: imx: add i.mx6ulz msl support
The i.MX 6ULZ processor is a high-performance, ultra
cost-efficient consumer Linux processor featuring an
advanced implementation of a single Arm® Cortex®-A7 core,
which operates at speeds up to 900 MHz.
This patch adds basic MSL support for i.MX6ULZ, the
i.MX6ULZ has same soc_id as i.MX6ULL, and SRC_SBMR2 bit[6]
is to differentiate i.MX6ULZ from i.MX6ULL, 1'b1 means
i.MX6ULZ and 1'b0 means i.MX6ULL.
Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
Signed-off-by: Shawn Guo <shawnguo@kernel.org>
-rw-r--r-- | arch/arm/mach-imx/anatop.c | 20 | ||||
-rw-r--r-- | arch/arm/mach-imx/cpu.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-imx/mxc.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-imx/pm-imx6.c | 4 |
4 files changed, 32 insertions, 2 deletions
diff --git a/arch/arm/mach-imx/anatop.c b/arch/arm/mach-imx/anatop.c index 61f3d94f1633..45d618abf26b 100644 --- a/arch/arm/mach-imx/anatop.c +++ b/arch/arm/mach-imx/anatop.c | |||
@@ -31,6 +31,8 @@ | |||
31 | #define ANADIG_DIGPROG_IMX6SL 0x280 | 31 | #define ANADIG_DIGPROG_IMX6SL 0x280 |
32 | #define ANADIG_DIGPROG_IMX7D 0x800 | 32 | #define ANADIG_DIGPROG_IMX7D 0x800 |
33 | 33 | ||
34 | #define SRC_SBMR2 0x1c | ||
35 | |||
34 | #define BM_ANADIG_REG_2P5_ENABLE_WEAK_LINREG 0x40000 | 36 | #define BM_ANADIG_REG_2P5_ENABLE_WEAK_LINREG 0x40000 |
35 | #define BM_ANADIG_REG_2P5_ENABLE_PULLDOWN 0x8 | 37 | #define BM_ANADIG_REG_2P5_ENABLE_PULLDOWN 0x8 |
36 | #define BM_ANADIG_REG_CORE_FET_ODRIVE 0x20000000 | 38 | #define BM_ANADIG_REG_CORE_FET_ODRIVE 0x20000000 |
@@ -148,6 +150,24 @@ void __init imx_init_revision_from_anatop(void) | |||
148 | major_part = (digprog >> 8) & 0xf; | 150 | major_part = (digprog >> 8) & 0xf; |
149 | minor_part = digprog & 0xf; | 151 | minor_part = digprog & 0xf; |
150 | revision = ((major_part + 1) << 4) | minor_part; | 152 | revision = ((major_part + 1) << 4) | minor_part; |
153 | |||
154 | if ((digprog >> 16) == MXC_CPU_IMX6ULL) { | ||
155 | void __iomem *src_base; | ||
156 | u32 sbmr2; | ||
157 | |||
158 | np = of_find_compatible_node(NULL, NULL, | ||
159 | "fsl,imx6ul-src"); | ||
160 | src_base = of_iomap(np, 0); | ||
161 | WARN_ON(!src_base); | ||
162 | sbmr2 = readl_relaxed(src_base + SRC_SBMR2); | ||
163 | iounmap(src_base); | ||
164 | |||
165 | /* src_sbmr2 bit 6 is to identify if it is i.MX6ULZ */ | ||
166 | if (sbmr2 & (1 << 6)) { | ||
167 | digprog &= ~(0xff << 16); | ||
168 | digprog |= (MXC_CPU_IMX6ULZ << 16); | ||
169 | } | ||
170 | } | ||
151 | } | 171 | } |
152 | 172 | ||
153 | mxc_set_cpu_type(digprog >> 16 & 0xff); | 173 | mxc_set_cpu_type(digprog >> 16 & 0xff); |
diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c index c6b1bf97a6c1..c73593e09121 100644 --- a/arch/arm/mach-imx/cpu.c +++ b/arch/arm/mach-imx/cpu.c | |||
@@ -136,6 +136,9 @@ struct device * __init imx_soc_device_init(void) | |||
136 | case MXC_CPU_IMX6ULL: | 136 | case MXC_CPU_IMX6ULL: |
137 | soc_id = "i.MX6ULL"; | 137 | soc_id = "i.MX6ULL"; |
138 | break; | 138 | break; |
139 | case MXC_CPU_IMX6ULZ: | ||
140 | soc_id = "i.MX6ULZ"; | ||
141 | break; | ||
139 | case MXC_CPU_IMX6SLL: | 142 | case MXC_CPU_IMX6SLL: |
140 | soc_id = "i.MX6SLL"; | 143 | soc_id = "i.MX6SLL"; |
141 | break; | 144 | break; |
diff --git a/arch/arm/mach-imx/mxc.h b/arch/arm/mach-imx/mxc.h index 026e2ca45f1e..b130a53ff62a 100644 --- a/arch/arm/mach-imx/mxc.h +++ b/arch/arm/mach-imx/mxc.h | |||
@@ -40,6 +40,8 @@ | |||
40 | #define MXC_CPU_IMX6Q 0x63 | 40 | #define MXC_CPU_IMX6Q 0x63 |
41 | #define MXC_CPU_IMX6UL 0x64 | 41 | #define MXC_CPU_IMX6UL 0x64 |
42 | #define MXC_CPU_IMX6ULL 0x65 | 42 | #define MXC_CPU_IMX6ULL 0x65 |
43 | /* virtual cpu id for i.mx6ulz */ | ||
44 | #define MXC_CPU_IMX6ULZ 0x6b | ||
43 | #define MXC_CPU_IMX6SLL 0x67 | 45 | #define MXC_CPU_IMX6SLL 0x67 |
44 | #define MXC_CPU_IMX7D 0x72 | 46 | #define MXC_CPU_IMX7D 0x72 |
45 | 47 | ||
@@ -80,6 +82,11 @@ static inline bool cpu_is_imx6ull(void) | |||
80 | return __mxc_cpu_type == MXC_CPU_IMX6ULL; | 82 | return __mxc_cpu_type == MXC_CPU_IMX6ULL; |
81 | } | 83 | } |
82 | 84 | ||
85 | static inline bool cpu_is_imx6ulz(void) | ||
86 | { | ||
87 | return __mxc_cpu_type == MXC_CPU_IMX6ULZ; | ||
88 | } | ||
89 | |||
83 | static inline bool cpu_is_imx6sll(void) | 90 | static inline bool cpu_is_imx6sll(void) |
84 | { | 91 | { |
85 | return __mxc_cpu_type == MXC_CPU_IMX6SLL; | 92 | return __mxc_cpu_type == MXC_CPU_IMX6SLL; |
diff --git a/arch/arm/mach-imx/pm-imx6.c b/arch/arm/mach-imx/pm-imx6.c index 529f4b5bbd3a..87f45b926c78 100644 --- a/arch/arm/mach-imx/pm-imx6.c +++ b/arch/arm/mach-imx/pm-imx6.c | |||
@@ -313,7 +313,7 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode mode) | |||
313 | if (cpu_is_imx6sl()) | 313 | if (cpu_is_imx6sl()) |
314 | val |= BM_CLPCR_BYPASS_PMIC_READY; | 314 | val |= BM_CLPCR_BYPASS_PMIC_READY; |
315 | if (cpu_is_imx6sl() || cpu_is_imx6sx() || cpu_is_imx6ul() || | 315 | if (cpu_is_imx6sl() || cpu_is_imx6sx() || cpu_is_imx6ul() || |
316 | cpu_is_imx6ull() || cpu_is_imx6sll()) | 316 | cpu_is_imx6ull() || cpu_is_imx6sll() || cpu_is_imx6ulz()) |
317 | val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS; | 317 | val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS; |
318 | else | 318 | else |
319 | val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; | 319 | val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; |
@@ -331,7 +331,7 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode mode) | |||
331 | if (cpu_is_imx6sl() || cpu_is_imx6sx()) | 331 | if (cpu_is_imx6sl() || cpu_is_imx6sx()) |
332 | val |= BM_CLPCR_BYPASS_PMIC_READY; | 332 | val |= BM_CLPCR_BYPASS_PMIC_READY; |
333 | if (cpu_is_imx6sl() || cpu_is_imx6sx() || cpu_is_imx6ul() || | 333 | if (cpu_is_imx6sl() || cpu_is_imx6sx() || cpu_is_imx6ul() || |
334 | cpu_is_imx6ull() || cpu_is_imx6sll()) | 334 | cpu_is_imx6ull() || cpu_is_imx6sll() || cpu_is_imx6ulz()) |
335 | val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS; | 335 | val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS; |
336 | else | 336 | else |
337 | val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; | 337 | val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; |