]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/cpufreq/exynos4210-cpufreq.c
Merge tag 'cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[karo-tx-linux.git] / drivers / cpufreq / exynos4210-cpufreq.c
index a5d0a8184220feac77aa6c38e1362ed6e12e0e24..add7fbec4fc9af5ca3060e925cfe662a25d21eb4 100644 (file)
 
 #include "exynos-cpufreq.h"
 
-#define CPUFREQ_LEVEL_END      L5
-
-static int max_support_idx = L0;
-static int min_support_idx = (CPUFREQ_LEVEL_END - 1);
-
 static struct clk *cpu_clk;
 static struct clk *moutcore;
 static struct clk *mout_mpll;
 static struct clk *mout_apll;
 
-struct cpufreq_clkdiv {
-       unsigned int index;
-       unsigned int clkdiv;
-};
-
-static unsigned int exynos4210_volt_table[CPUFREQ_LEVEL_END] = {
+static unsigned int exynos4210_volt_table[] = {
        1250000, 1150000, 1050000, 975000, 950000,
 };
 
-
-static struct cpufreq_clkdiv exynos4210_clkdiv_table[CPUFREQ_LEVEL_END];
-
 static struct cpufreq_frequency_table exynos4210_freq_table[] = {
-       {L0, 1200*1000},
-       {L1, 1000*1000},
-       {L2, 800*1000},
-       {L3, 500*1000},
-       {L4, 200*1000},
+       {L0, 1200 * 1000},
+       {L1, 1000 * 1000},
+       {L2,  800 * 1000},
+       {L3,  500 * 1000},
+       {L4,  200 * 1000},
        {0, CPUFREQ_TABLE_END},
 };
 
-static unsigned int clkdiv_cpu0[CPUFREQ_LEVEL_END][7] = {
+static struct apll_freq apll_freq_4210[] = {
        /*
-        * Clock divider value for following
-        * { DIVCORE, DIVCOREM0, DIVCOREM1, DIVPERIPH,
-        *              DIVATB, DIVPCLK_DBG, DIVAPLL }
+        * values:
+        * freq
+        * clock divider for CORE, COREM0, COREM1, PERIPH, ATB, PCLK_DBG, APLL, RESERVED
+        * clock divider for COPY, HPM, RESERVED
+        * PLL M, P, S
         */
-
-       /* ARM L0: 1200MHz */
-       { 0, 3, 7, 3, 4, 1, 7 },
-
-       /* ARM L1: 1000MHz */
-       { 0, 3, 7, 3, 4, 1, 7 },
-
-       /* ARM L2: 800MHz */
-       { 0, 3, 7, 3, 3, 1, 7 },
-
-       /* ARM L3: 500MHz */
-       { 0, 3, 7, 3, 3, 1, 7 },
-
-       /* ARM L4: 200MHz */
-       { 0, 1, 3, 1, 3, 1, 0 },
-};
-
-static unsigned int clkdiv_cpu1[CPUFREQ_LEVEL_END][2] = {
-       /*
-        * Clock divider value for following
-        * { DIVCOPY, DIVHPM }
-        */
-
-       /* ARM L0: 1200MHz */
-       { 5, 0 },
-
-       /* ARM L1: 1000MHz */
-       { 4, 0 },
-
-       /* ARM L2: 800MHz */
-       { 3, 0 },
-
-       /* ARM L3: 500MHz */
-       { 3, 0 },
-
-       /* ARM L4: 200MHz */
-       { 3, 0 },
-};
-
-static unsigned int exynos4210_apll_pms_table[CPUFREQ_LEVEL_END] = {
-       /* APLL FOUT L0: 1200MHz */
-       ((150 << 16) | (3 << 8) | 1),
-
-       /* APLL FOUT L1: 1000MHz */
-       ((250 << 16) | (6 << 8) | 1),
-
-       /* APLL FOUT L2: 800MHz */
-       ((200 << 16) | (6 << 8) | 1),
-
-       /* APLL FOUT L3: 500MHz */
-       ((250 << 16) | (6 << 8) | 2),
-
-       /* APLL FOUT L4: 200MHz */
-       ((200 << 16) | (6 << 8) | 3),
+       APLL_FREQ(1200, 0, 3, 7, 3, 4, 1, 7, 0, 5, 0, 0, 150, 3, 1),
+       APLL_FREQ(1000, 0, 3, 7, 3, 4, 1, 7, 0, 4, 0, 0, 250, 6, 1),
+       APLL_FREQ(800,  0, 3, 7, 3, 3, 1, 7, 0, 3, 0, 0, 200, 6, 1),
+       APLL_FREQ(500,  0, 3, 7, 3, 3, 1, 7, 0, 3, 0, 0, 250, 6, 2),
+       APLL_FREQ(200,  0, 1, 3, 1, 3, 1, 0, 0, 3, 0, 0, 200, 6, 3),
 };
 
 static void exynos4210_set_clkdiv(unsigned int div_index)
@@ -120,7 +60,7 @@ static void exynos4210_set_clkdiv(unsigned int div_index)
 
        /* Change Divider - CPU0 */
 
-       tmp = exynos4210_clkdiv_table[div_index].clkdiv;
+       tmp = apll_freq_4210[div_index].clk_div_cpu0;
 
        __raw_writel(tmp, EXYNOS4_CLKDIV_CPU);
 
@@ -130,12 +70,7 @@ static void exynos4210_set_clkdiv(unsigned int div_index)
 
        /* Change Divider - CPU1 */
 
-       tmp = __raw_readl(EXYNOS4_CLKDIV_CPU1);
-
-       tmp &= ~((0x7 << 4) | 0x7);
-
-       tmp |= ((clkdiv_cpu1[div_index][0] << 4) |
-               (clkdiv_cpu1[div_index][1] << 0));
+       tmp = apll_freq_4210[div_index].clk_div_cpu1;
 
        __raw_writel(tmp, EXYNOS4_CLKDIV_CPU1);
 
@@ -163,7 +98,7 @@ static void exynos4210_set_apll(unsigned int index)
        /* 3. Change PLL PMS values */
        tmp = __raw_readl(EXYNOS4_APLL_CON0);
        tmp &= ~((0x3ff << 16) | (0x3f << 8) | (0x7 << 0));
-       tmp |= exynos4210_apll_pms_table[index];
+       tmp |= apll_freq_4210[index].mps;
        __raw_writel(tmp, EXYNOS4_APLL_CON0);
 
        /* 4. wait_lock_time */
@@ -180,10 +115,10 @@ static void exynos4210_set_apll(unsigned int index)
        } while (tmp != (0x1 << EXYNOS4_CLKSRC_CPU_MUXCORE_SHIFT));
 }
 
