diff options
Diffstat (limited to 'recipes-bsp/u-boot/u-boot/0019-OMAP3-clocks-update-clock-setup-for-36XX-37XX.patch')
-rw-r--r-- | recipes-bsp/u-boot/u-boot/0019-OMAP3-clocks-update-clock-setup-for-36XX-37XX.patch | 826 |
1 files changed, 0 insertions, 826 deletions
diff --git a/recipes-bsp/u-boot/u-boot/0019-OMAP3-clocks-update-clock-setup-for-36XX-37XX.patch b/recipes-bsp/u-boot/u-boot/0019-OMAP3-clocks-update-clock-setup-for-36XX-37XX.patch deleted file mode 100644 index fc33fba4a0..0000000000 --- a/recipes-bsp/u-boot/u-boot/0019-OMAP3-clocks-update-clock-setup-for-36XX-37XX.patch +++ /dev/null @@ -1,826 +0,0 @@ -From 276236da04d67dfad61ccab5d4700613ae8527f9 Mon Sep 17 00:00:00 2001 -From: Steve Sakoman <steve@sakoman.com> -Date: Tue, 23 Mar 2010 09:20:56 -0700 -Subject: [PATCH 19/51] OMAP3: clocks: update clock setup for 36XX/37XX - ---- - cpu/arm_cortexa8/omap3/clock.c | 559 +++++++++++++++++++++-------- - cpu/arm_cortexa8/omap3/lowlevel_init.S | 69 ++++ - include/asm-arm/arch-omap3/clocks.h | 17 + - include/asm-arm/arch-omap3/clocks_omap3.h | 27 ++ - 4 files changed, 525 insertions(+), 147 deletions(-) - -diff --git a/cpu/arm_cortexa8/omap3/clock.c b/cpu/arm_cortexa8/omap3/clock.c -index 6330c9e..538a183 100644 ---- a/cpu/arm_cortexa8/omap3/clock.c -+++ b/cpu/arm_cortexa8/omap3/clock.c -@@ -47,17 +47,12 @@ u32 get_osc_clk_speed(void) - struct s32ktimer *s32k_base = (struct s32ktimer *)SYNC_32KTIMER_BASE; - - val = readl(&prm_base->clksrc_ctrl); -- - if (val & SYSCLKDIV_2) - cdiv = 2; -- else if (val & SYSCLKDIV_1) -- cdiv = 1; - else -- /* -- * Should never reach here! (Assume divider as 1) -- */ - cdiv = 1; - -+ - /* enable timer2 */ - val = readl(&prcm_base->clksel_wkup) | CLKSEL_GPT1; - -@@ -67,7 +62,6 @@ u32 get_osc_clk_speed(void) - /* Enable I and F Clocks for GPT1 */ - val = readl(&prcm_base->iclken_wkup) | EN_GPT1 | EN_32KSYNC; - writel(val, &prcm_base->iclken_wkup); -- - val = readl(&prcm_base->fclken_wkup) | EN_GPT1; - writel(val, &prcm_base->fclken_wkup); - -@@ -87,13 +81,10 @@ u32 get_osc_clk_speed(void) - - /* wait for 40 cycles */ - while (readl(&s32k_base->s32k_cr) < (start + 20)) ; -+ - cend = readl(&gpt1_base->tcrr); /* get end sys_clk count */ - cdiff = cend - cstart; /* get elapsed ticks */ -- -- if (cdiv == 2) -- { -- cdiff *= 2; -- } -+ cdiff *= cdiv; - - /* based on number of ticks assign speed */ - if (cdiff > 19000) -@@ -135,65 +126,25 @@ void get_sys_clkin_sel(u32 osc_clk, u32 *sys_clkin_sel) - } - } - -+/* -+ * OMAP3530 specific functions -+ */ -+ - /****************************************************************************** -- * prcm_init() - inits clocks for PRCM as defined in clocks.h -- * called from SRAM, or Flash (using temp SRAM stack). -+ * Initialize CORE DPLL for OMAP34x/35x - *****************************************************************************/ --void prcm_init(void) -+static void dpll3_init_34xx(u32 sil_index, u32 clk_index) - { -+ struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -+ dpll_param *ptr = (dpll_param *) get_core_dpll_param(); - void (*f_lock_pll) (u32, u32, u32, u32); - int xip_safe, p0, p1, p2, p3; -- u32 osc_clk = 0, sys_clkin_sel; -- u32 clk_index, sil_index = 0; -- struct prm *prm_base = (struct prm *)PRM_BASE; -- struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -- dpll_param *dpll_param_p; -- -- f_lock_pll = (void *) ((u32) &_end_vect - (u32) &_start + -- SRAM_VECT_CODE); - - xip_safe = is_running_in_sram(); - -- /* -- * Gauge the input clock speed and find out the sys_clkin_sel -- * value corresponding to the input clock. -- */ -- osc_clk = get_osc_clk_speed(); -- get_sys_clkin_sel(osc_clk, &sys_clkin_sel); -+ /* Moving to the right sysclk and ES rev base */ -+ ptr = ptr + (3 * clk_index) + sil_index; - -- /* set input crystal speed */ -- sr32(&prm_base->clksel, 0, 3, sys_clkin_sel); -- -- /* If the input clock is greater than 19.2M always divide/2 */ -- if (sys_clkin_sel > 2) { -- /* input clock divider */ -- sr32(&prm_base->clksrc_ctrl, 6, 2, 2); -- clk_index = sys_clkin_sel / 2; -- } else { -- /* input clock divider */ -- sr32(&prm_base->clksrc_ctrl, 6, 2, 1); -- clk_index = sys_clkin_sel; -- } -- -- /* -- * The DPLL tables are defined according to sysclk value and -- * silicon revision. The clk_index value will be used to get -- * the values for that input sysclk from the DPLL param table -- * and sil_index will get the values for that SysClk for the -- * appropriate silicon rev. -- */ -- if (get_cpu_rev()) -- sil_index = 1; -- -- /* Unlock MPU DPLL (slows things down, and needed later) */ -- sr32(&prcm_base->clken_pll_mpu, 0, 3, PLL_LOW_POWER_BYPASS); -- wait_on_value(ST_MPU_CLK, 0, &prcm_base->idlest_pll_mpu, LDELAY); -- -- /* Getting the base address of Core DPLL param table */ -- dpll_param_p = (dpll_param *) get_core_dpll_param(); -- -- /* Moving it to the right sysclk and ES rev base */ -- dpll_param_p = dpll_param_p + 3 * clk_index + sil_index; - if (xip_safe) { - /* - * CORE DPLL -@@ -208,34 +159,38 @@ void prcm_init(void) - * work. write another value and then default value. - */ - -- /* m3x2 */ -- sr32(&prcm_base->clksel1_emu, 16, 5, CORE_M3X2 + 1); -- /* m3x2 */ -+ /* CM_CLKSEL1_EMU[DIV_DPLL3] */ -+ sr32(&prcm_base->clksel1_emu, 16, 5, (CORE_M3X2 + 1)) ; - sr32(&prcm_base->clksel1_emu, 16, 5, CORE_M3X2); -- /* Set M2 */ -- sr32(&prcm_base->clksel1_pll, 27, 2, dpll_param_p->m2); -- /* Set M */ -- sr32(&prcm_base->clksel1_pll, 16, 11, dpll_param_p->m); -- /* Set N */ -- sr32(&prcm_base->clksel1_pll, 8, 7, dpll_param_p->n); -- /* 96M Src */ -+ -+ /* M2 (CORE_DPLL_CLKOUT_DIV): CM_CLKSEL1_PLL[27:31] */ -+ sr32(&prcm_base->clksel1_pll, 27, 5, ptr->m2); -+ -+ /* M (CORE_DPLL_MULT): CM_CLKSEL1_PLL[16:26] */ -+ sr32(&prcm_base->clksel1_pll, 16, 11, ptr->m); -+ -+ /* N (CORE_DPLL_DIV): CM_CLKSEL1_PLL[8:14] */ -+ sr32(&prcm_base->clksel1_pll, 8, 7, ptr->n); -+ -+ /* Source is the CM_96M_FCLK: CM_CLKSEL1_PLL[6] */ - sr32(&prcm_base->clksel1_pll, 6, 1, 0); -- /* ssi */ -+ -+ /* SSI */ - sr32(&prcm_base->clksel_core, 8, 4, CORE_SSI_DIV); -- /* fsusb */ -+ /* FSUSB */ - sr32(&prcm_base->clksel_core, 4, 2, CORE_FUSB_DIV); -- /* l4 */ -+ /* L4 */ - sr32(&prcm_base->clksel_core, 2, 2, CORE_L4_DIV); -- /* l3 */ -+ /* L3 */ - sr32(&prcm_base->clksel_core, 0, 2, CORE_L3_DIV); -- /* gfx */ -- sr32(&prcm_base->clksel_gfx, 0, 3, GFX_DIV); -- /* reset mgr */ -+ /* GFX */ -+ sr32(&prcm_base->clksel_gfx, 0, 3, GFX_DIV); -+ /* RESET MGR */ - sr32(&prcm_base->clksel_wkup, 1, 2, WKUP_RSM); -- /* FREQSEL */ -- sr32(&prcm_base->clken_pll, 4, 4, dpll_param_p->fsel); -- /* lock mode */ -- sr32(&prcm_base->clken_pll, 0, 3, PLL_LOCK); -+ /* FREQSEL (CORE_DPLL_FREQSEL): CM_CLKEN_PLL[4:7] */ -+ sr32(&prcm_base->clken_pll, 4, 4, ptr->fsel); -+ /* LOCK MODE */ -+ sr32(&prcm_base->clken_pll, 0, 3, PLL_LOCK); - - wait_on_value(ST_CORE_CLK, 1, &prcm_base->idlest_ckgen, - LDELAY); -@@ -244,102 +199,411 @@ void prcm_init(void) - * if running from flash, jump to small relocated code - * area in SRAM. - */ -+ f_lock_pll = (void *) ((u32) &_end_vect - (u32) &_start + -+ SRAM_VECT_CODE); -+ - p0 = readl(&prcm_base->clken_pll); - sr32(&p0, 0, 3, PLL_FAST_RELOCK_BYPASS); -- sr32(&p0, 4, 4, dpll_param_p->fsel); /* FREQSEL */ -+ /* FREQSEL (CORE_DPLL_FREQSEL): CM_CLKEN_PLL[4:7] */ -+ sr32(&p0, 4, 4, ptr->fsel); - - p1 = readl(&prcm_base->clksel1_pll); -- sr32(&p1, 27, 2, dpll_param_p->m2); /* Set M2 */ -- sr32(&p1, 16, 11, dpll_param_p->m); /* Set M */ -- sr32(&p1, 8, 7, dpll_param_p->n); /* Set N */ -- sr32(&p1, 6, 1, 0); /* set source for 96M */ -+ /* M2 (CORE_DPLL_CLKOUT_DIV): CM_CLKSEL1_PLL[27:31] */ -+ sr32(&p1, 27, 5, ptr->m2); -+ /* M (CORE_DPLL_MULT): CM_CLKSEL1_PLL[16:26] */ -+ sr32(&p1, 16, 11, ptr->m); -+ /* N (CORE_DPLL_DIV): CM_CLKSEL1_PLL[8:14] */ -+ sr32(&p1, 8, 7, ptr->n); -+ /* Source is the CM_96M_FCLK: CM_CLKSEL1_PLL[6] */ -+ sr32(&p1, 6, 1, 0); - - p2 = readl(&prcm_base->clksel_core); -- sr32(&p2, 8, 4, CORE_SSI_DIV); /* ssi */ -- sr32(&p2, 4, 2, CORE_FUSB_DIV); /* fsusb */ -- sr32(&p2, 2, 2, CORE_L4_DIV); /* l4 */ -- sr32(&p2, 0, 2, CORE_L3_DIV); /* l3 */ -+ /* SSI */ -+ sr32(&p2, 8, 4, CORE_SSI_DIV); -+ /* FSUSB */ -+ sr32(&p2, 4, 2, CORE_FUSB_DIV); -+ /* L4 */ -+ sr32(&p2, 2, 2, CORE_L4_DIV); -+ /* L3 */ -+ sr32(&p2, 0, 2, CORE_L3_DIV); - - p3 = (u32)&prcm_base->idlest_ckgen; - - (*f_lock_pll) (p0, p1, p2, p3); - } -+} - -- /* PER DPLL */ -- sr32(&prcm_base->clken_pll, 16, 3, PLL_STOP); -- wait_on_value(ST_PERIPH_CLK, 0, &prcm_base->idlest_ckgen, LDELAY); -- -- /* Getting the base address to PER DPLL param table */ -- -- /* Set N */ -- dpll_param_p = (dpll_param *) get_per_dpll_param(); -+/****************************************************************************** -+ * Initialize PER DPLL for OMAP34x/35x -+ *****************************************************************************/ -+static void dpll4_init_34xx(u32 sil_index, u32 clk_index) -+{ -+ struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -+ dpll_param *ptr = (dpll_param *) get_per_dpll_param(); - - /* Moving it to the right sysclk base */ -- dpll_param_p = dpll_param_p + clk_index; -+ ptr = ptr + clk_index; -+ -+ /* EN_PERIPH_DPLL: CM_CLKEN_PLL[16:18] */ -+ sr32(&prcm_base->clken_pll, 16, 3, PLL_STOP); -+ wait_on_value(ST_PERIPH_CLK, 0, &prcm_base->idlest_ckgen, LDELAY); - - /* - * Errata 1.50 Workaround for OMAP3 ES1.0 only - * If using default divisors, write default divisor + 1 - * and then the actual divisor value - */ -- sr32(&prcm_base->clksel1_emu, 24, 5, PER_M6X2 + 1); /* set M6 */ -- sr32(&prcm_base->clksel1_emu, 24, 5, PER_M6X2); /* set M6 */ -- sr32(&prcm_base->clksel_cam, 0, 5, PER_M5X2 + 1); /* set M5 */ -- sr32(&prcm_base->clksel_cam, 0, 5, PER_M5X2); /* set M5 */ -- sr32(&prcm_base->clksel_dss, 0, 5, PER_M4X2 + 1); /* set M4 */ -- sr32(&prcm_base->clksel_dss, 0, 5, PER_M4X2); /* set M4 */ -- sr32(&prcm_base->clksel_dss, 8, 5, PER_M3X2 + 1); /* set M3 */ -- sr32(&prcm_base->clksel_dss, 8, 5, PER_M3X2); /* set M3 */ -- sr32(&prcm_base->clksel3_pll, 0, 5, dpll_param_p->m2 + 1); /* set M2 */ -- sr32(&prcm_base->clksel3_pll, 0, 5, dpll_param_p->m2); /* set M2 */ -+ /* M6 */ -+ sr32(&prcm_base->clksel1_emu, 24, 5, (PER_M6X2 + 1)); -+ sr32(&prcm_base->clksel1_emu, 24, 5, PER_M6X2); -+ /* M5 */ -+ sr32(&prcm_base->clksel_cam, 0, 5, (PER_M5X2 + 1)); -+ sr32(&prcm_base->clksel_cam, 0, 5, PER_M5X2); -+ /* M4 */ -+ sr32(&prcm_base->clksel_dss, 0, 5, (PER_M4X2 + 1)); -+ sr32(&prcm_base->clksel_dss, 0, 5, PER_M4X2); -+ /* M3 */ -+ sr32(&prcm_base->clksel_dss, 8, 5, (PER_M3X2 + 1)); -+ sr32(&prcm_base->clksel_dss, 8, 5, PER_M3X2); -+ /* M2 (DIV_96M): CM_CLKSEL3_PLL[0:4] */ -+ sr32(&prcm_base->clksel3_pll, 0, 5, (ptr->m2 + 1)); -+ sr32(&prcm_base->clksel3_pll, 0, 5, ptr->m2); - /* Workaround end */ - -- sr32(&prcm_base->clksel2_pll, 8, 11, dpll_param_p->m); /* set m */ -- sr32(&prcm_base->clksel2_pll, 0, 7, dpll_param_p->n); /* set n */ -- sr32(&prcm_base->clken_pll, 20, 4, dpll_param_p->fsel); /* FREQSEL */ -- sr32(&prcm_base->clken_pll, 16, 3, PLL_LOCK); /* lock mode */ -+ /* M (PERIPH_DPLL_MULT): CM_CLKSEL2_PLL[8:18] */ -+ sr32(&prcm_base->clksel2_pll, 8, 11, ptr->m); -+ -+ /* N (PERIPH_DPLL_DIV): CM_CLKSEL2_PLL[0:6] */ -+ sr32(&prcm_base->clksel2_pll, 0, 7, ptr->n); -+ -+ /* FREQSEL (PERIPH_DPLL_FREQSEL): CM_CLKEN_PLL[20:23] */ -+ sr32(&prcm_base->clken_pll, 20, 4, ptr->fsel); -+ -+ /* LOCK MODE (EN_PERIPH_DPLL): CM_CLKEN_PLL[16:18] */ -+ sr32(&prcm_base->clken_pll, 16, 3, PLL_LOCK); - wait_on_value(ST_PERIPH_CLK, 2, &prcm_base->idlest_ckgen, LDELAY); -+} - -- /* Getting the base address to MPU DPLL param table */ -- dpll_param_p = (dpll_param *) get_mpu_dpll_param(); -+static void mpu_init_34xx(u32 sil_index, u32 clk_index) -+{ -+ struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -+ dpll_param *ptr = (dpll_param *) get_mpu_dpll_param(); - -- /* Moving it to the right sysclk and ES rev base */ -- dpll_param_p = dpll_param_p + 3 * clk_index + sil_index; -+ /* Moving to the right sysclk and ES rev base */ -+ ptr = ptr + (3 * clk_index) + sil_index; - - /* MPU DPLL (unlocked already) */ - -- /* Set M2 */ -- sr32(&prcm_base->clksel2_pll_mpu, 0, 5, dpll_param_p->m2); -- /* Set M */ -- sr32(&prcm_base->clksel1_pll_mpu, 8, 11, dpll_param_p->m); -- /* Set N */ -- sr32(&prcm_base->clksel1_pll_mpu, 0, 7, dpll_param_p->n); -- /* FREQSEL */ -- sr32(&prcm_base->clken_pll_mpu, 4, 4, dpll_param_p->fsel); -- /* lock mode */ -- sr32(&prcm_base->clken_pll_mpu, 0, 3, PLL_LOCK); -- wait_on_value(ST_MPU_CLK, 1, &prcm_base->idlest_pll_mpu, LDELAY); -- -- /* Getting the base address to IVA DPLL param table */ -- dpll_param_p = (dpll_param *) get_iva_dpll_param(); -- -- /* Moving it to the right sysclk and ES rev base */ -- dpll_param_p = dpll_param_p + 3 * clk_index + sil_index; -- -- /* IVA DPLL (set to 12*20=240MHz) */ -+ /* M2 (MPU_DPLL_CLKOUT_DIV) : CM_CLKSEL2_PLL_MPU[0:4] */ -+ sr32(&prcm_base->clksel2_pll_mpu, 0, 5, ptr->m2); -+ -+ /* M (MPU_DPLL_MULT) : CM_CLKSEL2_PLL_MPU[8:18] */ -+ sr32(&prcm_base->clksel1_pll_mpu, 8, 11, ptr->m); -+ -+ /* N (MPU_DPLL_DIV) : CM_CLKSEL2_PLL_MPU[0:6] */ -+ sr32(&prcm_base->clksel1_pll_mpu, 0, 7, ptr->n); -+ -+ /* FREQSEL (MPU_DPLL_FREQSEL) : CM_CLKEN_PLL_MPU[4:7] */ -+ sr32(&prcm_base->clken_pll_mpu, 4, 4, ptr->fsel); -+} -+ -+static void iva_init_34xx(u32 sil_index, u32 clk_index) -+{ -+ struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -+ dpll_param *ptr = (dpll_param *) get_iva_dpll_param(); -+ -+ /* Moving to the right sysclk and ES rev base */ -+ ptr = ptr + (3 * clk_index) + sil_index; -+ -+ /* IVA DPLL */ -+ /* EN_IVA2_DPLL : CM_CLKEN_PLL_IVA2[0:2] */ - sr32(&prcm_base->clken_pll_iva2, 0, 3, PLL_STOP); - wait_on_value(ST_IVA2_CLK, 0, &prcm_base->idlest_pll_iva2, LDELAY); -- /* set M2 */ -- sr32(&prcm_base->clksel2_pll_iva2, 0, 5, dpll_param_p->m2); -- /* set M */ -- sr32(&prcm_base->clksel1_pll_iva2, 8, 11, dpll_param_p->m); -- /* set N */ -- sr32(&prcm_base->clksel1_pll_iva2, 0, 7, dpll_param_p->n); -- /* FREQSEL */ -- sr32(&prcm_base->clken_pll_iva2, 4, 4, dpll_param_p->fsel); -- /* lock mode */ -+ -+ /* M2 (IVA2_DPLL_CLKOUT_DIV) : CM_CLKSEL2_PLL_IVA2[0:4] */ -+ sr32(&prcm_base->clksel2_pll_iva2, 0, 5, ptr->m2); -+ -+ /* M (IVA2_DPLL_MULT) : CM_CLKSEL1_PLL_IVA2[8:18] */ -+ sr32(&prcm_base->clksel1_pll_iva2, 8, 11, ptr->m); -+ -+ /* N (IVA2_DPLL_DIV) : CM_CLKSEL1_PLL_IVA2[0:6] */ -+ sr32(&prcm_base->clksel1_pll_iva2, 0, 7, ptr->n); -+ -+ /* FREQSEL (IVA2_DPLL_FREQSEL) : CM_CLKEN_PLL_IVA2[4:7] */ -+ sr32(&prcm_base->clken_pll_iva2, 4, 4, ptr->fsel); -+ -+ /* LOCK MODE (EN_IVA2_DPLL) : CM_CLKEN_PLL_IVA2[0:2] */ - sr32(&prcm_base->clken_pll_iva2, 0, 3, PLL_LOCK); -+ - wait_on_value(ST_IVA2_CLK, 1, &prcm_base->idlest_pll_iva2, LDELAY); -+} -+ -+/* -+ * OMAP3630 specific functions -+ */ -+ -+/****************************************************************************** -+ * Initialize PER DPLL for OMAP36x/37x -+ *****************************************************************************/ -+static void dpll3_init_36xx(u32 sil_index, u32 clk_index) -+{ -+ struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -+ dpll_param *ptr = (dpll_param *) get_36x_core_dpll_param(); -+ void (*f_lock_pll) (u32, u32, u32, u32); -+ int xip_safe, p0, p1, p2, p3; -+ -+ xip_safe = is_running_in_sram(); -+ -+ /* Moving it to the right sysclk base */ -+ ptr += clk_index; -+ -+ if (xip_safe) { -+ /* CORE DPLL */ -+ -+ /* Select relock bypass: CM_CLKEN_PLL[0:2] */ -+ sr32(&prcm_base->clken_pll, 0, 3, PLL_FAST_RELOCK_BYPASS); -+ wait_on_value(ST_CORE_CLK, 0, &prcm_base->idlest_ckgen, -+ LDELAY); -+ -+ /* CM_CLKSEL1_EMU[DIV_DPLL3] */ -+ sr32(&prcm_base->clksel1_emu, 16, 5, CORE_M3X2); -+ -+ /* M2 (CORE_DPLL_CLKOUT_DIV): CM_CLKSEL1_PLL[27:31] */ -+ sr32(&prcm_base->clksel1_pll, 27, 5, ptr->m2); -+ -+ /* M (CORE_DPLL_MULT): CM_CLKSEL1_PLL[16:26] */ -+ sr32(&prcm_base->clksel1_pll, 16, 11, ptr->m); -+ -+ /* N (CORE_DPLL_DIV): CM_CLKSEL1_PLL[8:14] */ -+ sr32(&prcm_base->clksel1_pll, 8, 7, ptr->n); -+ -+ /* Source is the CM_96M_FCLK: CM_CLKSEL1_PLL[6] */ -+ sr32(&prcm_base->clksel1_pll, 6, 1, 0); -+ -+ /* SSI */ -+ sr32(&prcm_base->clksel_core, 8, 4, CORE_SSI_DIV); -+ /* FSUSB */ -+ sr32(&prcm_base->clksel_core, 4, 2, CORE_FUSB_DIV); -+ /* L4 */ -+ sr32(&prcm_base->clksel_core, 2, 2, CORE_L4_DIV); -+ /* L3 */ -+ sr32(&prcm_base->clksel_core, 0, 2, CORE_L3_DIV); -+ /* GFX */ -+ sr32(&prcm_base->clksel_gfx, 0, 3, GFX_DIV); -+ /* RESET MGR */ -+ sr32(&prcm_base->clksel_wkup, 1, 2, WKUP_RSM); -+ /* FREQSEL (CORE_DPLL_FREQSEL): CM_CLKEN_PLL[4:7] */ -+ sr32(&prcm_base->clken_pll, 4, 4, ptr->fsel); -+ /* LOCK MODE */ -+ sr32(&prcm_base->clken_pll, 0, 3, PLL_LOCK); -+ -+ wait_on_value(ST_CORE_CLK, 1, &prcm_base->idlest_ckgen, -+ LDELAY); -+ } else if (is_running_in_flash()) { -+ /* -+ * if running from flash, jump to small relocated code -+ * area in SRAM. -+ */ -+ f_lock_pll = (void *) ((u32) &_end_vect - (u32) &_start + -+ SRAM_VECT_CODE); -+ -+ p0 = readl(&prcm_base->clken_pll); -+ sr32(&p0, 0, 3, PLL_FAST_RELOCK_BYPASS); -+ /* FREQSEL (CORE_DPLL_FREQSEL): CM_CLKEN_PLL[4:7] */ -+ sr32(&p0, 4, 4, ptr->fsel); -+ -+ p1 = readl(&prcm_base->clksel1_pll); -+ /* M2 (CORE_DPLL_CLKOUT_DIV): CM_CLKSEL1_PLL[27:31] */ -+ sr32(&p1, 27, 5, ptr->m2); -+ /* M (CORE_DPLL_MULT): CM_CLKSEL1_PLL[16:26] */ -+ sr32(&p1, 16, 11, ptr->m); -+ /* N (CORE_DPLL_DIV): CM_CLKSEL1_PLL[8:14] */ -+ sr32(&p1, 8, 7, ptr->n); -+ /* Source is the CM_96M_FCLK: CM_CLKSEL1_PLL[6] */ -+ sr32(&p1, 6, 1, 0); -+ -+ p2 = readl(&prcm_base->clksel_core); -+ /* SSI */ -+ sr32(&p2, 8, 4, CORE_SSI_DIV); -+ /* FSUSB */ -+ sr32(&p2, 4, 2, CORE_FUSB_DIV); -+ /* L4 */ -+ sr32(&p2, 2, 2, CORE_L4_DIV); -+ /* L3 */ -+ sr32(&p2, 0, 2, CORE_L3_DIV); -+ -+ p3 = (u32)&prcm_base->idlest_ckgen; -+ -+ (*f_lock_pll) (p0, p1, p2, p3); -+ } -+} -+ -+static void dpll4_init_36xx(u32 sil_index, u32 clk_index) -+{ -+ struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -+ struct dpll_per_36x_param *ptr; -+ -+ ptr = (struct dpll_per_36x_param *)get_36x_per_dpll_param(); -+ -+ /* Moving it to the right sysclk base */ -+ ptr += clk_index; -+ -+ /* EN_PERIPH_DPLL: CM_CLKEN_PLL[16:18] */ -+ sr32(&prcm_base->clken_pll, 16, 3, PLL_STOP); -+ wait_on_value(ST_PERIPH_CLK, 0, &prcm_base->idlest_ckgen, LDELAY); -+ -+ /* M6 (DIV_DPLL4): CM_CLKSEL1_EMU[24:29] */ -+ sr32(&prcm_base->clksel1_emu, 24, 6, ptr->m6); -+ -+ /* M5 (CLKSEL_CAM): CM_CLKSEL1_EMU[0:5] */ -+ sr32(&prcm_base->clksel_cam, 0, 6, ptr->m5); -+ -+ /* M4 (CLKSEL_DSS1): CM_CLKSEL_DSS[0:5] */ -+ sr32(&prcm_base->clksel_dss, 0, 6, ptr->m4); -+ -+ /* M3 (CLKSEL_DSS1): CM_CLKSEL_DSS[8:13] */ -+ sr32(&prcm_base->clksel_dss, 8, 6, ptr->m3); -+ -+ /* M2 (DIV_96M): CM_CLKSEL3_PLL[0:4] */ -+ sr32(&prcm_base->clksel3_pll, 0, 5, ptr->m2); -+ -+ /* M (PERIPH_DPLL_MULT): CM_CLKSEL2_PLL[8:19] */ -+ sr32(&prcm_base->clksel2_pll, 8, 12, ptr->m); -+ -+ /* N (PERIPH_DPLL_DIV): CM_CLKSEL2_PLL[0:6] */ -+ sr32(&prcm_base->clksel2_pll, 0, 7, ptr->n); -+ -+ /* M2DIV (CLKSEL_96M): CM_CLKSEL_CORE[12:13] */ -+ sr32(&prcm_base->clksel_core, 12, 2, ptr->m2div); -+ -+ /* LOCK MODE (EN_PERIPH_DPLL): CM_CLKEN_PLL[16:18] */ -+ sr32(&prcm_base->clken_pll, 16, 3, PLL_LOCK); -+ wait_on_value(ST_PERIPH_CLK, 2, &prcm_base->idlest_ckgen, LDELAY); -+} -+ -+static void mpu_init_36xx(u32 sil_index, u32 clk_index) -+{ -+ struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -+ dpll_param *ptr = (dpll_param *) get_36x_mpu_dpll_param(); -+ -+ /* Moving to the right sysclk */ -+ ptr += clk_index; -+ -+ /* MPU DPLL (unlocked already */ -+ -+ /* M2 (MPU_DPLL_CLKOUT_DIV) : CM_CLKSEL2_PLL_MPU[0:4] */ -+ sr32(&prcm_base->clksel2_pll_mpu, 0, 5, ptr->m2); -+ -+ /* M (MPU_DPLL_MULT) : CM_CLKSEL2_PLL_MPU[8:18] */ -+ sr32(&prcm_base->clksel1_pll_mpu, 8, 11, ptr->m); -+ -+ /* N (MPU_DPLL_DIV) : CM_CLKSEL2_PLL_MPU[0:6] */ -+ sr32(&prcm_base->clksel1_pll_mpu, 0, 7, ptr->n); -+} -+ -+static void iva_init_36xx(u32 sil_index, u32 clk_index) -+{ -+ struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -+ dpll_param *ptr = (dpll_param *)get_36x_iva_dpll_param(); -+ -+ /* Moving to the right sysclk */ -+ ptr += clk_index; -+ -+ /* IVA DPLL */ -+ /* EN_IVA2_DPLL : CM_CLKEN_PLL_IVA2[0:2] */ -+ sr32(&prcm_base->clken_pll_iva2, 0, 3, PLL_STOP); -+ wait_on_value(ST_IVA2_CLK, 0, &prcm_base->idlest_pll_iva2, LDELAY); -+ -+ /* M2 (IVA2_DPLL_CLKOUT_DIV) : CM_CLKSEL2_PLL_IVA2[0:4] */ -+ sr32(&prcm_base->clksel2_pll_iva2, 0, 5, ptr->m2); -+ -+ /* M (IVA2_DPLL_MULT) : CM_CLKSEL1_PLL_IVA2[8:18] */ -+ sr32(&prcm_base->clksel1_pll_iva2, 8, 11, ptr->m); -+ -+ /* N (IVA2_DPLL_DIV) : CM_CLKSEL1_PLL_IVA2[0:6] */ -+ sr32(&prcm_base->clksel1_pll_iva2, 0, 7, ptr->n); -+ -+ /* LOCK (MODE (EN_IVA2_DPLL) : CM_CLKEN_PLL_IVA2[0:2] */ -+ sr32(&prcm_base->clken_pll_iva2, 0, 3, PLL_LOCK); -+ -+ wait_on_value(ST_IVA2_CLK, 1, &prcm_base->idlest_pll_iva2, LDELAY); -+} -+ -+/****************************************************************************** -+ * prcm_init() - inits clocks for PRCM as defined in clocks.h -+ * called from SRAM, or Flash (using temp SRAM stack). -+ *****************************************************************************/ -+void prcm_init(void) -+{ -+ u32 osc_clk = 0, sys_clkin_sel; -+ u32 clk_index, sil_index = 0; -+ struct prm *prm_base = (struct prm *)PRM_BASE; -+ struct prcm *prcm_base = (struct prcm *)PRCM_BASE; -+ -+ /* -+ * Gauge the input clock speed and find out the sys_clkin_sel -+ * value corresponding to the input clock. -+ */ -+ osc_clk = get_osc_clk_speed(); -+ get_sys_clkin_sel(osc_clk, &sys_clkin_sel); -+ -+ /* set input crystal speed */ -+ sr32(&prm_base->clksel, 0, 3, sys_clkin_sel); -+ -+ /* If the input clock is greater than 19.2M always divide/2 */ -+ if (sys_clkin_sel > 2) { -+ /* input clock divider */ -+ sr32(&prm_base->clksrc_ctrl, 6, 2, 2); -+ clk_index = sys_clkin_sel / 2; -+ } else { -+ /* input clock divider */ -+ sr32(&prm_base->clksrc_ctrl, 6, 2, 1); -+ clk_index = sys_clkin_sel; -+ } -+ -+ if (get_cpu_family() == CPU_OMAP36XX) { -+ /* Unlock MPU DPLL (slows things down, and needed later) */ -+ sr32(&prcm_base->clken_pll_mpu, 0, 3, PLL_LOW_POWER_BYPASS); -+ wait_on_value(ST_MPU_CLK, 0, &prcm_base->idlest_pll_mpu, -+ LDELAY); -+ -+ dpll3_init_36xx(0, clk_index); -+ dpll4_init_36xx(0, clk_index); -+ iva_init_36xx(0, clk_index); -+ mpu_init_36xx(0, clk_index); -+ -+ /* Lock MPU DPLL to set frequency */ -+ sr32(&prcm_base->clken_pll_mpu, 0, 3, PLL_LOCK); -+ wait_on_value(ST_MPU_CLK, 1, &prcm_base->idlest_pll_mpu, -+ LDELAY); -+ } else { -+ /* -+ * The DPLL tables are defined according to sysclk value and -+ * silicon revision. The clk_index value will be used to get -+ * the values for that input sysclk from the DPLL param table -+ * and sil_index will get the values for that SysClk for the -+ * appropriate silicon rev. -+ */ -+ if (((get_cpu_family() == CPU_OMAP34XX) -+ && (get_cpu_rev() >= CPU_3XX_ES20)) || -+ (get_cpu_family() == CPU_AM35XX)) -+ sil_index = 1; -+ -+ /* Unlock MPU DPLL (slows things down, and needed later) */ -+ sr32(&prcm_base->clken_pll_mpu, 0, 3, PLL_LOW_POWER_BYPASS); -+ wait_on_value(ST_MPU_CLK, 0, &prcm_base->idlest_pll_mpu, -+ LDELAY); -+ -+ dpll3_init_34xx(sil_index, clk_index); -+ dpll4_init_34xx(sil_index, clk_index); -+ iva_init_34xx(sil_index, clk_index); -+ mpu_init_34xx(sil_index, clk_index); -+ -+ /* Lock MPU DPLL to set frequency */ -+ sr32(&prcm_base->clken_pll_mpu, 0, 3, PLL_LOCK); -+ wait_on_value(ST_MPU_CLK, 1, &prcm_base->idlest_pll_mpu, -+ LDELAY); -+ } - - /* Set up GPTimers to sys_clk source only */ - sr32(&prcm_base->clksel_per, 0, 8, 0xff); -@@ -414,3 +678,4 @@ void per_clocks_enable(void) - - sdelay(1000); - } -+ -diff --git a/cpu/arm_cortexa8/omap3/lowlevel_init.S b/cpu/arm_cortexa8/omap3/lowlevel_init.S -index 73063ec..061d75f 100644 ---- a/cpu/arm_cortexa8/omap3/lowlevel_init.S -+++ b/cpu/arm_cortexa8/omap3/lowlevel_init.S -@@ -359,3 +359,72 @@ per_dpll_param: - get_per_dpll_param: - adr r0, per_dpll_param - mov pc, lr -+ -+/* -+ * Tables for 36x/37x devices -+ * -+ */ -+mpu_36x_dpll_param: -+/* 12MHz */ -+.word 50, 0, 0, 1 -+/* 13MHz */ -+.word 600, 12, 0, 1 -+/* 19.2MHz */ -+.word 125, 3, 0, 1 -+/* 26MHz */ -+.word 300, 12, 0, 1 -+/* 38.4MHz */ -+.word 125, 7, 0, 1 -+ -+iva_36x_dpll_param: -+/* 12MHz */ -+.word 130, 2, 0, 1 -+/* 13MHz */ -+.word 40, 0, 0, 1 -+/* 19.2MHz */ -+.word 325, 11, 0, 1 -+/* 26MHz */ -+.word 20, 0, 0, 1 -+/* 38.4MHz */ -+.word 325, 23, 0, 1 -+ -+core_36x_dpll_param: -+/* 12MHz */ -+.word 100, 2, 0, 1 -+/* 13MHz */ -+.word 400, 12, 0, 1 -+/* 19.2MHz */ -+.word 375, 17, 0, 1 -+/* 26MHz */ -+.word 200, 12, 0, 1 -+/* 38.4MHz */ -+.word 375, 35, 0, 1 -+ -+per_36x_dpll_param: -+/* SYSCLK M N M2 M3 M4 M5 M6 m2DIV */ -+.word 12000, 360, 4, 9, 16, 5, 4, 3, 1 -+.word 13000, 864, 12, 9, 16, 9, 4, 3, 1 -+.word 19200, 360, 7, 9, 16, 5, 4, 3, 1 -+.word 26000, 432, 12, 9, 16, 9, 4, 3, 1 -+.word 38400, 360, 15, 9, 16, 5, 4, 3, 1 -+ -+.globl get_36x_mpu_dpll_param -+get_36x_mpu_dpll_param: -+ adr r0, mpu_36x_dpll_param -+ mov pc, lr -+ -+.globl get_36x_iva_dpll_param -+get_36x_iva_dpll_param: -+ adr r0, iva_36x_dpll_param -+ mov pc, lr -+ -+.globl get_36x_core_dpll_param -+get_36x_core_dpll_param: -+ adr r0, core_36x_dpll_param -+ mov pc, lr -+ -+.globl get_36x_per_dpll_param -+get_36x_per_dpll_param: -+ adr r0, per_36x_dpll_param -+ mov pc, lr -+ -diff --git a/include/asm-arm/arch-omap3/clocks.h b/include/asm-arm/arch-omap3/clocks.h -index 71a0cb6..a5f2d08 100644 ---- a/include/asm-arm/arch-omap3/clocks.h -+++ b/include/asm-arm/arch-omap3/clocks.h -@@ -51,12 +51,29 @@ typedef struct { - unsigned int m2; - } dpll_param; - -+struct dpll_per_36x_param { -+ unsigned int sys_clk; -+ unsigned int m; -+ unsigned int n; -+ unsigned int m2; -+ unsigned int m3; -+ unsigned int m4; -+ unsigned int m5; -+ unsigned int m6; -+ unsigned int m2div; -+}; -+ - /* Following functions are exported from lowlevel_init.S */ - extern dpll_param *get_mpu_dpll_param(void); - extern dpll_param *get_iva_dpll_param(void); - extern dpll_param *get_core_dpll_param(void); - extern dpll_param *get_per_dpll_param(void); - -+extern dpll_param *get_36x_mpu_dpll_param(void); -+extern dpll_param *get_36x_iva_dpll_param(void); -+extern dpll_param *get_36x_core_dpll_param(void); -+extern dpll_param *get_36x_per_dpll_param(void); -+ - extern void *_end_vect, *_start; - - #endif -diff --git a/include/asm-arm/arch-omap3/clocks_omap3.h b/include/asm-arm/arch-omap3/clocks_omap3.h -index 661407b..30ef690 100644 ---- a/include/asm-arm/arch-omap3/clocks_omap3.h -+++ b/include/asm-arm/arch-omap3/clocks_omap3.h -@@ -282,4 +282,31 @@ - #define PER_FSEL_38P4 0x07 - #define PER_M2_38P4 0x09 - -+/* 36XX PER DPLL */ -+ -+#define PER_36XX_M_12 0x1B0 -+#define PER_36XX_N_12 0x05 -+#define PER_36XX_FSEL_12 0x07 -+#define PER_36XX_M2_12 0x09 -+ -+#define PER_36XX_M_13 0x360 -+#define PER_36XX_N_13 0x0C -+#define PER_36XX_FSEL_13 0x03 -+#define PER_36XX_M2_13 0x09 -+ -+#define PER_36XX_M_19P2 0x1C2 -+#define PER_36XX_N_19P2 0x09 -+#define PER_36XX_FSEL_19P2 0x07 -+#define PER_36XX_M2_19P2 0x09 -+ -+#define PER_36XX_M_26 0x1B0 -+#define PER_36XX_N_26 0x0C -+#define PER_36XX_FSEL_26 0x07 -+#define PER_36XX_M2_26 0x09 -+ -+#define PER_36XX_M_38P4 0x1C2 -+#define PER_36XX_N_38P4 0x13 -+#define PER_36XX_FSEL_38P4 0x07 -+#define PER_36XX_M2_38P4 0x09 -+ - #endif /* endif _CLOCKS_OMAP3_H_ */ --- -1.6.6.1 - |