imx:mx6ul add clock support
1. Add enet, uart, i2c, ipg clock support for i.MX6UL. 2. Correct get_periph_clk, it should account for MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK. 3. Refactor get_mmdc_ch0_clk to make all i.MX6 share one function, but not use 'ifdef'. 4. Use CONFIG_FSL_QSPI for enable_qspi_clk, but not #ifdef CONFIG_MX6SX. 5. Use CONFIG_PCIE_IMX for pcie clock settings, use CONFIG_CMD_SATA for sata clock settings. In this way, we not need "#if defined(CONFIG_MX6Q) || defined....", only need one CONFIG_PCIE_IMX in header file. Signed-off-by: Ye.Li <B37916@freescale.com> Signed-off-by: Peng Fan <Peng.Fan@freescale.com>
This commit is contained in:
@@ -81,19 +81,32 @@ void enable_usboh3_clk(unsigned char enable)
|
||||
#if defined(CONFIG_FEC_MXC) && !defined(CONFIG_MX6SX)
|
||||
void enable_enet_clk(unsigned char enable)
|
||||
{
|
||||
u32 mask = MXC_CCM_CCGR1_ENET_CLK_ENABLE_MASK;
|
||||
u32 mask, *addr;
|
||||
|
||||
if (is_cpu_type(MXC_CPU_MX6UL)) {
|
||||
mask = MXC_CCM_CCGR3_ENET_MASK;
|
||||
addr = &imx_ccm->CCGR3;
|
||||
} else {
|
||||
mask = MXC_CCM_CCGR1_ENET_MASK;
|
||||
addr = &imx_ccm->CCGR1;
|
||||
}
|
||||
|
||||
if (enable)
|
||||
setbits_le32(&imx_ccm->CCGR1, mask);
|
||||
setbits_le32(addr, mask);
|
||||
else
|
||||
clrbits_le32(&imx_ccm->CCGR1, mask);
|
||||
clrbits_le32(addr, mask);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MXC_UART
|
||||
void enable_uart_clk(unsigned char enable)
|
||||
{
|
||||
u32 mask = MXC_CCM_CCGR5_UART_MASK | MXC_CCM_CCGR5_UART_SERIAL_MASK;
|
||||
u32 mask;
|
||||
|
||||
if (is_cpu_type(MXC_CPU_MX6UL))
|
||||
mask = MXC_CCM_CCGR5_UART_MASK;
|
||||
else
|
||||
mask = MXC_CCM_CCGR5_UART_MASK | MXC_CCM_CCGR5_UART_SERIAL_MASK;
|
||||
|
||||
if (enable)
|
||||
setbits_le32(&imx_ccm->CCGR5, mask);
|
||||
@@ -141,7 +154,7 @@ int enable_i2c_clk(unsigned char enable, unsigned i2c_num)
|
||||
reg &= ~mask;
|
||||
__raw_writel(reg, &imx_ccm->CCGR2);
|
||||
} else {
|
||||
if (is_cpu_type(MXC_CPU_MX6SX)) {
|
||||
if (is_cpu_type(MXC_CPU_MX6SX) || is_cpu_type(MXC_CPU_MX6UL)) {
|
||||
mask = MXC_CCM_CCGR6_I2C4_MASK;
|
||||
addr = &imx_ccm->CCGR6;
|
||||
} else {
|
||||
@@ -214,9 +227,11 @@ static u32 mxc_get_pll_pfd(enum pll_clocks pll, int pfd_num)
|
||||
|
||||
switch (pll) {
|
||||
case PLL_BUS:
|
||||
if (pfd_num == 3) {
|
||||
/* No PFD3 on PPL2 */
|
||||
return 0;
|
||||
if (!is_cpu_type(MXC_CPU_MX6UL)) {
|
||||
if (pfd_num == 3) {
|
||||
/* No PFD3 on PPL2 */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
div = __raw_readl(&imx_ccm->analog_pfd_528);
|
||||
freq = (u64)decode_pll(PLL_BUS, MXC_HCLK);
|
||||
@@ -248,10 +263,12 @@ static u32 get_mcu_main_clk(void)
|
||||
|
||||
u32 get_periph_clk(void)
|
||||
{
|
||||
u32 reg, freq = 0;
|
||||
u32 reg, div = 0, freq = 0;
|
||||
|
||||
reg = __raw_readl(&imx_ccm->cbcdr);
|
||||
if (reg & MXC_CCM_CBCDR_PERIPH_CLK_SEL) {
|
||||
div = (reg & MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK) >>
|
||||
MXC_CCM_CBCDR_PERIPH_CLK2_PODF_OFFSET;
|
||||
reg = __raw_readl(&imx_ccm->cbcmr);
|
||||
reg &= MXC_CCM_CBCMR_PERIPH_CLK2_SEL_MASK;
|
||||
reg >>= MXC_CCM_CBCMR_PERIPH_CLK2_SEL_OFFSET;
|
||||
@@ -291,7 +308,7 @@ u32 get_periph_clk(void)
|
||||
}
|
||||
}
|
||||
|
||||
return freq;
|
||||
return freq / (div + 1);
|
||||
}
|
||||
|
||||
static u32 get_ipg_clk(void)
|
||||
@@ -311,7 +328,7 @@ static u32 get_ipg_per_clk(void)
|
||||
|
||||
reg = __raw_readl(&imx_ccm->cscmr1);
|
||||
if (is_cpu_type(MXC_CPU_MX6SL) || is_cpu_type(MXC_CPU_MX6SX) ||
|
||||
is_mx6dqp()) {
|
||||
is_mx6dqp() || is_cpu_type(MXC_CPU_MX6UL)) {
|
||||
if (reg & MXC_CCM_CSCMR1_PER_CLK_SEL_MASK)
|
||||
return MXC_HCLK; /* OSC 24Mhz */
|
||||
}
|
||||
@@ -328,7 +345,7 @@ static u32 get_uart_clk(void)
|
||||
reg = __raw_readl(&imx_ccm->cscdr1);
|
||||
|
||||
if (is_cpu_type(MXC_CPU_MX6SL) || is_cpu_type(MXC_CPU_MX6SX) ||
|
||||
is_mx6dqp()) {
|
||||
is_mx6dqp() || is_cpu_type(MXC_CPU_MX6UL)) {
|
||||
if (reg & MXC_CCM_CSCDR1_UART_CLK_SEL)
|
||||
freq = MXC_HCLK;
|
||||
}
|
||||
@@ -347,7 +364,8 @@ static u32 get_cspi_clk(void)
|
||||
cspi_podf = (reg & MXC_CCM_CSCDR2_ECSPI_CLK_PODF_MASK) >>
|
||||
MXC_CCM_CSCDR2_ECSPI_CLK_PODF_OFFSET;
|
||||
|
||||
if (is_mx6dqp()) {
|
||||
if (is_mx6dqp() || is_cpu_type(MXC_CPU_MX6SL) ||
|
||||
is_cpu_type(MXC_CPU_MX6SX) || is_cpu_type(MXC_CPU_MX6UL)) {
|
||||
if (reg & MXC_CCM_CSCDR2_ECSPI_CLK_SEL_MASK)
|
||||
return MXC_HCLK / (cspi_podf + 1);
|
||||
}
|
||||
@@ -402,47 +420,60 @@ static u32 get_emi_slow_clk(void)
|
||||
return root_freq / (emi_slow_podf + 1);
|
||||
}
|
||||
|
||||
#if (defined(CONFIG_MX6SL) || defined(CONFIG_MX6SX))
|
||||
static u32 get_mmdc_ch0_clk(void)
|
||||
{
|
||||
u32 cbcmr = __raw_readl(&imx_ccm->cbcmr);
|
||||
u32 cbcdr = __raw_readl(&imx_ccm->cbcdr);
|
||||
u32 freq, podf;
|
||||
|
||||
podf = (cbcdr & MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK) \
|
||||
>> MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET;
|
||||
u32 freq, podf, per2_clk2_podf;
|
||||
|
||||
switch ((cbcmr & MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_MASK) >>
|
||||
MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_OFFSET) {
|
||||
case 0:
|
||||
freq = decode_pll(PLL_BUS, MXC_HCLK);
|
||||
break;
|
||||
case 1:
|
||||
freq = mxc_get_pll_pfd(PLL_BUS, 2);
|
||||
break;
|
||||
case 2:
|
||||
freq = mxc_get_pll_pfd(PLL_BUS, 0);
|
||||
break;
|
||||
case 3:
|
||||
/* static / 2 divider */
|
||||
freq = mxc_get_pll_pfd(PLL_BUS, 2) / 2;
|
||||
if (is_cpu_type(MXC_CPU_MX6SX) || is_cpu_type(MXC_CPU_MX6UL) ||
|
||||
is_cpu_type(MXC_CPU_MX6SL)) {
|
||||
podf = (cbcdr & MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK) >>
|
||||
MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET;
|
||||
if (cbcdr & MXC_CCM_CBCDR_PERIPH2_CLK_SEL) {
|
||||
per2_clk2_podf = (cbcdr & MXC_CCM_CBCDR_PERIPH2_CLK2_PODF_MASK) >>
|
||||
MXC_CCM_CBCDR_PERIPH2_CLK2_PODF_OFFSET;
|
||||
if (is_cpu_type(MXC_CPU_MX6SL)) {
|
||||
if (cbcmr & MXC_CCM_CBCMR_PERIPH2_CLK2_SEL)
|
||||
freq = MXC_HCLK;
|
||||
else
|
||||
freq = decode_pll(PLL_USBOTG, MXC_HCLK);
|
||||
} else {
|
||||
if (cbcmr & MXC_CCM_CBCMR_PERIPH2_CLK2_SEL)
|
||||
freq = decode_pll(PLL_BUS, MXC_HCLK);
|
||||
else
|
||||
freq = decode_pll(PLL_USBOTG, MXC_HCLK);
|
||||
}
|
||||
} else {
|
||||
per2_clk2_podf = 0;
|
||||
switch ((cbcmr &
|
||||
MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_MASK) >>
|
||||
MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_OFFSET) {
|
||||
case 0:
|
||||
freq = decode_pll(PLL_BUS, MXC_HCLK);
|
||||
break;
|
||||
case 1:
|
||||
freq = mxc_get_pll_pfd(PLL_BUS, 2);
|
||||
break;
|
||||
case 2:
|
||||
freq = mxc_get_pll_pfd(PLL_BUS, 0);
|
||||
break;
|
||||
case 3:
|
||||
/* static / 2 divider */
|
||||
freq = mxc_get_pll_pfd(PLL_BUS, 2) / 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return freq / (podf + 1) / (per2_clk2_podf + 1);
|
||||
} else {
|
||||
podf = (cbcdr & MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK) >>
|
||||
MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET;
|
||||
return get_periph_clk() / (podf + 1);
|
||||
}
|
||||
|
||||
return freq / (podf + 1);
|
||||
|
||||
}
|
||||
#else
|
||||
static u32 get_mmdc_ch0_clk(void)
|
||||
{
|
||||
u32 cbcdr = __raw_readl(&imx_ccm->cbcdr);
|
||||
u32 mmdc_ch0_podf = (cbcdr & MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK) >>
|
||||
MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET;
|
||||
|
||||
return get_periph_clk() / (mmdc_ch0_podf + 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MX6SX
|
||||
#ifdef CONFIG_FSL_QSPI
|
||||
/* qspi_num can be from 0 - 1 */
|
||||
void enable_qspi_clk(int qspi_num)
|
||||
{
|
||||
@@ -603,6 +634,7 @@ u32 imx_get_fecclk(void)
|
||||
return mxc_get_clock(MXC_IPG_CLK);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_CMD_SATA) || defined(CONFIG_PCIE_IMX)
|
||||
static int enable_enet_pll(uint32_t en)
|
||||
{
|
||||
struct mxc_ccm_reg *const imx_ccm
|
||||
@@ -627,8 +659,9 @@ static int enable_enet_pll(uint32_t en)
|
||||
writel(reg, &imx_ccm->analog_pll_enet);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_MX6SX
|
||||
#ifdef CONFIG_CMD_SATA
|
||||
static void ungate_sata_clock(void)
|
||||
{
|
||||
struct mxc_ccm_reg *const imx_ccm =
|
||||
@@ -637,18 +670,7 @@ static void ungate_sata_clock(void)
|
||||
/* Enable SATA clock. */
|
||||
setbits_le32(&imx_ccm->CCGR5, MXC_CCM_CCGR5_SATA_MASK);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void ungate_pcie_clock(void)
|
||||
{
|
||||
struct mxc_ccm_reg *const imx_ccm =
|
||||
(struct mxc_ccm_reg *)CCM_BASE_ADDR;
|
||||
|
||||
/* Enable PCIe clock. */
|
||||
setbits_le32(&imx_ccm->CCGR4, MXC_CCM_CCGR4_PCIE_MASK);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_MX6SX
|
||||
int enable_sata_clock(void)
|
||||
{
|
||||
ungate_sata_clock();
|
||||
@@ -664,6 +686,16 @@ void disable_sata_clock(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCIE_IMX
|
||||
static void ungate_pcie_clock(void)
|
||||
{
|
||||
struct mxc_ccm_reg *const imx_ccm =
|
||||
(struct mxc_ccm_reg *)CCM_BASE_ADDR;
|
||||
|
||||
/* Enable PCIe clock. */
|
||||
setbits_le32(&imx_ccm->CCGR4, MXC_CCM_CCGR4_PCIE_MASK);
|
||||
}
|
||||
|
||||
int enable_pcie_clock(void)
|
||||
{
|
||||
struct anatop_regs *anatop_regs =
|
||||
@@ -703,7 +735,7 @@ int enable_pcie_clock(void)
|
||||
clrbits_le32(&ccm_regs->cbcmr, MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL);
|
||||
|
||||
/* Party time! Ungate the clock to the PCIe. */
|
||||
#ifndef CONFIG_MX6SX
|
||||
#ifdef CONFIG_CMD_SATA
|
||||
ungate_sata_clock();
|
||||
#endif
|
||||
ungate_pcie_clock();
|
||||
@@ -711,6 +743,7 @@ int enable_pcie_clock(void)
|
||||
return enable_enet_pll(BM_ANADIG_PLL_ENET_ENABLE_SATA |
|
||||
BM_ANADIG_PLL_ENET_ENABLE_PCIE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SECURE_BOOT
|
||||
void hab_caam_clock_enable(unsigned char enable)
|
||||
|
||||
Reference in New Issue
Block a user