]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/arm/cpu/armv7/am33xx/clock_ti814x.c
am33xx: Update DT files, add am335x_gp_evm_config target
[karo-tx-uboot.git] / arch / arm / cpu / armv7 / am33xx / clock_ti814x.c
index cb4210f6e66f7dc64f659cd670abfb9aab7ddddd..9b5a47b01892f36c239638d857c0499e8a49f331 100644 (file)
@@ -5,15 +5,7 @@
  *
  * Copyright (C) 2013, Texas Instruments, Incorporated
  *
- * 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.
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
@@ -108,119 +100,94 @@ struct ad_pll {
 
 #define OSC_SRC_CTRL                   (PLL_SUBSYS_BASE + 0x2C0)
 
-/* PRCM */
-#define CM_DEFAULT_BASE                        (PRCM_BASE + 0x0500)
-
-struct cm_def {
-       unsigned int resv0[2];
-       unsigned int l3fastclkstctrl;
-       unsigned int resv1[1];
-       unsigned int pciclkstctrl;
-       unsigned int resv2[1];
-       unsigned int ducaticlkstctrl;
-       unsigned int resv3[1];
-       unsigned int emif0clkctrl;
-       unsigned int emif1clkctrl;
-       unsigned int dmmclkctrl;
-       unsigned int fwclkctrl;
-       unsigned int resv4[10];
-       unsigned int usbclkctrl;
-       unsigned int resv5[1];
-       unsigned int sataclkctrl;
-       unsigned int resv6[4];
-       unsigned int ducaticlkctrl;
-       unsigned int pciclkctrl;
-};
+#define ENET_CLKCTRL_CMPL              0x30000
 
-#define CM_ALWON_BASE                  (PRCM_BASE + 0x1400)
-
-struct cm_alwon {
-       unsigned int l3slowclkstctrl;
-       unsigned int ethclkstctrl;
-       unsigned int l3medclkstctrl;
-       unsigned int mmu_clkstctrl;
-       unsigned int mmucfg_clkstctrl;
-       unsigned int ocmc0clkstctrl;
-       unsigned int vcpclkstctrl;
-       unsigned int mpuclkstctrl;
-       unsigned int sysclk4clkstctrl;
-       unsigned int sysclk5clkstctrl;
-       unsigned int sysclk6clkstctrl;
-       unsigned int rtcclkstctrl;
-       unsigned int l3fastclkstctrl;
-       unsigned int resv0[67];
-       unsigned int mcasp0clkctrl;
-       unsigned int mcasp1clkctrl;
-       unsigned int mcasp2clkctrl;
-       unsigned int mcbspclkctrl;
-       unsigned int uart0clkctrl;
-       unsigned int uart1clkctrl;
-       unsigned int uart2clkctrl;
-       unsigned int gpio0clkctrl;
-       unsigned int gpio1clkctrl;
-       unsigned int i2c0clkctrl;
-       unsigned int i2c1clkctrl;
-       unsigned int mcasp345clkctrl;
-       unsigned int atlclkctrl;
-       unsigned int mlbclkctrl;
-       unsigned int pataclkctrl;
-       unsigned int resv1[1];
-       unsigned int uart3clkctrl;
-       unsigned int uart4clkctrl;
-       unsigned int uart5clkctrl;
-       unsigned int wdtimerclkctrl;
-       unsigned int spiclkctrl;
-       unsigned int mailboxclkctrl;
-       unsigned int spinboxclkctrl;
-       unsigned int mmudataclkctrl;
-       unsigned int resv2[2];
-       unsigned int mmucfgclkctrl;
-       unsigned int resv3[2];
-       unsigned int ocmc0clkctrl;
-       unsigned int vcpclkctrl;
-       unsigned int resv4[2];
-       unsigned int controlclkctrl;
-       unsigned int resv5[2];
-       unsigned int gpmcclkctrl;
-       unsigned int ethernet0clkctrl;
-       unsigned int resv6[1];
-       unsigned int mpuclkctrl;
-       unsigned int debugssclkctrl;
-       unsigned int l3clkctrl;
-       unsigned int l4hsclkctrl;
-       unsigned int l4lsclkctrl;
-       unsigned int rtcclkctrl;
-       unsigned int tpccclkctrl;
-       unsigned int tptc0clkctrl;
-       unsigned int tptc1clkctrl;
-       unsigned int tptc2clkctrl;
-       unsigned int tptc3clkctrl;
-       unsigned int resv7[4];
-       unsigned int dcan01clkctrl;
-       unsigned int mmchs0clkctrl;
-       unsigned int mmchs1clkctrl;
-       unsigned int mmchs2clkctrl;
-       unsigned int custefuseclkctrl;
+#define SATA_PLL_BASE                  (CTRL_BASE + 0x0720)
+
+struct sata_pll {
+       unsigned int pllcfg0;
+       unsigned int pllcfg1;
+       unsigned int pllcfg2;
+       unsigned int pllcfg3;
+       unsigned int pllcfg4;
+       unsigned int pllstatus;
+       unsigned int rxstatus;
+       unsigned int txstatus;
+       unsigned int testcfg;
 };
 
+#define SEL_IN_FREQ            (0x1 << 31)
+#define DIGCLRZ                        (0x1 << 30)
+#define ENDIGLDO               (0x1 << 4)
+#define APLL_CP_CURR           (0x1 << 3)
+#define ENBGSC_REF             (0x1 << 2)
+#define ENPLLLDO               (0x1 << 1)
+#define ENPLL                  (0x1 << 0)
+
+#define SATA_PLLCFG0_1 (SEL_IN_FREQ | ENBGSC_REF)
+#define SATA_PLLCFG0_2 (SEL_IN_FREQ | ENDIGLDO | ENBGSC_REF)
+#define SATA_PLLCFG0_3 (SEL_IN_FREQ | ENDIGLDO | ENBGSC_REF | ENPLLLDO)
+#define SATA_PLLCFG0_4 (SEL_IN_FREQ | DIGCLRZ | ENDIGLDO | ENBGSC_REF | \
+                       ENPLLLDO | ENPLL)
+
+#define PLL_LOCK               (0x1 << 0)
+
+#define ENSATAMODE             (0x1 << 31)
+#define PLLREFSEL              (0x1 << 30)
+#define MDIVINT                        (0x4b << 18)
+#define EN_CLKAUX              (0x1 << 5)
+#define EN_CLK125M             (0x1 << 4)
+#define EN_CLK100M             (0x1 << 3)
+#define EN_CLK50M              (0x1 << 2)
+
+#define SATA_PLLCFG1 (ENSATAMODE |     \
+                     PLLREFSEL |       \
+                     MDIVINT |         \
+                     EN_CLKAUX |       \
+                     EN_CLK125M |      \
+                     EN_CLK100M |      \
+                     EN_CLK50M)
+
+#define DIGLDO_EN_CAPLESSMODE  (0x1 << 22)
+#define PLLDO_EN_LDO_STABLE    (0x1 << 11)
+#define PLLDO_EN_BUF_CUR       (0x1 << 7)
+#define PLLDO_EN_LP            (0x1 << 6)
+#define PLLDO_CTRL_TRIM_1_4V   (0x10 << 1)
+
+#define SATA_PLLCFG3 (DIGLDO_EN_CAPLESSMODE |  \
+                     PLLDO_EN_LDO_STABLE |     \
+                     PLLDO_EN_BUF_CUR |        \
+                     PLLDO_EN_LP |             \
+                     PLLDO_CTRL_TRIM_1_4V)
 
 const struct cm_alwon *cmalwon = (struct cm_alwon *)CM_ALWON_BASE;
 const struct cm_def *cmdef = (struct cm_def *)CM_DEFAULT_BASE;
