|
@@ -46,8 +46,8 @@ static uint32_t mx28_get_pclk(void)
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
|
|
|
|
- uint32_t clkctrl, clkseq, clkfrac;
|
|
|
|
- uint32_t frac, div;
|
|
|
|
|
|
+ uint32_t clkctrl, clkseq, div;
|
|
|
|
+ uint8_t clkfrac, frac;
|
|
|
|
|
|
clkctrl = readl(&clkctrl_regs->hw_clkctrl_cpu);
|
|
clkctrl = readl(&clkctrl_regs->hw_clkctrl_cpu);
|
|
|
|
|
|
@@ -67,8 +67,8 @@ static uint32_t mx28_get_pclk(void)
|
|
}
|
|
}
|
|
|
|
|
|
/* REF Path */
|
|
/* REF Path */
|
|
- clkfrac = readl(&clkctrl_regs->hw_clkctrl_frac0);
|
|
|
|
- frac = clkfrac & CLKCTRL_FRAC0_CPUFRAC_MASK;
|
|
|
|
|
|
+ clkfrac = readb(&clkctrl_regs->hw_clkctrl_frac0[CLKCTRL_FRAC0_CPU]);
|
|
|
|
+ frac = clkfrac & CLKCTRL_FRAC_FRAC_MASK;
|
|
div = clkctrl & CLKCTRL_CPU_DIV_CPU_MASK;
|
|
div = clkctrl & CLKCTRL_CPU_DIV_CPU_MASK;
|
|
return (PLL_FREQ_MHZ * PLL_FREQ_COEF / frac) / div;
|
|
return (PLL_FREQ_MHZ * PLL_FREQ_COEF / frac) / div;
|
|
}
|
|
}
|
|
@@ -96,8 +96,8 @@ static uint32_t mx28_get_emiclk(void)
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
|
|
|
|
- uint32_t frac, div;
|
|
|
|
- uint32_t clkctrl, clkseq, clkfrac;
|
|
|
|
|
|
+ uint32_t clkctrl, clkseq, div;
|
|
|
|
+ uint8_t clkfrac, frac;
|
|
|
|
|
|
clkseq = readl(&clkctrl_regs->hw_clkctrl_clkseq);
|
|
clkseq = readl(&clkctrl_regs->hw_clkctrl_clkseq);
|
|
clkctrl = readl(&clkctrl_regs->hw_clkctrl_emi);
|
|
clkctrl = readl(&clkctrl_regs->hw_clkctrl_emi);
|
|
@@ -109,11 +109,9 @@ static uint32_t mx28_get_emiclk(void)
|
|
return XTAL_FREQ_MHZ / div;
|
|
return XTAL_FREQ_MHZ / div;
|
|
}
|
|
}
|
|
|
|
|
|
- clkfrac = readl(&clkctrl_regs->hw_clkctrl_frac0);
|
|
|
|
-
|
|
|
|
/* REF Path */
|
|
/* REF Path */
|
|
- frac = (clkfrac & CLKCTRL_FRAC0_EMIFRAC_MASK) >>
|
|
|
|
- CLKCTRL_FRAC0_EMIFRAC_OFFSET;
|
|
|
|
|
|
+ clkfrac = readb(&clkctrl_regs->hw_clkctrl_frac0[CLKCTRL_FRAC0_EMI]);
|
|
|
|
+ frac = clkfrac & CLKCTRL_FRAC_FRAC_MASK;
|
|
div = clkctrl & CLKCTRL_EMI_DIV_EMI_MASK;
|
|
div = clkctrl & CLKCTRL_EMI_DIV_EMI_MASK;
|
|
return (PLL_FREQ_MHZ * PLL_FREQ_COEF / frac) / div;
|
|
return (PLL_FREQ_MHZ * PLL_FREQ_COEF / frac) / div;
|
|
}
|
|
}
|
|
@@ -123,8 +121,8 @@ static uint32_t mx28_get_gpmiclk(void)
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
|
|
|
|
- uint32_t frac, div;
|
|
|
|
- uint32_t clkctrl, clkseq, clkfrac;
|
|
|
|
|
|
+ uint32_t clkctrl, clkseq, div;
|
|
|
|
+ uint8_t clkfrac, frac;
|
|
|
|
|
|
clkseq = readl(&clkctrl_regs->hw_clkctrl_clkseq);
|
|
clkseq = readl(&clkctrl_regs->hw_clkctrl_clkseq);
|
|
clkctrl = readl(&clkctrl_regs->hw_clkctrl_gpmi);
|
|
clkctrl = readl(&clkctrl_regs->hw_clkctrl_gpmi);
|
|
@@ -135,11 +133,9 @@ static uint32_t mx28_get_gpmiclk(void)
|
|
return XTAL_FREQ_MHZ / div;
|
|
return XTAL_FREQ_MHZ / div;
|
|
}
|
|
}
|
|
|
|
|
|
- clkfrac = readl(&clkctrl_regs->hw_clkctrl_frac1);
|
|
|
|
-
|
|
|
|
/* REF Path */
|
|
/* REF Path */
|
|
- frac = (clkfrac & CLKCTRL_FRAC1_GPMIFRAC_MASK) >>
|
|
|
|
- CLKCTRL_FRAC1_GPMIFRAC_OFFSET;
|
|
|
|
|
|
+ clkfrac = readb(&clkctrl_regs->hw_clkctrl_frac1[CLKCTRL_FRAC1_GPMI]);
|
|
|
|
+ frac = clkfrac & CLKCTRL_FRAC_FRAC_MASK;
|
|
div = clkctrl & CLKCTRL_GPMI_DIV_MASK;
|
|
div = clkctrl & CLKCTRL_GPMI_DIV_MASK;
|
|
return (PLL_FREQ_MHZ * PLL_FREQ_COEF / frac) / div;
|
|
return (PLL_FREQ_MHZ * PLL_FREQ_COEF / frac) / div;
|
|
}
|
|
}
|
|
@@ -152,11 +148,12 @@ void mx28_set_ioclk(enum mxs_ioclock io, uint32_t freq)
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
uint32_t div;
|
|
uint32_t div;
|
|
|
|
+ int io_reg;
|
|
|
|
|
|
if (freq == 0)
|
|
if (freq == 0)
|
|
return;
|
|
return;
|
|
|
|
|
|
- if (io > MXC_IOCLK1)
|
|
|
|
|
|
+ if ((io < MXC_IOCLK0) || (io > MXC_IOCLK1))
|
|
return;
|
|
return;
|
|
|
|
|
|
div = (PLL_FREQ_KHZ * PLL_FREQ_COEF) / freq;
|
|
div = (PLL_FREQ_KHZ * PLL_FREQ_COEF) / freq;
|
|
@@ -167,23 +164,13 @@ void mx28_set_ioclk(enum mxs_ioclock io, uint32_t freq)
|
|
if (div > 35)
|
|
if (div > 35)
|
|
div = 35;
|
|
div = 35;
|
|
|
|
|
|
- if (io == MXC_IOCLK0) {
|
|
|
|
- writel(CLKCTRL_FRAC0_CLKGATEIO0,
|
|
|
|
- &clkctrl_regs->hw_clkctrl_frac0_set);
|
|
|
|
- clrsetbits_le32(&clkctrl_regs->hw_clkctrl_frac0,
|
|
|
|
- CLKCTRL_FRAC0_IO0FRAC_MASK,
|
|
|
|
- div << CLKCTRL_FRAC0_IO0FRAC_OFFSET);
|
|
|
|
- writel(CLKCTRL_FRAC0_CLKGATEIO0,
|
|
|
|
- &clkctrl_regs->hw_clkctrl_frac0_clr);
|
|
|
|
- } else {
|
|
|
|
- writel(CLKCTRL_FRAC0_CLKGATEIO1,
|
|
|
|
- &clkctrl_regs->hw_clkctrl_frac0_set);
|
|
|
|
- clrsetbits_le32(&clkctrl_regs->hw_clkctrl_frac0,
|
|
|
|
- CLKCTRL_FRAC0_IO1FRAC_MASK,
|
|
|
|
- div << CLKCTRL_FRAC0_IO1FRAC_OFFSET);
|
|
|
|
- writel(CLKCTRL_FRAC0_CLKGATEIO1,
|
|
|
|
- &clkctrl_regs->hw_clkctrl_frac0_clr);
|
|
|
|
- }
|
|
|
|
|
|
+ io_reg = CLKCTRL_FRAC0_IO0 - io; /* Register order is reversed */
|
|
|
|
+ writeb(CLKCTRL_FRAC_CLKGATE,
|
|
|
|
+ &clkctrl_regs->hw_clkctrl_frac0_set[io_reg]);
|
|
|
|
+ writeb(CLKCTRL_FRAC_CLKGATE | (div & CLKCTRL_FRAC_FRAC_MASK),
|
|
|
|
+ &clkctrl_regs->hw_clkctrl_frac0[io_reg]);
|
|
|
|
+ writeb(CLKCTRL_FRAC_CLKGATE,
|
|
|
|
+ &clkctrl_regs->hw_clkctrl_frac0_clr[io_reg]);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -193,19 +180,16 @@ static uint32_t mx28_get_ioclk(enum mxs_ioclock io)
|
|
{
|
|
{
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
struct mx28_clkctrl_regs *clkctrl_regs =
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
|
|
- uint32_t tmp, ret;
|
|
|
|
|
|
+ uint8_t ret;
|
|
|
|
+ int io_reg;
|
|
|
|
|
|
- if (io > MXC_IOCLK1)
|
|
|
|
|
|
+ if ((io < MXC_IOCLK0) || (io > MXC_IOCLK1))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- tmp = readl(&clkctrl_regs->hw_clkctrl_frac0);
|
|
|
|
|
|
+ io_reg = CLKCTRL_FRAC0_IO0 - io; /* Register order is reversed */
|
|
|
|
|
|
- if (io == MXC_IOCLK0)
|
|
|
|
- ret = (tmp & CLKCTRL_FRAC0_IO0FRAC_MASK) >>
|
|
|
|
- CLKCTRL_FRAC0_IO0FRAC_OFFSET;
|
|
|
|
- else
|
|
|
|
- ret = (tmp & CLKCTRL_FRAC0_IO1FRAC_MASK) >>
|
|
|
|
- CLKCTRL_FRAC0_IO1FRAC_OFFSET;
|
|
|
|
|
|
+ ret = readb(&clkctrl_regs->hw_clkctrl_frac0[io_reg]) &
|
|
|
|
+ CLKCTRL_FRAC_FRAC_MASK;
|
|
|
|
|
|
return (PLL_FREQ_KHZ * PLL_FREQ_COEF) / ret;
|
|
return (PLL_FREQ_KHZ * PLL_FREQ_COEF) / ret;
|
|
}
|
|
}
|