]> git.sur5r.net Git - u-boot/blobdiff - arch/arm/cpu/arm926ejs/mx25/generic.c
mx25 clocks: Fix MXC_FEC_CLK
[u-boot] / arch / arm / cpu / arm926ejs / mx25 / generic.c
index a412a8fe204521ebba4d86147fbfda1710b3a772..fc92c9bf1d9a7c93490541de3953af2cd625205f 100644 (file)
@@ -48,7 +48,7 @@ static unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref)
 {
        unsigned int mfi = (pll >> CCM_PLL_MFI_SHIFT)
            & CCM_PLL_MFI_MASK;
-       unsigned int mfn = (pll >> CCM_PLL_MFN_SHIFT)
+       int mfn = (pll >> CCM_PLL_MFN_SHIFT)
            & CCM_PLL_MFN_MASK;
        unsigned int mfd = (pll >> CCM_PLL_MFD_SHIFT)
            & CCM_PLL_MFD_MASK;
@@ -56,15 +56,18 @@ static unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref)
            & CCM_PLL_PD_MASK;
 
        mfi = mfi <= 5 ? 5 : mfi;
+       mfn = mfn >= 512 ? mfn - 1024 : mfn;
+       mfd += 1;
+       pd += 1;
 
-       return lldiv(2 * (u64) f_ref * (mfi * (mfd + 1) + mfn),
-                     (mfd + 1) * (pd + 1));
+       return lldiv(2 * (u64) f_ref * (mfi * mfd + mfn),
+                    mfd * pd);
 }
 
 static ulong imx_get_mpllclk(void)
 {
        struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
-       ulong fref = 24000000;
+       ulong fref = MXC_HCLK;
 
        return imx_decode_pll(readl(&ccm->mpctl), fref);
 }
@@ -77,12 +80,12 @@ ulong imx_get_armclk(void)
        ulong div;
 
        if (cctl & CCM_CCTL_ARM_SRC)
-               fref = lldiv((fref * 3), 4);
+               fref = lldiv((u64) fref * 3, 4);
 
        div = ((cctl >> CCM_CCTL_ARM_DIV_SHIFT)
               & CCM_CCTL_ARM_DIV_MASK) + 1;
 
-       return lldiv(fref, div);
+       return fref / div;
 }
 
 ulong imx_get_ahbclk(void)
@@ -95,7 +98,12 @@ ulong imx_get_ahbclk(void)
        div = ((cctl >> CCM_CCTL_AHB_DIV_SHIFT)
               & CCM_CCTL_AHB_DIV_MASK) + 1;
 
-       return lldiv(fref, div);
+       return fref / div;
+}
+
+static ulong imx_get_ipgclk(void)
+{
+       return imx_get_ahbclk() / 2;
 }
 
 ulong imx_get_perclk(int clk)
@@ -107,7 +115,7 @@ ulong imx_get_perclk(int clk)
        div = readl(&ccm->pcdr[CCM_PERCLK_REG(clk)]);
        div = ((div >> CCM_PERCLK_SHIFT(clk)) & CCM_PERCLK_MASK) + 1;
 
-       return lldiv(fref, div);
+       return fref / div;
 }
 
 unsigned int mxc_get_clock(enum mxc_clock clk)
@@ -117,8 +125,12 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
        switch (clk) {
        case MXC_ARM_CLK:
                return imx_get_armclk();
-       case MXC_FEC_CLK:
+       case MXC_AHB_CLK:
                return imx_get_ahbclk();
+       case MXC_IPG_CLK:
+       case MXC_CSPI_CLK:
+       case MXC_FEC_CLK:
+               return imx_get_ipgclk();
        default:
                return imx_get_perclk(clk);
        }
@@ -140,6 +152,9 @@ u32 get_cpu_rev(void)
        case 0x01:
                system_rev |= CHIP_REV_1_1;
                break;
+       case 0x02:
+               system_rev |= CHIP_REV_1_2;
+               break;
        default:
                system_rev |= 0x8000;
                break;