-bool exynos4210_pms_change(unsigned int old_index, unsigned int new_index)
+static bool exynos4210_pms_change(unsigned int old_index, unsigned int new_index)
 {
-       unsigned int old_pm = (exynos4210_apll_pms_table[old_index] >> 8);
-       unsigned int new_pm = (exynos4210_apll_pms_table[new_index] >> 8);
+       unsigned int old_pm = apll_freq_4210[old_index].mps >> 8;
+       unsigned int new_pm = apll_freq_4210[new_index].mps >> 8;
 
        return (old_pm == new_pm) ? 0 : 1;
 }
@@ -201,7 +136,7 @@ static void exynos4210_set_frequency(unsigned int old_index,
                        /* 2. Change just s value in apll m,p,s value */
                        tmp = __raw_readl(EXYNOS4_APLL_CON0);
                        tmp &= ~(0x7 << 0);
-                       tmp |= (exynos4210_apll_pms_table[new_index] & 0x7);
+                       tmp |= apll_freq_4210[new_index].mps & 0x7;
                        __raw_writel(tmp, EXYNOS4_APLL_CON0);
                } else {
                        /* Clock Configuration Procedure */
@@ -215,7 +150,7 @@ static void exynos4210_set_frequency(unsigned int old_index,
                        /* 1. Change just s value in apll m,p,s value */
                        tmp = __raw_readl(EXYNOS4_APLL_CON0);
                        tmp &= ~(0x7 << 0);
-                       tmp |= (exynos4210_apll_pms_table[new_index] & 0x7);
+                       tmp |= apll_freq_4210[new_index].mps & 0x7;
                        __raw_writel(tmp, EXYNOS4_APLL_CON0);
 
                        /* 2. Change the system clock divider values */
@@ -232,8 +167,6 @@ static void exynos4210_set_frequency(unsigned int old_index,
 
 int exynos4210_cpufreq_init(struct exynos_dvfs_info *info)
 {
-       int i;
-       unsigned int tmp;
        unsigned long rate;
 
        cpu_clk = clk_get(NULL, "armclk");
@@ -254,33 +187,9 @@ int exynos4210_cpufreq_init(struct exynos_dvfs_info *info)
        if (IS_ERR(mout_apll))
                goto err_mout_apll;
 
-       tmp = __raw_readl(EXYNOS4_CLKDIV_CPU);
-
-       for (i = L0; i <  CPUFREQ_LEVEL_END; i++) {
-               tmp &= ~(EXYNOS4_CLKDIV_CPU0_CORE_MASK |
-                       EXYNOS4_CLKDIV_CPU0_COREM0_MASK |
-                       EXYNOS4_CLKDIV_CPU0_COREM1_MASK |
-                       EXYNOS4_CLKDIV_CPU0_PERIPH_MASK |
-                       EXYNOS4_CLKDIV_CPU0_ATB_MASK |
-                       EXYNOS4_CLKDIV_CPU0_PCLKDBG_MASK |
-                       EXYNOS4_CLKDIV_CPU0_APLL_MASK);
-
-               tmp |= ((clkdiv_cpu0[i][0] << EXYNOS4_CLKDIV_CPU0_CORE_SHIFT) |
-                       (clkdiv_cpu0[i][1] << EXYNOS4_CLKDIV_CPU0_COREM0_SHIFT) |
-                       (clkdiv_cpu0[i][2] << EXYNOS4_CLKDIV_CPU0_COREM1_SHIFT) |
-                       (clkdiv_cpu0[i][3] << EXYNOS4_CLKDIV_CPU0_PERIPH_SHIFT) |
-                       (clkdiv_cpu0[i][4] << EXYNOS4_CLKDIV_CPU0_ATB_SHIFT) |
-                       (clkdiv_cpu0[i][5] << EXYNOS4_CLKDIV_CPU0_PCLKDBG_SHIFT) |
-                       (clkdiv_cpu0[i][6] << EXYNOS4_CLKDIV_CPU0_APLL_SHIFT));
-
-               exynos4210_clkdiv_table[i].clkdiv = tmp;
-       }
-
        info->mpll_freq_khz = rate;
-       info->pm_lock_idx = L2;
+       /* 800Mhz */
        info->pll_safe_idx = L2;
-       info->max_support_idx = max_support_idx;
-       info->min_support_idx = min_support_idx;
        info->cpu_clk = cpu_clk;
        info->volt_table = exynos4210_volt_table;
        info->freq_table = exynos4210_freq_table;
@@ -290,14 +199,11 @@ int exynos4210_cpufreq_init(struct exynos_dvfs_info *info)
        return 0;
 
 err_mout_apll:
-       if (!IS_ERR(mout_mpll))
-               clk_put(mout_mpll);
+       clk_put(mout_mpll);
 err_mout_mpll:
-       if (!IS_ERR(moutcore))
-               clk_put(moutcore);
+       clk_put(moutcore);
 err_moutcore:
-       if (!IS_ERR(cpu_clk))
-               clk_put(cpu_clk);
+       clk_put(cpu_clk);
 
        pr_debug("%s: failed initialization\n", __func__);
        return -EINVAL;