Merge branch 'u-boot-sunxi/master' into 'u-boot-arm/master'
[platform/kernel/u-boot.git] / arch / m68k / cpu / mcf5445x / speed.c
index d71b5fe..4e363a4 100644 (file)
@@ -3,23 +3,7 @@
  * Copyright (C) 2004-2007, 2012 Freescale Semiconductor, Inc.
  * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
  *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
@@ -57,8 +41,10 @@ void clock_enter_limp(int lpdiv)
        /* Round divider down to nearest power of two */
        for (i = 0, j = lpdiv; j != 1; j >>= 1, i++) ;
 
+#ifdef CONFIG_MCF5445x
        /* Apply the divider to the system clock */
        clrsetbits_be16(&ccm->cdr, 0x0f00, CCM_CDR_LPDIV(i));
+#endif
 
        /* Enable Limp Mode */
        setbits_be16(&ccm->misccr, CCM_MISCCR_LIMP);
@@ -81,12 +67,66 @@ void clock_exit_limp(void)
                ;
 }
 
-/*
- * get_clocks() fills in gd->cpu_clock and gd->bus_clk
- */
-int get_clocks(void)
+#ifdef CONFIG_MCF5441x
+void setup_5441x_clocks(void)
 {
+       ccm_t *ccm = (ccm_t *)MMAP_CCM;
+       pll_t *pll = (pll_t *)MMAP_PLL;
+       int temp, vco = 0, bootmod_ccr, pdr;
+
+       bootmod_ccr = (in_be16(&ccm->ccr) & CCM_CCR_BOOTMOD) >> 14;
+
+       switch (bootmod_ccr) {
+       case 0:
+               out_be32(&pll->pcr, 0x00000013);
+               out_be32(&pll->pdr, 0x00e70c61);
+               clock_exit_limp();
+               break;
+       case 2:
+               break;
+       case 3:
+               break;
+       }
+
+       /*Change frequency for Modelo SER1 USB host*/
+#ifdef CONFIG_LOW_MCFCLK
+       temp = in_be32(&pll->pcr);
+       temp &= ~0x3f;
+       temp |= 5;
+       out_be32(&pll->pcr, temp);
+
+       temp = in_be32(&pll->pdr);
+       temp &= ~0x001f0000;
+       temp |= 0x00040000;
+       out_be32(&pll->pdr, temp);
+       __asm__("tpf");
+#endif
+
+       setbits_be16(&ccm->misccr2, 0x02);
+
+       vco =  ((in_be32(&pll->pcr) & PLL_CR_FBKDIV_BITS) + 1) *
+               CONFIG_SYS_INPUT_CLKSRC;
+       gd->arch.vco_clk = vco;
+
+       gd->arch.inp_clk = CONFIG_SYS_INPUT_CLKSRC;     /* Input clock */
 
+       pdr = in_be32(&pll->pdr);
+       temp = (pdr & PLL_DR_OUTDIV1_BITS) + 1;
+       gd->cpu_clk = vco / temp;       /* cpu clock */
+       gd->arch.flb_clk = vco / temp;  /* FlexBus clock */
+       gd->arch.flb_clk >>= 1;
+       if (in_be16(&ccm->misccr2) & 2)         /* fsys/4 */
+               gd->arch.flb_clk >>= 1;
+
+       temp = ((pdr & PLL_DR_OUTDIV2_BITS) >> 5) + 1;
+       gd->bus_clk = vco / temp;       /* bus clock */
+
+}
+#endif
+
+#ifdef CONFIG_MCF5445x
+void setup_5445x_clocks(void)
+{
        ccm_t *ccm = (ccm_t *)MMAP_CCM;
        pll_t *pll = (pll_t *)MMAP_PLL;
        int pllmult_nopci[] = { 20, 10, 24, 18, 12, 6, 16, 8 };
@@ -177,7 +217,7 @@ int get_clocks(void)
 
                        out_be32(&pll->pcr, pcrvalue);
                }
-               gd->vco_clk = vco;      /* Vco clock */
+               gd->arch.vco_clk = vco; /* Vco clock */
        } else if (bootmode == 2) {
                /* Normal mode */
                vco =  ((in_be32(&pll->pcr) & 0xFF000000) >> 24) * CONFIG_SYS_INPUT_CLKSRC;
@@ -188,17 +228,17 @@ int get_clocks(void)
                        out_be32(&pll->pcr, pcrvalue);
                        vco = ((in_be32(&pll->pcr) & 0xFF000000) >> 24) * CONFIG_SYS_INPUT_CLKSRC;
                }
-               gd->vco_clk = vco;      /* Vco clock */
+               gd->arch.vco_clk = vco; /* Vco clock */
        } else if (bootmode == 3) {
                /* serial mode */
                vco =  ((in_be32(&pll->pcr) & 0xFF000000) >> 24) * CONFIG_SYS_INPUT_CLKSRC;
-               gd->vco_clk = vco;      /* Vco clock */
+               gd->arch.vco_clk = vco; /* Vco clock */
        }
 
        if ((in_be16(&ccm->ccr) & CCM_MISCCR_LIMP) == CCM_MISCCR_LIMP) {
                /* Limp mode */
        } else {
-               gd->inp_clk = CONFIG_SYS_INPUT_CLKSRC;  /* Input clock */
+               gd->arch.inp_clk = CONFIG_SYS_INPUT_CLKSRC; /* Input clock */
 
                temp = (in_be32(&pll->pcr) & PLL_PCR_OUTDIV1_MASK) + 1;
                gd->cpu_clk = vco / temp;       /* cpu clock */
@@ -207,7 +247,7 @@ int get_clocks(void)
                gd->bus_clk = vco / temp;       /* bus clock */
 
                temp = ((in_be32(&pll->pcr) & PLL_PCR_OUTDIV3_MASK) >> 8) + 1;
-               gd->flb_clk = vco / temp;       /* FlexBus clock */
+               gd->arch.flb_clk = vco / temp;  /* FlexBus clock */
 
 #ifdef CONFIG_PCI
                if (bPci) {
@@ -217,8 +257,24 @@ int get_clocks(void)
 #endif
        }
 
-#ifdef CONFIG_FSL_I2C
-       gd->i2c1_clk = gd->bus_clk;
+#ifdef CONFIG_SYS_I2C_FSL
+       gd->arch.i2c1_clk = gd->bus_clk;
+#endif
+}
+#endif
+
+/* get_clocks() fills in gd->cpu_clock and gd->bus_clk */
+int get_clocks(void)
+{
+#ifdef CONFIG_MCF5441x
+       setup_5441x_clocks();
+#endif
+#ifdef CONFIG_MCF5445x
+       setup_5445x_clocks();
+#endif
+
+#ifdef CONFIG_SYS_FSL_I2C
+       gd->arch.i2c1_clk = gd->bus_clk;
 #endif
 
        return (0);