am33xx: refactor am33xx clocks and add ti814x support
authorMatt Porter <mporter@ti.com>
Fri, 15 Mar 2013 10:07:04 +0000 (10:07 +0000)
committerTom Rini <trini@ti.com>
Sun, 24 Mar 2013 16:49:11 +0000 (12:49 -0400)
Split clock.c for am335x and ti814x and add ti814x specific
clock support.

Signed-off-by: Matt Porter <mporter@ti.com>
arch/arm/cpu/armv7/am33xx/Makefile
arch/arm/cpu/armv7/am33xx/clock.c [deleted file]
arch/arm/cpu/armv7/am33xx/clock_am33xx.c [new file with mode: 0644]
arch/arm/cpu/armv7/am33xx/clock_ti814x.c [new file with mode: 0644]
arch/arm/include/asm/arch-am33xx/clock.h
arch/arm/include/asm/arch-am33xx/clocks_am33xx.h
arch/arm/include/asm/arch-am33xx/hardware_am33xx.h [new file with mode: 0644]
arch/arm/include/asm/arch-am33xx/hardware_ti814x.h [new file with mode: 0644]

index 70c443edbbb0a4ebd53f741cc0e53a3de15129e2..c97e30d441ca8f1d0eaf201933fd0cccd2aa73c5 100644 (file)
@@ -16,7 +16,8 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(SOC).o
 
-COBJS  += clock.o
+COBJS-$(CONFIG_AM33XX) += clock_am33xx.o
+COBJS-$(CONFIG_TI814X) += clock_ti814x.o
 COBJS  += sys_info.o
 COBJS  += mem.o
 COBJS  += ddr.o
