static void setup_dplls(void) { u32 sysclk_ind, temp; const struct dpll_params *params; debug("setup_dplls\n"); sysclk_ind = get_sys_clk_index(); /* CORE dpll */ params = get_core_dpll_params(); /* default - safest */ /* * Do not lock the core DPLL now. Just set it up. * Core DPLL will be locked after setting up EMIF * using the FREQ_UPDATE method(freq_update_core()) */ do_setup_dpll(&prcm->cm_clkmode_dpll_core, params, DPLL_NO_LOCK); /* Set the ratios for CORE_CLK, L3_CLK, L4_CLK */ temp = (CLKSEL_CORE_X2_DIV_1 << CLKSEL_CORE_SHIFT) | (CLKSEL_L3_CORE_DIV_2 << CLKSEL_L3_SHIFT) | (CLKSEL_L4_L3_DIV_2 << CLKSEL_L4_SHIFT); writel(temp, &prcm->cm_clksel_core); debug("Core DPLL configured\n"); /* lock PER dpll */ do_setup_dpll(&prcm->cm_clkmode_dpll_per, &per_dpll_params_1536mhz[sysclk_ind], DPLL_LOCK); debug("PER DPLL locked\n"); /* MPU dpll */ configure_mpu_dpll(); }
const struct dpll_params *get_dpll_mpu_params(void) { int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET); u32 ind = get_sys_clk_index(); return &dpll_mpu[ind][opp]; }
/* * Lock MPU dpll * * Resulting MPU frequencies: * 4430 ES1.0 : 600 MHz * 4430 ES2.x : 792 MHz (OPP Turbo) * 4460 : 920 MHz (OPP Turbo) - DCC disabled */ void configure_mpu_dpll(void) { const struct dpll_params *params; struct dpll_regs *mpu_dpll_regs; u32 omap4_rev, sysclk_ind; omap4_rev = omap_revision(); sysclk_ind = get_sys_clk_index(); if (omap4_rev == OMAP4430_ES1_0) params = &mpu_dpll_params_1200mhz[sysclk_ind]; else if (omap4_rev < OMAP4460_ES1_0) params = &mpu_dpll_params_1584mhz[sysclk_ind]; else params = &mpu_dpll_params_1840mhz[sysclk_ind]; /* DCC and clock divider settings for 4460 */ if (omap4_rev >= OMAP4460_ES1_0) { mpu_dpll_regs = (struct dpll_regs *)&prcm->cm_clkmode_dpll_mpu; bypass_dpll(&prcm->cm_clkmode_dpll_mpu); clrbits_le32(&prcm->cm_mpu_mpu_clkctrl, MPU_CLKCTRL_CLKSEL_EMIF_DIV_MODE_MASK); setbits_le32(&prcm->cm_mpu_mpu_clkctrl, MPU_CLKCTRL_CLKSEL_ABE_DIV_MODE_MASK); clrbits_le32(&mpu_dpll_regs->cm_clksel_dpll, CM_CLKSEL_DCC_EN_MASK); } do_setup_dpll(&prcm->cm_clkmode_dpll_mpu, params, DPLL_LOCK); debug("MPU DPLL locked\n"); }
static void omap_usb_dpll_lock(struct omap_usb3_phy *phy_regs) { u32 clk_index = get_sys_clk_index(); u32 val; val = readl(&phy_regs->pll_config_1); val &= ~PLL_REGN_MASK; val |= omap_usb3_dpll_params[clk_index].n << PLL_REGN_SHIFT; writel(val, &phy_regs->pll_config_1); val = readl(&phy_regs->pll_config_2); val &= ~PLL_SELFREQDCO_MASK; val |= omap_usb3_dpll_params[clk_index].freq << PLL_SELFREQDCO_SHIFT; writel(val, &phy_regs->pll_config_2); val = readl(&phy_regs->pll_config_1); val &= ~PLL_REGM_MASK; val |= omap_usb3_dpll_params[clk_index].m << PLL_REGM_SHIFT; writel(val, &phy_regs->pll_config_1); val = readl(&phy_regs->pll_config_4); val &= ~PLL_REGM_F_MASK; val |= omap_usb3_dpll_params[clk_index].mf << PLL_REGM_F_SHIFT; writel(val, &phy_regs->pll_config_4); val = readl(&phy_regs->pll_config_3); val &= ~PLL_SD_MASK; val |= omap_usb3_dpll_params[clk_index].sd << PLL_SD_SHIFT; writel(val, &phy_regs->pll_config_3); omap_usb_dpll_relock(phy_regs); }
static const struct dpll_params *get_gmac_dpll_params (struct dplls const *dpll_data) { u32 sysclk_ind = get_sys_clk_index(); if (!dpll_data->gmac) return NULL; return &dpll_data->gmac[sysclk_ind]; }
const struct dpll_params *get_abe_dpll_params(struct dplls const *dpll_data) { #ifdef CONFIG_SYS_OMAP_ABE_SYSCK u32 sysclk_ind = get_sys_clk_index(); return &dpll_data->abe[sysclk_ind]; #else return dpll_data->abe; #endif }
const struct dpll_params *get_dpll_ddr_params(void) { int ind = get_sys_clk_index(); if (board_is_eposevm()) return &epos_evm_dpll_ddr[ind]; else if (board_is_evm() || board_is_sk()) return &gp_evm_dpll_ddr; else if (board_is_idk()) return &idk_dpll_ddr; printf(" Board '%s' not supported\n", board_ti_get_name()); return NULL; }
const struct dpll_params *get_core_dpll_params(void) { u32 sysclk_ind = get_sys_clk_index(); switch (omap_revision()) { case OMAP4430_ES1_0: return &core_dpll_params_es1_1524mhz[sysclk_ind]; case OMAP4430_ES2_0: case OMAP4430_SILICON_ID_INVALID: /* safest */ return &core_dpll_params_es2_1600mhz_ddr200mhz[sysclk_ind]; default: return &core_dpll_params_1600mhz[sysclk_ind]; } }
void srcomp_enable(void) { u32 srcomp_value, mul_factor, div_factor, clk_val, i; u32 sysclk_ind = get_sys_clk_index(); u32 omap_rev = omap_revision(); if (!is_omap54xx()) return; mul_factor = srcomp_parameters[sysclk_ind].multiply_factor; div_factor = srcomp_parameters[sysclk_ind].divide_factor; for (i = 0; i < 4; i++) { srcomp_value = readl((*ctrl)->control_srcomp_north_side + i*4); srcomp_value &= ~(MULTIPLY_FACTOR_XS_MASK | DIVIDE_FACTOR_XS_MASK); srcomp_value |= (mul_factor << MULTIPLY_FACTOR_XS_SHIFT) | (div_factor << DIVIDE_FACTOR_XS_SHIFT); writel(srcomp_value, (*ctrl)->control_srcomp_north_side + i*4); } if ((omap_rev == OMAP5430_ES1_0) || (omap_rev == OMAP5432_ES1_0)) { clk_val = readl((*prcm)->cm_coreaon_io_srcomp_clkctrl); clk_val |= OPTFCLKEN_SRCOMP_FCLK_MASK; writel(clk_val, (*prcm)->cm_coreaon_io_srcomp_clkctrl); for (i = 0; i < 4; i++) { srcomp_value = readl((*ctrl)->control_srcomp_north_side + i*4); srcomp_value &= ~PWRDWN_XS_MASK; writel(srcomp_value, (*ctrl)->control_srcomp_north_side + i*4); while (((readl((*ctrl)->control_srcomp_north_side + i*4) & SRCODE_READ_XS_MASK) >> SRCODE_READ_XS_SHIFT) == 0) ; srcomp_value = readl((*ctrl)->control_srcomp_north_side + i*4); srcomp_value &= ~OVERRIDE_XS_MASK; writel(srcomp_value, (*ctrl)->control_srcomp_north_side + i*4); } } else {
u32 get_sys_clk_freq(void) { u8 index = get_sys_clk_index(); return sys_clk_array[index]; }
const struct dpll_params *get_usb_dpll_params(struct dplls const *dpll_data) { u32 sysclk_ind = get_sys_clk_index(); return &dpll_data->usb[sysclk_ind]; }
const struct dpll_params *get_dpll_per_params(void) { int ind = get_sys_clk_index(); return &dpll_per[ind]; }
static void setup_non_essential_dplls(void) { u32 sys_clk_khz, abe_ref_clk; u32 sysclk_ind, sd_div, num, den; const struct dpll_params *params; sysclk_ind = get_sys_clk_index(); sys_clk_khz = get_sys_clk_freq() / 1000; /* IVA */ clrsetbits_le32(&prcm->cm_bypclk_dpll_iva, CM_BYPCLK_DPLL_IVA_CLKSEL_MASK, DPLL_IVA_CLKSEL_CORE_X2_DIV_2); do_setup_dpll(&prcm->cm_clkmode_dpll_iva, &iva_dpll_params_1862mhz[sysclk_ind], DPLL_LOCK); /* * USB: * USB dpll is J-type. Need to set DPLL_SD_DIV for jitter correction * DPLL_SD_DIV = CEILING ([DPLL_MULT/(DPLL_DIV+1)]* CLKINP / 250) * - where CLKINP is sys_clk in MHz * Use CLKINP in KHz and adjust the denominator accordingly so * that we have enough accuracy and at the same time no overflow */ params = &usb_dpll_params_1920mhz[sysclk_ind]; num = params->m * sys_clk_khz; den = (params->n + 1) * 250 * 1000; num += den - 1; sd_div = num / den; clrsetbits_le32(&prcm->cm_clksel_dpll_usb, CM_CLKSEL_DPLL_DPLL_SD_DIV_MASK, sd_div << CM_CLKSEL_DPLL_DPLL_SD_DIV_SHIFT); /* Now setup the dpll with the regular function */ do_setup_dpll(&prcm->cm_clkmode_dpll_usb, params, DPLL_LOCK); #ifdef CONFIG_SYS_OMAP4_ABE_SYSCK params = &abe_dpll_params_sysclk_196608khz[sysclk_ind]; abe_ref_clk = CM_ABE_PLL_REF_CLKSEL_CLKSEL_SYSCLK; #else params = &abe_dpll_params_32k_196608khz; abe_ref_clk = CM_ABE_PLL_REF_CLKSEL_CLKSEL_32KCLK; /* * We need to enable some additional options to achieve * 196.608MHz from 32768 Hz */ setbits_le32(&prcm->cm_clkmode_dpll_abe, CM_CLKMODE_DPLL_DRIFTGUARD_EN_MASK| CM_CLKMODE_DPLL_RELOCK_RAMP_EN_MASK| CM_CLKMODE_DPLL_LPMODE_EN_MASK| CM_CLKMODE_DPLL_REGM4XEN_MASK); /* Spend 4 REFCLK cycles at each stage */ clrsetbits_le32(&prcm->cm_clkmode_dpll_abe, CM_CLKMODE_DPLL_RAMP_RATE_MASK, 1 << CM_CLKMODE_DPLL_RAMP_RATE_SHIFT); #endif /* Select the right reference clk */ clrsetbits_le32(&prcm->cm_abe_pll_ref_clksel, CM_ABE_PLL_REF_CLKSEL_CLKSEL_MASK, abe_ref_clk << CM_ABE_PLL_REF_CLKSEL_CLKSEL_SHIFT); /* Lock the dpll */ do_setup_dpll(&prcm->cm_clkmode_dpll_abe, params, DPLL_LOCK); }