Commit 3c03a2fe authored by Shawn Guo's avatar Shawn Guo

ARM: imx: add initial imx6dl support

The i.MX6 DualLite/Solo is another i.MX6 family SoC, which is highly
compatible with i.MX6 Quad/Dual.  And that's why we choose to support
it using imx6q code with cpu_is_imx6dl() check when necessary.
Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
parent 9a37ac48
...@@ -234,11 +234,11 @@ choice ...@@ -234,11 +234,11 @@ choice
on i.MX53. on i.MX53.
config DEBUG_IMX6Q_UART config DEBUG_IMX6Q_UART
bool "i.MX6Q Debug UART" bool "i.MX6Q/DL Debug UART"
depends on SOC_IMX6Q depends on SOC_IMX6Q
help help
Say Y here if you want kernel low-level debugging support Say Y here if you want kernel low-level debugging support
on i.MX6Q. on i.MX6Q/DL.
config DEBUG_MMP_UART2 config DEBUG_MMP_UART2
bool "Kernel low-level debugging message via MMP UART2" bool "Kernel low-level debugging message via MMP UART2"
......
...@@ -790,7 +790,7 @@ config SOC_IMX53 ...@@ -790,7 +790,7 @@ config SOC_IMX53
This enables support for Freescale i.MX53 processor. This enables support for Freescale i.MX53 processor.
config SOC_IMX6Q config SOC_IMX6Q
bool "i.MX6 Quad support" bool "i.MX6 Quad/DualLite support"
select ARCH_HAS_CPUFREQ select ARCH_HAS_CPUFREQ
select ARCH_HAS_OPP select ARCH_HAS_OPP
select ARM_CPU_SUSPEND if PM select ARM_CPU_SUSPEND if PM
......
...@@ -296,7 +296,7 @@ int __init mx6q_clocks_init(void) ...@@ -296,7 +296,7 @@ int __init mx6q_clocks_init(void)
WARN_ON(!base); WARN_ON(!base);
/* Audio/video PLL post dividers do not work on i.MX6q revision 1.0 */ /* Audio/video PLL post dividers do not work on i.MX6q revision 1.0 */
if (imx6q_revision() == IMX_CHIP_REVISION_1_0) { if (cpu_is_imx6q() && imx6q_revision() == IMX_CHIP_REVISION_1_0) {
post_div_table[1].div = 1; post_div_table[1].div = 1;
post_div_table[2].div = 1; post_div_table[2].div = 1;
video_div_table[1].div = 1; video_div_table[1].div = 1;
......
...@@ -39,23 +39,32 @@ ...@@ -39,23 +39,32 @@
#include "cpuidle.h" #include "cpuidle.h"
#include "hardware.h" #include "hardware.h"
static u32 chip_revision;
int imx6q_revision(void) int imx6q_revision(void)
{ {
static u32 rev; return chip_revision;
}
if (!rev) static void __init imx6q_init_revision(void)
rev = imx_anatop_get_digprog(); {
u32 rev = imx_anatop_get_digprog();
switch (rev & 0xff) { switch (rev & 0xff) {
case 0: case 0:
return IMX_CHIP_REVISION_1_0; chip_revision = IMX_CHIP_REVISION_1_0;
break;
case 1: case 1:
return IMX_CHIP_REVISION_1_1; chip_revision = IMX_CHIP_REVISION_1_1;
break;
case 2: case 2:
return IMX_CHIP_REVISION_1_2; chip_revision = IMX_CHIP_REVISION_1_2;
break;
default: default:
return IMX_CHIP_REVISION_UNKNOWN; chip_revision = IMX_CHIP_REVISION_UNKNOWN;
} }
mxc_set_cpu_type(rev >> 16 & 0xff);
} }
void imx6q_restart(char mode, const char *cmd) void imx6q_restart(char mode, const char *cmd)
...@@ -247,6 +256,7 @@ static void __init imx6q_map_io(void) ...@@ -247,6 +256,7 @@ static void __init imx6q_map_io(void)
static void __init imx6q_init_irq(void) static void __init imx6q_init_irq(void)
{ {
imx6q_init_revision();
l2x0_of_init(0, ~0UL); l2x0_of_init(0, ~0UL);
imx_src_init(); imx_src_init();
imx_gpc_init(); imx_gpc_init();
...@@ -257,15 +267,17 @@ static void __init imx6q_timer_init(void) ...@@ -257,15 +267,17 @@ static void __init imx6q_timer_init(void)
{ {
mx6q_clocks_init(); mx6q_clocks_init();
twd_local_timer_of_register(); twd_local_timer_of_register();
imx_print_silicon_rev("i.MX6Q", imx6q_revision()); imx_print_silicon_rev(cpu_is_imx6dl() ? "i.MX6DL" : "i.MX6Q",
imx6q_revision());
} }
static const char *imx6q_dt_compat[] __initdata = { static const char *imx6q_dt_compat[] __initdata = {
"fsl,imx6dl",
"fsl,imx6q", "fsl,imx6q",
NULL, NULL,
}; };
DT_MACHINE_START(IMX6Q, "Freescale i.MX6 Quad (Device Tree)") DT_MACHINE_START(IMX6Q, "Freescale i.MX6 Quad/DualLite (Device Tree)")
.smp = smp_ops(imx_smp_ops), .smp = smp_ops(imx_smp_ops),
.map_io = imx6q_map_io, .map_io = imx6q_map_io,
.init_irq = imx6q_init_irq, .init_irq = imx6q_init_irq,
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#define MXC_CPU_MX35 35 #define MXC_CPU_MX35 35
#define MXC_CPU_MX51 51 #define MXC_CPU_MX51 51
#define MXC_CPU_MX53 53 #define MXC_CPU_MX53 53
#define MXC_CPU_IMX6DL 0x61
#define MXC_CPU_IMX6Q 0x63
#define IMX_CHIP_REVISION_1_0 0x10 #define IMX_CHIP_REVISION_1_0 0x10
#define IMX_CHIP_REVISION_1_1 0x11 #define IMX_CHIP_REVISION_1_1 0x11
...@@ -150,6 +152,15 @@ extern unsigned int __mxc_cpu_type; ...@@ -150,6 +152,15 @@ extern unsigned int __mxc_cpu_type;
#endif #endif
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
static inline bool cpu_is_imx6dl(void)
{
return __mxc_cpu_type == MXC_CPU_IMX6DL;
}
static inline bool cpu_is_imx6q(void)
{
return __mxc_cpu_type == MXC_CPU_IMX6Q;
}
struct cpu_op { struct cpu_op {
u32 cpu_rate; u32 cpu_rate;
......
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