Commit c0abefd3 authored by Dinh Nguyen's avatar Dinh Nguyen Committed by Sascha Hauer

ARM: imx: Add core definitions for MX53

Add iomux, clocks,  and memory map for Freescale's MX53 SoC.
Add cpu_is_mx53 function to common.h.
Add 3 more banks of gpio's to mxc_gpio_ports.
Add MX53 phys offset address.
Signed-off-by: default avatarDinh Nguyen <Dinh.Nguyen@freescale.com>
Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
parent 374daa4f
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
# Object file lists. # Object file lists.
obj-y := cpu.o mm.o clock-mx51.o devices.o obj-y := cpu.o mm.o clock-mx51-mx53.o devices.o
obj-$(CONFIG_CPU_FREQ_IMX) += cpu_op-mx51.o obj-$(CONFIG_CPU_FREQ_IMX) += cpu_op-mx51.o
obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o
......
...@@ -33,6 +33,7 @@ static struct clk pll1_main_clk; ...@@ -33,6 +33,7 @@ static struct clk pll1_main_clk;
static struct clk pll1_sw_clk; static struct clk pll1_sw_clk;
static struct clk pll2_sw_clk; static struct clk pll2_sw_clk;
static struct clk pll3_sw_clk; static struct clk pll3_sw_clk;
static struct clk mx53_pll4_sw_clk;
static struct clk lp_apm_clk; static struct clk lp_apm_clk;
static struct clk periph_apm_clk; static struct clk periph_apm_clk;
static struct clk ahb_clk; static struct clk ahb_clk;
...@@ -131,6 +132,8 @@ static inline void __iomem *_get_pll_base(struct clk *pll) ...@@ -131,6 +132,8 @@ static inline void __iomem *_get_pll_base(struct clk *pll)
return MX51_DPLL2_BASE; return MX51_DPLL2_BASE;
else if (pll == &pll3_sw_clk) else if (pll == &pll3_sw_clk)
return MX51_DPLL3_BASE; return MX51_DPLL3_BASE;
else if (pll == &mx53_pll4_sw_clk)
return MX53_DPLL4_BASE;
else else
BUG(); BUG();
...@@ -514,7 +517,10 @@ static int _clk_max_enable(struct clk *clk) ...@@ -514,7 +517,10 @@ static int _clk_max_enable(struct clk *clk)
/* Handshake with MAX when LPM is entered. */ /* Handshake with MAX when LPM is entered. */
reg = __raw_readl(MXC_CCM_CLPCR); reg = __raw_readl(MXC_CCM_CLPCR);
reg &= ~MXC_CCM_CLPCR_BYPASS_MAX_LPM_HS; if (cpu_is_mx51())
reg &= ~MX51_CCM_CLPCR_BYPASS_MAX_LPM_HS;
else if (cpu_is_mx53())
reg &= ~MX53_CCM_CLPCR_BYPASS_MAX_LPM_HS;
__raw_writel(reg, MXC_CCM_CLPCR); __raw_writel(reg, MXC_CCM_CLPCR);
return 0; return 0;
...@@ -528,7 +534,10 @@ static void _clk_max_disable(struct clk *clk) ...@@ -528,7 +534,10 @@ static void _clk_max_disable(struct clk *clk)
/* No Handshake with MAX when LPM is entered as its disabled. */ /* No Handshake with MAX when LPM is entered as its disabled. */
reg = __raw_readl(MXC_CCM_CLPCR); reg = __raw_readl(MXC_CCM_CLPCR);
reg |= MXC_CCM_CLPCR_BYPASS_MAX_LPM_HS; if (cpu_is_mx51())
reg |= MX51_CCM_CLPCR_BYPASS_MAX_LPM_HS;
else if (cpu_is_mx53())
reg &= ~MX53_CCM_CLPCR_BYPASS_MAX_LPM_HS;
__raw_writel(reg, MXC_CCM_CLPCR); __raw_writel(reg, MXC_CCM_CLPCR);
} }
...@@ -739,6 +748,14 @@ static struct clk pll3_sw_clk = { ...@@ -739,6 +748,14 @@ static struct clk pll3_sw_clk = {
.disable = _clk_pll_disable, .disable = _clk_pll_disable,
}; };
/* PLL4 SW supplies to LVDS Display Bridge(LDB) */
static struct clk mx53_pll4_sw_clk = {
.parent = &osc_clk,
.set_rate = _clk_pll_set_rate,
.enable = _clk_pll_enable,
.disable = _clk_pll_disable,
};
/* Low-power Audio Playback Mode clock */ /* Low-power Audio Playback Mode clock */
static struct clk lp_apm_clk = { static struct clk lp_apm_clk = {
.parent = &osc_clk, .parent = &osc_clk,
...@@ -1053,7 +1070,7 @@ DEFINE_CLOCK_MAX(esdhc2_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG3_OFFSET, ...@@ -1053,7 +1070,7 @@ DEFINE_CLOCK_MAX(esdhc2_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG3_OFFSET,
.clk = &c, \ .clk = &c, \
}, },
static struct clk_lookup lookups[] = { static struct clk_lookup mx51_lookups[] = {
_REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk) _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk)
_REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk) _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk)
_REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk) _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk)
...@@ -1084,6 +1101,14 @@ static struct clk_lookup lookups[] = { ...@@ -1084,6 +1101,14 @@ static struct clk_lookup lookups[] = {
_REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk) _REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk)
}; };
static struct clk_lookup mx53_lookups[] = {
_REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk)
_REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk)
_REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk)
_REGISTER_CLOCK(NULL, "gpt", gpt_clk)
_REGISTER_CLOCK("fec.0", NULL, fec_clk)
};
static void clk_tree_init(void) static void clk_tree_init(void)
{ {
u32 reg; u32 reg;
...@@ -1114,8 +1139,8 @@ int __init mx51_clocks_init(unsigned long ckil, unsigned long osc, ...@@ -1114,8 +1139,8 @@ int __init mx51_clocks_init(unsigned long ckil, unsigned long osc,
ckih2_reference = ckih2; ckih2_reference = ckih2;
oscillator_reference = osc; oscillator_reference = osc;
for (i = 0; i < ARRAY_SIZE(lookups); i++) for (i = 0; i < ARRAY_SIZE(mx51_lookups); i++)
clkdev_add(&lookups[i]); clkdev_add(&mx51_lookups[i]);
clk_tree_init(); clk_tree_init();
...@@ -1138,3 +1163,27 @@ int __init mx51_clocks_init(unsigned long ckil, unsigned long osc, ...@@ -1138,3 +1163,27 @@ int __init mx51_clocks_init(unsigned long ckil, unsigned long osc,
MX51_MXC_INT_GPT); MX51_MXC_INT_GPT);
return 0; return 0;
} }
int __init mx53_clocks_init(unsigned long ckil, unsigned long osc,
unsigned long ckih1, unsigned long ckih2)
{
int i;
external_low_reference = ckil;
external_high_reference = ckih1;
ckih2_reference = ckih2;
oscillator_reference = osc;
for (i = 0; i < ARRAY_SIZE(mx53_lookups); i++)
clkdev_add(&mx53_lookups[i]);
clk_tree_init();
clk_enable(&cpu_clk);
clk_enable(&main_bus_clk);
/* System timer */
mxc_timer_init(&gpt_clk, MX53_IO_ADDRESS(MX53_GPT1_BASE_ADDR),
MX53_INT_GPT);
return 0;
}
...@@ -97,10 +97,12 @@ static int __init post_cpu_init(void) ...@@ -97,10 +97,12 @@ static int __init post_cpu_init(void)
unsigned int reg; unsigned int reg;
void __iomem *base; void __iomem *base;
if (!cpu_is_mx51()) if (cpu_is_mx51() || cpu_is_mx53()) {
return 0; if (cpu_is_mx51())
base = MX51_IO_ADDRESS(MX51_AIPS1_BASE_ADDR); base = MX51_IO_ADDRESS(MX51_AIPS1_BASE_ADDR);
else
base = MX53_IO_ADDRESS(MX53_AIPS1_BASE_ADDR);
__raw_writel(0x0, base + 0x40); __raw_writel(0x0, base + 0x40);
__raw_writel(0x0, base + 0x44); __raw_writel(0x0, base + 0x44);
__raw_writel(0x0, base + 0x48); __raw_writel(0x0, base + 0x48);
...@@ -108,13 +110,18 @@ static int __init post_cpu_init(void) ...@@ -108,13 +110,18 @@ static int __init post_cpu_init(void)
reg = __raw_readl(base + 0x50) & 0x00FFFFFF; reg = __raw_readl(base + 0x50) & 0x00FFFFFF;
__raw_writel(reg, base + 0x50); __raw_writel(reg, base + 0x50);
if (cpu_is_mx51())
base = MX51_IO_ADDRESS(MX51_AIPS2_BASE_ADDR); base = MX51_IO_ADDRESS(MX51_AIPS2_BASE_ADDR);
else
base = MX53_IO_ADDRESS(MX53_AIPS2_BASE_ADDR);
__raw_writel(0x0, base + 0x40); __raw_writel(0x0, base + 0x40);
__raw_writel(0x0, base + 0x44); __raw_writel(0x0, base + 0x44);
__raw_writel(0x0, base + 0x48); __raw_writel(0x0, base + 0x48);
__raw_writel(0x0, base + 0x4C); __raw_writel(0x0, base + 0x4C);
reg = __raw_readl(base + 0x50) & 0x00FFFFFF; reg = __raw_readl(base + 0x50) & 0x00FFFFFF;
__raw_writel(reg, base + 0x50); __raw_writel(reg, base + 0x50);
}
return 0; return 0;
} }
......
...@@ -18,6 +18,9 @@ ...@@ -18,6 +18,9 @@
#define MX51_CORTEXA8_BASE MX51_IO_ADDRESS(MX51_ARM_BASE_ADDR) #define MX51_CORTEXA8_BASE MX51_IO_ADDRESS(MX51_ARM_BASE_ADDR)
#define MX51_GPC_BASE MX51_IO_ADDRESS(MX51_GPC_BASE_ADDR) #define MX51_GPC_BASE MX51_IO_ADDRESS(MX51_GPC_BASE_ADDR)
/*MX53*/
#define MX53_DPLL4_BASE MX53_IO_ADDRESS(MX53_PLL3_BASE_ADDR)
/* PLL Register Offsets */ /* PLL Register Offsets */
#define MXC_PLL_DP_CTL 0x00 #define MXC_PLL_DP_CTL 0x00
#define MXC_PLL_DP_CONFIG 0x04 #define MXC_PLL_DP_CONFIG 0x04
...@@ -380,7 +383,8 @@ ...@@ -380,7 +383,8 @@
/* Define the bits in register CLPCR */ /* Define the bits in register CLPCR */
#define MXC_CCM_CLPCR_BYPASS_HSC_LPM_HS (0x1 << 23) #define MXC_CCM_CLPCR_BYPASS_HSC_LPM_HS (0x1 << 23)
#define MXC_CCM_CLPCR_BYPASS_SCC_LPM_HS (0x1 << 22) #define MXC_CCM_CLPCR_BYPASS_SCC_LPM_HS (0x1 << 22)
#define MXC_CCM_CLPCR_BYPASS_MAX_LPM_HS (0x1 << 21) #define MX51_CCM_CLPCR_BYPASS_MAX_LPM_HS (0x1 << 21)
#define MX53_CCM_CLPCR_BYPASS_MAX_LPM_HS (0x1 << 25)
#define MXC_CCM_CLPCR_BYPASS_SDMA_LPM_HS (0x1 << 20) #define MXC_CCM_CLPCR_BYPASS_SDMA_LPM_HS (0x1 << 20)
#define MXC_CCM_CLPCR_BYPASS_EMI_LPM_HS (0x1 << 19) #define MXC_CCM_CLPCR_BYPASS_EMI_LPM_HS (0x1 << 19)
#define MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS (0x1 << 18) #define MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS (0x1 << 18)
......
...@@ -160,9 +160,36 @@ static struct mxc_gpio_port mxc_gpio_ports[] = { ...@@ -160,9 +160,36 @@ static struct mxc_gpio_port mxc_gpio_ports[] = {
.irq_high = MX51_MXC_INT_GPIO4_HIGH, .irq_high = MX51_MXC_INT_GPIO4_HIGH,
.virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 3 .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 3
}, },
{
.chip.label = "gpio-4",
.base = MX53_IO_ADDRESS(MX53_GPIO5_BASE_ADDR),
.irq = MX53_INT_GPIO5_LOW,
.irq_high = MX53_INT_GPIO5_HIGH,
.virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 4
},
{
.chip.label = "gpio-5",
.base = MX53_IO_ADDRESS(MX53_GPIO6_BASE_ADDR),
.irq = MX53_INT_GPIO6_LOW,
.irq_high = MX53_INT_GPIO6_HIGH,
.virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 5
},
{
.chip.label = "gpio-6",
.base = MX53_IO_ADDRESS(MX53_GPIO7_BASE_ADDR),
.irq = MX53_INT_GPIO7_LOW,
.irq_high = MX53_INT_GPIO7_HIGH,
.virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 6
},
}; };
int __init imx51_register_gpios(void) int __init imx51_register_gpios(void)
{
return mxc_gpio_init(mxc_gpio_ports, 4);
}
int __init imx53_register_gpios(void)
{ {
return mxc_gpio_init(mxc_gpio_ports, ARRAY_SIZE(mxc_gpio_ports)); return mxc_gpio_init(mxc_gpio_ports, ARRAY_SIZE(mxc_gpio_ports));
} }
...@@ -63,3 +63,20 @@ void __init mx51_init_irq(void) ...@@ -63,3 +63,20 @@ void __init mx51_init_irq(void)
tzic_init_irq(tzic_virt); tzic_init_irq(tzic_virt);
imx51_register_gpios(); imx51_register_gpios();
} }
int imx53_register_gpios(void);
void __init mx53_init_irq(void)
{
unsigned long tzic_addr;
void __iomem *tzic_virt;
tzic_addr = MX53_TZIC_BASE_ADDR;
tzic_virt = ioremap(tzic_addr, SZ_16K);
if (!tzic_virt)
panic("unable to map TZIC interrupt controller\n");
tzic_init_irq(tzic_virt);
imx53_register_gpios();
}
...@@ -21,6 +21,7 @@ extern void mx27_map_io(void); ...@@ -21,6 +21,7 @@ extern void mx27_map_io(void);
extern void mx31_map_io(void); extern void mx31_map_io(void);
extern void mx35_map_io(void); extern void mx35_map_io(void);
extern void mx51_map_io(void); extern void mx51_map_io(void);
extern void mx53_map_io(void);
extern void mxc91231_map_io(void); extern void mxc91231_map_io(void);
extern void mxc_init_irq(void __iomem *); extern void mxc_init_irq(void __iomem *);
extern void tzic_init_irq(void __iomem *); extern void tzic_init_irq(void __iomem *);
...@@ -31,6 +32,7 @@ extern void mx27_init_irq(void); ...@@ -31,6 +32,7 @@ extern void mx27_init_irq(void);
extern void mx31_init_irq(void); extern void mx31_init_irq(void);
extern void mx35_init_irq(void); extern void mx35_init_irq(void);
extern void mx51_init_irq(void); extern void mx51_init_irq(void);
extern void mx53_init_irq(void);
extern void mxc91231_init_irq(void); extern void mxc91231_init_irq(void);
extern void epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq); extern void epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq);
extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int); extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int);
...@@ -42,6 +44,8 @@ extern int mx31_clocks_init(unsigned long fref); ...@@ -42,6 +44,8 @@ extern int mx31_clocks_init(unsigned long fref);
extern int mx35_clocks_init(void); extern int mx35_clocks_init(void);
extern int mx51_clocks_init(unsigned long ckil, unsigned long osc, extern int mx51_clocks_init(unsigned long ckil, unsigned long osc,
unsigned long ckih1, unsigned long ckih2); unsigned long ckih1, unsigned long ckih2);
extern int mx53_clocks_init(unsigned long ckil, unsigned long osc,
unsigned long ckih1, unsigned long ckih2);
extern int mxc91231_clocks_init(unsigned long fref); extern int mxc91231_clocks_init(unsigned long fref);
extern int mxc_register_gpios(void); extern int mxc_register_gpios(void);
extern int mxc_register_device(struct platform_device *pdev, void *data); extern int mxc_register_device(struct platform_device *pdev, void *data);
...@@ -51,4 +55,5 @@ extern void mxc91231_power_off(void); ...@@ -51,4 +55,5 @@ extern void mxc91231_power_off(void);
extern void mxc91231_arch_reset(int, const char *); extern void mxc91231_arch_reset(int, const char *);
extern void mxc91231_prepare_idle(void); extern void mxc91231_prepare_idle(void);
extern void mx51_efikamx_reset(void); extern void mx51_efikamx_reset(void);
extern int mx53_revision(void);
#endif #endif
...@@ -101,6 +101,7 @@ ...@@ -101,6 +101,7 @@
#ifdef CONFIG_ARCH_MX5 #ifdef CONFIG_ARCH_MX5
#include <mach/mx51.h> #include <mach/mx51.h>
#include <mach/mx53.h>
#endif #endif
#ifdef CONFIG_ARCH_MX3 #ifdef CONFIG_ARCH_MX3
......
This diff is collapsed.
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#define MX27_PHYS_OFFSET UL(0xa0000000) #define MX27_PHYS_OFFSET UL(0xa0000000)
#define MX3x_PHYS_OFFSET UL(0x80000000) #define MX3x_PHYS_OFFSET UL(0x80000000)
#define MX51_PHYS_OFFSET UL(0x90000000) #define MX51_PHYS_OFFSET UL(0x90000000)
#define MX53_PHYS_OFFSET UL(0x70000000)
#define MXC91231_PHYS_OFFSET UL(0x90000000) #define MXC91231_PHYS_OFFSET UL(0x90000000)
#if !defined(CONFIG_RUNTIME_PHYS_OFFSET) #if !defined(CONFIG_RUNTIME_PHYS_OFFSET)
...@@ -32,8 +33,10 @@ ...@@ -32,8 +33,10 @@
# define PHYS_OFFSET MX3x_PHYS_OFFSET # define PHYS_OFFSET MX3x_PHYS_OFFSET
# elif defined CONFIG_ARCH_MXC91231 # elif defined CONFIG_ARCH_MXC91231
# define PHYS_OFFSET MXC91231_PHYS_OFFSET # define PHYS_OFFSET MXC91231_PHYS_OFFSET
# elif defined CONFIG_ARCH_MX5 # elif defined CONFIG_ARCH_MX51
# define PHYS_OFFSET MX51_PHYS_OFFSET # define PHYS_OFFSET MX51_PHYS_OFFSET
# elif defined CONFIG_ARCH_MX53
# define PHYS_OFFSET MX53_PHYS_OFFSET
# endif # endif
#endif #endif
......
This diff is collapsed.
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#define MXC_CPU_MX31 31 #define MXC_CPU_MX31 31
#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_MXC91231 91231 #define MXC_CPU_MXC91231 91231
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
...@@ -119,6 +120,7 @@ extern unsigned int __mxc_cpu_type; ...@@ -119,6 +120,7 @@ extern unsigned int __mxc_cpu_type;
# define mxc_cpu_type MXC_CPU_MX51 # define mxc_cpu_type MXC_CPU_MX51
# endif # endif
# define cpu_is_mx51() (mxc_cpu_type == MXC_CPU_MX51) # define cpu_is_mx51() (mxc_cpu_type == MXC_CPU_MX51)
# define cpu_is_mx53() (mxc_cpu_type == MXC_CPU_MX53)
#else #else
# define cpu_is_mx51() (0) # define cpu_is_mx51() (0)
#endif #endif
......
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