+const struct sata_pll *spll = (struct sata_pll *)SATA_PLL_BASE;
 
 /*
  * Enable the peripheral clock for required peripherals
  */
 static void enable_per_clocks(void)
 {
-       /* UART0 */
-       writel(PRCM_MOD_EN, &cmalwon->uart0clkctrl);
-       while (readl(&cmalwon->uart0clkctrl) != PRCM_MOD_EN)
-               ;
-
        /* HSMMC1 */
        writel(PRCM_MOD_EN, &cmalwon->mmchs1clkctrl);
        while (readl(&cmalwon->mmchs1clkctrl) != PRCM_MOD_EN)
                ;
+
+       /* Ethernet */
+       writel(PRCM_MOD_EN, &cmalwon->ethclkstctrl);
+       writel(PRCM_MOD_EN, &cmalwon->ethernet0clkctrl);
+       while ((readl(&cmalwon->ethernet0clkctrl) & ENET_CLKCTRL_CMPL) != 0)
+               ;
+       writel(PRCM_MOD_EN, &cmalwon->ethernet1clkctrl);
+       while ((readl(&cmalwon->ethernet1clkctrl) & ENET_CLKCTRL_CMPL) != 0)
+               ;
+
+       /* RTC clocks */
+       writel(PRCM_MOD_EN, &cmalwon->rtcclkstctrl);
+       writel(PRCM_MOD_EN, &cmalwon->rtcclkctrl);
+       while (readl(&cmalwon->rtcclkctrl) != PRCM_MOD_EN)
+               ;
 }
 
 /*
@@ -244,11 +211,8 @@ static u32 pll_dco_freq_sel(u32 clkout_dco)
 static u32 pll_sigma_delta_val(u32 clkout_dco)
 {
        u32 sig_val = 0;
-       float frac_div;
 
-       frac_div = (float) clkout_dco / 250;
-       frac_div = frac_div + 0.90;
-       sig_val = (int)frac_div;
+       sig_val = (clkout_dco + 225) / 250;
        sig_val = sig_val << 24;
 
        return sig_val;
@@ -365,7 +329,34 @@ void ddr_pll_config(unsigned int ddrpll_m)
        pll_config(DDR_PLL_BASE, DDR_N, DDR_M, DDR_M2, DDR_CLKCTRL, 1);
 }
 
-void enable_emif_clocks(void) {};
+void sata_pll_config(void)
+{
+       /*
+        * This sequence for configuring the SATA PLL
+        * resident in the control module is documented
+        * in TI8148 TRM section 21.3.1
+        */
+       writel(SATA_PLLCFG1, &spll->pllcfg1);
+       udelay(50);
+
+       writel(SATA_PLLCFG3, &spll->pllcfg3);
+       udelay(50);
+
+       writel(SATA_PLLCFG0_1, &spll->pllcfg0);
+       udelay(50);
+
+       writel(SATA_PLLCFG0_2, &spll->pllcfg0);
+       udelay(50);
+
+       writel(SATA_PLLCFG0_3, &spll->pllcfg0);
+       udelay(50);
+
+       writel(SATA_PLLCFG0_4, &spll->pllcfg0);
+       udelay(50);
+
+       while (((readl(&spll->pllstatus) & PLL_LOCK) == 0))
+               ;
+}
 
 void enable_dmm_clocks(void)
 {
@@ -387,19 +378,26 @@ void enable_dmm_clocks(void)
                ;
 }
 
+void setup_clocks_for_console(void)
+{
+       unlock_pll_control_mmr();
+       /* UART0 */
+       writel(PRCM_MOD_EN, &cmalwon->uart0clkctrl);
+       while (readl(&cmalwon->uart0clkctrl) != PRCM_MOD_EN)
+               ;
+}
 /*
  * Configure the PLL/PRCM for necessary peripherals
  */
-void pll_init()
+void prcm_init(void)
 {
-       unlock_pll_control_mmr();
-
        /* Enable the control module */
        writel(PRCM_MOD_EN, &cmalwon->controlclkctrl);
 
+       /* Configure PLLs */
        mpu_pll_config();
-
        l3_pll_config();
+       sata_pll_config();
 
        /* Enable the required peripherals */
        enable_per_clocks();