diff options
| author | Wolfgang Grandegger <wg@denx.de> | 2011-11-11 14:03:34 +0100 | 
|---|---|---|
| committer | Remy Bohmer <linux@bohmer.net> | 2011-12-11 14:49:25 +0100 | 
| commit | 5d2947a3fc8d130cfa39fccdefb87082abbf0e9b (patch) | |
| tree | b6a930fcec490f900ab366b66c44b7a183db937b | |
| parent | a954da2902e2e0fc54942691d6e0d64a7a1b3c3a (diff) | |
| download | olio-uboot-2014.01-5d2947a3fc8d130cfa39fccdefb87082abbf0e9b.tar.xz olio-uboot-2014.01-5d2947a3fc8d130cfa39fccdefb87082abbf0e9b.zip | |
USB: MX5: add helper functions to enable USB clocks
Signed-off-by: Wolfgang Grandegger <wg@denx.de>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Remy Bohmer <linux@bohmer.net>
Cc: Wolfgang Grandegger <wg@denx.de>
Cc: Jason Liu <r64343@freescale.com>
V2: Fix spacing in crm_regs.h
| -rw-r--r-- | arch/arm/cpu/armv7/mx5/clock.c | 72 | ||||
| -rw-r--r-- | arch/arm/include/asm/arch-mx5/clock.h | 5 | ||||
| -rw-r--r-- | arch/arm/include/asm/arch-mx5/crm_regs.h | 3 | 
3 files changed, 80 insertions, 0 deletions
| diff --git a/arch/arm/cpu/armv7/mx5/clock.c b/arch/arm/cpu/armv7/mx5/clock.c index 933ce05b7..e92f10623 100644 --- a/arch/arm/cpu/armv7/mx5/clock.c +++ b/arch/arm/cpu/armv7/mx5/clock.c @@ -50,6 +50,78 @@ struct mxc_pll_reg *mxc_plls[PLL_CLOCKS] = {  struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)MXC_CCM_BASE; +void set_usboh3_clk(void) +{ +	unsigned int reg; + +	reg = readl(&mxc_ccm->cscmr1) & +		 ~MXC_CCM_CSCMR1_USBOH3_CLK_SEL_MASK; +	reg |= 1 << MXC_CCM_CSCMR1_USBOH3_CLK_SEL_OFFSET; +	writel(reg, &mxc_ccm->cscmr1); + +	reg = readl(&mxc_ccm->cscdr1); +	reg &= ~MXC_CCM_CSCDR1_USBOH3_CLK_PODF_MASK; +	reg &= ~MXC_CCM_CSCDR1_USBOH3_CLK_PRED_MASK; +	reg |= 4 << MXC_CCM_CSCDR1_USBOH3_CLK_PRED_OFFSET; +	reg |= 1 << MXC_CCM_CSCDR1_USBOH3_CLK_PODF_OFFSET; + +	writel(reg, &mxc_ccm->cscdr1); +} + +void enable_usboh3_clk(unsigned char enable) +{ +	unsigned int reg; + +	reg = readl(&mxc_ccm->CCGR2); +	if (enable) +		reg |= 1 << MXC_CCM_CCGR2_CG14_OFFSET; +	else +		reg &= ~(1 << MXC_CCM_CCGR2_CG14_OFFSET); +	writel(reg, &mxc_ccm->CCGR2); +} + +void set_usb_phy1_clk(void) +{ +	unsigned int reg; + +	reg = readl(&mxc_ccm->cscmr1); +	reg &= ~MXC_CCM_CSCMR1_USB_PHY_CLK_SEL; +	writel(reg, &mxc_ccm->cscmr1); +} + +void enable_usb_phy1_clk(unsigned char enable) +{ +	unsigned int reg; + +	reg = readl(&mxc_ccm->CCGR4); +	if (enable) +		reg |= 1 << MXC_CCM_CCGR4_CG5_OFFSET; +	else +		reg &= ~(1 << MXC_CCM_CCGR4_CG5_OFFSET); +	writel(reg, &mxc_ccm->CCGR4); +} + +void set_usb_phy2_clk(void) +{ +	unsigned int reg; + +	reg = readl(&mxc_ccm->cscmr1); +	reg &= ~MXC_CCM_CSCMR1_USB_PHY_CLK_SEL; +	writel(reg, &mxc_ccm->cscmr1); +} + +void enable_usb_phy2_clk(unsigned char enable) +{ +	unsigned int reg; + +	reg = readl(&mxc_ccm->CCGR4); +	if (enable) +		reg |= 1 << MXC_CCM_CCGR4_CG6_OFFSET; +	else +		reg &= ~(1 << MXC_CCM_CCGR4_CG6_OFFSET); +	writel(reg, &mxc_ccm->CCGR4); +} +  /*   * Calculate the frequency of PLLn.   */ diff --git a/arch/arm/include/asm/arch-mx5/clock.h b/arch/arm/include/asm/arch-mx5/clock.h index 1f8a537a5..ea972a398 100644 --- a/arch/arm/include/asm/arch-mx5/clock.h +++ b/arch/arm/include/asm/arch-mx5/clock.h @@ -40,4 +40,9 @@ u32 imx_get_uartclk(void);  u32 imx_get_fecclk(void);  unsigned int mxc_get_clock(enum mxc_clock clk); +void set_usb_phy2_clk(void); +void enable_usb_phy2_clk(unsigned char enable); +void set_usboh3_clk(void); +void enable_usboh3_clk(unsigned char enable); +  #endif /* __ASM_ARCH_CLOCK_H */ diff --git a/arch/arm/include/asm/arch-mx5/crm_regs.h b/arch/arm/include/asm/arch-mx5/crm_regs.h index fcc0e36fa..bdeafbc0d 100644 --- a/arch/arm/include/asm/arch-mx5/crm_regs.h +++ b/arch/arm/include/asm/arch-mx5/crm_regs.h @@ -195,7 +195,10 @@ struct mxc_ccm_reg {  /* Define the bits in register CCGRx */  #define MXC_CCM_CCGR_CG_MASK				0x3 +#define MXC_CCM_CCGR4_CG5_OFFSET			10 +#define MXC_CCM_CCGR4_CG6_OFFSET			12  #define MXC_CCM_CCGR5_CG5_OFFSET			10 +#define MXC_CCM_CCGR2_CG14_OFFSET			28  /* Define the bits in register CLPCR */  #define MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS                 (0x1 << 18) |