diff options
Diffstat (limited to 'arch/arm/mach-mx5')
| -rw-r--r-- | arch/arm/mach-mx5/Kconfig | 18 | ||||
| -rw-r--r-- | arch/arm/mach-mx5/Makefile | 9 | ||||
| -rw-r--r-- | arch/arm/mach-mx5/Makefile.boot | 3 | ||||
| -rw-r--r-- | arch/arm/mach-mx5/board-mx51_babbage.c | 98 | ||||
| -rw-r--r-- | arch/arm/mach-mx5/clock-mx51.c | 826 | ||||
| -rw-r--r-- | arch/arm/mach-mx5/cpu.c | 100 | ||||
| -rw-r--r-- | arch/arm/mach-mx5/crm_regs.h | 583 | ||||
| -rw-r--r-- | arch/arm/mach-mx5/devices.c | 96 | ||||
| -rw-r--r-- | arch/arm/mach-mx5/devices.h | 4 | ||||
| -rw-r--r-- | arch/arm/mach-mx5/mm.c | 83 | 
10 files changed, 1820 insertions, 0 deletions
diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig new file mode 100644 index 00000000000..1576d51e676 --- /dev/null +++ b/arch/arm/mach-mx5/Kconfig @@ -0,0 +1,18 @@ +if ARCH_MX5 + +config ARCH_MX51 +	bool +	default y +	select MXC_TZIC +	select ARCH_MXC_IOMUX_V3 + +comment "MX5 platforms:" + +config MACH_MX51_BABBAGE +	bool "Support MX51 BABBAGE platforms" +	help +	  Include support for MX51 Babbage platform, also known as MX51EVK in +	  u-boot. This includes specific configurations for the board and its +	  peripherals. + +endif diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile new file mode 100644 index 00000000000..bf23f869ef5 --- /dev/null +++ b/arch/arm/mach-mx5/Makefile @@ -0,0 +1,9 @@ +# +# Makefile for the linux kernel. +# + +# Object file lists. +obj-y   := cpu.o mm.o clock-mx51.o devices.o + +obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o + diff --git a/arch/arm/mach-mx5/Makefile.boot b/arch/arm/mach-mx5/Makefile.boot new file mode 100644 index 00000000000..9939a19d99a --- /dev/null +++ b/arch/arm/mach-mx5/Makefile.boot @@ -0,0 +1,3 @@ +   zreladdr-y	:= 0x90008000 +params_phys-y	:= 0x90000100 +initrd_phys-y	:= 0x90800000 diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c b/arch/arm/mach-mx5/board-mx51_babbage.c new file mode 100644 index 00000000000..ee67a71db80 --- /dev/null +++ b/arch/arm/mach-mx5/board-mx51_babbage.c @@ -0,0 +1,98 @@ +/* + * Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright (C) 2009-2010 Amit Kucheria <amit.kucheria@canonical.com> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +#include <linux/init.h> +#include <linux/platform_device.h> + +#include <mach/common.h> +#include <mach/hardware.h> +#include <mach/imx-uart.h> +#include <mach/iomux-mx51.h> + +#include <asm/irq.h> +#include <asm/setup.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/mach/time.h> + +#include "devices.h" + +static struct platform_device *devices[] __initdata = { +	&mxc_fec_device, +}; + +static struct pad_desc mx51babbage_pads[] = { +	/* UART1 */ +	MX51_PAD_UART1_RXD__UART1_RXD, +	MX51_PAD_UART1_TXD__UART1_TXD, +	MX51_PAD_UART1_RTS__UART1_RTS, +	MX51_PAD_UART1_CTS__UART1_CTS, + +	/* UART2 */ +	MX51_PAD_UART2_RXD__UART2_RXD, +	MX51_PAD_UART2_TXD__UART2_TXD, + +	/* UART3 */ +	MX51_PAD_EIM_D25__UART3_RXD, +	MX51_PAD_EIM_D26__UART3_TXD, +	MX51_PAD_EIM_D27__UART3_RTS, +	MX51_PAD_EIM_D24__UART3_CTS, +}; + +/* Serial ports */ +#if defined(CONFIG_SERIAL_IMX) || defined(CONFIG_SERIAL_IMX_MODULE) +static struct imxuart_platform_data uart_pdata = { +	.flags = IMXUART_HAVE_RTSCTS, +}; + +static inline void mxc_init_imx_uart(void) +{ +	mxc_register_device(&mxc_uart_device0, &uart_pdata); +	mxc_register_device(&mxc_uart_device1, &uart_pdata); +	mxc_register_device(&mxc_uart_device2, &uart_pdata); +} +#else /* !SERIAL_IMX */ +static inline void mxc_init_imx_uart(void) +{ +} +#endif /* SERIAL_IMX */ + +/* + * Board specific initialization. + */ +static void __init mxc_board_init(void) +{ +	mxc_iomux_v3_setup_multiple_pads(mx51babbage_pads, +					ARRAY_SIZE(mx51babbage_pads)); +	mxc_init_imx_uart(); +	platform_add_devices(devices, ARRAY_SIZE(devices)); +} + +static void __init mx51_babbage_timer_init(void) +{ +	mx51_clocks_init(32768, 24000000, 22579200, 0); +} + +static struct sys_timer mxc_timer = { +	.init	= mx51_babbage_timer_init, +}; + +MACHINE_START(MX51_BABBAGE, "Freescale MX51 Babbage Board") +	/* Maintainer: Amit Kucheria <amit.kucheria@canonical.com> */ +	.phys_io = MX51_AIPS1_BASE_ADDR, +	.io_pg_offst = ((MX51_AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, +	.boot_params = PHYS_OFFSET + 0x100, +	.map_io = mx51_map_io, +	.init_irq = mx51_init_irq, +	.init_machine = mxc_board_init, +	.timer = &mxc_timer, +MACHINE_END diff --git a/arch/arm/mach-mx5/clock-mx51.c b/arch/arm/mach-mx5/clock-mx51.c new file mode 100644 index 00000000000..1ee6ce4087b --- /dev/null +++ b/arch/arm/mach-mx5/clock-mx51.c @@ -0,0 +1,826 @@ +/* + * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright (C) 2009-2010 Amit Kucheria <amit.kucheria@canonical.com> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +#include <linux/mm.h> +#include <linux/delay.h> +#include <linux/clk.h> +#include <linux/io.h> + +#include <asm/clkdev.h> +#include <asm/div64.h> + +#include <mach/hardware.h> +#include <mach/common.h> +#include <mach/clock.h> + +#include "crm_regs.h" + +/* External clock values passed-in by the board code */ +static unsigned long external_high_reference, external_low_reference; +static unsigned long oscillator_reference, ckih2_reference; + +static struct clk osc_clk; +static struct clk pll1_main_clk; +static struct clk pll1_sw_clk; +static struct clk pll2_sw_clk; +static struct clk pll3_sw_clk; +static struct clk lp_apm_clk; +static struct clk periph_apm_clk; +static struct clk ahb_clk; +static struct clk ipg_clk; + +#define MAX_DPLL_WAIT_TRIES	1000 /* 1000 * udelay(1) = 1ms */ + +static int _clk_ccgr_enable(struct clk *clk) +{ +	u32 reg; + +	reg = __raw_readl(clk->enable_reg); +	reg |= MXC_CCM_CCGRx_MOD_ON << clk->enable_shift; +	__raw_writel(reg, clk->enable_reg); + +	return 0; +} + +static void _clk_ccgr_disable(struct clk *clk) +{ +	u32 reg; +	reg = __raw_readl(clk->enable_reg); +	reg &= ~(MXC_CCM_CCGRx_MOD_OFF << clk->enable_shift); +	__raw_writel(reg, clk->enable_reg); + +} + +static void _clk_ccgr_disable_inwait(struct clk *clk) +{ +	u32 reg; + +	reg = __raw_readl(clk->enable_reg); +	reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift); +	reg |= MXC_CCM_CCGRx_MOD_IDLE << clk->enable_shift; +	__raw_writel(reg, clk->enable_reg); +} + +/* + * For the 4-to-1 muxed input clock + */ +static inline u32 _get_mux(struct clk *parent, struct clk *m0, +			   struct clk *m1, struct clk *m2, struct clk *m3) +{ +	if (parent == m0) +		return 0; +	else if (parent == m1) +		return 1; +	else if (parent == m2) +		return 2; +	else if (parent == m3) +		return 3; +	else +		BUG(); + +	return -EINVAL; +} + +static inline void __iomem *_get_pll_base(struct clk *pll) +{ +	if (pll == &pll1_main_clk) +		return MX51_DPLL1_BASE; +	else if (pll == &pll2_sw_clk) +		return MX51_DPLL2_BASE; +	else if (pll == &pll3_sw_clk) +		return MX51_DPLL3_BASE; +	else +		BUG(); + +	return NULL; +} + +static unsigned long clk_pll_get_rate(struct clk *clk) +{ +	long mfi, mfn, mfd, pdf, ref_clk, mfn_abs; +	unsigned long dp_op, dp_mfd, dp_mfn, dp_ctl, pll_hfsm, dbl; +	void __iomem *pllbase; +	s64 temp; +	unsigned long parent_rate; + +	parent_rate = clk_get_rate(clk->parent); + +	pllbase = _get_pll_base(clk); + +	dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL); +	pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM; +	dbl = dp_ctl & MXC_PLL_DP_CTL_DPDCK0_2_EN; + +	if (pll_hfsm == 0) { +		dp_op = __raw_readl(pllbase + MXC_PLL_DP_OP); +		dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_MFD); +		dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_MFN); +	} else { +		dp_op = __raw_readl(pllbase + MXC_PLL_DP_HFS_OP); +		dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFD); +		dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFN); +	} +	pdf = dp_op & MXC_PLL_DP_OP_PDF_MASK; +	mfi = (dp_op & MXC_PLL_DP_OP_MFI_MASK) >> MXC_PLL_DP_OP_MFI_OFFSET; +	mfi = (mfi <= 5) ? 5 : mfi; +	mfd = dp_mfd & MXC_PLL_DP_MFD_MASK; +	mfn = mfn_abs = dp_mfn & MXC_PLL_DP_MFN_MASK; +	/* Sign extend to 32-bits */ +	if (mfn >= 0x04000000) { +		mfn |= 0xFC000000; +		mfn_abs = -mfn; +	} + +	ref_clk = 2 * parent_rate; +	if (dbl != 0) +		ref_clk *= 2; + +	ref_clk /= (pdf + 1); +	temp = (u64) ref_clk * mfn_abs; +	do_div(temp, mfd + 1); +	if (mfn < 0) +		temp = -temp; +	temp = (ref_clk * mfi) + temp; + +	return temp; +} + +static int _clk_pll_set_rate(struct clk *clk, unsigned long rate) +{ +	u32 reg; +	void __iomem *pllbase; + +	long mfi, pdf, mfn, mfd = 999999; +	s64 temp64; +	unsigned long quad_parent_rate; +	unsigned long pll_hfsm, dp_ctl; +	unsigned long parent_rate; + +	parent_rate = clk_get_rate(clk->parent); + +	pllbase = _get_pll_base(clk); + +	quad_parent_rate = 4 * parent_rate; +	pdf = mfi = -1; +	while (++pdf < 16 && mfi < 5) +		mfi = rate * (pdf+1) / quad_parent_rate; +	if (mfi > 15) +		return -EINVAL; +	pdf--; + +	temp64 = rate * (pdf+1) - quad_parent_rate * mfi; +	do_div(temp64, quad_parent_rate/1000000); +	mfn = (long)temp64; + +	dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL); +	/* use dpdck0_2 */ +	__raw_writel(dp_ctl | 0x1000L, pllbase + MXC_PLL_DP_CTL); +	pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM; +	if (pll_hfsm == 0) { +		reg = mfi << 4 | pdf; +		__raw_writel(reg, pllbase + MXC_PLL_DP_OP); +		__raw_writel(mfd, pllbase + MXC_PLL_DP_MFD); +		__raw_writel(mfn, pllbase + MXC_PLL_DP_MFN); +	} else { +		reg = mfi << 4 | pdf; +		__raw_writel(reg, pllbase + MXC_PLL_DP_HFS_OP); +		__raw_writel(mfd, pllbase + MXC_PLL_DP_HFS_MFD); +		__raw_writel(mfn, pllbase + MXC_PLL_DP_HFS_MFN); +	} + +	return 0; +} + +static int _clk_pll_enable(struct clk *clk) +{ +	u32 reg; +	void __iomem *pllbase; +	int i = 0; + +	pllbase = _get_pll_base(clk); +	reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) | MXC_PLL_DP_CTL_UPEN; +	__raw_writel(reg, pllbase + MXC_PLL_DP_CTL); + +	/* Wait for lock */ +	do { +		reg = __raw_readl(pllbase + MXC_PLL_DP_CTL); +		if (reg & MXC_PLL_DP_CTL_LRF) +			break; + +		udelay(1); +	} while (++i < MAX_DPLL_WAIT_TRIES); + +	if (i == MAX_DPLL_WAIT_TRIES) { +		pr_err("MX5: pll locking failed\n"); +		return -EINVAL; +	} + +	return 0; +} + +static void _clk_pll_disable(struct clk *clk) +{ +	u32 reg; +	void __iomem *pllbase; + +	pllbase = _get_pll_base(clk); +	reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) & ~MXC_PLL_DP_CTL_UPEN; +	__raw_writel(reg, pllbase + MXC_PLL_DP_CTL); +} + +static int _clk_pll1_sw_set_parent(struct clk *clk, struct clk *parent) +{ +	u32 reg, step; + +	reg = __raw_readl(MXC_CCM_CCSR); + +	/* When switching from pll_main_clk to a bypass clock, first select a +	 * multiplexed clock in 'step_sel', then shift the glitchless mux +	 * 'pll1_sw_clk_sel'. +	 * +	 * When switching back, do it in reverse order +	 */ +	if (parent == &pll1_main_clk) { +		/* Switch to pll1_main_clk */ +		reg &= ~MXC_CCM_CCSR_PLL1_SW_CLK_SEL; +		__raw_writel(reg, MXC_CCM_CCSR); +		/* step_clk mux switched to lp_apm, to save power. */ +		reg = __raw_readl(MXC_CCM_CCSR); +		reg &= ~MXC_CCM_CCSR_STEP_SEL_MASK; +		reg |= (MXC_CCM_CCSR_STEP_SEL_LP_APM << +				MXC_CCM_CCSR_STEP_SEL_OFFSET); +	} else { +		if (parent == &lp_apm_clk) { +			step = MXC_CCM_CCSR_STEP_SEL_LP_APM; +		} else  if (parent == &pll2_sw_clk) { +			step = MXC_CCM_CCSR_STEP_SEL_PLL2_DIVIDED; +		} else  if (parent == &pll3_sw_clk) { +			step = MXC_CCM_CCSR_STEP_SEL_PLL3_DIVIDED; +		} else +			return -EINVAL; + +		reg &= ~MXC_CCM_CCSR_STEP_SEL_MASK; +		reg |= (step << MXC_CCM_CCSR_STEP_SEL_OFFSET); + +		__raw_writel(reg, MXC_CCM_CCSR); +		/* Switch to step_clk */ +		reg = __raw_readl(MXC_CCM_CCSR); +		reg |= MXC_CCM_CCSR_PLL1_SW_CLK_SEL; +	} +	__raw_writel(reg, MXC_CCM_CCSR); +	return 0; +} + +static unsigned long clk_pll1_sw_get_rate(struct clk *clk) +{ +	u32 reg, div; +	unsigned long parent_rate; + +	parent_rate = clk_get_rate(clk->parent); + +	reg = __raw_readl(MXC_CCM_CCSR); + +	if (clk->parent == &pll2_sw_clk) { +		div = ((reg & MXC_CCM_CCSR_PLL2_PODF_MASK) >> +		       MXC_CCM_CCSR_PLL2_PODF_OFFSET) + 1; +	} else if (clk->parent == &pll3_sw_clk) { +		div = ((reg & MXC_CCM_CCSR_PLL3_PODF_MASK) >> +		       MXC_CCM_CCSR_PLL3_PODF_OFFSET) + 1; +	} else +		div = 1; +	return parent_rate / div; +} + +static int _clk_pll2_sw_set_parent(struct clk *clk, struct clk *parent) +{ +	u32 reg; + +	reg = __raw_readl(MXC_CCM_CCSR); + +	if (parent == &pll2_sw_clk) +		reg &= ~MXC_CCM_CCSR_PLL2_SW_CLK_SEL; +	else +		reg |= MXC_CCM_CCSR_PLL2_SW_CLK_SEL; + +	__raw_writel(reg, MXC_CCM_CCSR); +	return 0; +} + +static int _clk_lp_apm_set_parent(struct clk *clk, struct clk *parent) +{ +	u32 reg; + +	if (parent == &osc_clk) +		reg = __raw_readl(MXC_CCM_CCSR) & ~MXC_CCM_CCSR_LP_APM_SEL; +	else +		return -EINVAL; + +	__raw_writel(reg, MXC_CCM_CCSR); + +	return 0; +} + +static unsigned long clk_arm_get_rate(struct clk *clk) +{ +	u32 cacrr, div; +	unsigned long parent_rate; + +	parent_rate = clk_get_rate(clk->parent); +	cacrr = __raw_readl(MXC_CCM_CACRR); +	div = (cacrr & MXC_CCM_CACRR_ARM_PODF_MASK) + 1; + +	return parent_rate / div; +} + +static int _clk_periph_apm_set_parent(struct clk *clk, struct clk *parent) +{ +	u32 reg, mux; +	int i = 0; + +	mux = _get_mux(parent, &pll1_sw_clk, &pll3_sw_clk, &lp_apm_clk, NULL); + +	reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_PERIPH_CLK_SEL_MASK; +	reg |= mux << MXC_CCM_CBCMR_PERIPH_CLK_SEL_OFFSET; +	__raw_writel(reg, MXC_CCM_CBCMR); + +	/* Wait for lock */ +	do { +		reg = __raw_readl(MXC_CCM_CDHIPR); +		if (!(reg &  MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY)) +			break; + +		udelay(1); +	} while (++i < MAX_DPLL_WAIT_TRIES); + +	if (i == MAX_DPLL_WAIT_TRIES) { +		pr_err("MX5: Set parent for periph_apm clock failed\n"); +		return -EINVAL; +	} + +	return 0; +} + +static int _clk_main_bus_set_parent(struct clk *clk, struct clk *parent) +{ +	u32 reg; + +	reg = __raw_readl(MXC_CCM_CBCDR); + +	if (parent == &pll2_sw_clk) +		reg &= ~MXC_CCM_CBCDR_PERIPH_CLK_SEL; +	else if (parent == &periph_apm_clk) +		reg |= MXC_CCM_CBCDR_PERIPH_CLK_SEL; +	else +		return -EINVAL; + +	__raw_writel(reg, MXC_CCM_CBCDR); + +	return 0; +} + +static struct clk main_bus_clk = { +	.parent = &pll2_sw_clk, +	.set_parent = _clk_main_bus_set_parent, +}; + +static unsigned long clk_ahb_get_rate(struct clk *clk) +{ +	u32 reg, div; +	unsigned long parent_rate; + +	parent_rate = clk_get_rate(clk->parent); + +	reg = __raw_readl(MXC_CCM_CBCDR); +	div = ((reg & MXC_CCM_CBCDR_AHB_PODF_MASK) >> +	       MXC_CCM_CBCDR_AHB_PODF_OFFSET) + 1; +	return parent_rate / div; +} + + +static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate) +{ +	u32 reg, div; +	unsigned long parent_rate; +	int i = 0; + +	parent_rate = clk_get_rate(clk->parent); + +	div = parent_rate / rate; +	if (div > 8 || div < 1 || ((parent_rate / div) != rate)) +		return -EINVAL; + +	reg = __raw_readl(MXC_CCM_CBCDR); +	reg &= ~MXC_CCM_CBCDR_AHB_PODF_MASK; +	reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET; +	__raw_writel(reg, MXC_CCM_CBCDR); + +	/* Wait for lock */ +	do { +		reg = __raw_readl(MXC_CCM_CDHIPR); +		if (!(reg & MXC_CCM_CDHIPR_AHB_PODF_BUSY)) +			break; + +		udelay(1); +	} while (++i < MAX_DPLL_WAIT_TRIES); + +	if (i == MAX_DPLL_WAIT_TRIES) { +		pr_err("MX5: clk_ahb_set_rate failed\n"); +		return -EINVAL; +	} + +	return 0; +} + +static unsigned long _clk_ahb_round_rate(struct clk *clk, +						unsigned long rate) +{ +	u32 div; +	unsigned long parent_rate; + +	parent_rate = clk_get_rate(clk->parent); + +	div = parent_rate / rate; +	if (div > 8) +		div = 8; +	else if (div == 0) +		div++; +	return parent_rate / div; +} + + +static int _clk_max_enable(struct clk *clk) +{ +	u32 reg; + +	_clk_ccgr_enable(clk); + +	/* Handshake with MAX when LPM is entered. */ +	reg = __raw_readl(MXC_CCM_CLPCR); +	reg &= ~MXC_CCM_CLPCR_BYPASS_MAX_LPM_HS; +	__raw_writel(reg, MXC_CCM_CLPCR); + +	return 0; +} + +static void _clk_max_disable(struct clk *clk) +{ +	u32 reg; + +	_clk_ccgr_disable_inwait(clk); + +	/* No Handshake with MAX when LPM is entered as its disabled. */ +	reg = __raw_readl(MXC_CCM_CLPCR); +	reg |= MXC_CCM_CLPCR_BYPASS_MAX_LPM_HS; +	__raw_writel(reg, MXC_CCM_CLPCR); +} + +static unsigned long clk_ipg_get_rate(struct clk *clk) +{ +	u32 reg, div; +	unsigned long parent_rate; + +	parent_rate = clk_get_rate(clk->parent); + +	reg = __raw_readl(MXC_CCM_CBCDR); +	div = ((reg & MXC_CCM_CBCDR_IPG_PODF_MASK) >> +	       MXC_CCM_CBCDR_IPG_PODF_OFFSET) + 1; + +	return parent_rate / div; +} + +static unsigned long clk_ipg_per_get_rate(struct clk *clk) +{ +	u32 reg, prediv1, prediv2, podf; +	unsigned long parent_rate; + +	parent_rate = clk_get_rate(clk->parent); + +	if (clk->parent == &main_bus_clk || clk->parent == &lp_apm_clk) { +		/* the main_bus_clk is the one before the DVFS engine */ +		reg = __raw_readl(MXC_CCM_CBCDR); +		prediv1 = ((reg & MXC_CCM_CBCDR_PERCLK_PRED1_MASK) >> +			   MXC_CCM_CBCDR_PERCLK_PRED1_OFFSET) + 1; +		prediv2 = ((reg & MXC_CCM_CBCDR_PERCLK_PRED2_MASK) >> +			   MXC_CCM_CBCDR_PERCLK_PRED2_OFFSET) + 1; +		podf = ((reg & MXC_CCM_CBCDR_PERCLK_PODF_MASK) >> +			MXC_CCM_CBCDR_PERCLK_PODF_OFFSET) + 1; +		return parent_rate / (prediv1 * prediv2 * podf); +	} else if (clk->parent == &ipg_clk) +		return parent_rate; +	else +		BUG(); +} + +static int _clk_ipg_per_set_parent(struct clk *clk, struct clk *parent) +{ +	u32 reg; + +	reg = __raw_readl(MXC_CCM_CBCMR); + +	reg &= ~MXC_CCM_CBCMR_PERCLK_LP_APM_CLK_SEL; +	reg &= ~MXC_CCM_CBCMR_PERCLK_IPG_CLK_SEL; + +	if (parent == &ipg_clk) +		reg |= MXC_CCM_CBCMR_PERCLK_IPG_CLK_SEL; +	else if (parent == &lp_apm_clk) +		reg |= MXC_CCM_CBCMR_PERCLK_LP_APM_CLK_SEL; +	else if (parent != &main_bus_clk) +		return -EINVAL; + +	__raw_writel(reg, MXC_CCM_CBCMR); + +	return 0; +} + +static unsigned long clk_uart_get_rate(struct clk *clk) +{ +	u32 reg, prediv, podf; +	unsigned long parent_rate; + +	parent_rate = clk_get_rate(clk->parent); + +	reg = __raw_readl(MXC_CCM_CSCDR1); +	prediv = ((reg & MXC_CCM_CSCDR1_UART_CLK_PRED_MASK) >> +		  MXC_CCM_CSCDR1_UART_CLK_PRED_OFFSET) + 1; +	podf = ((reg & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK) >> +		MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET) + 1; + +	return parent_rate / (prediv * podf); +} + +static int _clk_uart_set_parent(struct clk *clk, struct clk *parent) +{ +	u32 reg, mux; + +	mux = _get_mux(parent, &pll1_sw_clk, &pll2_sw_clk, &pll3_sw_clk, +		       &lp_apm_clk); +	reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_UART_CLK_SEL_MASK; +	reg |= mux << MXC_CCM_CSCMR1_UART_CLK_SEL_OFFSET; +	__raw_writel(reg, MXC_CCM_CSCMR1); + +	return 0; +} + +static unsigned long get_high_reference_clock_rate(struct clk *clk) +{ +	return external_high_reference; +} + +static unsigned long get_low_reference_clock_rate(struct clk *clk) +{ +	return external_low_reference; +} + +static unsigned long get_oscillator_reference_clock_rate(struct clk *clk) +{ +	return oscillator_reference; +} + +static unsigned long get_ckih2_reference_clock_rate(struct clk *clk) +{ +	return ckih2_reference; +} + +/* External high frequency clock */ +static struct clk ckih_clk = { +	.get_rate = get_high_reference_clock_rate, +}; + +static struct clk ckih2_clk = { +	.get_rate = get_ckih2_reference_clock_rate, +}; + +static struct clk osc_clk = { +	.get_rate = get_oscillator_reference_clock_rate, +}; + +/* External low frequency (32kHz) clock */ +static struct clk ckil_clk = { +	.get_rate = get_low_reference_clock_rate, +}; + +static struct clk pll1_main_clk = { +	.parent = &osc_clk, +	.get_rate = clk_pll_get_rate, +	.enable = _clk_pll_enable, +	.disable = _clk_pll_disable, +}; + +/* Clock tree block diagram (WIP): + * 	CCM: Clock Controller Module + * + * PLL output -> | + *               | CCM Switcher -> CCM_CLK_ROOT_GEN -> + * PLL bypass -> | + * + */ + +/* PLL1 SW supplies to ARM core */ +static struct clk pll1_sw_clk = { +	.parent = &pll1_main_clk, +	.set_parent = _clk_pll1_sw_set_parent, +	.get_rate = clk_pll1_sw_get_rate, +}; + +/* PLL2 SW supplies to AXI/AHB/IP buses */ +static struct clk pll2_sw_clk = { +	.parent = &osc_clk, +	.get_rate = clk_pll_get_rate, +	.set_rate = _clk_pll_set_rate, +	.set_parent = _clk_pll2_sw_set_parent, +	.enable = _clk_pll_enable, +	.disable = _clk_pll_disable, +}; + +/* PLL3 SW supplies to serial clocks like USB, SSI, etc. */ +static struct clk pll3_sw_clk = { +	.parent = &osc_clk, +	.set_rate = _clk_pll_set_rate, +	.get_rate = clk_pll_get_rate, +	.enable = _clk_pll_enable, +	.disable = _clk_pll_disable, +}; + +/* Low-power Audio Playback Mode clock */ +static struct clk lp_apm_clk = { +	.parent = &osc_clk, +	.set_parent = _clk_lp_apm_set_parent, +}; + +static struct clk periph_apm_clk = { +	.parent = &pll1_sw_clk, +	.set_parent = _clk_periph_apm_set_parent, +}; + +static struct clk cpu_clk = { +	.parent = &pll1_sw_clk, +	.get_rate = clk_arm_get_rate, +}; + +static struct clk ahb_clk = { +	.parent = &main_bus_clk, +	.get_rate = clk_ahb_get_rate, +	.set_rate = _clk_ahb_set_rate, +	.round_rate = _clk_ahb_round_rate, +}; + +/* Main IP interface clock for access to registers */ +static struct clk ipg_clk = { +	.parent = &ahb_clk, +	.get_rate = clk_ipg_get_rate, +}; + +static struct clk ipg_perclk = { +	.parent = &lp_apm_clk, +	.get_rate = clk_ipg_per_get_rate, +	.set_parent = _clk_ipg_per_set_parent, +}; + +static struct clk uart_root_clk = { +	.parent = &pll2_sw_clk, +	.get_rate = clk_uart_get_rate, +	.set_parent = _clk_uart_set_parent, +}; + +static struct clk ahb_max_clk = { +	.parent = &ahb_clk, +	.enable_reg = MXC_CCM_CCGR0, +	.enable_shift = MXC_CCM_CCGRx_CG14_OFFSET, +	.enable = _clk_max_enable, +	.disable = _clk_max_disable, +}; + +static struct clk aips_tz1_clk = { +	.parent = &ahb_clk, +	.secondary = &ahb_max_clk, +	.enable_reg = MXC_CCM_CCGR0, +	.enable_shift = MXC_CCM_CCGRx_CG12_OFFSET, +	.enable = _clk_ccgr_enable, +	.disable = _clk_ccgr_disable_inwait, +}; + +static struct clk aips_tz2_clk = { +	.parent = &ahb_clk, +	.secondary = &ahb_max_clk, +	.enable_reg = MXC_CCM_CCGR0, +	.enable_shift = MXC_CCM_CCGRx_CG13_OFFSET, +	.enable = _clk_ccgr_enable, +	.disable = _clk_ccgr_disable_inwait, +}; + +static struct clk gpt_32k_clk = { +	.id = 0, +	.parent = &ckil_clk, +}; + +#define DEFINE_CLOCK(name, i, er, es, gr, sr, p, s)	\ +	static struct clk name = {			\ +		.id		= i,			\ +		.enable_reg	= er,			\ +		.enable_shift	= es,			\ +		.get_rate	= gr,			\ +		.set_rate	= sr,			\ +		.enable		= _clk_ccgr_enable,	\ +		.disable	= _clk_ccgr_disable,	\ +		.parent		= p,			\ +		.secondary	= s,			\ +	} + +/* DEFINE_CLOCK(name, id, enable_reg, enable_shift, +   get_rate, set_rate, parent, secondary); */ + +/* Shared peripheral bus arbiter */ +DEFINE_CLOCK(spba_clk, 0, MXC_CCM_CCGR5, MXC_CCM_CCGRx_CG0_OFFSET, +	NULL,  NULL, &ipg_clk, NULL); + +/* UART */ +DEFINE_CLOCK(uart1_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG4_OFFSET, +	NULL,  NULL, &uart_root_clk, NULL); +DEFINE_CLOCK(uart2_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG6_OFFSET, +	NULL,  NULL, &uart_root_clk, NULL); +DEFINE_CLOCK(uart3_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG8_OFFSET, +	NULL,  NULL, &uart_root_clk, NULL); +DEFINE_CLOCK(uart1_ipg_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG3_OFFSET, +	NULL,  NULL, &ipg_clk, &aips_tz1_clk); +DEFINE_CLOCK(uart2_ipg_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG5_OFFSET, +	NULL,  NULL, &ipg_clk, &aips_tz1_clk); +DEFINE_CLOCK(uart3_ipg_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG7_OFFSET, +	NULL,  NULL, &ipg_clk, &spba_clk); + +/* GPT */ +DEFINE_CLOCK(gpt_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG9_OFFSET, +	NULL,  NULL, &ipg_clk, NULL); +DEFINE_CLOCK(gpt_ipg_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG10_OFFSET, +	NULL,  NULL, &ipg_clk, NULL); + +/* FEC */ +DEFINE_CLOCK(fec_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG12_OFFSET, +	NULL,  NULL, &ipg_clk, NULL); + +#define _REGISTER_CLOCK(d, n, c) \ +       { \ +		.dev_id = d, \ +		.con_id = n, \ +		.clk = &c,   \ +       }, + +static struct clk_lookup 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) +{ +	u32 reg; + +	ipg_perclk.set_parent(&ipg_perclk, &lp_apm_clk); + +	/* +	 * Initialise the IPG PER CLK dividers to 3. IPG_PER_CLK should be at +	 * 8MHz, its derived from lp_apm. +	 * +	 * FIXME: Verify if true for all boards +	 */ +	reg = __raw_readl(MXC_CCM_CBCDR); +	reg &= ~MXC_CCM_CBCDR_PERCLK_PRED1_MASK; +	reg &= ~MXC_CCM_CBCDR_PERCLK_PRED2_MASK; +	reg &= ~MXC_CCM_CBCDR_PERCLK_PODF_MASK; +	reg |= (2 << MXC_CCM_CBCDR_PERCLK_PRED1_OFFSET); +	__raw_writel(reg, MXC_CCM_CBCDR); +} + +int __init mx51_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(lookups); i++) +		clkdev_add(&lookups[i]); + +	clk_tree_init(); + +	clk_enable(&cpu_clk); +	clk_enable(&main_bus_clk); + +	/* System timer */ +	mxc_timer_init(&gpt_clk, MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR), +		MX51_MXC_INT_GPT); +	return 0; +} diff --git a/arch/arm/mach-mx5/cpu.c b/arch/arm/mach-mx5/cpu.c new file mode 100644 index 00000000000..2d37785e385 --- /dev/null +++ b/arch/arm/mach-mx5/cpu.c @@ -0,0 +1,100 @@ +/* + * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved. + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + * + * This file contains the CPU initialization code. + */ + +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/module.h> +#include <mach/hardware.h> +#include <asm/io.h> + +static int cpu_silicon_rev = -1; + +#define SI_REV 0x48 + +static void query_silicon_parameter(void) +{ +	void __iomem *rom = ioremap(MX51_IROM_BASE_ADDR, MX51_IROM_SIZE); +	u32 rev; + +	if (!rom) { +		cpu_silicon_rev = -EINVAL; +		return; +	} + +	rev = readl(rom + SI_REV); +	switch (rev) { +	case 0x1: +		cpu_silicon_rev = MX51_CHIP_REV_1_0; +		break; +	case 0x2: +		cpu_silicon_rev = MX51_CHIP_REV_1_1; +		break; +	case 0x10: +		cpu_silicon_rev = MX51_CHIP_REV_2_0; +		break; +	case 0x20: +		cpu_silicon_rev = MX51_CHIP_REV_3_0; +		break; +	default: +		cpu_silicon_rev = 0; +	} + +	iounmap(rom); +} + +/* + * Returns: + *	the silicon revision of the cpu + *	-EINVAL - not a mx51 + */ +int mx51_revision(void) +{ +	if (!cpu_is_mx51()) +		return -EINVAL; + +	if (cpu_silicon_rev == -1) +		query_silicon_parameter(); + +	return cpu_silicon_rev; +} +EXPORT_SYMBOL(mx51_revision); + +static int __init post_cpu_init(void) +{ +	unsigned int reg; +	void __iomem *base; + +	if (!cpu_is_mx51()) +		return 0; + +	base = MX51_IO_ADDRESS(MX51_AIPS1_BASE_ADDR); +	__raw_writel(0x0, base + 0x40); +	__raw_writel(0x0, base + 0x44); +	__raw_writel(0x0, base + 0x48); +	__raw_writel(0x0, base + 0x4C); +	reg = __raw_readl(base + 0x50) & 0x00FFFFFF; +	__raw_writel(reg, base + 0x50); + +	base = MX51_IO_ADDRESS(MX51_AIPS2_BASE_ADDR); +	__raw_writel(0x0, base + 0x40); +	__raw_writel(0x0, base + 0x44); +	__raw_writel(0x0, base + 0x48); +	__raw_writel(0x0, base + 0x4C); +	reg = __raw_readl(base + 0x50) & 0x00FFFFFF; +	__raw_writel(reg, base + 0x50); + +	return 0; +} + +postcore_initcall(post_cpu_init); diff --git a/arch/arm/mach-mx5/crm_regs.h b/arch/arm/mach-mx5/crm_regs.h new file mode 100644 index 00000000000..c776b9af062 --- /dev/null +++ b/arch/arm/mach-mx5/crm_regs.h @@ -0,0 +1,583 @@ +/* + * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved. + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ +#ifndef __ARCH_ARM_MACH_MX51_CRM_REGS_H__ +#define __ARCH_ARM_MACH_MX51_CRM_REGS_H__ + +#define MX51_CCM_BASE		MX51_IO_ADDRESS(MX51_CCM_BASE_ADDR) +#define MX51_DPLL1_BASE		MX51_IO_ADDRESS(MX51_PLL1_BASE_ADDR) +#define MX51_DPLL2_BASE		MX51_IO_ADDRESS(MX51_PLL2_BASE_ADDR) +#define MX51_DPLL3_BASE		MX51_IO_ADDRESS(MX51_PLL3_BASE_ADDR) +#define MX51_CORTEXA8_BASE	MX51_IO_ADDRESS(MX51_ARM_BASE_ADDR) +#define MX51_GPC_BASE		MX51_IO_ADDRESS(MX51_GPC_BASE_ADDR) + +/* PLL Register Offsets */ +#define MXC_PLL_DP_CTL			0x00 +#define MXC_PLL_DP_CONFIG		0x04 +#define MXC_PLL_DP_OP			0x08 +#define MXC_PLL_DP_MFD			0x0C +#define MXC_PLL_DP_MFN			0x10 +#define MXC_PLL_DP_MFNMINUS		0x14 +#define MXC_PLL_DP_MFNPLUS		0x18 +#define MXC_PLL_DP_HFS_OP		0x1C +#define MXC_PLL_DP_HFS_MFD		0x20 +#define MXC_PLL_DP_HFS_MFN		0x24 +#define MXC_PLL_DP_MFN_TOGC		0x28 +#define MXC_PLL_DP_DESTAT		0x2c + +/* PLL Register Bit definitions */ +#define MXC_PLL_DP_CTL_MUL_CTRL		0x2000 +#define MXC_PLL_DP_CTL_DPDCK0_2_EN	0x1000 +#define MXC_PLL_DP_CTL_DPDCK0_2_OFFSET	12 +#define MXC_PLL_DP_CTL_ADE		0x800 +#define MXC_PLL_DP_CTL_REF_CLK_DIV	0x400 +#define MXC_PLL_DP_CTL_REF_CLK_SEL_MASK	(3 << 8) +#define MXC_PLL_DP_CTL_REF_CLK_SEL_OFFSET	8 +#define MXC_PLL_DP_CTL_HFSM		0x80 +#define MXC_PLL_DP_CTL_PRE		0x40 +#define MXC_PLL_DP_CTL_UPEN		0x20 +#define MXC_PLL_DP_CTL_RST		0x10 +#define MXC_PLL_DP_CTL_RCP		0x8 +#define MXC_PLL_DP_CTL_PLM		0x4 +#define MXC_PLL_DP_CTL_BRM0		0x2 +#define MXC_PLL_DP_CTL_LRF		0x1 + +#define MXC_PLL_DP_CONFIG_BIST		0x8 +#define MXC_PLL_DP_CONFIG_SJC_CE	0x4 +#define MXC_PLL_DP_CONFIG_AREN		0x2 +#define MXC_PLL_DP_CONFIG_LDREQ		0x1 + +#define MXC_PLL_DP_OP_MFI_OFFSET	4 +#define MXC_PLL_DP_OP_MFI_MASK		(0xF << 4) +#define MXC_PLL_DP_OP_PDF_OFFSET	0 +#define MXC_PLL_DP_OP_PDF_MASK		0xF + +#define MXC_PLL_DP_MFD_OFFSET		0 +#define MXC_PLL_DP_MFD_MASK		0x07FFFFFF + +#define MXC_PLL_DP_MFN_OFFSET		0x0 +#define MXC_PLL_DP_MFN_MASK		0x07FFFFFF + +#define MXC_PLL_DP_MFN_TOGC_TOG_DIS	(1 << 17) +#define MXC_PLL_DP_MFN_TOGC_TOG_EN	(1 << 16) +#define MXC_PLL_DP_MFN_TOGC_CNT_OFFSET	0x0 +#define MXC_PLL_DP_MFN_TOGC_CNT_MASK	0xFFFF + +#define MXC_PLL_DP_DESTAT_TOG_SEL	(1 << 31) +#define MXC_PLL_DP_DESTAT_MFN		0x07FFFFFF + +/* Register addresses of CCM*/ +#define MXC_CCM_CCR		(MX51_CCM_BASE + 0x00) +#define MXC_CCM_CCDR		(MX51_CCM_BASE + 0x04) +#define MXC_CCM_CSR		(MX51_CCM_BASE + 0x08) +#define MXC_CCM_CCSR		(MX51_CCM_BASE + 0x0C) +#define MXC_CCM_CACRR		(MX51_CCM_BASE + 0x10) +#define MXC_CCM_CBCDR		(MX51_CCM_BASE + 0x14) +#define MXC_CCM_CBCMR		(MX51_CCM_BASE + 0x18) +#define MXC_CCM_CSCMR1		(MX51_CCM_BASE + 0x1C) +#define MXC_CCM_CSCMR2		(MX51_CCM_BASE + 0x20) +#define MXC_CCM_CSCDR1		(MX51_CCM_BASE + 0x24) +#define MXC_CCM_CS1CDR		(MX51_CCM_BASE + 0x28) +#define MXC_CCM_CS2CDR		(MX51_CCM_BASE + 0x2C) +#define MXC_CCM_CDCDR		(MX51_CCM_BASE + 0x30) +#define MXC_CCM_CHSCDR		(MX51_CCM_BASE + 0x34) +#define MXC_CCM_CSCDR2		(MX51_CCM_BASE + 0x38) +#define MXC_CCM_CSCDR3		(MX51_CCM_BASE + 0x3C) +#define MXC_CCM_CSCDR4		(MX51_CCM_BASE + 0x40) +#define MXC_CCM_CWDR		(MX51_CCM_BASE + 0x44) +#define MXC_CCM_CDHIPR		(MX51_CCM_BASE + 0x48) +#define MXC_CCM_CDCR		(MX51_CCM_BASE + 0x4C) +#define MXC_CCM_CTOR		(MX51_CCM_BASE + 0x50) +#define MXC_CCM_CLPCR		(MX51_CCM_BASE + 0x54) +#define MXC_CCM_CISR		(MX51_CCM_BASE + 0x58) +#define MXC_CCM_CIMR		(MX51_CCM_BASE + 0x5C) +#define MXC_CCM_CCOSR		(MX51_CCM_BASE + 0x60) +#define MXC_CCM_CGPR		(MX51_CCM_BASE + 0x64) +#define MXC_CCM_CCGR0		(MX51_CCM_BASE + 0x68) +#define MXC_CCM_CCGR1		(MX51_CCM_BASE + 0x6C) +#define MXC_CCM_CCGR2		(MX51_CCM_BASE + 0x70) +#define MXC_CCM_CCGR3		(MX51_CCM_BASE + 0x74) +#define MXC_CCM_CCGR4		(MX51_CCM_BASE + 0x78) +#define MXC_CCM_CCGR5		(MX51_CCM_BASE + 0x7C) +#define MXC_CCM_CCGR6		(MX51_CCM_BASE + 0x80) +#define MXC_CCM_CMEOR		(MX51_CCM_BASE + 0x84) + +/* Define the bits in register CCR */ +#define MXC_CCM_CCR_COSC_EN		(1 << 12) +#define MXC_CCM_CCR_FPM_MULT_MASK	(1 << 11) +#define MXC_CCM_CCR_CAMP2_EN		(1 << 10) +#define MXC_CCM_CCR_CAMP1_EN		(1 << 9) +#define MXC_CCM_CCR_FPM_EN		(1 << 8) +#define MXC_CCM_CCR_OSCNT_OFFSET	(0) +#define MXC_CCM_CCR_OSCNT_MASK	(0xFF) + +/* Define the bits in register CCDR */ +#define MXC_CCM_CCDR_HSC_HS_MASK	(0x1 << 18) +#define MXC_CCM_CCDR_IPU_HS_MASK	(0x1 << 17) +#define MXC_CCM_CCDR_EMI_HS_MASK	(0x1 << 16) + +/* Define the bits in register CSR */ +#define MXC_CCM_CSR_COSR_READY	(1 << 5) +#define MXC_CCM_CSR_LVS_VALUE	(1 << 4) +#define MXC_CCM_CSR_CAMP2_READY	(1 << 3) +#define MXC_CCM_CSR_CAMP1_READY	(1 << 2) +#define MXC_CCM_CSR_FPM_READY	(1 << 1) +#define MXC_CCM_CSR_REF_EN_B	(1 << 0) + +/* Define the bits in register CCSR */ +#define MXC_CCM_CCSR_LP_APM_SEL		(0x1 << 9) +#define MXC_CCM_CCSR_STEP_SEL_OFFSET	(7) +#define MXC_CCM_CCSR_STEP_SEL_MASK	(0x3 << 7) +#define MXC_CCM_CCSR_STEP_SEL_LP_APM	   0 +#define MXC_CCM_CCSR_STEP_SEL_PLL1_BYPASS  1 /* Only when JTAG connected? */ +#define MXC_CCM_CCSR_STEP_SEL_PLL2_DIVIDED 2 +#define MXC_CCM_CCSR_STEP_SEL_PLL3_DIVIDED 3 +#define MXC_CCM_CCSR_PLL2_PODF_OFFSET	(5) +#define MXC_CCM_CCSR_PLL2_PODF_MASK	(0x3 << 5) +#define MXC_CCM_CCSR_PLL3_PODF_OFFSET	(3) +#define MXC_CCM_CCSR_PLL3_PODF_MASK	(0x3 << 3) +#define MXC_CCM_CCSR_PLL1_SW_CLK_SEL	(1 << 2) /* 0: pll1_main_clk, +						    1: step_clk */ +#define MXC_CCM_CCSR_PLL2_SW_CLK_SEL	(1 << 1) +#define MXC_CCM_CCSR_PLL3_SW_CLK_SEL	(1 << 0) + +/* Define the bits in register CACRR */ +#define MXC_CCM_CACRR_ARM_PODF_OFFSET	(0) +#define MXC_CCM_CACRR_ARM_PODF_MASK	(0x7) + +/* Define the bits in register CBCDR */ +#define MXC_CCM_CBCDR_EMI_CLK_SEL		(0x1 << 26) +#define MXC_CCM_CBCDR_PERIPH_CLK_SEL		(0x1 << 25) +#define MXC_CCM_CBCDR_DDR_HF_SEL_OFFSET		(30) +#define MXC_CCM_CBCDR_DDR_HF_SEL		(0x1 << 30) +#define MXC_CCM_CBCDR_DDR_PODF_OFFSET		(27) +#define MXC_CCM_CBCDR_DDR_PODF_MASK		(0x7 << 27) +#define MXC_CCM_CBCDR_EMI_PODF_OFFSET		(22) +#define MXC_CCM_CBCDR_EMI_PODF_MASK		(0x7 << 22) +#define MXC_CCM_CBCDR_AXI_B_PODF_OFFSET		(19) +#define MXC_CCM_CBCDR_AXI_B_PODF_MASK		(0x7 << 19) +#define MXC_CCM_CBCDR_AXI_A_PODF_OFFSET		(16) +#define MXC_CCM_CBCDR_AXI_A_PODF_MASK		(0x7 << 16) +#define MXC_CCM_CBCDR_NFC_PODF_OFFSET		(13) +#define MXC_CCM_CBCDR_NFC_PODF_MASK		(0x7 << 13) +#define MXC_CCM_CBCDR_AHB_PODF_OFFSET		(10) +#define MXC_CCM_CBCDR_AHB_PODF_MASK		(0x7 << 10) +#define MXC_CCM_CBCDR_IPG_PODF_OFFSET		(8) +#define MXC_CCM_CBCDR_IPG_PODF_MASK		(0x3 << 8) +#define MXC_CCM_CBCDR_PERCLK_PRED1_OFFSET	(6) +#define MXC_CCM_CBCDR_PERCLK_PRED1_MASK		(0x3 << 6) +#define MXC_CCM_CBCDR_PERCLK_PRED2_OFFSET	(3) +#define MXC_CCM_CBCDR_PERCLK_PRED2_MASK		(0x7 << 3) +#define MXC_CCM_CBCDR_PERCLK_PODF_OFFSET	(0) +#define MXC_CCM_CBCDR_PERCLK_PODF_MASK		(0x7) + +/* Define the bits in register CBCMR */ +#define MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_OFFSET	(14) +#define MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_MASK	(0x3 << 14) +#define MXC_CCM_CBCMR_PERIPH_CLK_SEL_OFFSET	(12) +#define MXC_CCM_CBCMR_PERIPH_CLK_SEL_MASK	(0x3 << 12) +#define MXC_CCM_CBCMR_DDR_CLK_SEL_OFFSET	(10) +#define MXC_CCM_CBCMR_DDR_CLK_SEL_MASK		(0x3 << 10) +#define MXC_CCM_CBCMR_ARM_AXI_CLK_SEL_OFFSET	(8) +#define MXC_CCM_CBCMR_ARM_AXI_CLK_SEL_MASK	(0x3 << 8) +#define MXC_CCM_CBCMR_IPU_HSP_CLK_SEL_OFFSET	(6) +#define MXC_CCM_CBCMR_IPU_HSP_CLK_SEL_MASK	(0x3 << 6) +#define MXC_CCM_CBCMR_GPU_CLK_SEL_OFFSET	(4) +#define MXC_CCM_CBCMR_GPU_CLK_SEL_MASK		(0x3 << 4) +#define MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET	(14) +#define MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK	(0x3 << 14) +#define MXC_CCM_CBCMR_PERCLK_LP_APM_CLK_SEL	(0x1 << 1) +#define MXC_CCM_CBCMR_PERCLK_IPG_CLK_SEL	(0x1 << 0) + +/* Define the bits in register CSCMR1 */ +#define MXC_CCM_CSCMR1_SSI_EXT2_CLK_SEL_OFFSET		(30) +#define MXC_CCM_CSCMR1_SSI_EXT2_CLK_SEL_MASK		(0x3 << 30) +#define MXC_CCM_CSCMR1_SSI_EXT1_CLK_SEL_OFFSET		(28) +#define MXC_CCM_CSCMR1_SSI_EXT1_CLK_SEL_MASK		(0x3 << 28) +#define MXC_CCM_CSCMR1_USB_PHY_CLK_SEL_OFFSET		(26) +#define MXC_CCM_CSCMR1_USB_PHY_CLK_SEL			(0x1 << 26) +#define MXC_CCM_CSCMR1_UART_CLK_SEL_OFFSET		(24) +#define MXC_CCM_CSCMR1_UART_CLK_SEL_MASK		(0x3 << 24) +#define MXC_CCM_CSCMR1_USBOH3_CLK_SEL_OFFSET		(22) +#define MXC_CCM_CSCMR1_USBOH3_CLK_SEL_MASK		(0x3 << 22) +#define MXC_CCM_CSCMR1_ESDHC1_MSHC1_CLK_SEL_OFFSET	(20) +#define MXC_CCM_CSCMR1_ESDHC1_MSHC1_CLK_SEL_MASK	(0x3 << 20) +#define MXC_CCM_CSCMR1_ESDHC3_CLK_SEL			(0x1 << 19) +#define MXC_CCM_CSCMR1_ESDHC4_CLK_SEL			(0x1 << 18) +#define MXC_CCM_CSCMR1_ESDHC2_MSHC2_CLK_SEL_OFFSET	(16) +#define MXC_CCM_CSCMR1_ESDHC2_MSHC2_CLK_SEL_MASK	(0x3 << 16) +#define MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET		(14) +#define MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK		(0x3 << 14) +#define MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET		(12) +#define MXC_CCM_CSCMR1_SSI2_CLK_SEL_MASK		(0x3 << 12) +#define MXC_CCM_CSCMR1_SSI3_CLK_SEL			(0x1 << 11) +#define MXC_CCM_CSCMR1_VPU_RCLK_SEL			(0x1 << 10) +#define MXC_CCM_CSCMR1_SSI_APM_CLK_SEL_OFFSET		(8) +#define MXC_CCM_CSCMR1_SSI_APM_CLK_SEL_MASK		(0x3 << 8) +#define MXC_CCM_CSCMR1_TVE_CLK_SEL			(0x1 << 7) +#define MXC_CCM_CSCMR1_TVE_EXT_CLK_SEL			(0x1 << 6) +#define MXC_CCM_CSCMR1_CSPI_CLK_SEL_OFFSET		(4) +#define MXC_CCM_CSCMR1_CSPI_CLK_SEL_MASK		(0x3 << 4) +#define MXC_CCM_CSCMR1_SPDIF_CLK_SEL_OFFSET		(2) +#define MXC_CCM_CSCMR1_SPDIF_CLK_SEL_MASK		(0x3 << 2) +#define MXC_CCM_CSCMR1_SSI_EXT2_COM_CLK_SEL		(0x1 << 1) +#define MXC_CCM_CSCMR1_SSI_EXT1_COM_CLK_SEL		(0x1) + +/* Define the bits in register CSCMR2 */ +#define MXC_CCM_CSCMR2_DI_CLK_SEL_OFFSET(n)		(26+n*3) +#define MXC_CCM_CSCMR2_DI_CLK_SEL_MASK(n)		(0x7 << (26+n*3)) +#define MXC_CCM_CSCMR2_CSI_MCLK2_CLK_SEL_OFFSET		(24) +#define MXC_CCM_CSCMR2_CSI_MCLK2_CLK_SEL_MASK		(0x3 << 24) +#define MXC_CCM_CSCMR2_CSI_MCLK1_CLK_SEL_OFFSET		(22) +#define MXC_CCM_CSCMR2_CSI_MCLK1_CLK_SEL_MASK		(0x3 << 22) +#define MXC_CCM_CSCMR2_ESC_CLK_SEL_OFFSET		(20) +#define MXC_CCM_CSCMR2_ESC_CLK_SEL_MASK			(0x3 << 20) +#define MXC_CCM_CSCMR2_HSC2_CLK_SEL_OFFSET		(18) +#define MXC_CCM_CSCMR2_HSC2_CLK_SEL_MASK		(0x3 << 18) +#define MXC_CCM_CSCMR2_HSC1_CLK_SEL_OFFSET		(16) +#define MXC_CCM_CSCMR2_HSC1_CLK_SEL_MASK		(0x3 << 16) +#define MXC_CCM_CSCMR2_HSI2C_CLK_SEL_OFFSET		(14) +#define MXC_CCM_CSCMR2_HSI2C_CLK_SEL_MASK		(0x3 << 14) +#define MXC_CCM_CSCMR2_FIRI_CLK_SEL_OFFSET		(12) +#define MXC_CCM_CSCMR2_FIRI_CLK_SEL_MASK		(0x3 << 12) +#define MXC_CCM_CSCMR2_SIM_CLK_SEL_OFFSET		(10) +#define MXC_CCM_CSCMR2_SIM_CLK_SEL_MASK			(0x3 << 10) +#define MXC_CCM_CSCMR2_SLIMBUS_COM			(0x1 << 9) +#define MXC_CCM_CSCMR2_SLIMBUS_CLK_SEL_OFFSET		(6) +#define MXC_CCM_CSCMR2_SLIMBUS_CLK_SEL_MASK		(0x7 << 6) +#define MXC_CCM_CSCMR2_SPDIF1_COM			(1 << 5) +#define MXC_CCM_CSCMR2_SPDIF0_COM			(1 << 4) +#define MXC_CCM_CSCMR2_SPDIF1_CLK_SEL_OFFSET		(2) +#define MXC_CCM_CSCMR2_SPDIF1_CLK_SEL_MASK		(0x3 << 2) +#define MXC_CCM_CSCMR2_SPDIF0_CLK_SEL_OFFSET		(0) +#define MXC_CCM_CSCMR2_SPDIF0_CLK_SEL_MASK		(0x3) + +/* Define the bits in register CSCDR1 */ +#define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_OFFSET	(22) +#define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_MASK	(0x7 << 22) +#define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_OFFSET	(19) +#define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_MASK	(0x7 << 19) +#define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_OFFSET	(16) +#define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_MASK	(0x7 << 16) +#define MXC_CCM_CSCDR1_PGC_CLK_PODF_OFFSET		(14) +#define MXC_CCM_CSCDR1_PGC_CLK_PODF_MASK		(0x3 << 14) +#define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PODF_OFFSET	(11) +#define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PODF_MASK	(0x7 << 11) +#define MXC_CCM_CSCDR1_USBOH3_CLK_PRED_OFFSET		(8) +#define MXC_CCM_CSCDR1_USBOH3_CLK_PRED_MASK		(0x7 << 8) +#define MXC_CCM_CSCDR1_USBOH3_CLK_PODF_OFFSET		(6) +#define MXC_CCM_CSCDR1_USBOH3_CLK_PODF_MASK		(0x3 << 6) +#define MXC_CCM_CSCDR1_UART_CLK_PRED_OFFSET		(3) +#define MXC_CCM_CSCDR1_UART_CLK_PRED_MASK		(0x7 << 3) +#define MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET		(0) +#define MXC_CCM_CSCDR1_UART_CLK_PODF_MASK		(0x7) + +/* Define the bits in register CS1CDR and CS2CDR */ +#define MXC_CCM_CS1CDR_SSI_EXT1_CLK_PRED_OFFSET		(22) +#define MXC_CCM_CS1CDR_SSI_EXT1_CLK_PRED_MASK		(0x7 << 22) +#define MXC_CCM_CS1CDR_SSI_EXT1_CLK_PODF_OFFSET		(16) +#define MXC_CCM_CS1CDR_SSI_EXT1_CLK_PODF_MASK		(0x3F << 16) +#define MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET		(6) +#define MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK		(0x7 << 6) +#define MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET		(0) +#define MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK		(0x3F) + +#define MXC_CCM_CS2CDR_SSI_EXT2_CLK_PRED_OFFSET		(22) +#define MXC_CCM_CS2CDR_SSI_EXT2_CLK_PRED_MASK		(0x7 << 22) +#define MXC_CCM_CS2CDR_SSI_EXT2_CLK_PODF_OFFSET		(16) +#define MXC_CCM_CS2CDR_SSI_EXT2_CLK_PODF_MASK		(0x3F << 16) +#define MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET		(6) +#define MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK		(0x7 << 6) +#define MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET		(0) +#define MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK		(0x3F) + +/* Define the bits in register CDCDR */ +#define MXC_CCM_CDCDR_TVE_CLK_PRED_OFFSET		(28) +#define MXC_CCM_CDCDR_TVE_CLK_PRED_MASK			(0x7 << 28) +#define MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET		(25) +#define MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK		(0x7 << 25) +#define MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET		(19) +#define MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK		(0x3F << 19) +#define MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET		(16) +#define MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK		(0x7 << 16) +#define MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET		(9) +#define MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK		(0x3F << 9) +#define MXC_CCM_CDCDR_DI_CLK_PRED_OFFSET		(6) +#define MXC_CCM_CDCDR_DI_CLK_PRED_MASK			(0x7 << 6) +#define MXC_CCM_CDCDR_USB_PHY_PRED_OFFSET		(3) +#define MXC_CCM_CDCDR_USB_PHY_PRED_MASK			(0x7 << 3) +#define MXC_CCM_CDCDR_USB_PHY_PODF_OFFSET		(0) +#define MXC_CCM_CDCDR_USB_PHY_PODF_MASK			(0x7) + +/* Define the bits in register CHSCCDR */ +#define MXC_CCM_CHSCCDR_ESC_CLK_PRED_OFFSET		(12) +#define MXC_CCM_CHSCCDR_ESC_CLK_PRED_MASK		(0x7 << 12) +#define MXC_CCM_CHSCCDR_ESC_CLK_PODF_OFFSET		(6) +#define MXC_CCM_CHSCCDR_ESC_CLK_PODF_MASK		(0x3F << 6) +#define MXC_CCM_CHSCCDR_HSC2_CLK_PODF_OFFSET		(3) +#define MXC_CCM_CHSCCDR_HSC2_CLK_PODF_MASK		(0x7 << 3) +#define MXC_CCM_CHSCCDR_HSC1_CLK_PODF_OFFSET		(0) +#define MXC_CCM_CHSCCDR_HSC1_CLK_PODF_MASK		(0x7) + +/* Define the bits in register CSCDR2 */ +#define MXC_CCM_CSCDR2_CSPI_CLK_PRED_OFFSET		(25) +#define MXC_CCM_CSCDR2_CSPI_CLK_PRED_MASK		(0x7 << 25) +#define MXC_CCM_CSCDR2_CSPI_CLK_PODF_OFFSET		(19) +#define MXC_CCM_CSCDR2_CSPI_CLK_PODF_MASK		(0x3F << 19) +#define MXC_CCM_CSCDR2_SIM_CLK_PRED_OFFSET		(16) +#define MXC_CCM_CSCDR2_SIM_CLK_PRED_MASK		(0x7 << 16) +#define MXC_CCM_CSCDR2_SIM_CLK_PODF_OFFSET		(9) +#define MXC_CCM_CSCDR2_SIM_CLK_PODF_MASK		(0x3F << 9) +#define MXC_CCM_CSCDR2_SLIMBUS_CLK_PRED_OFFSET		(6) +#define MXC_CCM_CSCDR2_SLIMBUS_PRED_MASK		(0x7 << 6) +#define MXC_CCM_CSCDR2_SLIMBUS_PODF_OFFSET		(0) +#define MXC_CCM_CSCDR2_SLIMBUS_PODF_MASK		(0x3F) + +/* Define the bits in register CSCDR3 */ +#define MXC_CCM_CSCDR3_HSI2C_CLK_PRED_OFFSET		(16) +#define MXC_CCM_CSCDR3_HSI2C_CLK_PRED_MASK		(0x7 << 16) +#define MXC_CCM_CSCDR3_HSI2C_CLK_PODF_OFFSET		(9) +#define MXC_CCM_CSCDR3_HSI2C_CLK_PODF_MASK		(0x3F << 9) +#define MXC_CCM_CSCDR3_FIRI_CLK_PRED_OFFSET		(6) +#define MXC_CCM_CSCDR3_FIRI_CLK_PRED_MASK		(0x7 << 6) +#define MXC_CCM_CSCDR3_FIRI_CLK_PODF_OFFSET		(0) +#define MXC_CCM_CSCDR3_FIRI_CLK_PODF_MASK		(0x3F) + +/* Define the bits in register CSCDR4 */ +#define MXC_CCM_CSCDR4_CSI_MCLK2_CLK_PRED_OFFSET	(16) +#define MXC_CCM_CSCDR4_CSI_MCLK2_CLK_PRED_MASK		(0x7 << 16) +#define MXC_CCM_CSCDR4_CSI_MCLK2_CLK_PODF_OFFSET	(9) +#define MXC_CCM_CSCDR4_CSI_MCLK2_CLK_PODF_MASK		(0x3F << 9) +#define MXC_CCM_CSCDR4_CSI_MCLK1_CLK_PRED_OFFSET	(6) +#define MXC_CCM_CSCDR4_CSI_MCLK1_CLK_PRED_MASK		(0x7 << 6) +#define MXC_CCM_CSCDR4_CSI_MCLK1_CLK_PODF_OFFSET	(0) +#define MXC_CCM_CSCDR4_CSI_MCLK1_CLK_PODF_MASK		(0x3F) + +/* Define the bits in register CDHIPR */ +#define MXC_CCM_CDHIPR_ARM_PODF_BUSY			(1 << 16) +#define MXC_CCM_CDHIPR_DDR_HF_CLK_SEL_BUSY		(1 << 8) +#define MXC_CCM_CDHIPR_DDR_PODF_BUSY			(1 << 7) +#define MXC_CCM_CDHIPR_EMI_CLK_SEL_BUSY			(1 << 6) +#define MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY		(1 << 5) +#define MXC_CCM_CDHIPR_NFC_IPG_INT_MEM_PODF_BUSY	(1 << 4) +#define MXC_CCM_CDHIPR_AHB_PODF_BUSY			(1 << 3) +#define MXC_CCM_CDHIPR_EMI_PODF_BUSY			(1 << 2) +#define MXC_CCM_CDHIPR_AXI_B_PODF_BUSY			(1 << 1) +#define MXC_CCM_CDHIPR_AXI_A_PODF_BUSY			(1 << 0) + +/* Define the bits in register CDCR */ +#define MXC_CCM_CDCR_ARM_FREQ_SHIFT_DIVIDER		(0x1 << 2) +#define MXC_CCM_CDCR_PERIPH_CLK_DVFS_PODF_OFFSET	(0) +#define MXC_CCM_CDCR_PERIPH_CLK_DVFS_PODF_MASK		(0x3) + +/* Define the bits in register CLPCR */ +#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_MAX_LPM_HS		(0x1 << 21) +#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_IPU_LPM_HS		(0x1 << 18) +#define MXC_CCM_CLPCR_BYPASS_RTIC_LPM_HS	(0x1 << 17) +#define MXC_CCM_CLPCR_BYPASS_RNGC_LPM_HS	(0x1 << 16) +#define MXC_CCM_CLPCR_COSC_PWRDOWN		(0x1 << 11) +#define MXC_CCM_CLPCR_STBY_COUNT_OFFSET		(9) +#define MXC_CCM_CLPCR_STBY_COUNT_MASK		(0x3 << 9) +#define MXC_CCM_CLPCR_VSTBY			(0x1 << 8) +#define MXC_CCM_CLPCR_DIS_REF_OSC		(0x1 << 7) +#define MXC_CCM_CLPCR_SBYOS			(0x1 << 6) +#define MXC_CCM_CLPCR_ARM_CLK_DIS_ON_LPM	(0x1 << 5) +#define MXC_CCM_CLPCR_LPSR_CLK_SEL_OFFSET	(3) +#define MXC_CCM_CLPCR_LPSR_CLK_SEL_MASK		(0x3 << 3) +#define MXC_CCM_CLPCR_LPM_OFFSET		(0) +#define MXC_CCM_CLPCR_LPM_MASK			(0x3) + +/* Define the bits in register CISR */ +#define MXC_CCM_CISR_ARM_PODF_LOADED			(0x1 << 25) +#define MXC_CCM_CISR_NFC_IPG_INT_MEM_PODF_LOADED	(0x1 << 21) +#define MXC_CCM_CISR_AHB_PODF_LOADED			(0x1 << 20) +#define MXC_CCM_CISR_EMI_PODF_LOADED			(0x1 << 19) +#define MXC_CCM_CISR_AXI_B_PODF_LOADED			(0x1 << 18) +#define MXC_CCM_CISR_AXI_A_PODF_LOADED			(0x1 << 17) +#define MXC_CCM_CISR_DIVIDER_LOADED			(0x1 << 16) +#define MXC_CCM_CISR_COSC_READY				(0x1 << 6) +#define MXC_CCM_CISR_CKIH2_READY			(0x1 << 5) +#define MXC_CCM_CISR_CKIH_READY				(0x1 << 4) +#define MXC_CCM_CISR_FPM_READY				(0x1 << 3) +#define MXC_CCM_CISR_LRF_PLL3				(0x1 << 2) +#define MXC_CCM_CISR_LRF_PLL2				(0x1 << 1) +#define MXC_CCM_CISR_LRF_PLL1				(0x1) + +/* Define the bits in register CIMR */ +#define MXC_CCM_CIMR_MASK_ARM_PODF_LOADED		(0x1 << 25) +#define MXC_CCM_CIMR_MASK_NFC_IPG_INT_MEM_PODF_LOADED	(0x1 << 21) +#define MXC_CCM_CIMR_MASK_EMI_PODF_LOADED		(0x1 << 20) +#define MXC_CCM_CIMR_MASK_AXI_C_PODF_LOADED		(0x1 << 19) +#define MXC_CCM_CIMR_MASK_AXI_B_PODF_LOADED		(0x1 << 18) +#define MXC_CCM_CIMR_MASK_AXI_A_PODF_LOADED		(0x1 << 17) +#define MXC_CCM_CIMR_MASK_DIVIDER_LOADED		(0x1 << 16) +#define MXC_CCM_CIMR_MASK_COSC_READY			(0x1 << 5) +#define MXC_CCM_CIMR_MASK_CKIH_READY			(0x1 << 4) +#define MXC_CCM_CIMR_MASK_FPM_READY			(0x1 << 3) +#define MXC_CCM_CIMR_MASK_LRF_PLL3			(0x1 << 2) +#define MXC_CCM_CIMR_MASK_LRF_PLL2			(0x1 << 1) +#define MXC_CCM_CIMR_MASK_LRF_PLL1			(0x1) + +/* Define the bits in register CCOSR */ +#define MXC_CCM_CCOSR_CKO2_EN_OFFSET			(0x1 << 24) +#define MXC_CCM_CCOSR_CKO2_DIV_OFFSET			(21) +#define MXC_CCM_CCOSR_CKO2_DIV_MASK			(0x7 << 21) +#define MXC_CCM_CCOSR_CKO2_SEL_OFFSET			(16) +#define MXC_CCM_CCOSR_CKO2_SEL_MASK			(0x1F << 16) +#define MXC_CCM_CCOSR_CKOL_EN				(0x1 << 7) +#define MXC_CCM_CCOSR_CKOL_DIV_OFFSET			(4) +#define MXC_CCM_CCOSR_CKOL_DIV_MASK			(0x7 << 4) +#define MXC_CCM_CCOSR_CKOL_SEL_OFFSET			(0) +#define MXC_CCM_CCOSR_CKOL_SEL_MASK			(0xF) + +/* Define the bits in registers CGPR */ +#define MXC_CCM_CGPR_EFUSE_PROG_SUPPLY_GATE		(0x1 << 4) +#define MXC_CCM_CGPR_FPM_SEL				(0x1 << 3) +#define MXC_CCM_CGPR_VL_L2BIST_CLKDIV_OFFSET		(0) +#define MXC_CCM_CGPR_VL_L2BIST_CLKDIV_MASK		(0x7) + +/* Define the bits in registers CCGRx */ +#define MXC_CCM_CCGRx_CG_MASK				0x3 +#define MXC_CCM_CCGRx_MOD_OFF				0x0 +#define MXC_CCM_CCGRx_MOD_ON				0x3 +#define MXC_CCM_CCGRx_MOD_IDLE				0x1 + +#define MXC_CCM_CCGRx_CG15_MASK				(0x3 << 30) +#define MXC_CCM_CCGRx_CG14_MASK				(0x3 << 28) +#define MXC_CCM_CCGRx_CG13_MASK				(0x3 << 26) +#define MXC_CCM_CCGRx_CG12_MASK				(0x3 << 24) +#define MXC_CCM_CCGRx_CG11_MASK				(0x3 << 22) +#define MXC_CCM_CCGRx_CG10_MASK				(0x3 << 20) +#define MXC_CCM_CCGRx_CG9_MASK				(0x3 << 18) +#define MXC_CCM_CCGRx_CG8_MASK				(0x3 << 16) +#define MXC_CCM_CCGRx_CG5_MASK				(0x3 << 10) +#define MXC_CCM_CCGRx_CG4_MASK				(0x3 << 8) +#define MXC_CCM_CCGRx_CG3_MASK				(0x3 << 6) +#define MXC_CCM_CCGRx_CG2_MASK				(0x3 << 4) +#define MXC_CCM_CCGRx_CG1_MASK				(0x3 << 2) +#define MXC_CCM_CCGRx_CG0_MASK				(0x3 << 0) + +#define MXC_CCM_CCGRx_CG15_OFFSET			30 +#define MXC_CCM_CCGRx_CG14_OFFSET			28 +#define MXC_CCM_CCGRx_CG13_OFFSET			26 +#define MXC_CCM_CCGRx_CG12_OFFSET			24 +#define MXC_CCM_CCGRx_CG11_OFFSET			22 +#define MXC_CCM_CCGRx_CG10_OFFSET			20 +#define MXC_CCM_CCGRx_CG9_OFFSET			18 +#define MXC_CCM_CCGRx_CG8_OFFSET			16 +#define MXC_CCM_CCGRx_CG7_OFFSET			14 +#define MXC_CCM_CCGRx_CG6_OFFSET			12 +#define MXC_CCM_CCGRx_CG5_OFFSET			10 +#define MXC_CCM_CCGRx_CG4_OFFSET			8 +#define MXC_CCM_CCGRx_CG3_OFFSET			6 +#define MXC_CCM_CCGRx_CG2_OFFSET			4 +#define MXC_CCM_CCGRx_CG1_OFFSET			2 +#define MXC_CCM_CCGRx_CG0_OFFSET			0 + +#define MXC_DPTC_LP_BASE	(MX51_GPC_BASE + 0x80) +#define MXC_DPTC_GP_BASE	(MX51_GPC_BASE + 0x100) +#define MXC_DVFS_CORE_BASE	(MX51_GPC_BASE + 0x180) +#define MXC_DPTC_PER_BASE	(MX51_GPC_BASE + 0x1C0) +#define MXC_PGC_IPU_BASE	(MX51_GPC_BASE + 0x220) +#define MXC_PGC_VPU_BASE	(MX51_GPC_BASE + 0x240) +#define MXC_PGC_GPU_BASE	(MX51_GPC_BASE + 0x260) +#define MXC_SRPG_NEON_BASE	(MX51_GPC_BASE + 0x280) +#define MXC_SRPG_ARM_BASE	(MX51_GPC_BASE + 0x2A0) +#define MXC_SRPG_EMPGC0_BASE	(MX51_GPC_BASE + 0x2C0) +#define MXC_SRPG_EMPGC1_BASE	(MX51_GPC_BASE + 0x2D0) +#define MXC_SRPG_MEGAMIX_BASE	(MX51_GPC_BASE + 0x2E0) +#define MXC_SRPG_EMI_BASE	(MX51_GPC_BASE + 0x300) + +/* CORTEXA8 platform */ +#define MXC_CORTEXA8_PLAT_PVID		(MX51_CORTEXA8_BASE + 0x0) +#define MXC_CORTEXA8_PLAT_GPC		(MX51_CORTEXA8_BASE + 0x4) +#define MXC_CORTEXA8_PLAT_PIC		(MX51_CORTEXA8_BASE + 0x8) +#define MXC_CORTEXA8_PLAT_LPC		(MX51_CORTEXA8_BASE + 0xC) +#define MXC_CORTEXA8_PLAT_NEON_LPC	(MX51_CORTEXA8_BASE + 0x10) +#define MXC_CORTEXA8_PLAT_ICGC		(MX51_CORTEXA8_BASE + 0x14) +#define MXC_CORTEXA8_PLAT_AMC		(MX51_CORTEXA8_BASE + 0x18) +#define MXC_CORTEXA8_PLAT_NMC		(MX51_CORTEXA8_BASE + 0x20) +#define MXC_CORTEXA8_PLAT_NMS		(MX51_CORTEXA8_BASE + 0x24) + +/* DVFS CORE */ +#define MXC_DVFSTHRS		(MXC_DVFS_CORE_BASE + 0x00) +#define MXC_DVFSCOUN		(MXC_DVFS_CORE_BASE + 0x04) +#define MXC_DVFSSIG1		(MXC_DVFS_CORE_BASE + 0x08) +#define MXC_DVFSSIG0		(MXC_DVFS_CORE_BASE + 0x0C) +#define MXC_DVFSGPC0		(MXC_DVFS_CORE_BASE + 0x10) +#define MXC_DVFSGPC1		(MXC_DVFS_CORE_BASE + 0x14) +#define MXC_DVFSGPBT		(MXC_DVFS_CORE_BASE + 0x18) +#define MXC_DVFSEMAC		(MXC_DVFS_CORE_BASE + 0x1C) +#define MXC_DVFSCNTR		(MXC_DVFS_CORE_BASE + 0x20) +#define MXC_DVFSLTR0_0		(MXC_DVFS_CORE_BASE + 0x24) +#define MXC_DVFSLTR0_1		(MXC_DVFS_CORE_BASE + 0x28) +#define MXC_DVFSLTR1_0		(MXC_DVFS_CORE_BASE + 0x2C) +#define MXC_DVFSLTR1_1		(MXC_DVFS_CORE_BASE + 0x30) +#define MXC_DVFSPT0 		(MXC_DVFS_CORE_BASE + 0x34) +#define MXC_DVFSPT1 		(MXC_DVFS_CORE_BASE + 0x38) +#define MXC_DVFSPT2 		(MXC_DVFS_CORE_BASE + 0x3C) +#define MXC_DVFSPT3 		(MXC_DVFS_CORE_BASE + 0x40) + +/* GPC */ +#define MXC_GPC_CNTR		(MX51_GPC_BASE + 0x0) +#define MXC_GPC_PGR		(MX51_GPC_BASE + 0x4) +#define MXC_GPC_VCR		(MX51_GPC_BASE + 0x8) +#define MXC_GPC_ALL_PU		(MX51_GPC_BASE + 0xC) +#define MXC_GPC_NEON		(MX51_GPC_BASE + 0x10) +#define MXC_GPC_PGR_ARMPG_OFFSET	8 +#define MXC_GPC_PGR_ARMPG_MASK		(3 << 8) + +/* PGC */ +#define MXC_PGC_IPU_PGCR	(MXC_PGC_IPU_BASE + 0x0) +#define MXC_PGC_IPU_PGSR	(MXC_PGC_IPU_BASE + 0xC) +#define MXC_PGC_VPU_PGCR	(MXC_PGC_VPU_BASE + 0x0) +#define MXC_PGC_VPU_PGSR	(MXC_PGC_VPU_BASE + 0xC) +#define MXC_PGC_GPU_PGCR	(MXC_PGC_GPU_BASE + 0x0) +#define MXC_PGC_GPU_PGSR	(MXC_PGC_GPU_BASE + 0xC) + +#define MXC_PGCR_PCR		1 +#define MXC_SRPGCR_PCR		1 +#define MXC_EMPGCR_PCR		1 +#define MXC_PGSR_PSR		1 + + +#define MXC_CORTEXA8_PLAT_LPC_DSM	(1 << 0) +#define MXC_CORTEXA8_PLAT_LPC_DBG_DSM	(1 << 1) + +/* SRPG */ +#define MXC_SRPG_NEON_SRPGCR	(MXC_SRPG_NEON_BASE + 0x0) +#define MXC_SRPG_NEON_PUPSCR	(MXC_SRPG_NEON_BASE + 0x4) +#define MXC_SRPG_NEON_PDNSCR	(MXC_SRPG_NEON_BASE + 0x8) + +#define MXC_SRPG_ARM_SRPGCR	(MXC_SRPG_ARM_BASE + 0x0) +#define MXC_SRPG_ARM_PUPSCR	(MXC_SRPG_ARM_BASE + 0x4) +#define MXC_SRPG_ARM_PDNSCR	(MXC_SRPG_ARM_BASE + 0x8) + +#define MXC_SRPG_EMPGC0_SRPGCR	(MXC_SRPG_EMPGC0_BASE + 0x0) +#define MXC_SRPG_EMPGC0_PUPSCR	(MXC_SRPG_EMPGC0_BASE + 0x4) +#define MXC_SRPG_EMPGC0_PDNSCR	(MXC_SRPG_EMPGC0_BASE + 0x8) + +#define MXC_SRPG_EMPGC1_SRPGCR	(MXC_SRPG_EMPGC1_BASE + 0x0) +#define MXC_SRPG_EMPGC1_PUPSCR	(MXC_SRPG_EMPGC1_BASE + 0x4) +#define MXC_SRPG_EMPGC1_PDNSCR	(MXC_SRPG_EMPGC1_BASE + 0x8) + +#define MXC_SRPG_MEGAMIX_SRPGCR		(MXC_SRPG_MEGAMIX_BASE + 0x0) +#define MXC_SRPG_MEGAMIX_PUPSCR		(MXC_SRPG_MEGAMIX_BASE + 0x4) +#define MXC_SRPG_MEGAMIX_PDNSCR		(MXC_SRPG_MEGAMIX_BASE + 0x8) + +#define MXC_SRPGC_EMI_SRPGCR	(MXC_SRPGC_EMI_BASE + 0x0) +#define MXC_SRPGC_EMI_PUPSCR	(MXC_SRPGC_EMI_BASE + 0x4) +#define MXC_SRPGC_EMI_PDNSCR	(MXC_SRPGC_EMI_BASE + 0x8) + +#endif				/* __ARCH_ARM_MACH_MX51_CRM_REGS_H__ */ diff --git a/arch/arm/mach-mx5/devices.c b/arch/arm/mach-mx5/devices.c new file mode 100644 index 00000000000..d6fd3961ade --- /dev/null +++ b/arch/arm/mach-mx5/devices.c @@ -0,0 +1,96 @@ +/* + * Copyright 2009 Amit Kucheria <amit.kucheria@canonical.com> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +#include <linux/platform_device.h> +#include <mach/hardware.h> +#include <mach/imx-uart.h> + +static struct resource uart0[] = { +	{ +		.start = MX51_UART1_BASE_ADDR, +		.end = MX51_UART1_BASE_ADDR + 0xfff, +		.flags = IORESOURCE_MEM, +	}, { +		.start = MX51_MXC_INT_UART1, +		.end = MX51_MXC_INT_UART1, +		.flags = IORESOURCE_IRQ, +	}, +}; + +struct platform_device mxc_uart_device0 = { +	.name = "imx-uart", +	.id = 0, +	.resource = uart0, +	.num_resources = ARRAY_SIZE(uart0), +}; + +static struct resource uart1[] = { +	{ +		.start = MX51_UART2_BASE_ADDR, +		.end = MX51_UART2_BASE_ADDR + 0xfff, +		.flags = IORESOURCE_MEM, +	}, { +		.start = MX51_MXC_INT_UART2, +		.end = MX51_MXC_INT_UART2, +		.flags = IORESOURCE_IRQ, +	}, +}; + +struct platform_device mxc_uart_device1 = { +	.name = "imx-uart", +	.id = 1, +	.resource = uart1, +	.num_resources = ARRAY_SIZE(uart1), +}; + +static struct resource uart2[] = { +	{ +		.start = MX51_UART3_BASE_ADDR, +		.end = MX51_UART3_BASE_ADDR + 0xfff, +		.flags = IORESOURCE_MEM, +	}, { +		.start = MX51_MXC_INT_UART3, +		.end = MX51_MXC_INT_UART3, +		.flags = IORESOURCE_IRQ, +	}, +}; + +struct platform_device mxc_uart_device2 = { +	.name = "imx-uart", +	.id = 2, +	.resource = uart2, +	.num_resources = ARRAY_SIZE(uart2), +}; + +static struct resource mxc_fec_resources[] = { +	{ +		.start	= MX51_MXC_FEC_BASE_ADDR, +		.end	= MX51_MXC_FEC_BASE_ADDR + 0xfff, +		.flags	= IORESOURCE_MEM, +	}, { +		.start	= MX51_MXC_INT_FEC, +		.end	= MX51_MXC_INT_FEC, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +struct platform_device mxc_fec_device = { +	.name = "fec", +	.id = 0, +	.num_resources = ARRAY_SIZE(mxc_fec_resources), +	.resource = mxc_fec_resources, +}; + +/* Dummy definition to allow compiling in AVIC and TZIC simultaneously */ +int __init mxc_register_gpios(void) +{ +	return 0; +} diff --git a/arch/arm/mach-mx5/devices.h b/arch/arm/mach-mx5/devices.h new file mode 100644 index 00000000000..f339ab8c19b --- /dev/null +++ b/arch/arm/mach-mx5/devices.h @@ -0,0 +1,4 @@ +extern struct platform_device mxc_uart_device0; +extern struct platform_device mxc_uart_device1; +extern struct platform_device mxc_uart_device2; +extern struct platform_device mxc_fec_device; diff --git a/arch/arm/mach-mx5/mm.c b/arch/arm/mach-mx5/mm.c new file mode 100644 index 00000000000..b7677ef80cc --- /dev/null +++ b/arch/arm/mach-mx5/mm.c @@ -0,0 +1,83 @@ +/* + * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved. + * + * The code contained herein is licensed under the GNU General Public + * License.  You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + * + * Create static mapping between physical to virtual memory. + */ + +#include <linux/mm.h> +#include <linux/init.h> + +#include <asm/mach/map.h> + +#include <mach/hardware.h> +#include <mach/common.h> +#include <mach/iomux-v3.h> + +/* + * Define the MX51 memory map. + */ +static struct map_desc mxc_io_desc[] __initdata = { +	{ +		.virtual = MX51_IRAM_BASE_ADDR_VIRT, +		.pfn = __phys_to_pfn(MX51_IRAM_BASE_ADDR), +		.length = MX51_IRAM_SIZE, +		.type = MT_DEVICE +	}, { +		.virtual = MX51_DEBUG_BASE_ADDR_VIRT, +		.pfn = __phys_to_pfn(MX51_DEBUG_BASE_ADDR), +		.length = MX51_DEBUG_SIZE, +		.type = MT_DEVICE +	}, { +		.virtual = MX51_AIPS1_BASE_ADDR_VIRT, +		.pfn = __phys_to_pfn(MX51_AIPS1_BASE_ADDR), +		.length = MX51_AIPS1_SIZE, +		.type = MT_DEVICE +	}, { +		.virtual = MX51_SPBA0_BASE_ADDR_VIRT, +		.pfn = __phys_to_pfn(MX51_SPBA0_BASE_ADDR), +		.length = MX51_SPBA0_SIZE, +		.type = MT_DEVICE +	}, { +		.virtual = MX51_AIPS2_BASE_ADDR_VIRT, +		.pfn = __phys_to_pfn(MX51_AIPS2_BASE_ADDR), +		.length = MX51_AIPS2_SIZE, +		.type = MT_DEVICE +	}, +}; + +/* + * This function initializes the memory map. It is called during the + * system startup to create static physical to virtual memory mappings + * for the IO modules. + */ +void __init mx51_map_io(void) +{ +	mxc_set_cpu_type(MXC_CPU_MX51); +	mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR)); +	mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG_BASE_ADDR)); +	iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); +} + +void __init mx51_init_irq(void) +{ +	unsigned long tzic_addr; +	void __iomem *tzic_virt; + +	if (mx51_revision() < MX51_CHIP_REV_2_0) +		tzic_addr = MX51_TZIC_BASE_ADDR_TO1; +	else +		tzic_addr = MX51_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); +}  |