diff --git a/arch/arm/cpu/armv7/am33xx/clock.c b/arch/arm/cpu/armv7/am33xx/clock.c
deleted file mode 100644 (file)
index d7d98d1..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * clock.c
- *
- * clocks for AM33XX based boards
- *
- * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <common.h>
-#include <asm/arch/cpu.h>
-#include <asm/arch/clock.h>
-#include <asm/arch/hardware.h>
-#include <asm/io.h>
-
-#define PRCM_MOD_EN            0x2
-#define PRCM_FORCE_WAKEUP      0x2
-#define PRCM_FUNCTL            0x0
-
-#define PRCM_EMIF_CLK_ACTIVITY BIT(2)
-#define PRCM_L3_GCLK_ACTIVITY  BIT(4)
-
-#define PLL_BYPASS_MODE                0x4
-#define ST_MN_BYPASS           0x00000100
-#define ST_DPLL_CLK            0x00000001
-#define CLK_SEL_MASK           0x7ffff
-#define CLK_DIV_MASK           0x1f
-#define CLK_DIV2_MASK          0x7f
-#define CLK_SEL_SHIFT          0x8
-#define CLK_MODE_SEL           0x7
-#define CLK_MODE_MASK          0xfffffff8
-#define CLK_DIV_SEL            0xFFFFFFE0
-#define CPGMAC0_IDLE           0x30000
-#define DPLL_CLKDCOLDO_GATE_CTRL        0x300
-
-const struct cm_perpll *cmper = (struct cm_perpll *)CM_PER;
-const struct cm_wkuppll *cmwkup = (struct cm_wkuppll *)CM_WKUP;
-const struct cm_dpll *cmdpll = (struct cm_dpll *)CM_DPLL;
-const struct cm_rtc *cmrtc = (struct cm_rtc *)CM_RTC;
-
-static void enable_interface_clocks(void)
-{
-       /* Enable all the Interconnect Modules */
-       writel(PRCM_MOD_EN, &cmper->l3clkctrl);
-       while (readl(&cmper->l3clkctrl) != PRCM_MOD_EN)
-               ;
-
-       writel(PRCM_MOD_EN, &cmper->l4lsclkctrl);
-       while (readl(&cmper->l4lsclkctrl) != PRCM_MOD_EN)
-               ;
-
-       writel(PRCM_MOD_EN, &cmper->l4fwclkctrl);
-       while (readl(&cmper->l4fwclkctrl) != PRCM_MOD_EN)
-               ;
-
-       writel(PRCM_MOD_EN, &cmwkup->wkl4wkclkctrl);
-       while (readl(&cmwkup->wkl4wkclkctrl) != PRCM_MOD_EN)
-               ;
-
-       writel(PRCM_MOD_EN, &cmper->l3instrclkctrl);
-       while (readl(&cmper->l3instrclkctrl) != PRCM_MOD_EN)
-               ;
-
-       writel(PRCM_MOD_EN, &cmper->l4hsclkctrl);
-       while (readl(&cmper->l4hsclkctrl) != PRCM_MOD_EN)
-               ;
-
-       writel(PRCM_MOD_EN, &cmwkup->wkgpio0clkctrl);
-       while (readl(&cmwkup->wkgpio0clkctrl) != PRCM_MOD_EN)
-               ;
-}
-
-/*
- * Force power domain wake up transition
- * Ensure that the corresponding interface clock is active before
- * using the peripheral
- */
-static void power_domain_wkup_transition(void)
-{
-       writel(PRCM_FORCE_WAKEUP, &cmper->l3clkstctrl);
-       writel(PRCM_FORCE_WAKEUP, &cmper->l4lsclkstctrl);
-       writel(PRCM_FORCE_WAKEUP, &cmwkup->wkclkstctrl);
-       writel(PRCM_FORCE_WAKEUP, &cmper->l4fwclkstctrl);
-       writel(PRCM_FORCE_WAKEUP, &cmper->l3sclkstctrl);
-}
-
-/*
- * Enable the peripheral clock for required peripherals
- */
-static void enable_per_clocks(void)
-{
-       /* Enable the control module though RBL would have done it*/
-       writel(PRCM_MOD_EN, &cmwkup->wkctrlclkctrl);
-       while (readl(&cmwkup->wkctrlclkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* Enable the module clock */
-       writel(PRCM_MOD_EN, &cmper->timer2clkctrl);
-       while (readl(&cmper->timer2clkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* Select the Master osc 24 MHZ as Timer2 clock source */
-       writel(0x1, &cmdpll->clktimer2clk);
-
-       /* UART0 */
-       writel(PRCM_MOD_EN, &cmwkup->wkup_uart0ctrl);
-       while (readl(&cmwkup->wkup_uart0ctrl) != PRCM_MOD_EN)
-               ;
-
-       /* UART1 */
-#ifdef CONFIG_SERIAL2
-       writel(PRCM_MOD_EN, &cmper->uart1clkctrl);
-       while (readl(&cmper->uart1clkctrl) != PRCM_MOD_EN)
-               ;
-#endif /* CONFIG_SERIAL2 */
-
-       /* UART2 */
-#ifdef CONFIG_SERIAL3
-       writel(PRCM_MOD_EN, &cmper->uart2clkctrl);
-       while (readl(&cmper->uart2clkctrl) != PRCM_MOD_EN)
-               ;
-#endif /* CONFIG_SERIAL3 */
-
-       /* UART3 */
-#ifdef CONFIG_SERIAL4
-       writel(PRCM_MOD_EN, &cmper->uart3clkctrl);
-       while (readl(&cmper->uart3clkctrl) != PRCM_MOD_EN)
-               ;
-#endif /* CONFIG_SERIAL4 */
-
-       /* UART4 */
-#ifdef CONFIG_SERIAL5
-       writel(PRCM_MOD_EN, &cmper->uart4clkctrl);
-       while (readl(&cmper->uart4clkctrl) != PRCM_MOD_EN)
-               ;
-#endif /* CONFIG_SERIAL5 */
-
-       /* UART5 */
-#ifdef CONFIG_SERIAL6
-       writel(PRCM_MOD_EN, &cmper->uart5clkctrl);
-       while (readl(&cmper->uart5clkctrl) != PRCM_MOD_EN)
-               ;
-#endif /* CONFIG_SERIAL6 */
-
-       /* GPMC */
-       writel(PRCM_MOD_EN, &cmper->gpmcclkctrl);
-       while (readl(&cmper->gpmcclkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* ELM */
-       writel(PRCM_MOD_EN, &cmper->elmclkctrl);
-       while (readl(&cmper->elmclkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* MMC0*/
-       writel(PRCM_MOD_EN, &cmper->mmc0clkctrl);
-       while (readl(&cmper->mmc0clkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* i2c0 */
-       writel(PRCM_MOD_EN, &cmwkup->wkup_i2c0ctrl);
-       while (readl(&cmwkup->wkup_i2c0ctrl) != PRCM_MOD_EN)
-               ;
-
-       /* gpio1 module */
-       writel(PRCM_MOD_EN, &cmper->gpio1clkctrl);
-       while (readl(&cmper->gpio1clkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* gpio2 module */
-       writel(PRCM_MOD_EN, &cmper->gpio2clkctrl);
-       while (readl(&cmper->gpio2clkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* gpio3 module */
-       writel(PRCM_MOD_EN, &cmper->gpio3clkctrl);
-       while (readl(&cmper->gpio3clkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* i2c1 */
-       writel(PRCM_MOD_EN, &cmper->i2c1clkctrl);
-       while (readl(&cmper->i2c1clkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* Ethernet */
-       writel(PRCM_MOD_EN, &cmper->cpgmac0clkctrl);
-       while ((readl(&cmper->cpgmac0clkctrl) & CPGMAC0_IDLE) != PRCM_FUNCTL)
-               ;
-
-       /* spi0 */
-       writel(PRCM_MOD_EN, &cmper->spi0clkctrl);
-       while (readl(&cmper->spi0clkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* RTC */
-       writel(PRCM_MOD_EN, &cmrtc->rtcclkctrl);
-       while (readl(&cmrtc->rtcclkctrl) != PRCM_MOD_EN)
-               ;
-
-       /* MUSB */
-       writel(PRCM_MOD_EN, &cmper->usb0clkctrl);
-       while (readl(&cmper->usb0clkctrl) != PRCM_MOD_EN)
-               ;
-}
-
-static void mpu_pll_config(void)
-{
-       u32 clkmode, clksel, div_m2;
-
-       clkmode = readl(&cmwkup->clkmoddpllmpu);
-       clksel = readl(&cmwkup->clkseldpllmpu);
-       div_m2 = readl(&cmwkup->divm2dpllmpu);
-
-       /* Set the PLL to bypass Mode */
-       writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllmpu);
-       while (readl(&cmwkup->idlestdpllmpu) != ST_MN_BYPASS)
-               ;
-
-       clksel = clksel & (~CLK_SEL_MASK);
-       clksel = clksel | ((MPUPLL_M << CLK_SEL_SHIFT) | MPUPLL_N);
-       writel(clksel, &cmwkup->clkseldpllmpu);
-
-       div_m2 = div_m2 & ~CLK_DIV_MASK;
-       div_m2 = div_m2 | MPUPLL_M2;
-       writel(div_m2, &cmwkup->divm2dpllmpu);
-
-       clkmode = clkmode | CLK_MODE_SEL;
-       writel(clkmode, &cmwkup->clkmoddpllmpu);
-
-       while (readl(&cmwkup->idlestdpllmpu) != ST_DPLL_CLK)
-               ;
-}
-
-static void core_pll_config(void)
-{
-       u32 clkmode, clksel, div_m4, div_m5, div_m6;
-
-       clkmode = readl(&cmwkup->clkmoddpllcore);
-       clksel = readl(&cmwkup->clkseldpllcore);
-       div_m4 = readl(&cmwkup->divm4dpllcore);
-       div_m5 = readl(&cmwkup->divm5dpllcore);
-       div_m6 = readl(&cmwkup->divm6dpllcore);
-
-       /* Set the PLL to bypass Mode */
-       writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllcore);
-
-       while (readl(&cmwkup->idlestdpllcore) != ST_MN_BYPASS)
-               ;
-
-       clksel = clksel & (~CLK_SEL_MASK);
-       clksel = clksel | ((COREPLL_M << CLK_SEL_SHIFT) | COREPLL_N);
-       writel(clksel, &cmwkup->clkseldpllcore);
-
-       div_m4 = div_m4 & ~CLK_DIV_MASK;
-       div_m4 = div_m4 | COREPLL_M4;
-       writel(div_m4, &cmwkup->divm4dpllcore);
-
-       div_m5 = div_m5 & ~CLK_DIV_MASK;
-       div_m5 = div_m5 | COREPLL_M5;
-       writel(div_m5, &cmwkup->divm5dpllcore);
-
-       div_m6 = div_m6 & ~CLK_DIV_MASK;
-       div_m6 = div_m6 | COREPLL_M6;
-       writel(div_m6, &cmwkup->divm6dpllcore);
-
-       clkmode = clkmode | CLK_MODE_SEL;
-       writel(clkmode, &cmwkup->clkmoddpllcore);
-
-       while (readl(&cmwkup->idlestdpllcore) != ST_DPLL_CLK)
-               ;
-}
-
-static void per_pll_config(void)
-{
-       u32 clkmode, clksel, div_m2;
-
-       clkmode = readl(&cmwkup->clkmoddpllper);
-       clksel = readl(&cmwkup->clkseldpllper);
-       div_m2 = readl(&cmwkup->divm2dpllper);
-
-       /* Set the PLL to bypass Mode */
-       writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllper);
-
-       while (readl(&cmwkup->idlestdpllper) != ST_MN_BYPASS)
-               ;
-
-       clksel = clksel & (~CLK_SEL_MASK);
-       clksel = clksel | ((PERPLL_M << CLK_SEL_SHIFT) | PERPLL_N);
-       writel(clksel, &cmwkup->clkseldpllper);
-
-       div_m2 = div_m2 & ~CLK_DIV2_MASK;
-       div_m2 = div_m2 | PERPLL_M2;
-       writel(div_m2, &cmwkup->divm2dpllper);
-
-       clkmode = clkmode | CLK_MODE_SEL;
-       writel(clkmode, &cmwkup->clkmoddpllper);
-
-       while (readl(&cmwkup->idlestdpllper) != ST_DPLL_CLK)
-               ;
-
-       writel(DPLL_CLKDCOLDO_GATE_CTRL, &cmwkup->clkdcoldodpllper);
-}
-
-void ddr_pll_config(unsigned int ddrpll_m)
-{
-       u32 clkmode, clksel, div_m2;
-
-       clkmode = readl(&cmwkup->clkmoddpllddr);
-       clksel = readl(&cmwkup->clkseldpllddr);
-       div_m2 = readl(&cmwkup->divm2dpllddr);
-
-       /* Set the PLL to bypass Mode */
-       clkmode = (clkmode & CLK_MODE_MASK) | PLL_BYPASS_MODE;
-       writel(clkmode, &cmwkup->clkmoddpllddr);
-
-       /* Wait till bypass mode is enabled */
-       while ((readl(&cmwkup->idlestdpllddr) & ST_MN_BYPASS)
-                               != ST_MN_BYPASS)
-               ;
-
-       clksel = clksel & (~CLK_SEL_MASK);
-       clksel = clksel | ((ddrpll_m << CLK_SEL_SHIFT) | DDRPLL_N);
-       writel(clksel, &cmwkup->clkseldpllddr);
-
-       div_m2 = div_m2 & CLK_DIV_SEL;
-       div_m2 = div_m2 | DDRPLL_M2;
-       writel(div_m2, &cmwkup->divm2dpllddr);
-
-       clkmode = (clkmode & CLK_MODE_MASK) | CLK_MODE_SEL;
-       writel(clkmode, &cmwkup->clkmoddpllddr);
-
-       /* Wait till dpll is locked */
-       while ((readl(&cmwkup->idlestdpllddr) & ST_DPLL_CLK) != ST_DPLL_CLK)
-               ;
-}
-
-void enable_emif_clocks(void)
-{
-       /* Enable the  EMIF_FW Functional clock */
-       writel(PRCM_MOD_EN, &cmper->emiffwclkctrl);
-       /* Enable EMIF0 Clock */
-       writel(PRCM_MOD_EN, &cmper->emifclkctrl);
-       /* Poll if module is functional */
-       while ((readl(&cmper->emifclkctrl)) != PRCM_MOD_EN)
-               ;
-}
-
-/*
- * Configure the PLL/PRCM for necessary peripherals
- */
-void pll_init()
-{
-       mpu_pll_config();
-       core_pll_config();
-       per_pll_config();
-
-       /* Enable the required interconnect clocks */
-       enable_interface_clocks();
-
-       /* Power domain wake up transition */
-       power_domain_wkup_transition();
-
-       /* Enable the required peripherals */
-       enable_per_clocks();
-}
diff --git a/arch/arm/cpu/armv7/am33xx/clock_am33xx.c b/arch/arm/cpu/armv7/am33xx/clock_am33xx.c
new file mode 100644 (file)
index 0000000..afc0d92
--- /dev/null
@@ -0,0 +1,403 @@
+/*
+ * clock_am33xx.c
+ *
+ * clocks for AM33XX based boards
+ *
+ * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <common.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/hardware.h>
+#include <asm/io.h>
+
+#define PRCM_MOD_EN            0x2
+#define PRCM_FORCE_WAKEUP      0x2
+#define PRCM_FUNCTL            0x0
+
+#define PRCM_EMIF_CLK_ACTIVITY BIT(2)
+#define PRCM_L3_GCLK_ACTIVITY  BIT(4)
+
+#define PLL_BYPASS_MODE                0x4
+#define ST_MN_BYPASS           0x00000100
+#define ST_DPLL_CLK            0x00000001
+#define CLK_SEL_MASK           0x7ffff
+#define CLK_DIV_MASK           0x1f
+#define CLK_DIV2_MASK          0x7f
+#define CLK_SEL_SHIFT          0x8
+#define CLK_MODE_SEL           0x7
+#define CLK_MODE_MASK          0xfffffff8
+#define CLK_DIV_SEL            0xFFFFFFE0
+#define CPGMAC0_IDLE           0x30000
+#define DPLL_CLKDCOLDO_GATE_CTRL        0x300
+
+#define OSC    (V_OSCK/1000000)
+
+#define MPUPLL_M       CONFIG_SYS_MPUCLK
+#define MPUPLL_N       (OSC-1)
+#define MPUPLL_M2      1
+
+/* Core PLL Fdll = 1 GHZ, */
+#define COREPLL_M      1000
+#define COREPLL_N      (OSC-1)
+
+#define COREPLL_M4     10      /* CORE_CLKOUTM4 = 200 MHZ */
+#define COREPLL_M5     8       /* CORE_CLKOUTM5 = 250 MHZ */
+#define COREPLL_M6     4       /* CORE_CLKOUTM6 = 500 MHZ */
+
+/*
+ * USB PHY clock is 960 MHZ. Since, this comes directly from Fdll, Fdll
+ * frequency needs to be set to 960 MHZ. Hence,
+ * For clkout = 192 MHZ, Fdll = 960 MHZ, divider values are given below
+ */
+#define PERPLL_M       960
+#define PERPLL_N       (OSC-1)
+#define PERPLL_M2      5
+
+/* DDR Freq is 266 MHZ for now */
+/* Set Fdll = 400 MHZ , Fdll = M * 2 * CLKINP/ N + 1; clkout = Fdll /(2 * M2) */
+#define DDRPLL_M       266
+#define DDRPLL_N       (OSC-1)
+#define DDRPLL_M2      1
+
+const struct cm_perpll *cmper = (struct cm_perpll *)CM_PER;
+const struct cm_wkuppll *cmwkup = (struct cm_wkuppll *)CM_WKUP;
+const struct cm_dpll *cmdpll = (struct cm_dpll *)CM_DPLL;
+const struct cm_rtc *cmrtc = (struct cm_rtc *)CM_RTC;
+
+static void enable_interface_clocks(void)
+{
+       /* Enable all the Interconnect Modules */
+       writel(PRCM_MOD_EN, &cmper->l3clkctrl);
+       while (readl(&cmper->l3clkctrl) != PRCM_MOD_EN)
+               ;
+
+       writel(PRCM_MOD_EN, &cmper->l4lsclkctrl);
+       while (readl(&cmper->l4lsclkctrl) != PRCM_MOD_EN)
+               ;
+
+       writel(PRCM_MOD_EN, &cmper->l4fwclkctrl);
+       while (readl(&cmper->l4fwclkctrl) != PRCM_MOD_EN)
+               ;
+
+       writel(PRCM_MOD_EN, &cmwkup->wkl4wkclkctrl);
+       while (readl(&cmwkup->wkl4wkclkctrl) != PRCM_MOD_EN)
+               ;
+
+       writel(PRCM_MOD_EN, &cmper->l3instrclkctrl);
+       while (readl(&cmper->l3instrclkctrl) != PRCM_MOD_EN)
+               ;
+
+       writel(PRCM_MOD_EN, &cmper->l4hsclkctrl);
+       while (readl(&cmper->l4hsclkctrl) != PRCM_MOD_EN)
+               ;
+
+       writel(PRCM_MOD_EN, &cmwkup->wkgpio0clkctrl);
+       while (readl(&cmwkup->wkgpio0clkctrl) != PRCM_MOD_EN)
+               ;
+}
+
+/*
+ * Force power domain wake up transition
+ * Ensure that the corresponding interface clock is active before
+ * using the peripheral
+ */
+static void power_domain_wkup_transition(void)
+{
+       writel(PRCM_FORCE_WAKEUP, &cmper->l3clkstctrl);
+       writel(PRCM_FORCE_WAKEUP, &cmper->l4lsclkstctrl);
+       writel(PRCM_FORCE_WAKEUP, &cmwkup->wkclkstctrl);
+       writel(PRCM_FORCE_WAKEUP, &cmper->l4fwclkstctrl);
+       writel(PRCM_FORCE_WAKEUP, &cmper->l3sclkstctrl);
+}
+
+/*
+ * Enable the peripheral clock for required peripherals
+ */
+static void enable_per_clocks(void)
+{
+       /* Enable the control module though RBL would have done it*/
+       writel(PRCM_MOD_EN, &cmwkup->wkctrlclkctrl);
+       while (readl(&cmwkup->wkctrlclkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* Enable the module clock */
+       writel(PRCM_MOD_EN, &cmper->timer2clkctrl);
+       while (readl(&cmper->timer2clkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* Select the Master osc 24 MHZ as Timer2 clock source */
+       writel(0x1, &cmdpll->clktimer2clk);
+
+       /* UART0 */
+       writel(PRCM_MOD_EN, &cmwkup->wkup_uart0ctrl);
+       while (readl(&cmwkup->wkup_uart0ctrl) != PRCM_MOD_EN)
+               ;
+
+       /* UART1 */
+#ifdef CONFIG_SERIAL2
+       writel(PRCM_MOD_EN, &cmper->uart1clkctrl);
+       while (readl(&cmper->uart1clkctrl) != PRCM_MOD_EN)
+               ;
+#endif /* CONFIG_SERIAL2 */
+
+       /* UART2 */
+#ifdef CONFIG_SERIAL3
+       writel(PRCM_MOD_EN, &cmper->uart2clkctrl);
+       while (readl(&cmper->uart2clkctrl) != PRCM_MOD_EN)
+               ;
+#endif /* CONFIG_SERIAL3 */
+
+       /* UART3 */
+#ifdef CONFIG_SERIAL4
+       writel(PRCM_MOD_EN, &cmper->uart3clkctrl);
+       while (readl(&cmper->uart3clkctrl) != PRCM_MOD_EN)
+               ;
+#endif /* CONFIG_SERIAL4 */
+
+       /* UART4 */
+#ifdef CONFIG_SERIAL5
+       writel(PRCM_MOD_EN, &cmper->uart4clkctrl);
+       while (readl(&cmper->uart4clkctrl) != PRCM_MOD_EN)
+               ;
+#endif /* CONFIG_SERIAL5 */
+
+       /* UART5 */
+#ifdef CONFIG_SERIAL6
+       writel(PRCM_MOD_EN, &cmper->uart5clkctrl);
+       while (readl(&cmper->uart5clkctrl) != PRCM_MOD_EN)
+               ;
+#endif /* CONFIG_SERIAL6 */
+
+       /* GPMC */
+       writel(PRCM_MOD_EN, &cmper->gpmcclkctrl);
+       while (readl(&cmper->gpmcclkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* ELM */
+       writel(PRCM_MOD_EN, &cmper->elmclkctrl);
+       while (readl(&cmper->elmclkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* MMC0*/
+       writel(PRCM_MOD_EN, &cmper->mmc0clkctrl);
+       while (readl(&cmper->mmc0clkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* i2c0 */
+       writel(PRCM_MOD_EN, &cmwkup->wkup_i2c0ctrl);
+       while (readl(&cmwkup->wkup_i2c0ctrl) != PRCM_MOD_EN)
+               ;
+
+       /* gpio1 module */
+       writel(PRCM_MOD_EN, &cmper->gpio1clkctrl);
+       while (readl(&cmper->gpio1clkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* gpio2 module */
+       writel(PRCM_MOD_EN, &cmper->gpio2clkctrl);
+       while (readl(&cmper->gpio2clkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* gpio3 module */
+       writel(PRCM_MOD_EN, &cmper->gpio3clkctrl);
+       while (readl(&cmper->gpio3clkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* i2c1 */
+       writel(PRCM_MOD_EN, &cmper->i2c1clkctrl);
+       while (readl(&cmper->i2c1clkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* Ethernet */
+       writel(PRCM_MOD_EN, &cmper->cpgmac0clkctrl);
+       while ((readl(&cmper->cpgmac0clkctrl) & CPGMAC0_IDLE) != PRCM_FUNCTL)
+               ;
+
+       /* spi0 */
+       writel(PRCM_MOD_EN, &cmper->spi0clkctrl);
+       while (readl(&cmper->spi0clkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* RTC */
+       writel(PRCM_MOD_EN, &cmrtc->rtcclkctrl);
+       while (readl(&cmrtc->rtcclkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* MUSB */
+       writel(PRCM_MOD_EN, &cmper->usb0clkctrl);
+       while (readl(&cmper->usb0clkctrl) != PRCM_MOD_EN)
+               ;
+}
+
+static void mpu_pll_config(void)
+{
+       u32 clkmode, clksel, div_m2;
+
+       clkmode = readl(&cmwkup->clkmoddpllmpu);
+       clksel = readl(&cmwkup->clkseldpllmpu);
+       div_m2 = readl(&cmwkup->divm2dpllmpu);
+
+       /* Set the PLL to bypass Mode */
+       writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllmpu);
+       while (readl(&cmwkup->idlestdpllmpu) != ST_MN_BYPASS)
+               ;
+
+       clksel = clksel & (~CLK_SEL_MASK);
+       clksel = clksel | ((MPUPLL_M << CLK_SEL_SHIFT) | MPUPLL_N);
+       writel(clksel, &cmwkup->clkseldpllmpu);
+
+       div_m2 = div_m2 & ~CLK_DIV_MASK;
+       div_m2 = div_m2 | MPUPLL_M2;
+       writel(div_m2, &cmwkup->divm2dpllmpu);
+
+       clkmode = clkmode | CLK_MODE_SEL;
+       writel(clkmode, &cmwkup->clkmoddpllmpu);
+
+       while (readl(&cmwkup->idlestdpllmpu) != ST_DPLL_CLK)
+               ;
+}
+
+static void core_pll_config(void)
+{
+       u32 clkmode, clksel, div_m4, div_m5, div_m6;
+
+       clkmode = readl(&cmwkup->clkmoddpllcore);
+       clksel = readl(&cmwkup->clkseldpllcore);
+       div_m4 = readl(&cmwkup->divm4dpllcore);
+       div_m5 = readl(&cmwkup->divm5dpllcore);
+       div_m6 = readl(&cmwkup->divm6dpllcore);
+
+       /* Set the PLL to bypass Mode */
+       writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllcore);
+
+       while (readl(&cmwkup->idlestdpllcore) != ST_MN_BYPASS)
+               ;
+
+       clksel = clksel & (~CLK_SEL_MASK);
+       clksel = clksel | ((COREPLL_M << CLK_SEL_SHIFT) | COREPLL_N);
+       writel(clksel, &cmwkup->clkseldpllcore);
+
+       div_m4 = div_m4 & ~CLK_DIV_MASK;
+       div_m4 = div_m4 | COREPLL_M4;
+       writel(div_m4, &cmwkup->divm4dpllcore);
+
+       div_m5 = div_m5 & ~CLK_DIV_MASK;
+       div_m5 = div_m5 | COREPLL_M5;
+       writel(div_m5, &cmwkup->divm5dpllcore);
+
+       div_m6 = div_m6 & ~CLK_DIV_MASK;
+       div_m6 = div_m6 | COREPLL_M6;
+       writel(div_m6, &cmwkup->divm6dpllcore);
+
+       clkmode = clkmode | CLK_MODE_SEL;
+       writel(clkmode, &cmwkup->clkmoddpllcore);
+
+       while (readl(&cmwkup->idlestdpllcore) != ST_DPLL_CLK)
+               ;
+}
+
+static void per_pll_config(void)
+{
+       u32 clkmode, clksel, div_m2;
+
+       clkmode = readl(&cmwkup->clkmoddpllper);
+       clksel = readl(&cmwkup->clkseldpllper);
+       div_m2 = readl(&cmwkup->divm2dpllper);
+
+       /* Set the PLL to bypass Mode */
+       writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllper);
+
+       while (readl(&cmwkup->idlestdpllper) != ST_MN_BYPASS)
+               ;
+
+       clksel = clksel & (~CLK_SEL_MASK);
+       clksel = clksel | ((PERPLL_M << CLK_SEL_SHIFT) | PERPLL_N);
+       writel(clksel, &cmwkup->clkseldpllper);
+
+       div_m2 = div_m2 & ~CLK_DIV2_MASK;
+       div_m2 = div_m2 | PERPLL_M2;
+       writel(div_m2, &cmwkup->divm2dpllper);
+
+       clkmode = clkmode | CLK_MODE_SEL;
+       writel(clkmode, &cmwkup->clkmoddpllper);
+
+       while (readl(&cmwkup->idlestdpllper) != ST_DPLL_CLK)
+               ;
+
+       writel(DPLL_CLKDCOLDO_GATE_CTRL, &cmwkup->clkdcoldodpllper);
+}
+
+void ddr_pll_config(unsigned int ddrpll_m)
+{
+       u32 clkmode, clksel, div_m2;
+
+       clkmode = readl(&cmwkup->clkmoddpllddr);
+       clksel = readl(&cmwkup->clkseldpllddr);
+       div_m2 = readl(&cmwkup->divm2dpllddr);
+
+       /* Set the PLL to bypass Mode */
+       clkmode = (clkmode & CLK_MODE_MASK) | PLL_BYPASS_MODE;
+       writel(clkmode, &cmwkup->clkmoddpllddr);
+
+       /* Wait till bypass mode is enabled */
+       while ((readl(&cmwkup->idlestdpllddr) & ST_MN_BYPASS)
+                               != ST_MN_BYPASS)
+               ;
+
+       clksel = clksel & (~CLK_SEL_MASK);
+       clksel = clksel | ((ddrpll_m << CLK_SEL_SHIFT) | DDRPLL_N);
+       writel(clksel, &cmwkup->clkseldpllddr);
+
+       div_m2 = div_m2 & CLK_DIV_SEL;
+       div_m2 = div_m2 | DDRPLL_M2;
+       writel(div_m2, &cmwkup->divm2dpllddr);
+
+       clkmode = (clkmode & CLK_MODE_MASK) | CLK_MODE_SEL;
+       writel(clkmode, &cmwkup->clkmoddpllddr);
+
+       /* Wait till dpll is locked */
+       while ((readl(&cmwkup->idlestdpllddr) & ST_DPLL_CLK) != ST_DPLL_CLK)
+               ;
+}
+
+void enable_emif_clocks(void)
+{
+       /* Enable the  EMIF_FW Functional clock */
+       writel(PRCM_MOD_EN, &cmper->emiffwclkctrl);
+       /* Enable EMIF0 Clock */
+       writel(PRCM_MOD_EN, &cmper->emifclkctrl);
+       /* Poll if module is functional */
+       while ((readl(&cmper->emifclkctrl)) != PRCM_MOD_EN)
+               ;
+}
+
+/*
+ * Configure the PLL/PRCM for necessary peripherals
+ */
+void pll_init()
+{
+       mpu_pll_config();
+       core_pll_config();
+       per_pll_config();
+
+       /* Enable the required interconnect clocks */
+       enable_interface_clocks();
+
+       /* Power domain wake up transition */
+       power_domain_wkup_transition();
+
+       /* Enable the required peripherals */
+       enable_per_clocks();
+}
diff --git a/arch/arm/cpu/armv7/am33xx/clock_ti814x.c b/arch/arm/cpu/armv7/am33xx/clock_ti814x.c
new file mode 100644 (file)
index 0000000..cb4210f
--- /dev/null
@@ -0,0 +1,406 @@
+/*
+ * clock_ti814x.c
+ *
+ * Clocks for TI814X based boards
+ *
+ * Copyright (C) 2013, Texas Instruments, Incorporated
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <common.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/hardware.h>
+#include <asm/io.h>
+
+/* PRCM */
+#define PRCM_MOD_EN            0x2
+
+/* CLK_SRC */
+#define OSC_SRC0               0
+#define OSC_SRC1               1
+
+#define L3_OSC_SRC             OSC_SRC0
+
+#define OSC_0_FREQ             20
+
+#define DCO_HS2_MIN            500
+#define DCO_HS2_MAX            1000
+#define DCO_HS1_MIN            1000
+#define DCO_HS1_MAX            2000
+
+#define SELFREQDCO_HS2         0x00000801
+#define SELFREQDCO_HS1         0x00001001
+
+#define MPU_N                  0x1
+#define MPU_M                  0x3C
+#define MPU_M2                 1
+#define MPU_CLKCTRL            0x1
+
+#define L3_N                   19
+#define L3_M                   880
+#define L3_M2                  4
+#define L3_CLKCTRL             0x801
+
+#define DDR_N                  19
+#define DDR_M                  666
+#define DDR_M2                 2
+#define DDR_CLKCTRL            0x801
+
+/* ADPLLJ register values */
+#define ADPLLJ_CLKCTRL_HS2     0x00000801 /* HS2 mode, TINT2 = 1 */
+#define ADPLLJ_CLKCTRL_HS1     0x00001001 /* HS1 mode, TINT2 = 1 */
+#define ADPLLJ_CLKCTRL_CLKDCOLDOEN     (1 << 29)
+#define ADPLLJ_CLKCTRL_IDLE            (1 << 23)
+#define ADPLLJ_CLKCTRL_CLKOUTEN                (1 << 20)
+#define ADPLLJ_CLKCTRL_CLKOUTLDOEN     (1 << 19)
+#define ADPLLJ_CLKCTRL_CLKDCOLDOPWDNZ  (1 << 17)
+#define ADPLLJ_CLKCTRL_LPMODE          (1 << 12)
+#define ADPLLJ_CLKCTRL_DRIFTGUARDIAN   (1 << 11)
+#define ADPLLJ_CLKCTRL_REGM4XEN                (1 << 10)
+#define ADPLLJ_CLKCTRL_TINITZ          (1 << 0)
+#define ADPLLJ_CLKCTRL_CLKDCO          (ADPLLJ_CLKCTRL_CLKDCOLDOEN | \
+                                        ADPLLJ_CLKCTRL_CLKOUTEN | \
+                                        ADPLLJ_CLKCTRL_CLKOUTLDOEN | \
+                                        ADPLLJ_CLKCTRL_CLKDCOLDOPWDNZ)
+
+#define ADPLLJ_STATUS_PHASELOCK                (1 << 10)
+#define ADPLLJ_STATUS_FREQLOCK         (1 << 9)
+#define ADPLLJ_STATUS_PHSFRQLOCK       (ADPLLJ_STATUS_PHASELOCK | \
+                                        ADPLLJ_STATUS_FREQLOCK)
+#define ADPLLJ_STATUS_BYPASSACK                (1 << 8)
+#define ADPLLJ_STATUS_BYPASS           (1 << 0)
+#define ADPLLJ_STATUS_BYPASSANDACK     (ADPLLJ_STATUS_BYPASSACK | \
+                                        ADPLLJ_STATUS_BYPASS)
+
+#define ADPLLJ_TENABLE_ENB             (1 << 0)
+#define ADPLLJ_TENABLEDIV_ENB          (1 << 0)
+
+#define ADPLLJ_M2NDIV_M2SHIFT          16
+
+#define MPU_PLL_BASE                   (PLL_SUBSYS_BASE + 0x048)
+#define L3_PLL_BASE                    (PLL_SUBSYS_BASE + 0x110)
+#define DDR_PLL_BASE                   (PLL_SUBSYS_BASE + 0x290)
+
+struct ad_pll {
+       unsigned int pwrctrl;
+       unsigned int clkctrl;
+       unsigned int tenable;
+       unsigned int tenablediv;
+       unsigned int m2ndiv;
+       unsigned int mn2div;
+       unsigned int fracdiv;
+       unsigned int bwctrl;
+       unsigned int fracctrl;
+       unsigned int status;
+       unsigned int m3div;
+       unsigned int rampctrl;
+};
+
+#define OSC_SRC_CTRL                   (PLL_SUBSYS_BASE + 0x2C0)
+
+/* PRCM */
+#define CM_DEFAULT_BASE                        (PRCM_BASE + 0x0500)
+
+struct cm_def {
+       unsigned int resv0[2];
+       unsigned int l3fastclkstctrl;
+       unsigned int resv1[1];
+       unsigned int pciclkstctrl;
+       unsigned int resv2[1];
+       unsigned int ducaticlkstctrl;
+       unsigned int resv3[1];
+       unsigned int emif0clkctrl;
+       unsigned int emif1clkctrl;
+       unsigned int dmmclkctrl;
+       unsigned int fwclkctrl;
+       unsigned int resv4[10];
+       unsigned int usbclkctrl;
+       unsigned int resv5[1];
+       unsigned int sataclkctrl;
+       unsigned int resv6[4];
+       unsigned int ducaticlkctrl;
+       unsigned int pciclkctrl;
+};
+
+#define CM_ALWON_BASE                  (PRCM_BASE + 0x1400)
+
+struct cm_alwon {
+       unsigned int l3slowclkstctrl;
+       unsigned int ethclkstctrl;
+       unsigned int l3medclkstctrl;
+       unsigned int mmu_clkstctrl;
+       unsigned int mmucfg_clkstctrl;
+       unsigned int ocmc0clkstctrl;
+       unsigned int vcpclkstctrl;
+       unsigned int mpuclkstctrl;
+       unsigned int sysclk4clkstctrl;
+       unsigned int sysclk5clkstctrl;
+       unsigned int sysclk6clkstctrl;
+       unsigned int rtcclkstctrl;
+       unsigned int l3fastclkstctrl;
+       unsigned int resv0[67];
+       unsigned int mcasp0clkctrl;
+       unsigned int mcasp1clkctrl;
+       unsigned int mcasp2clkctrl;
+       unsigned int mcbspclkctrl;
+       unsigned int uart0clkctrl;
+       unsigned int uart1clkctrl;
+       unsigned int uart2clkctrl;
+       unsigned int gpio0clkctrl;
+       unsigned int gpio1clkctrl;
+       unsigned int i2c0clkctrl;
+       unsigned int i2c1clkctrl;
+       unsigned int mcasp345clkctrl;
+       unsigned int atlclkctrl;
+       unsigned int mlbclkctrl;
+       unsigned int pataclkctrl;
+       unsigned int resv1[1];
+       unsigned int uart3clkctrl;
+       unsigned int uart4clkctrl;
+       unsigned int uart5clkctrl;
+       unsigned int wdtimerclkctrl;
+       unsigned int spiclkctrl;
+       unsigned int mailboxclkctrl;
+       unsigned int spinboxclkctrl;
+       unsigned int mmudataclkctrl;
+       unsigned int resv2[2];
+       unsigned int mmucfgclkctrl;
+       unsigned int resv3[2];
+       unsigned int ocmc0clkctrl;
+       unsigned int vcpclkctrl;
+       unsigned int resv4[2];
+       unsigned int controlclkctrl;
+       unsigned int resv5[2];
+       unsigned int gpmcclkctrl;
+       unsigned int ethernet0clkctrl;
+       unsigned int resv6[1];
+       unsigned int mpuclkctrl;
+       unsigned int debugssclkctrl;
+       unsigned int l3clkctrl;
+       unsigned int l4hsclkctrl;
+       unsigned int l4lsclkctrl;
+       unsigned int rtcclkctrl;
+       unsigned int tpccclkctrl;
+       unsigned int tptc0clkctrl;
+       unsigned int tptc1clkctrl;
+       unsigned int tptc2clkctrl;
+       unsigned int tptc3clkctrl;
+       unsigned int resv7[4];
+       unsigned int dcan01clkctrl;
+       unsigned int mmchs0clkctrl;
+       unsigned int mmchs1clkctrl;
+       unsigned int mmchs2clkctrl;
+       unsigned int custefuseclkctrl;
+};
+
+
+const struct cm_alwon *cmalwon = (struct cm_alwon *)CM_ALWON_BASE;
+const struct cm_def *cmdef = (struct cm_def *)CM_DEFAULT_BASE;
+
+/*
+ * Enable the peripheral clock for required peripherals
+ */
+static void enable_per_clocks(void)
+{
+       /* UART0 */
+       writel(PRCM_MOD_EN, &cmalwon->uart0clkctrl);
+       while (readl(&cmalwon->uart0clkctrl) != PRCM_MOD_EN)
+               ;
+
+       /* HSMMC1 */
+       writel(PRCM_MOD_EN, &cmalwon->mmchs1clkctrl);
+       while (readl(&cmalwon->mmchs1clkctrl) != PRCM_MOD_EN)
+               ;
+}
+
+/*
+ * select the HS1 or HS2 for DCO Freq
+ * return : CLKCTRL
+ */
+static u32 pll_dco_freq_sel(u32 clkout_dco)
+{
+       if (clkout_dco >= DCO_HS2_MIN && clkout_dco < DCO_HS2_MAX)
+               return SELFREQDCO_HS2;
+       else if (clkout_dco >= DCO_HS1_MIN && clkout_dco < DCO_HS1_MAX)
+               return SELFREQDCO_HS1;
+       else
+               return -1;
+}
+
+/*
+ * select the sigma delta config
+ * return: sigma delta val
+ */
+static u32 pll_sigma_delta_val(u32 clkout_dco)
+{
+       u32 sig_val = 0;
+       float frac_div;
+
+       frac_div = (float) clkout_dco / 250;
+       frac_div = frac_div + 0.90;
+       sig_val = (int)frac_div;
+       sig_val = sig_val << 24;
+
+       return sig_val;
+}
+
+/*
+ * configure individual ADPLLJ
+ */
+static void pll_config(u32 base, u32 n, u32 m, u32 m2,
+                      u32 clkctrl_val, int adpllj)
+{
+       const struct ad_pll *adpll = (struct ad_pll *)base;
+       u32 m2nval, mn2val, read_clkctrl = 0, clkout_dco = 0;
+       u32 sig_val = 0, hs_mod = 0;
+
+       m2nval = (m2 << ADPLLJ_M2NDIV_M2SHIFT) | n;
+       mn2val = m;
+
+       /* calculate clkout_dco */
+       clkout_dco = ((OSC_0_FREQ / (n+1)) * m);
+
+       /* sigma delta & Hs mode selection skip for ADPLLS*/
+       if (adpllj) {
+               sig_val = pll_sigma_delta_val(clkout_dco);
+               hs_mod = pll_dco_freq_sel(clkout_dco);
+       }
+
+       /* by-pass pll */
+       read_clkctrl = readl(&adpll->clkctrl);
+       writel((read_clkctrl | ADPLLJ_CLKCTRL_IDLE), &adpll->clkctrl);
+       while ((readl(&adpll->status) & ADPLLJ_STATUS_BYPASSANDACK)
+               != ADPLLJ_STATUS_BYPASSANDACK)
+               ;
+
+       /* clear TINITZ */
+       read_clkctrl = readl(&adpll->clkctrl);
+       writel((read_clkctrl & ~ADPLLJ_CLKCTRL_TINITZ), &adpll->clkctrl);
+
+       /*
+        * ref_clk = 20/(n + 1);
+        * clkout_dco = ref_clk * m;
+        * clk_out = clkout_dco/m2;
+       */
+       read_clkctrl = readl(&adpll->clkctrl) &
+                            ~(ADPLLJ_CLKCTRL_LPMODE |
+                            ADPLLJ_CLKCTRL_DRIFTGUARDIAN |
+                            ADPLLJ_CLKCTRL_REGM4XEN);
+       writel(m2nval, &adpll->m2ndiv);
+       writel(mn2val, &adpll->mn2div);
+
+       /* Skip for modena(ADPLLS) */
+       if (adpllj) {
+               writel(sig_val, &adpll->fracdiv);
+               writel((read_clkctrl | hs_mod), &adpll->clkctrl);
+       }
+
+       /* Load M2, N2 dividers of ADPLL */
+       writel(ADPLLJ_TENABLEDIV_ENB, &adpll->tenablediv);
+       writel(~ADPLLJ_TENABLEDIV_ENB, &adpll->tenablediv);
+
+       /* Load M, N dividers of ADPLL */
+       writel(ADPLLJ_TENABLE_ENB, &adpll->tenable);
+       writel(~ADPLLJ_TENABLE_ENB, &adpll->tenable);
+
+       /* Configure CLKDCOLDOEN,CLKOUTLDOEN,CLKOUT Enable BITS */
+       read_clkctrl = readl(&adpll->clkctrl) & ~ADPLLJ_CLKCTRL_CLKDCO;
+       if (adpllj)
+               writel((read_clkctrl | ADPLLJ_CLKCTRL_CLKDCO),
+                                               &adpll->clkctrl);
+
+       /* Enable TINTZ and disable IDLE(PLL in Active & Locked Mode */
+       read_clkctrl = readl(&adpll->clkctrl) & ~ADPLLJ_CLKCTRL_IDLE;
+       writel((read_clkctrl | ADPLLJ_CLKCTRL_TINITZ), &adpll->clkctrl);
+
+       /* Wait for phase and freq lock */
+       while ((readl(&adpll->status) & ADPLLJ_STATUS_PHSFRQLOCK) !=
+              ADPLLJ_STATUS_PHSFRQLOCK)
+               ;
+}
+
+static void unlock_pll_control_mmr(void)
+{
+       /* TRM 2.10.1.4 and 3.2.7-3.2.11 */
+       writel(0x1EDA4C3D, 0x481C5040);
+       writel(0x2FF1AC2B, 0x48140060);
+       writel(0xF757FDC0, 0x48140064);
+       writel(0xE2BC3A6D, 0x48140068);
+       writel(0x1EBF131D, 0x4814006c);
+       writel(0x6F361E05, 0x48140070);
+}
+
+static void mpu_pll_config(void)
+{
+       pll_config(MPU_PLL_BASE, MPU_N, MPU_M, MPU_M2, MPU_CLKCTRL, 0);
+}
+
+static void l3_pll_config(void)
+{
+       u32 l3_osc_src, rd_osc_src = 0;
+
+       l3_osc_src = L3_OSC_SRC;
+       rd_osc_src = readl(OSC_SRC_CTRL);
+
+       if (OSC_SRC0 == l3_osc_src)
+               writel((rd_osc_src & 0xfffffffe)|0x0, OSC_SRC_CTRL);
+       else
+               writel((rd_osc_src & 0xfffffffe)|0x1, OSC_SRC_CTRL);
+
+       pll_config(L3_PLL_BASE, L3_N, L3_M, L3_M2, L3_CLKCTRL, 1);
+}
+
+void ddr_pll_config(unsigned int ddrpll_m)
+{
+       pll_config(DDR_PLL_BASE, DDR_N, DDR_M, DDR_M2, DDR_CLKCTRL, 1);
+}
+
+void enable_emif_clocks(void) {};
+
+void enable_dmm_clocks(void)
+{
+       writel(PRCM_MOD_EN, &cmdef->fwclkctrl);
+       writel(PRCM_MOD_EN, &cmdef->l3fastclkstctrl);
+       writel(PRCM_MOD_EN, &cmdef->emif0clkctrl);
+       while ((readl(&cmdef->emif0clkctrl)) != PRCM_MOD_EN)
+               ;
+       writel(PRCM_MOD_EN, &cmdef->emif1clkctrl);
+       while ((readl(&cmdef->emif1clkctrl)) != PRCM_MOD_EN)
+               ;
+       while ((readl(&cmdef->l3fastclkstctrl) & 0x300) != 0x300)
+               ;
+       writel(PRCM_MOD_EN, &cmdef->dmmclkctrl);
+       while ((readl(&cmdef->dmmclkctrl)) != PRCM_MOD_EN)
+               ;
+       writel(PRCM_MOD_EN, &cmalwon->l3slowclkstctrl);
+       while ((readl(&cmalwon->l3slowclkstctrl) & 0x2100) != 0x2100)
+               ;
+}
+
+/*
+ * Configure the PLL/PRCM for necessary peripherals
+ */
+void pll_init()
+{
+       unlock_pll_control_mmr();
+
+       /* Enable the control module */
+       writel(PRCM_MOD_EN, &cmalwon->controlclkctrl);
+
+       mpu_pll_config();
+
+       l3_pll_config();
+
+       /* Enable the required peripherals */
+       enable_per_clocks();
+}
index 872ff820af30a10d5a4864dceea63240b9549dff..ecb590185730f47c9d91fa4698fdf8e8989e1017 100644 (file)
@@ -3,7 +3,7 @@
  *
  * clock header
  *
- * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
+ * Copyright (C) 2011, Texas Instruments Incorporated - http://www.ti.com/
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
index 2d960070f10f3c5afbeb13689043591ff9d2211d..89b63d9a8ced5132fd66f8cc8eeb7da428c752f8 100644 (file)
@@ -3,7 +3,7 @@
  *
  * AM33xx clock define
  *
- * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
 #ifndef _CLOCKS_AM33XX_H_
 #define _CLOCKS_AM33XX_H_
 
-#define OSC    (V_OSCK/1000000)
-
 /* MAIN PLL Fdll = 550 MHz, by default */
 #ifndef CONFIG_SYS_MPUCLK
 #define CONFIG_SYS_MPUCLK      550
 #endif
-#define MPUPLL_M       CONFIG_SYS_MPUCLK
-#define MPUPLL_N       (OSC-1)
-#define MPUPLL_M2      1
-
-/* Core PLL Fdll = 1 GHZ, */
-#define COREPLL_M      1000
-#define COREPLL_N      (OSC-1)
-
-#define COREPLL_M4     10      /* CORE_CLKOUTM4 = 200 MHZ */
-#define COREPLL_M5     8       /* CORE_CLKOUTM5 = 250 MHZ */
-#define COREPLL_M6     4       /* CORE_CLKOUTM6 = 500 MHZ */
-
-/*
- * USB PHY clock is 960 MHZ. Since, this comes directly from Fdll, Fdll
- * frequency needs to be set to 960 MHZ. Hence,
- * For clkout = 192 MHZ, Fdll = 960 MHZ, divider values are given below
- */
-#define PERPLL_M       960
-#define PERPLL_N       (OSC-1)
-#define PERPLL_M2      5
-
-/* DDR Freq is 266 MHZ for now */
-/* Set Fdll = 400 MHZ , Fdll = M * 2 * CLKINP/ N + 1; clkout = Fdll /(2 * M2) */
-#define DDRPLL_M       266
-#define DDRPLL_N       (OSC-1)
-#define DDRPLL_M2      1
 
 extern void pll_init(void);
 extern void enable_emif_clocks(void);
+extern void enable_dmm_clocks(void);
 
 #endif /* endif _CLOCKS_AM33XX_H_ */
diff --git a/arch/arm/include/asm/arch-am33xx/hardware_am33xx.h b/arch/arm/include/asm/arch-am33xx/hardware_am33xx.h
new file mode 100644 (file)
index 0000000..7a4070c
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * hardware_am33xx.h
+ *
+ * AM33xx hardware specific header
+ *
+ * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __AM33XX_HARDWARE_AM33XX_H
+#define __AM33XX_HARDWARE_AM33XX_H
+
+/* VTP Base address */
+#define VTP0_CTRL_ADDR                 0x44E10E0C
+
+/* DDR Base address */
+#define DDR_PHY_CMD_ADDR               0x44E12000
+#define DDR_PHY_DATA_ADDR              0x44E120C8
+#define DDR_DATA_REGS_NR               2
+
+#endif /* __AM33XX_HARDWARE_AM33XX_H */
diff --git a/arch/arm/include/asm/arch-am33xx/hardware_ti814x.h b/arch/arm/include/asm/arch-am33xx/hardware_ti814x.h
new file mode 100644 (file)
index 0000000..af7d1d8
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * hardware_ti814x.h
+ *
+ * TI814x hardware specific header
+ *
+ * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __AM33XX_HARDWARE_TI814X_H
+#define __AM33XX_HARDWARE_TI814X_H
+
+/* VTP Base address */
+#define VTP0_CTRL_ADDR                 0x48140E0C
+
+/* DDR Base address */
+#define DDR_PHY_CMD_ADDR               0x47C0C400
+#define DDR_PHY_DATA_ADDR              0x47C0C4C8
+#define DDR_DATA_REGS_NR               4
+
+#endif /* __AM33XX_HARDWARE_TI814X_H */