]> rtime.felk.cvut.cz Git - linux-imx.git/commitdiff
Merge branch 'pm-cpufreq'
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 28 Jun 2013 11:01:34 +0000 (13:01 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 28 Jun 2013 11:01:34 +0000 (13:01 +0200)
* pm-cpufreq: (41 commits)
  cpufreq: tegra: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: s3c64xx: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: omap: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: imx6q: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: exynos: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: dbx500: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: davinci: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: arm-big-little: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: powernow-k8: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: pcc: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: e_powersaver: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: ACPI: call CPUFREQ_POSTCHANGE notfier in error cases
  cpufreq: s3c2416: fix forgotten driver_data conversions
  cpufreq: make __cpufreq_notify_transition() static
  cpufreq: Fix minor formatting issues
  cpufreq: Fix governor start/stop race condition
  cpufreq: Simplify userspace governor
  cpufreq: X86_AMD_FREQ_SENSITIVITY: select CPU_FREQ_TABLE
  cpufreq: tegra: create CONFIG_ARM_TEGRA_CPUFREQ
  cpufreq: S3C2416/S3C64XX: select CPU_FREQ_TABLE
  ...

67 files changed:
Documentation/cpu-freq/cpu-drivers.txt
MAINTAINERS
arch/arm/mach-davinci/Kconfig
arch/arm/mach-davinci/da850.c
arch/arm/mach-pxa/Kconfig
arch/arm/mach-s3c24xx/cpufreq-utils.c
arch/arm/mach-s3c24xx/cpufreq.c
arch/arm/mach-s3c24xx/pll-s3c2410.c
arch/arm/mach-s3c24xx/pll-s3c2440-12000000.c
arch/arm/mach-s3c24xx/pll-s3c2440-16934400.c
arch/arm/mach-shmobile/clock-sh7372.c
arch/arm/mach-tegra/Kconfig
arch/arm/plat-samsung/include/plat/cpu-freq-core.h
arch/cris/Kconfig
arch/mips/loongson/lemote-2f/clock.c
arch/powerpc/platforms/Kconfig
arch/powerpc/platforms/pasemi/Makefile
arch/powerpc/platforms/powermac/Makefile
drivers/base/power/opp.c
drivers/cpufreq/Kconfig.arm
drivers/cpufreq/Kconfig.powerpc
drivers/cpufreq/Kconfig.x86
drivers/cpufreq/Makefile
drivers/cpufreq/acpi-cpufreq.c
drivers/cpufreq/arm_big_little.c
drivers/cpufreq/blackfin-cpufreq.c
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq_governor.c
drivers/cpufreq/cpufreq_governor.h
drivers/cpufreq/cpufreq_performance.c
drivers/cpufreq/cpufreq_powersave.c
drivers/cpufreq/cpufreq_stats.c
drivers/cpufreq/cpufreq_userspace.c
drivers/cpufreq/davinci-cpufreq.c
drivers/cpufreq/dbx500-cpufreq.c
drivers/cpufreq/e_powersaver.c
drivers/cpufreq/exynos-cpufreq.c
drivers/cpufreq/freq_table.c
drivers/cpufreq/ia64-acpi-cpufreq.c
drivers/cpufreq/imx6q-cpufreq.c
drivers/cpufreq/kirkwood-cpufreq.c
drivers/cpufreq/longhaul.c
drivers/cpufreq/loongson2_cpufreq.c
drivers/cpufreq/omap-cpufreq.c
drivers/cpufreq/p4-clockmod.c
drivers/cpufreq/pasemi-cpufreq.c [moved from arch/powerpc/platforms/pasemi/cpufreq.c with 98% similarity]
drivers/cpufreq/pcc-cpufreq.c
drivers/cpufreq/pmac32-cpufreq.c [moved from arch/powerpc/platforms/powermac/cpufreq_32.c with 100% similarity]
drivers/cpufreq/pmac64-cpufreq.c [moved from arch/powerpc/platforms/powermac/cpufreq_64.c with 100% similarity]
drivers/cpufreq/powernow-k6.c
drivers/cpufreq/powernow-k7.c
drivers/cpufreq/powernow-k8.c
drivers/cpufreq/ppc-corenet-cpufreq.c [new file with mode: 0644]
drivers/cpufreq/ppc_cbe_cpufreq.c
drivers/cpufreq/pxa2xx-cpufreq.c
drivers/cpufreq/pxa3xx-cpufreq.c
drivers/cpufreq/s3c2416-cpufreq.c
drivers/cpufreq/s3c64xx-cpufreq.c
drivers/cpufreq/sc520_freq.c
drivers/cpufreq/sparc-us2e-cpufreq.c
drivers/cpufreq/sparc-us3-cpufreq.c
drivers/cpufreq/spear-cpufreq.c
drivers/cpufreq/speedstep-centrino.c
drivers/cpufreq/tegra-cpufreq.c
drivers/mfd/db8500-prcmu.c
drivers/sh/clk/core.c
include/linux/cpufreq.h

index a3585eac83b605cfdf5f07b15930d77e62eef5d8..19fa98e07bf7fe79f403042d14858677f4474839 100644 (file)
@@ -186,7 +186,7 @@ As most cpufreq processors only allow for being set to a few specific
 frequencies, a "frequency table" with some functions might assist in
 some work of the processor driver. Such a "frequency table" consists
 of an array of struct cpufreq_frequency_table entries, with any value in
-"index" you want to use, and the corresponding frequency in
+"driver_data" you want to use, and the corresponding frequency in
 "frequency". At the end of the table, you need to add a
 cpufreq_frequency_table entry with frequency set to CPUFREQ_TABLE_END. And
 if you want to skip one entry in the table, set the frequency to 
@@ -214,10 +214,4 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 is the corresponding frequency table helper for the ->target
 stage. Just pass the values to this function, and the unsigned int
 index returns the number of the frequency table entry which contains
-the frequency the CPU shall be set to. PLEASE NOTE: This is not the
-"index" which is in this cpufreq_table_entry.index, but instead
-cpufreq_table[index]. So, the new frequency is
-cpufreq_table[index].frequency, and the value you stored into the
-frequency table "index" field is
-cpufreq_table[index].index.
-
+the frequency the CPU shall be set to.
index ac6c8994714c1829207d33ad6eee7e2072749ca9..04a5fef844159f762193a72d9cd72fa40cf48df1 100644 (file)
@@ -2218,7 +2218,8 @@ M:        Viresh Kumar <viresh.kumar@linaro.org>
 L:     cpufreq@vger.kernel.org
 L:     linux-pm@vger.kernel.org
 S:     Maintained
-T:     git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
+T:     git git://git.linaro.org/people/vireshk/linux.git (For ARM Updates)
 F:     drivers/cpufreq/
 F:     include/linux/cpufreq.h
 
index a075b3e0c5c7a5229aa87163e732d9c6b49a7a50..e026b19b23eaf1d8546f4996a387c13e1b8ed670 100644 (file)
@@ -40,6 +40,7 @@ config ARCH_DAVINCI_DA850
        bool "DA850/OMAP-L138/AM18x based system"
        select ARCH_DAVINCI_DA8XX
        select ARCH_HAS_CPUFREQ
+       select CPU_FREQ_TABLE
        select CP_INTC
 
 config ARCH_DAVINCI_DA8XX
index 4d6933848abfaeaab005ed972916fb0cfb69b5da..a0d4f6038b608f187eedc4a0cf89b0b97ce6a49c 100644 (file)
@@ -1004,7 +1004,7 @@ static const struct da850_opp da850_opp_96 = {
 
 #define OPP(freq)              \
        {                               \
-               .index = (unsigned int) &da850_opp_##freq,      \
+               .driver_data = (unsigned int) &da850_opp_##freq,        \
                .frequency = freq * 1000, \
        }
 
@@ -1016,7 +1016,7 @@ static struct cpufreq_frequency_table da850_freq_table[] = {
        OPP(200),
        OPP(96),
        {
-               .index          = 0,
+               .driver_data            = 0,
                .frequency      = CPUFREQ_TABLE_END,
        },
 };
@@ -1044,7 +1044,7 @@ static int da850_set_voltage(unsigned int index)
        if (!cvdd)
                return -ENODEV;
 
-       opp = (struct da850_opp *) cpufreq_info.freq_table[index].index;
+       opp = (struct da850_opp *) cpufreq_info.freq_table[index].driver_data;
 
        return regulator_set_voltage(cvdd, opp->cvdd_min, opp->cvdd_max);
 }
@@ -1125,7 +1125,7 @@ static int da850_set_pll0rate(struct clk *clk, unsigned long index)
        struct pll_data *pll = clk->pll_data;
        int ret;
 
-       opp = (struct da850_opp *) cpufreq_info.freq_table[index].index;
+       opp = (struct da850_opp *) cpufreq_info.freq_table[index].driver_data;
        prediv = opp->prediv;
        mult = opp->mult;
        postdiv = opp->postdiv;
index 96100dbf5a2e8353e9fad34ded41ec5e83dda7ad..a8427115ee07b9a986d62dceac6006f8c9cecafd 100644 (file)
@@ -615,12 +615,14 @@ endmenu
 config PXA25x
        bool
        select CPU_XSCALE
+       select CPU_FREQ_TABLE if CPU_FREQ
        help
          Select code specific to PXA21x/25x/26x variants
 
 config PXA27x
        bool
        select CPU_XSCALE
+       select CPU_FREQ_TABLE if CPU_FREQ
        help
          Select code specific to PXA27x variants
 
@@ -633,6 +635,7 @@ config CPU_PXA26x
 config PXA3xx
        bool
        select CPU_XSC3
+       select CPU_FREQ_TABLE if CPU_FREQ
        help
          Select code specific to PXA3xx variants
 
index ddd8280e3875792abd0899048201e9ead6010567..2a0aa5684e725fbd13973e407c1722571f1a4357 100644 (file)
@@ -60,5 +60,5 @@ void s3c2410_cpufreq_setrefresh(struct s3c_cpufreq_config *cfg)
  */
 void s3c2410_set_fvco(struct s3c_cpufreq_config *cfg)
 {
-       __raw_writel(cfg->pll.index, S3C2410_MPLLCON);
+       __raw_writel(cfg->pll.driver_data, S3C2410_MPLLCON);
 }
index 3c0e78ede0da0fcaa82512c6f9f91f3af2260f7b..3513e747716007f0700dc58df1e8c96bffdc2151 100644 (file)
@@ -70,7 +70,7 @@ static void s3c_cpufreq_getcur(struct s3c_cpufreq_config *cfg)
        cfg->freq.pclk = pclk = clk_get_rate(clk_pclk);
        cfg->freq.armclk = armclk = clk_get_rate(clk_arm);
 
-       cfg->pll.index = __raw_readl(S3C2410_MPLLCON);
+       cfg->pll.driver_data = __raw_readl(S3C2410_MPLLCON);
        cfg->pll.frequency = fclk;
 
        cfg->freq.hclk_tns = 1000000000 / (cfg->freq.hclk / 10);
@@ -431,7 +431,7 @@ static unsigned int suspend_freq;
 static int s3c_cpufreq_suspend(struct cpufreq_policy *policy)
 {
        suspend_pll.frequency = clk_get_rate(_clk_mpll);
-       suspend_pll.index = __raw_readl(S3C2410_MPLLCON);
+       suspend_pll.driver_data = __raw_readl(S3C2410_MPLLCON);
        suspend_freq = s3c_cpufreq_get(0) * 1000;
 
        return 0;
index dcf3420a3271b2a9a6e9f750c69c685c8811cf68..5e37d368594b6ac0e5a459cf80c5bd0f7ac4d77b 100644 (file)
 #include <plat/cpu-freq-core.h>
 
 static struct cpufreq_frequency_table pll_vals_12MHz[] = {
-    { .frequency = 34000000,  .index = PLLVAL(82, 2, 3),   },
-    { .frequency = 45000000,  .index = PLLVAL(82, 1, 3),   },
-    { .frequency = 51000000,  .index = PLLVAL(161, 3, 3),  },
-    { .frequency = 48000000,  .index = PLLVAL(120, 2, 3),  },
-    { .frequency = 56000000,  .index = PLLVAL(142, 2, 3),  },
-    { .frequency = 68000000,  .index = PLLVAL(82, 2, 2),   },
-    { .frequency = 79000000,  .index = PLLVAL(71, 1, 2),   },
-    { .frequency = 85000000,  .index = PLLVAL(105, 2, 2),  },
-    { .frequency = 90000000,  .index = PLLVAL(112, 2, 2),  },
-    { .frequency = 101000000, .index = PLLVAL(127, 2, 2),  },
-    { .frequency = 113000000, .index = PLLVAL(105, 1, 2),  },
-    { .frequency = 118000000, .index = PLLVAL(150, 2, 2),  },
-    { .frequency = 124000000, .index = PLLVAL(116, 1, 2),  },
-    { .frequency = 135000000, .index = PLLVAL(82, 2, 1),   },
-    { .frequency = 147000000, .index = PLLVAL(90, 2, 1),   },
-    { .frequency = 152000000, .index = PLLVAL(68, 1, 1),   },
-    { .frequency = 158000000, .index = PLLVAL(71, 1, 1),   },
-    { .frequency = 170000000, .index = PLLVAL(77, 1, 1),   },
-    { .frequency = 180000000, .index = PLLVAL(82, 1, 1),   },
-    { .frequency = 186000000, .index = PLLVAL(85, 1, 1),   },
-    { .frequency = 192000000, .index = PLLVAL(88, 1, 1),   },
-    { .frequency = 203000000, .index = PLLVAL(161, 3, 1),  },
+    { .frequency = 34000000,  .driver_data = PLLVAL(82, 2, 3),   },
+    { .frequency = 45000000,  .driver_data = PLLVAL(82, 1, 3),   },
+    { .frequency = 51000000,  .driver_data = PLLVAL(161, 3, 3),  },
+    { .frequency = 48000000,  .driver_data = PLLVAL(120, 2, 3),  },
+    { .frequency = 56000000,  .driver_data = PLLVAL(142, 2, 3),  },
+    { .frequency = 68000000,  .driver_data = PLLVAL(82, 2, 2),   },
+    { .frequency = 79000000,  .driver_data = PLLVAL(71, 1, 2),   },
+    { .frequency = 85000000,  .driver_data = PLLVAL(105, 2, 2),  },
+    { .frequency = 90000000,  .driver_data = PLLVAL(112, 2, 2),  },
+    { .frequency = 101000000, .driver_data = PLLVAL(127, 2, 2),  },
+    { .frequency = 113000000, .driver_data = PLLVAL(105, 1, 2),  },
+    { .frequency = 118000000, .driver_data = PLLVAL(150, 2, 2),  },
+    { .frequency = 124000000, .driver_data = PLLVAL(116, 1, 2),  },
+    { .frequency = 135000000, .driver_data = PLLVAL(82, 2, 1),   },
+    { .frequency = 147000000, .driver_data = PLLVAL(90, 2, 1),   },
+    { .frequency = 152000000, .driver_data = PLLVAL(68, 1, 1),   },
+    { .frequency = 158000000, .driver_data = PLLVAL(71, 1, 1),   },
+    { .frequency = 170000000, .driver_data = PLLVAL(77, 1, 1),   },
+    { .frequency = 180000000, .driver_data = PLLVAL(82, 1, 1),   },
+    { .frequency = 186000000, .driver_data = PLLVAL(85, 1, 1),   },
+    { .frequency = 192000000, .driver_data = PLLVAL(88, 1, 1),   },
+    { .frequency = 203000000, .driver_data = PLLVAL(161, 3, 1),  },
 
     /* 2410A extras */
 
-    { .frequency = 210000000, .index = PLLVAL(132, 2, 1),  },
-    { .frequency = 226000000, .index = PLLVAL(105, 1, 1),  },
-    { .frequency = 266000000, .index = PLLVAL(125, 1, 1),  },
-    { .frequency = 268000000, .index = PLLVAL(126, 1, 1),  },
-    { .frequency = 270000000, .index = PLLVAL(127, 1, 1),  },
+    { .frequency = 210000000, .driver_data = PLLVAL(132, 2, 1),  },
+    { .frequency = 226000000, .driver_data = PLLVAL(105, 1, 1),  },
+    { .frequency = 266000000, .driver_data = PLLVAL(125, 1, 1),  },
+    { .frequency = 268000000, .driver_data = PLLVAL(126, 1, 1),  },
+    { .frequency = 270000000, .driver_data = PLLVAL(127, 1, 1),  },
 };
 
 static int s3c2410_plls_add(struct device *dev, struct subsys_interface *sif)
index 67378175831943ad4f8a45053674a79c40d75968..a19460e6e7b0ec9317e8db98ed9aea2cf6290421 100644 (file)
 #include <plat/cpu-freq-core.h>
 
 static struct cpufreq_frequency_table s3c2440_plls_12[] __initdata = {
-       { .frequency = 75000000,        .index = PLLVAL(0x75, 3, 3),  },        /* FVco 600.000000 */
-       { .frequency = 80000000,        .index = PLLVAL(0x98, 4, 3),  },        /* FVco 640.000000 */
-       { .frequency = 90000000,        .index = PLLVAL(0x70, 2, 3),  },        /* FVco 720.000000 */
-       { .frequency = 100000000,       .index = PLLVAL(0x5c, 1, 3),  },        /* FVco 800.000000 */
-       { .frequency = 110000000,       .index = PLLVAL(0x66, 1, 3),  },        /* FVco 880.000000 */
-       { .frequency = 120000000,       .index = PLLVAL(0x70, 1, 3),  },        /* FVco 960.000000 */
-       { .frequency = 150000000,       .index = PLLVAL(0x75, 3, 2),  },        /* FVco 600.000000 */
-       { .frequency = 160000000,       .index = PLLVAL(0x98, 4, 2),  },        /* FVco 640.000000 */
-       { .frequency = 170000000,       .index = PLLVAL(0x4d, 1, 2),  },        /* FVco 680.000000 */
-       { .frequency = 180000000,       .index = PLLVAL(0x70, 2, 2),  },        /* FVco 720.000000 */
-       { .frequency = 190000000,       .index = PLLVAL(0x57, 1, 2),  },        /* FVco 760.000000 */
-       { .frequency = 200000000,       .index = PLLVAL(0x5c, 1, 2),  },        /* FVco 800.000000 */
-       { .frequency = 210000000,       .index = PLLVAL(0x84, 2, 2),  },        /* FVco 840.000000 */
-       { .frequency = 220000000,       .index = PLLVAL(0x66, 1, 2),  },        /* FVco 880.000000 */
-       { .frequency = 230000000,       .index = PLLVAL(0x6b, 1, 2),  },        /* FVco 920.000000 */
-       { .frequency = 240000000,       .index = PLLVAL(0x70, 1, 2),  },        /* FVco 960.000000 */
-       { .frequency = 300000000,       .index = PLLVAL(0x75, 3, 1),  },        /* FVco 600.000000 */
-       { .frequency = 310000000,       .index = PLLVAL(0x93, 4, 1),  },        /* FVco 620.000000 */
-       { .frequency = 320000000,       .index = PLLVAL(0x98, 4, 1),  },        /* FVco 640.000000 */
-       { .frequency = 330000000,       .index = PLLVAL(0x66, 2, 1),  },        /* FVco 660.000000 */
-       { .frequency = 340000000,       .index = PLLVAL(0x4d, 1, 1),  },        /* FVco 680.000000 */
-       { .frequency = 350000000,       .index = PLLVAL(0xa7, 4, 1),  },        /* FVco 700.000000 */
-       { .frequency = 360000000,       .index = PLLVAL(0x70, 2, 1),  },        /* FVco 720.000000 */
-       { .frequency = 370000000,       .index = PLLVAL(0xb1, 4, 1),  },        /* FVco 740.000000 */
-       { .frequency = 380000000,       .index = PLLVAL(0x57, 1, 1),  },        /* FVco 760.000000 */
-       { .frequency = 390000000,       .index = PLLVAL(0x7a, 2, 1),  },        /* FVco 780.000000 */
-       { .frequency = 400000000,       .index = PLLVAL(0x5c, 1, 1),  },        /* FVco 800.000000 */
+       { .frequency = 75000000,        .driver_data = PLLVAL(0x75, 3, 3),  },  /* FVco 600.000000 */
+       { .frequency = 80000000,        .driver_data = PLLVAL(0x98, 4, 3),  },  /* FVco 640.000000 */
+       { .frequency = 90000000,        .driver_data = PLLVAL(0x70, 2, 3),  },  /* FVco 720.000000 */
+       { .frequency = 100000000,       .driver_data = PLLVAL(0x5c, 1, 3),  },  /* FVco 800.000000 */
+       { .frequency = 110000000,       .driver_data = PLLVAL(0x66, 1, 3),  },  /* FVco 880.000000 */
+       { .frequency = 120000000,       .driver_data = PLLVAL(0x70, 1, 3),  },  /* FVco 960.000000 */
+       { .frequency = 150000000,       .driver_data = PLLVAL(0x75, 3, 2),  },  /* FVco 600.000000 */
+       { .frequency = 160000000,       .driver_data = PLLVAL(0x98, 4, 2),  },  /* FVco 640.000000 */
+       { .frequency = 170000000,       .driver_data = PLLVAL(0x4d, 1, 2),  },  /* FVco 680.000000 */
+       { .frequency = 180000000,       .driver_data = PLLVAL(0x70, 2, 2),  },  /* FVco 720.000000 */
+       { .frequency = 190000000,       .driver_data = PLLVAL(0x57, 1, 2),  },  /* FVco 760.000000 */
+       { .frequency = 200000000,       .driver_data = PLLVAL(0x5c, 1, 2),  },  /* FVco 800.000000 */
+       { .frequency = 210000000,       .driver_data = PLLVAL(0x84, 2, 2),  },  /* FVco 840.000000 */
+       { .frequency = 220000000,       .driver_data = PLLVAL(0x66, 1, 2),  },  /* FVco 880.000000 */
+       { .frequency = 230000000,       .driver_data = PLLVAL(0x6b, 1, 2),  },  /* FVco 920.000000 */
+       { .frequency = 240000000,       .driver_data = PLLVAL(0x70, 1, 2),  },  /* FVco 960.000000 */
+       { .frequency = 300000000,       .driver_data = PLLVAL(0x75, 3, 1),  },  /* FVco 600.000000 */
+       { .frequency = 310000000,       .driver_data = PLLVAL(0x93, 4, 1),  },  /* FVco 620.000000 */
+       { .frequency = 320000000,       .driver_data = PLLVAL(0x98, 4, 1),  },  /* FVco 640.000000 */
+       { .frequency = 330000000,       .driver_data = PLLVAL(0x66, 2, 1),  },  /* FVco 660.000000 */
+       { .frequency = 340000000,       .driver_data = PLLVAL(0x4d, 1, 1),  },  /* FVco 680.000000 */
+       { .frequency = 350000000,       .driver_data = PLLVAL(0xa7, 4, 1),  },  /* FVco 700.000000 */
+       { .frequency = 360000000,       .driver_data = PLLVAL(0x70, 2, 1),  },  /* FVco 720.000000 */
+       { .frequency = 370000000,       .driver_data = PLLVAL(0xb1, 4, 1),  },  /* FVco 740.000000 */
+       { .frequency = 380000000,       .driver_data = PLLVAL(0x57, 1, 1),  },  /* FVco 760.000000 */
+       { .frequency = 390000000,       .driver_data = PLLVAL(0x7a, 2, 1),  },  /* FVco 780.000000 */
+       { .frequency = 400000000,       .driver_data = PLLVAL(0x5c, 1, 1),  },  /* FVco 800.000000 */
 };
 
 static int s3c2440_plls12_add(struct device *dev, struct subsys_interface *sif)
index debfa106289bb1f1df3a9e44db8929202f9258c5..1191b29056252e49eee5cc041e0757247dab1bdf 100644 (file)
 #include <plat/cpu-freq-core.h>
 
 static struct cpufreq_frequency_table s3c2440_plls_169344[] __initdata = {
-       { .frequency = 78019200,        .index = PLLVAL(121, 5, 3),     },      /* FVco 624.153600 */
-       { .frequency = 84067200,        .index = PLLVAL(131, 5, 3),     },      /* FVco 672.537600 */
-       { .frequency = 90115200,        .index = PLLVAL(141, 5, 3),     },      /* FVco 720.921600 */
-       { .frequency = 96163200,        .index = PLLVAL(151, 5, 3),     },      /* FVco 769.305600 */
-       { .frequency = 102135600,       .index = PLLVAL(185, 6, 3),     },      /* FVco 817.084800 */
-       { .frequency = 108259200,       .index = PLLVAL(171, 5, 3),     },      /* FVco 866.073600 */
-       { .frequency = 114307200,       .index = PLLVAL(127, 3, 3),     },      /* FVco 914.457600 */
-       { .frequency = 120234240,       .index = PLLVAL(134, 3, 3),     },      /* FVco 961.873920 */
-       { .frequency = 126161280,       .index = PLLVAL(141, 3, 3),     },      /* FVco 1009.290240 */
-       { .frequency = 132088320,       .index = PLLVAL(148, 3, 3),     },      /* FVco 1056.706560 */
-       { .frequency = 138015360,       .index = PLLVAL(155, 3, 3),     },      /* FVco 1104.122880 */
-       { .frequency = 144789120,       .index = PLLVAL(163, 3, 3),     },      /* FVco 1158.312960 */
-       { .frequency = 150100363,       .index = PLLVAL(187, 9, 2),     },      /* FVco 600.401454 */
-       { .frequency = 156038400,       .index = PLLVAL(121, 5, 2),     },      /* FVco 624.153600 */
-       { .frequency = 162086400,       .index = PLLVAL(126, 5, 2),     },      /* FVco 648.345600 */
-       { .frequency = 168134400,       .index = PLLVAL(131, 5, 2),     },      /* FVco 672.537600 */
-       { .frequency = 174048000,       .index = PLLVAL(177, 7, 2),     },      /* FVco 696.192000 */
-       { .frequency = 180230400,       .index = PLLVAL(141, 5, 2),     },      /* FVco 720.921600 */
-       { .frequency = 186278400,       .index = PLLVAL(124, 4, 2),     },      /* FVco 745.113600 */
-       { .frequency = 192326400,       .index = PLLVAL(151, 5, 2),     },      /* FVco 769.305600 */
-       { .frequency = 198132480,       .index = PLLVAL(109, 3, 2),     },      /* FVco 792.529920 */
-       { .frequency = 204271200,       .index = PLLVAL(185, 6, 2),     },      /* FVco 817.084800 */
-       { .frequency = 210268800,       .index = PLLVAL(141, 4, 2),     },      /* FVco 841.075200 */
-       { .frequency = 216518400,       .index = PLLVAL(171, 5, 2),     },      /* FVco 866.073600 */
-       { .frequency = 222264000,       .index = PLLVAL(97, 2, 2),      },      /* FVco 889.056000 */
-       { .frequency = 228614400,       .index = PLLVAL(127, 3, 2),     },      /* FVco 914.457600 */
-       { .frequency = 234259200,       .index = PLLVAL(158, 4, 2),     },      /* FVco 937.036800 */
-       { .frequency = 240468480,       .index = PLLVAL(134, 3, 2),     },      /* FVco 961.873920 */
-       { .frequency = 246960000,       .index = PLLVAL(167, 4, 2),     },      /* FVco 987.840000 */
-       { .frequency = 252322560,       .index = PLLVAL(141, 3, 2),     },      /* FVco 1009.290240 */
-       { .frequency = 258249600,       .index = PLLVAL(114, 2, 2),     },      /* FVco 1032.998400 */
-       { .frequency = 264176640,       .index = PLLVAL(148, 3, 2),     },      /* FVco 1056.706560 */
-       { .frequency = 270950400,       .index = PLLVAL(120, 2, 2),     },      /* FVco 1083.801600 */
-       { .frequency = 276030720,       .index = PLLVAL(155, 3, 2),     },      /* FVco 1104.122880 */
-       { .frequency = 282240000,       .index = PLLVAL(92, 1, 2),      },      /* FVco 1128.960000 */
-       { .frequency = 289578240,       .index = PLLVAL(163, 3, 2),     },      /* FVco 1158.312960 */
-       { .frequency = 294235200,       .index = PLLVAL(131, 2, 2),     },      /* FVco 1176.940800 */
-       { .frequency = 300200727,       .index = PLLVAL(187, 9, 1),     },      /* FVco 600.401454 */
-       { .frequency = 306358690,       .index = PLLVAL(191, 9, 1),     },      /* FVco 612.717380 */
-       { .frequency = 312076800,       .index = PLLVAL(121, 5, 1),     },      /* FVco 624.153600 */
-       { .frequency = 318366720,       .index = PLLVAL(86, 3, 1),      },      /* FVco 636.733440 */
-       { .frequency = 324172800,       .index = PLLVAL(126, 5, 1),     },      /* FVco 648.345600 */
-       { .frequency = 330220800,       .index = PLLVAL(109, 4, 1),     },      /* FVco 660.441600 */
-       { .frequency = 336268800,       .index = PLLVAL(131, 5, 1),     },      /* FVco 672.537600 */
-       { .frequency = 342074880,       .index = PLLVAL(93, 3, 1),      },      /* FVco 684.149760 */
-       { .frequency = 348096000,       .index = PLLVAL(177, 7, 1),     },      /* FVco 696.192000 */
-       { .frequency = 355622400,       .index = PLLVAL(118, 4, 1),     },      /* FVco 711.244800 */
-       { .frequency = 360460800,       .index = PLLVAL(141, 5, 1),     },      /* FVco 720.921600 */
-       { .frequency = 366206400,       .index = PLLVAL(165, 6, 1),     },      /* FVco 732.412800 */
-       { .frequency = 372556800,       .index = PLLVAL(124, 4, 1),     },      /* FVco 745.113600 */
-       { .frequency = 378201600,       .index = PLLVAL(126, 4, 1),     },      /* FVco 756.403200 */
-       { .frequency = 384652800,       .index = PLLVAL(151, 5, 1),     },      /* FVco 769.305600 */
-       { .frequency = 391608000,       .index = PLLVAL(177, 6, 1),     },      /* FVco 783.216000 */
-       { .frequency = 396264960,       .index = PLLVAL(109, 3, 1),     },      /* FVco 792.529920 */
-       { .frequency = 402192000,       .index = PLLVAL(87, 2, 1),      },      /* FVco 804.384000 */
+       { .frequency = 78019200,        .driver_data = PLLVAL(121, 5, 3),       },      /* FVco 624.153600 */
+       { .frequency = 84067200,        .driver_data = PLLVAL(131, 5, 3),       },      /* FVco 672.537600 */
+       { .frequency = 90115200,        .driver_data = PLLVAL(141, 5, 3),       },      /* FVco 720.921600 */
+       { .frequency = 96163200,        .driver_data = PLLVAL(151, 5, 3),       },      /* FVco 769.305600 */
+       { .frequency = 102135600,       .driver_data = PLLVAL(185, 6, 3),       },      /* FVco 817.084800 */
+       { .frequency = 108259200,       .driver_data = PLLVAL(171, 5, 3),       },      /* FVco 866.073600 */
+       { .frequency = 114307200,       .driver_data = PLLVAL(127, 3, 3),       },      /* FVco 914.457600 */
+       { .frequency = 120234240,       .driver_data = PLLVAL(134, 3, 3),       },      /* FVco 961.873920 */
+       { .frequency = 126161280,       .driver_data = PLLVAL(141, 3, 3),       },      /* FVco 1009.290240 */
+       { .frequency = 132088320,       .driver_data = PLLVAL(148, 3, 3),       },      /* FVco 1056.706560 */
+       { .frequency = 138015360,       .driver_data = PLLVAL(155, 3, 3),       },      /* FVco 1104.122880 */
+       { .frequency = 144789120,       .driver_data = PLLVAL(163, 3, 3),       },      /* FVco 1158.312960 */
+       { .frequency = 150100363,       .driver_data = PLLVAL(187, 9, 2),       },      /* FVco 600.401454 */
+       { .frequency = 156038400,       .driver_data = PLLVAL(121, 5, 2),       },      /* FVco 624.153600 */
+       { .frequency = 162086400,       .driver_data = PLLVAL(126, 5, 2),       },      /* FVco 648.345600 */
+       { .frequency = 168134400,       .driver_data = PLLVAL(131, 5, 2),       },      /* FVco 672.537600 */
+       { .frequency = 174048000,       .driver_data = PLLVAL(177, 7, 2),       },      /* FVco 696.192000 */
+       { .frequency = 180230400,       .driver_data = PLLVAL(141, 5, 2),       },      /* FVco 720.921600 */
+       { .frequency = 186278400,       .driver_data = PLLVAL(124, 4, 2),       },      /* FVco 745.113600 */
+       { .frequency = 192326400,       .driver_data = PLLVAL(151, 5, 2),       },      /* FVco 769.305600 */
+       { .frequency = 198132480,       .driver_data = PLLVAL(109, 3, 2),       },      /* FVco 792.529920 */
+       { .frequency = 204271200,       .driver_data = PLLVAL(185, 6, 2),       },      /* FVco 817.084800 */
+       { .frequency = 210268800,       .driver_data = PLLVAL(141, 4, 2),       },      /* FVco 841.075200 */
+       { .frequency = 216518400,       .driver_data = PLLVAL(171, 5, 2),       },      /* FVco 866.073600 */
+       { .frequency = 222264000,       .driver_data = PLLVAL(97, 2, 2),        },      /* FVco 889.056000 */
+       { .frequency = 228614400,       .driver_data = PLLVAL(127, 3, 2),       },      /* FVco 914.457600 */
+       { .frequency = 234259200,       .driver_data = PLLVAL(158, 4, 2),       },      /* FVco 937.036800 */
+       { .frequency = 240468480,       .driver_data = PLLVAL(134, 3, 2),       },      /* FVco 961.873920 */
+       { .frequency = 246960000,       .driver_data = PLLVAL(167, 4, 2),       },      /* FVco 987.840000 */
+       { .frequency = 252322560,       .driver_data = PLLVAL(141, 3, 2),       },      /* FVco 1009.290240 */
+       { .frequency = 258249600,       .driver_data = PLLVAL(114, 2, 2),       },      /* FVco 1032.998400 */
+       { .frequency = 264176640,       .driver_data = PLLVAL(148, 3, 2),       },      /* FVco 1056.706560 */
+       { .frequency = 270950400,       .driver_data = PLLVAL(120, 2, 2),       },      /* FVco 1083.801600 */
+       { .frequency = 276030720,       .driver_data = PLLVAL(155, 3, 2),       },      /* FVco 1104.122880 */
+       { .frequency = 282240000,       .driver_data = PLLVAL(92, 1, 2),        },      /* FVco 1128.960000 */
+       { .frequency = 289578240,       .driver_data = PLLVAL(163, 3, 2),       },      /* FVco 1158.312960 */
+       { .frequency = 294235200,       .driver_data = PLLVAL(131, 2, 2),       },      /* FVco 1176.940800 */
+       { .frequency = 300200727,       .driver_data = PLLVAL(187, 9, 1),       },      /* FVco 600.401454 */
+       { .frequency = 306358690,       .driver_data = PLLVAL(191, 9, 1),       },      /* FVco 612.717380 */
+       { .frequency = 312076800,       .driver_data = PLLVAL(121, 5, 1),       },      /* FVco 624.153600 */
+       { .frequency = 318366720,       .driver_data = PLLVAL(86, 3, 1),        },      /* FVco 636.733440 */
+       { .frequency = 324172800,       .driver_data = PLLVAL(126, 5, 1),       },      /* FVco 648.345600 */
+       { .frequency = 330220800,       .driver_data = PLLVAL(109, 4, 1),       },      /* FVco 660.441600 */
+       { .frequency = 336268800,       .driver_data = PLLVAL(131, 5, 1),       },      /* FVco 672.537600 */
+       { .frequency = 342074880,       .driver_data = PLLVAL(93, 3, 1),        },      /* FVco 684.149760 */
+       { .frequency = 348096000,       .driver_data = PLLVAL(177, 7, 1),       },      /* FVco 696.192000 */
+       { .frequency = 355622400,       .driver_data = PLLVAL(118, 4, 1),       },      /* FVco 711.244800 */
+       { .frequency = 360460800,       .driver_data = PLLVAL(141, 5, 1),       },      /* FVco 720.921600 */
+       { .frequency = 366206400,       .driver_data = PLLVAL(165, 6, 1),       },      /* FVco 732.412800 */
+       { .frequency = 372556800,       .driver_data = PLLVAL(124, 4, 1),       },      /* FVco 745.113600 */
+       { .frequency = 378201600,       .driver_data = PLLVAL(126, 4, 1),       },      /* FVco 756.403200 */
+       { .frequency = 384652800,       .driver_data = PLLVAL(151, 5, 1),       },      /* FVco 769.305600 */
+       { .frequency = 391608000,       .driver_data = PLLVAL(177, 6, 1),       },      /* FVco 783.216000 */
+       { .frequency = 396264960,       .driver_data = PLLVAL(109, 3, 1),       },      /* FVco 792.529920 */
+       { .frequency = 402192000,       .driver_data = PLLVAL(87, 2, 1),        },      /* FVco 804.384000 */
 };
 
 static int s3c2440_plls169344_add(struct device *dev,
index 7e105932c09d709f53a734f8633dcfde2b6a6efe..5390c6bbbc02dd389852ba519118ddaab2222a37 100644 (file)
@@ -142,15 +142,15 @@ static void pllc2_table_rebuild(struct clk *clk)
        /* Initialise PLLC2 frequency table */
        for (i = 0; i < ARRAY_SIZE(pllc2_freq_table) - 2; i++) {
                pllc2_freq_table[i].frequency = clk->parent->rate * (i + 20) * 2;
-               pllc2_freq_table[i].index = i;
+               pllc2_freq_table[i].driver_data = i;
        }
 
        /* This is a special entry - switching PLL off makes it a repeater */
        pllc2_freq_table[i].frequency = clk->parent->rate;
-       pllc2_freq_table[i].index = i;
+       pllc2_freq_table[i].driver_data = i;
 
        pllc2_freq_table[++i].frequency = CPUFREQ_TABLE_END;
-       pllc2_freq_table[i].index = i;
+       pllc2_freq_table[i].driver_data = i;
 }
 
 static unsigned long pllc2_recalc(struct clk *clk)
index 84d72fc36dfea1434431cb0b98a388f4b178e667..5c0db065baa411f56722e17409968eb25b027aac 100644 (file)
@@ -28,7 +28,6 @@ config ARCH_TEGRA_2x_SOC
        select ARM_ERRATA_754327 if SMP
        select ARM_ERRATA_764369 if SMP
        select ARM_GIC
-       select CPU_FREQ_TABLE if CPU_FREQ
        select CPU_V7
        select PINCTRL
        select PINCTRL_TEGRA20
@@ -46,7 +45,6 @@ config ARCH_TEGRA_3x_SOC
        select ARM_ERRATA_754322
        select ARM_ERRATA_764369 if SMP
        select ARM_GIC
-       select CPU_FREQ_TABLE if CPU_FREQ
        select CPU_V7
        select PINCTRL
        select PINCTRL_TEGRA30
@@ -63,7 +61,6 @@ config ARCH_TEGRA_114_SOC
        select ARM_ARCH_TIMER
        select ARM_GIC
        select ARM_L1_CACHE_SHIFT_6
-       select CPU_FREQ_TABLE if CPU_FREQ
        select CPU_V7
        select PINCTRL
        select PINCTRL_TEGRA114
index 95509d8eb140fda1367658d048660790253b35d5..a8a760ddfae1c0216f8da907fcc255b420fce3dc 100644 (file)
@@ -285,7 +285,7 @@ static inline int s3c_cpufreq_addfreq(struct cpufreq_frequency_table *table,
                s3c_freq_dbg("%s: { %d = %u kHz }\n",
                             __func__, index, freq);
 
-               table[index].index = index;
+               table[index].driver_data = index;
                table[index].frequency = freq;
        }
 
index 8769a9045a543995c137f02f9bfc92bf3ce0da36..5f7530cc9a279a133f1f17a278c5fb53fb39f43b 100644 (file)
@@ -134,11 +134,13 @@ config SVINTO_SIM
 
 config ETRAXFS
        bool "ETRAX-FS-V32"
+       select CPU_FREQ_TABLE if CPU_FREQ
        help
          Support CRIS V32.
 
 config CRIS_MACH_ARTPEC3
         bool "ARTPEC-3"
+       select CPU_FREQ_TABLE if CPU_FREQ
         help
           Support Axis ARTPEC-3.
 
index bc739d4bab2eee62c2860b777415dffc80a83f4a..4dc2f5fa3f6737f940103216558b2310867f4e7e 100644 (file)
@@ -121,7 +121,8 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
        clk->rate = rate;
 
        regval = LOONGSON_CHIPCFG0;
-       regval = (regval & ~0x7) | (loongson2_clockmod_table[i].index - 1);
+       regval = (regval & ~0x7) |
+               (loongson2_clockmod_table[i].driver_data - 1);
        LOONGSON_CHIPCFG0 = regval;
 
        return ret;
index b62aab3e22ecd0447caf0db7ff97c2c16bc12644..e17cdfc5ba40bf0b10283dfbf7e66a7a92eebb28 100644 (file)
@@ -193,37 +193,6 @@ config PPC_IO_WORKAROUNDS
 
 source "drivers/cpufreq/Kconfig"
 
-menu "CPU Frequency drivers"
-       depends on CPU_FREQ
-
-config CPU_FREQ_PMAC
-       bool "Support for Apple PowerBooks"
-       depends on ADB_PMU && PPC32
-       select CPU_FREQ_TABLE
-       help
-         This adds support for frequency switching on Apple PowerBooks,
-         this currently includes some models of iBook & Titanium
-         PowerBook.
-
-config CPU_FREQ_PMAC64
-       bool "Support for some Apple G5s"
-       depends on PPC_PMAC && PPC64
-       select CPU_FREQ_TABLE
-       help
-         This adds support for frequency switching on Apple iMac G5,
-         and some of the more recent desktop G5 machines as well.
-
-config PPC_PASEMI_CPUFREQ
-       bool "Support for PA Semi PWRficient"
-       depends on PPC_PASEMI
-       default y
-       select CPU_FREQ_TABLE
-       help
-         This adds the support for frequency switching on PA Semi
-         PWRficient processors.
-
-endmenu
-
 menu "CPUIdle driver"
 
 source "drivers/cpuidle/Kconfig"
index ce6d789e0741c8785ba7e213ad007b8de3428fb1..8e8d4cae5ebe731ff5b1c45723ec11ba4c13c68f 100644 (file)
@@ -1,3 +1,2 @@
 obj-y  += setup.o pci.o time.o idle.o powersave.o iommu.o dma_lib.o misc.o
 obj-$(CONFIG_PPC_PASEMI_MDIO)  += gpio_mdio.o
-obj-$(CONFIG_PPC_PASEMI_CPUFREQ) += cpufreq.o
index ea47df66fee5235588061efb08d5e2a6be685f4e..52c6ce1cc985ba33c93a9afc35572b5dc9457d8c 100644 (file)
@@ -9,8 +9,6 @@ obj-y                           += pic.o setup.o time.o feature.o pci.o \
                                   sleep.o low_i2c.o cache.o pfunc_core.o \
                                   pfunc_base.o udbg_scc.o udbg_adb.o
 obj-$(CONFIG_PMAC_BACKLIGHT)   += backlight.o
-obj-$(CONFIG_CPU_FREQ_PMAC)    += cpufreq_32.o
-obj-$(CONFIG_CPU_FREQ_PMAC64)  += cpufreq_64.o
 # CONFIG_NVRAM is an arch. independent tristate symbol, for pmac32 we really
 # need this to be a bool.  Cheat here and pretend CONFIG_NVRAM=m is really
 # CONFIG_NVRAM=y
index f0077cb8e249e5f0fac3ef302d9a1ded177a479b..c8ec186303db29308f1091db8d5a2bcff01dc53c 100644 (file)
@@ -648,14 +648,14 @@ int opp_init_cpufreq_table(struct device *dev,
 
        list_for_each_entry(opp, &dev_opp->opp_list, node) {
                if (opp->available) {
-                       freq_table[i].index = i;
+                       freq_table[i].driver_data = i;
                        freq_table[i].frequency = opp->rate / 1000;
                        i++;
                }
        }
        mutex_unlock(&dev_opp_list_lock);
 
-       freq_table[i].index = i;
+       freq_table[i].driver_data = i;
        freq_table[i].frequency = CPUFREQ_TABLE_END;
 
        *table = &freq_table[0];
index 6e57543fe0b981e55cfdd9623c5eb1ed910ffd8c..fee9f489269a2564aafeeee32ba3b0b2d22db983 100644 (file)
@@ -5,6 +5,7 @@
 config ARM_BIG_LITTLE_CPUFREQ
        tristate "Generic ARM big LITTLE CPUfreq driver"
        depends on ARM_CPU_TOPOLOGY && PM_OPP && HAVE_CLK
+       select CPU_FREQ_TABLE
        help
          This enables the Generic CPUfreq driver for ARM big.LITTLE platforms.
 
@@ -18,6 +19,7 @@ config ARM_DT_BL_CPUFREQ
 config ARM_EXYNOS_CPUFREQ
        bool "SAMSUNG EXYNOS SoCs"
        depends on ARCH_EXYNOS
+       select CPU_FREQ_TABLE
        default y
        help
          This adds the CPUFreq driver common part for Samsung
@@ -46,6 +48,7 @@ config ARM_EXYNOS5250_CPUFREQ
 config ARM_EXYNOS5440_CPUFREQ
        def_bool SOC_EXYNOS5440
        depends on HAVE_CLK && PM_OPP && OF
+       select CPU_FREQ_TABLE
        help
          This adds the CPUFreq driver for Samsung EXYNOS5440
          SoC. The nature of exynos5440 clock controller is
@@ -55,7 +58,6 @@ config ARM_EXYNOS5440_CPUFREQ
 config ARM_HIGHBANK_CPUFREQ
        tristate "Calxeda Highbank-based"
        depends on ARCH_HIGHBANK
-       select CPU_FREQ_TABLE
        select GENERIC_CPUFREQ_CPU0
        select PM_OPP
        select REGULATOR
@@ -71,6 +73,7 @@ config ARM_IMX6Q_CPUFREQ
        tristate "Freescale i.MX6Q cpufreq support"
        depends on SOC_IMX6Q
        depends on REGULATOR_ANATOP
+       select CPU_FREQ_TABLE
        help
          This adds cpufreq driver support for Freescale i.MX6Q SOC.
 
@@ -86,6 +89,7 @@ config ARM_INTEGRATOR
 
 config ARM_KIRKWOOD_CPUFREQ
        def_bool ARCH_KIRKWOOD && OF
+       select CPU_FREQ_TABLE
        help
          This adds the CPUFreq driver for Marvell Kirkwood
          SoCs.
@@ -99,6 +103,7 @@ config ARM_OMAP2PLUS_CPUFREQ
 config ARM_S3C2416_CPUFREQ
        bool "S3C2416 CPU Frequency scaling support"
        depends on CPU_S3C2416
+       select CPU_FREQ_TABLE
        help
          This adds the CPUFreq driver for the Samsung S3C2416 and
          S3C2450 SoC. The S3C2416 supports changing the rate of the
@@ -121,6 +126,7 @@ config ARM_S3C2416_CPUFREQ_VCORESCALE
 config ARM_S3C64XX_CPUFREQ
        bool "Samsung S3C64XX"
        depends on CPU_S3C6410
+       select CPU_FREQ_TABLE
        default y
        help
          This adds the CPUFreq driver for Samsung S3C6410 SoC.
@@ -147,6 +153,15 @@ config ARM_SA1110_CPUFREQ
 config ARM_SPEAR_CPUFREQ
        bool "SPEAr CPUFreq support"
        depends on PLAT_SPEAR
+       select CPU_FREQ_TABLE
        default y
        help
          This adds the CPUFreq driver support for SPEAr SOCs.
+
+config ARM_TEGRA_CPUFREQ
+       bool "TEGRA CPUFreq support"
+       depends on ARCH_TEGRA
+       select CPU_FREQ_TABLE
+       default y
+       help
+         This adds the CPUFreq driver support for TEGRA SOCs.
index 9c926ca0d718020b048b1efc09b0b55c7b1efe2f..25ca9db62e090d6b49e20d6744c3cd4027a16bfb 100644 (file)
@@ -1,6 +1,7 @@
 config CPU_FREQ_CBE
        tristate "CBE frequency scaling"
        depends on CBE_RAS && PPC_CELL
+       select CPU_FREQ_TABLE
        default m
        help
          This adds the cpufreq driver for Cell BE processors.
@@ -23,3 +24,39 @@ config CPU_FREQ_MAPLE
        help
          This adds support for frequency switching on Maple 970FX
          Evaluation Board and compatible boards (IBM JS2x blades).
+
+config PPC_CORENET_CPUFREQ
+       tristate "CPU frequency scaling driver for Freescale E500MC SoCs"
+       depends on PPC_E500MC && OF && COMMON_CLK
+       select CPU_FREQ_TABLE
+       select CLK_PPC_CORENET
+       help
+         This adds the CPUFreq driver support for Freescale e500mc,
+         e5500 and e6500 series SoCs which are capable of changing
+         the CPU's frequency dynamically.
+
+config CPU_FREQ_PMAC
+       bool "Support for Apple PowerBooks"
+       depends on ADB_PMU && PPC32
+       select CPU_FREQ_TABLE
+       help
+         This adds support for frequency switching on Apple PowerBooks,
+         this currently includes some models of iBook & Titanium
+         PowerBook.
+
+config CPU_FREQ_PMAC64
+       bool "Support for some Apple G5s"
+       depends on PPC_PMAC && PPC64
+       select CPU_FREQ_TABLE
+       help
+         This adds support for frequency switching on Apple iMac G5,
+         and some of the more recent desktop G5 machines as well.
+
+config PPC_PASEMI_CPUFREQ
+       bool "Support for PA Semi PWRficient"
+       depends on PPC_PASEMI
+       select CPU_FREQ_TABLE
+       default y
+       help
+         This adds the support for frequency switching on PA Semi
+         PWRficient processors.
index 6bd63d63d356ba0f2fc731e65824409cee9bf158..e2b6eabef2218d4e1e392ed523b3451553e196cb 100644 (file)
@@ -132,6 +132,7 @@ config X86_POWERNOW_K8
 config X86_AMD_FREQ_SENSITIVITY
        tristate "AMD frequency sensitivity feedback powersave bias"
        depends on CPU_FREQ_GOV_ONDEMAND && X86_ACPI_CPUFREQ && CPU_SUP_AMD
+       select CPU_FREQ_TABLE
        help
          This adds AMD-specific powersave bias function to the ondemand
          governor, which allows it to make more power-conscious frequency
index 315b9231feb17f00d52fd4374f47c3bd9b6d57c4..0c8d0c69306d68c29913caaafe70f4816c5310e3 100644 (file)
@@ -71,7 +71,7 @@ obj-$(CONFIG_ARM_S5PV210_CPUFREQ)     += s5pv210-cpufreq.o
 obj-$(CONFIG_ARM_SA1100_CPUFREQ)       += sa1100-cpufreq.o
 obj-$(CONFIG_ARM_SA1110_CPUFREQ)       += sa1110-cpufreq.o
 obj-$(CONFIG_ARM_SPEAR_CPUFREQ)                += spear-cpufreq.o
-obj-$(CONFIG_ARCH_TEGRA)               += tegra-cpufreq.o
+obj-$(CONFIG_ARM_TEGRA_CPUFREQ)                += tegra-cpufreq.o
 
 ##################################################################################
 # PowerPC platform drivers
@@ -79,11 +79,15 @@ obj-$(CONFIG_CPU_FREQ_CBE)          += ppc-cbe-cpufreq.o
 ppc-cbe-cpufreq-y                      += ppc_cbe_cpufreq_pervasive.o ppc_cbe_cpufreq.o
 obj-$(CONFIG_CPU_FREQ_CBE_PMI)         += ppc_cbe_cpufreq_pmi.o
 obj-$(CONFIG_CPU_FREQ_MAPLE)           += maple-cpufreq.o
+obj-$(CONFIG_PPC_CORENET_CPUFREQ)   += ppc-corenet-cpufreq.o
+obj-$(CONFIG_CPU_FREQ_PMAC)            += pmac32-cpufreq.o
+obj-$(CONFIG_CPU_FREQ_PMAC64)          += pmac64-cpufreq.o
+obj-$(CONFIG_PPC_PASEMI_CPUFREQ)       += pasemi-cpufreq.o
 
 ##################################################################################
 # Other platform drivers
 obj-$(CONFIG_AVR32_AT32AP_CPUFREQ)     += at32ap-cpufreq.o
-obj-$(CONFIG_BLACKFIN)                 += blackfin-cpufreq.o
+obj-$(CONFIG_BFIN_CPU_FREQ)            += blackfin-cpufreq.o
 obj-$(CONFIG_CRIS_MACH_ARTPEC3)                += cris-artpec3-cpufreq.o
 obj-$(CONFIG_ETRAXFS)                  += cris-etraxfs-cpufreq.o
 obj-$(CONFIG_IA64_ACPI_CPUFREQ)                += ia64-acpi-cpufreq.o
index b8efacf01d694cb50a07115cc0a79a57d638c3e4..f4fef0acc1838e6505d3ccf8f29dc73977ce2ece 100644 (file)
@@ -232,7 +232,7 @@ static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data)
        perf = data->acpi_data;
 
        for (i = 0; data->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
-               if (msr == perf->states[data->freq_table[i].index].status)
+               if (msr == perf->states[data->freq_table[i].driver_data].status)
                        return data->freq_table[i].frequency;
        }
        return data->freq_table[0].frequency;
@@ -442,7 +442,7 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
                goto out;
        }
 
-       next_perf_state = data->freq_table[next_state].index;
+       next_perf_state = data->freq_table[next_state].driver_data;
        if (perf->state == next_perf_state) {
                if (unlikely(data->resume)) {
                        pr_debug("Called after resume, resetting to P%d\n",
@@ -494,12 +494,14 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
                        pr_debug("acpi_cpufreq_target failed (%d)\n",
                                policy->cpu);
                        result = -EAGAIN;
-                       goto out;
+                       freqs.new = freqs.old;
                }
        }
 
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
-       perf->state = next_perf_state;
+
+       if (!result)
+               perf->state = next_perf_state;
 
 out:
        return result;
@@ -811,7 +813,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
                    data->freq_table[valid_states-1].frequency / 1000)
                        continue;
 
-               data->freq_table[valid_states].index = i;
+               data->freq_table[valid_states].driver_data = i;
                data->freq_table[valid_states].frequency =
                    perf->states[i].core_frequency * 1000;
                valid_states++;
@@ -947,7 +949,7 @@ static void __init acpi_cpufreq_boost_init(void)
        /* We create the boost file in any case, though for systems without
         * hardware support it will be read-only and hardwired to return 0.
         */
-       if (sysfs_create_file(cpufreq_global_kobject, &(global_boost.attr)))
+       if (cpufreq_sysfs_create_file(&(global_boost.attr)))
                pr_warn(PFX "could not register global boost sysfs file\n");
        else
                pr_debug("registered global boost sysfs file\n");
@@ -955,7 +957,7 @@ static void __init acpi_cpufreq_boost_init(void)
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-       sysfs_remove_file(cpufreq_global_kobject, &(global_boost.attr));
+       cpufreq_sysfs_remove_file(&(global_boost.attr));
 
        if (msrs) {
                unregister_cpu_notifier(&boost_nb);
index 5d7f53fcd6f5eac052d4a0bfed4d48f531921d8c..3549f0784af176d07ee17dd60d02ec85859d6bd1 100644 (file)
@@ -84,11 +84,9 @@ static int bL_cpufreq_set_target(struct cpufreq_policy *policy,
        ret = clk_set_rate(clk[cur_cluster], freqs.new * 1000);
        if (ret) {
                pr_err("clk_set_rate failed: %d\n", ret);
-               return ret;
+               freqs.new = freqs.old;
        }
 
-       policy->cur = freqs.new;
-
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 
        return ret;
index 995511e80bef6d012b5fe0c4a7319db324dbd9c6..9cdbbd278a800da1587eae1fdb6314d23d0a9b9d 100644 (file)
 
 
 /* this is the table of CCLK frequencies, in Hz */
-/* .index is the entry in the auxiliary dpm_state_table[] */
+/* .driver_data is the entry in the auxiliary dpm_state_table[] */
 static struct cpufreq_frequency_table bfin_freq_table[] = {
        {
                .frequency = CPUFREQ_TABLE_END,
-               .index = 0,
+               .driver_data = 0,
        },
        {
                .frequency = CPUFREQ_TABLE_END,
-               .index = 1,
+               .driver_data = 1,
        },
        {
                .frequency = CPUFREQ_TABLE_END,
-               .index = 2,
+               .driver_data = 2,
        },
        {
                .frequency = CPUFREQ_TABLE_END,
-               .index = 0,
+               .driver_data = 0,
        },
 };
 
index 2d53f47d1747360b8968c7c308c0f975777ef9ab..d976e222f10fb3f50143963a435638257bb314f4 100644 (file)
@@ -3,6 +3,7 @@
  *
  *  Copyright (C) 2001 Russell King
  *            (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
+ *            (C) 2013 Viresh Kumar <viresh.kumar@linaro.org>
  *
  *  Oct 2005 - Ashok Raj <ashok.raj@intel.com>
  *     Added handling for CPU hotplug
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
- *
  */
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <asm/cputime.h>
 #include <linux/kernel.h>
+#include <linux/kernel_stat.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/notifier.h>
@@ -25,6 +27,7 @@
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/spinlock.h>
+#include <linux/tick.h>
 #include <linux/device.h>
 #include <linux/slab.h>
 #include <linux/cpu.h>
  */
 static struct cpufreq_driver *cpufreq_driver;
 static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
+static DEFINE_RWLOCK(cpufreq_driver_lock);
+static DEFINE_MUTEX(cpufreq_governor_lock);
+
 #ifdef CONFIG_HOTPLUG_CPU
 /* This one keeps track of the previously set governor of a removed CPU */
 static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
 #endif
-static DEFINE_RWLOCK(cpufreq_driver_lock);
 
 /*
  * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
@@ -132,6 +137,51 @@ bool have_governor_per_policy(void)
 {
        return cpufreq_driver->have_governor_per_policy;
 }
+EXPORT_SYMBOL_GPL(have_governor_per_policy);
+
+struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy)
+{
+       if (have_governor_per_policy())
+               return &policy->kobj;
+       else
+               return cpufreq_global_kobject;
+}
+EXPORT_SYMBOL_GPL(get_governor_parent_kobj);
+
+static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
+{
+       u64 idle_time;
+       u64 cur_wall_time;
+       u64 busy_time;
+
+       cur_wall_time = jiffies64_to_cputime64(get_jiffies_64());
+
+       busy_time = kcpustat_cpu(cpu).cpustat[CPUTIME_USER];
+       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];
+       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];
+       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];
+       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
+       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];
+
+       idle_time = cur_wall_time - busy_time;
+       if (wall)
+               *wall = cputime_to_usecs(cur_wall_time);
+
+       return cputime_to_usecs(idle_time);
+}
+
+u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy)
+{
+       u64 idle_time = get_cpu_idle_time_us(cpu, io_busy ? wall : NULL);
+
+       if (idle_time == -1ULL)
+               return get_cpu_idle_time_jiffy(cpu, wall);
+       else if (!io_busy)
+               idle_time += get_cpu_iowait_time_us(cpu, wall);
+
+       return idle_time;
+}
+EXPORT_SYMBOL_GPL(get_cpu_idle_time);
 
 static struct cpufreq_policy *__cpufreq_cpu_get(unsigned int cpu, bool sysfs)
 {
@@ -150,7 +200,6 @@ static struct cpufreq_policy *__cpufreq_cpu_get(unsigned int cpu, bool sysfs)
        if (!try_module_get(cpufreq_driver->owner))
                goto err_out_unlock;
 
-
        /* get the CPU */
        data = per_cpu(cpufreq_cpu_data, cpu);
 
@@ -220,7 +269,7 @@ static void cpufreq_cpu_put_sysfs(struct cpufreq_policy *data)
  */
 #ifndef CONFIG_SMP
 static unsigned long l_p_j_ref;
-static unsigned int  l_p_j_ref_freq;
+static unsigned int l_p_j_ref_freq;
 
 static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
 {
@@ -233,7 +282,7 @@ static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
                pr_debug("saving %lu as reference value for loops_per_jiffy; "
                        "freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
        }
-       if ((val == CPUFREQ_POSTCHANGE  && ci->old != ci->new) ||
+       if ((val == CPUFREQ_POSTCHANGE && ci->old != ci->new) ||
            (val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
                loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq,
                                                                ci->new);
@@ -248,8 +297,7 @@ static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
 }
 #endif
 
-
-void __cpufreq_notify_transition(struct cpufreq_policy *policy,
+static void __cpufreq_notify_transition(struct cpufreq_policy *policy,
                struct cpufreq_freqs *freqs, unsigned int state)
 {
        BUG_ON(irqs_disabled());
@@ -294,6 +342,7 @@ void __cpufreq_notify_transition(struct cpufreq_policy *policy,
                break;
        }
 }
+
 /**
  * cpufreq_notify_transition - call notifier chain and adjust_jiffies
  * on frequency transition.
@@ -311,7 +360,6 @@ void cpufreq_notify_transition(struct cpufreq_policy *policy,
 EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 
 
-
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
@@ -376,7 +424,6 @@ out:
        return err;
 }
 
-
 /**
  * cpufreq_per_cpu_attr_read() / show_##file_name() -
  * print out cpufreq information
@@ -441,7 +488,6 @@ static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy,
        return sprintf(buf, "%u\n", cur_freq);
 }
 
-
 /**
  * show_scaling_governor - show the current policy for the specified CPU
  */
@@ -457,7 +503,6 @@ static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)
        return -EINVAL;
 }
 
-
 /**
  * store_scaling_governor - store policy for the specified CPU
  */
@@ -480,8 +525,10 @@ static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
                                                &new_policy.governor))
                return -EINVAL;
 
-       /* Do not use cpufreq_set_policy here or the user_policy.max
-          will be wrongly overridden */
+       /*
+        * Do not use cpufreq_set_policy here or the user_policy.max
+        * will be wrongly overridden
+        */
        ret = __cpufreq_set_policy(policy, &new_policy);
 
        policy->user_policy.policy = policy->policy;
@@ -630,9 +677,6 @@ static struct attribute *default_attrs[] = {
        NULL
 };
 
-struct kobject *cpufreq_global_kobject;
-EXPORT_SYMBOL(cpufreq_global_kobject);
-
 #define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
 #define to_attr(a) container_of(a, struct freq_attr, attr)
 
@@ -703,6 +747,49 @@ static struct kobj_type ktype_cpufreq = {
        .release        = cpufreq_sysfs_release,
 };
 
+struct kobject *cpufreq_global_kobject;
+EXPORT_SYMBOL(cpufreq_global_kobject);
+
+static int cpufreq_global_kobject_usage;
+
+int cpufreq_get_global_kobject(void)
+{
+       if (!cpufreq_global_kobject_usage++)
+               return kobject_add(cpufreq_global_kobject,
+                               &cpu_subsys.dev_root->kobj, "%s", "cpufreq");
+
+       return 0;
+}
+EXPORT_SYMBOL(cpufreq_get_global_kobject);
+
+void cpufreq_put_global_kobject(void)
+{
+       if (!--cpufreq_global_kobject_usage)
+               kobject_del(cpufreq_global_kobject);
+}
+EXPORT_SYMBOL(cpufreq_put_global_kobject);
+
+int cpufreq_sysfs_create_file(const struct attribute *attr)
+{
+       int ret = cpufreq_get_global_kobject();
+
+       if (!ret) {
+               ret = sysfs_create_file(cpufreq_global_kobject, attr);
+               if (ret)
+                       cpufreq_put_global_kobject();
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(cpufreq_sysfs_create_file);
+
+void cpufreq_sysfs_remove_file(const struct attribute *attr)
+{
+       sysfs_remove_file(cpufreq_global_kobject, attr);
+       cpufreq_put_global_kobject();
+}
+EXPORT_SYMBOL(cpufreq_sysfs_remove_file);
+
 /* symlink affected CPUs */
 static int cpufreq_add_dev_symlink(unsigned int cpu,
                                   struct cpufreq_policy *policy)
@@ -1005,7 +1092,8 @@ static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)
  * Caller should already have policy_rwsem in write mode for this CPU.
  * This routine frees the rwsem before returning.
  */
-static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
+static int __cpufreq_remove_dev(struct device *dev,
+               struct subsys_interface *sif)
 {
        unsigned int cpu = dev->id, ret, cpus;
        unsigned long flags;
@@ -1112,7 +1200,6 @@ static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif
        return 0;
 }
 
-
 static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
 {
        unsigned int cpu = dev->id;
@@ -1125,7 +1212,6 @@ static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
        return retval;
 }
 
-
 static void handle_update(struct work_struct *work)
 {
        struct cpufreq_policy *policy =
@@ -1136,7 +1222,8 @@ static void handle_update(struct work_struct *work)
 }
 
 /**
- *     cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're in deep trouble.
+ *     cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're
+ *     in deep trouble.
  *     @cpu: cpu number
  *     @old_freq: CPU frequency the kernel thinks the CPU runs at
  *     @new_freq: CPU frequency the CPU actually runs at
@@ -1151,7 +1238,6 @@ static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
        struct cpufreq_freqs freqs;
        unsigned long flags;
 
-
        pr_debug("Warning: CPU frequency out of sync: cpufreq and timing "
               "core thinks of %u, is %u kHz.\n", old_freq, new_freq);
 
@@ -1166,7 +1252,6 @@ static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 }
 
-
 /**
  * cpufreq_quick_get - get the CPU frequency (in kHz) from policy->cur
  * @cpu: CPU number
@@ -1212,7 +1297,6 @@ unsigned int cpufreq_quick_get_max(unsigned int cpu)
 }
 EXPORT_SYMBOL(cpufreq_quick_get_max);
 
-
 static unsigned int __cpufreq_get(unsigned int cpu)
 {
        struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
@@ -1271,7 +1355,6 @@ static struct subsys_interface cpufreq_interface = {
        .remove_dev     = cpufreq_remove_dev,
 };
 
-
 /**
  * cpufreq_bp_suspend - Prepare the boot CPU for system suspend.
  *
@@ -1408,11 +1491,10 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
 }
 EXPORT_SYMBOL(cpufreq_register_notifier);
 
-
 /**
  *     cpufreq_unregister_notifier - unregister a driver with cpufreq
  *     @nb: notifier block to be unregistered
- *      @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
+ *     @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
  *
  *     Remove a driver from the CPU frequency notifier list.
  *
@@ -1448,7 +1530,6 @@ EXPORT_SYMBOL(cpufreq_unregister_notifier);
  *                              GOVERNORS                            *
  *********************************************************************/
 
-
 int __cpufreq_driver_target(struct cpufreq_policy *policy,
                            unsigned int target_freq,
                            unsigned int relation)
@@ -1484,10 +1565,6 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
 {
        int ret = -EINVAL;
 
-       policy = cpufreq_cpu_get(policy->cpu);
-       if (!policy)
-               goto no_policy;
-
        if (unlikely(lock_policy_rwsem_write(policy->cpu)))
                goto fail;
 
@@ -1496,30 +1573,19 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
        unlock_policy_rwsem_write(policy->cpu);
 
 fail:
-       cpufreq_cpu_put(policy);
-no_policy:
        return ret;
 }
 EXPORT_SYMBOL_GPL(cpufreq_driver_target);
 
 int __cpufreq_driver_getavg(struct cpufreq_policy *policy, unsigned int cpu)
 {
-       int ret = 0;
-
        if (cpufreq_disabled())
-               return ret;
+               return 0;
 
        if (!cpufreq_driver->getavg)
                return 0;
 
-       policy = cpufreq_cpu_get(policy->cpu);
-       if (!policy)
-               return -EINVAL;
-
-       ret = cpufreq_driver->getavg(policy, cpu);
-
-       cpufreq_cpu_put(policy);
-       return ret;
+       return cpufreq_driver->getavg(policy, cpu);
 }
 EXPORT_SYMBOL_GPL(__cpufreq_driver_getavg);
 
@@ -1562,6 +1628,21 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
 
        pr_debug("__cpufreq_governor for CPU %u, event %u\n",
                                                policy->cpu, event);
+
+       mutex_lock(&cpufreq_governor_lock);
+       if ((!policy->governor_enabled && (event == CPUFREQ_GOV_STOP)) ||
+           (policy->governor_enabled && (event == CPUFREQ_GOV_START))) {
+               mutex_unlock(&cpufreq_governor_lock);
+               return -EBUSY;
+       }
+
+       if (event == CPUFREQ_GOV_STOP)
+               policy->governor_enabled = false;
+       else if (event == CPUFREQ_GOV_START)
+               policy->governor_enabled = true;
+
+       mutex_unlock(&cpufreq_governor_lock);
+
        ret = policy->governor->governor(policy, event);
 
        if (!ret) {
@@ -1569,6 +1650,14 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
                        policy->governor->initialized++;
                else if (event == CPUFREQ_GOV_POLICY_EXIT)
                        policy->governor->initialized--;
+       } else {
+               /* Restore original values */
+               mutex_lock(&cpufreq_governor_lock);
+               if (event == CPUFREQ_GOV_STOP)
+                       policy->governor_enabled = true;
+               else if (event == CPUFREQ_GOV_START)
+                       policy->governor_enabled = false;
+               mutex_unlock(&cpufreq_governor_lock);
        }
 
        /* we keep one module reference alive for
@@ -1581,7 +1670,6 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
        return ret;
 }
 
-
 int cpufreq_register_governor(struct cpufreq_governor *governor)
 {
        int err;
@@ -1606,7 +1694,6 @@ int cpufreq_register_governor(struct cpufreq_governor *governor)
 }
 EXPORT_SYMBOL_GPL(cpufreq_register_governor);
 
-
 void cpufreq_unregister_governor(struct cpufreq_governor *governor)
 {
 #ifdef CONFIG_HOTPLUG_CPU
@@ -1636,7 +1723,6 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor)
 EXPORT_SYMBOL_GPL(cpufreq_unregister_governor);
 
 
-
 /*********************************************************************
  *                          POLICY INTERFACE                         *
  *********************************************************************/
@@ -1665,7 +1751,6 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
 }
 EXPORT_SYMBOL(cpufreq_get_policy);
 
-
 /*
  * data   : current policy.
  * policy : policy to be set.
@@ -1699,8 +1784,10 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data,
        blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
                        CPUFREQ_INCOMPATIBLE, policy);
 
-       /* verify the cpu speed can be set within this limit,
-          which might be different to the first one */
+       /*
+        * verify the cpu speed can be set within this limit, which might be
+        * different to the first one
+        */
        ret = cpufreq_driver->verify(policy);
        if (ret)
                goto error_out;
@@ -1802,8 +1889,10 @@ int cpufreq_update_policy(unsigned int cpu)
        policy.policy = data->user_policy.policy;
        policy.governor = data->user_policy.governor;
 
-       /* BIOS might change freq behind our back
-         -> ask driver for current freq and notify governors about a change */
+       /*
+        * BIOS might change freq behind our back
+        * -> ask driver for current freq and notify governors about a change
+        */
        if (cpufreq_driver->get) {
                policy.cur = cpufreq_driver->get(cpu);
                if (!data->cur) {
@@ -1852,7 +1941,7 @@ static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,
 }
 
 static struct notifier_block __refdata cpufreq_cpu_notifier = {
-    .notifier_call = cpufreq_cpu_callback,
+       .notifier_call = cpufreq_cpu_callback,
 };
 
 /*********************************************************************
@@ -1864,7 +1953,7 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
  * @driver_data: A struct cpufreq_driver containing the values#
  * submitted by the CPU Frequency driver.
  *
- *   Registers a CPU Frequency driver to this core code. This code
+ * Registers a CPU Frequency driver to this core code. This code
  * returns zero on success, -EBUSY when another driver got here first
  * (and isn't unregistered in the meantime).
  *
@@ -1931,11 +2020,10 @@ err_null_driver:
 }
 EXPORT_SYMBOL_GPL(cpufreq_register_driver);
 
-
 /**
  * cpufreq_unregister_driver - unregister the current CPUFreq driver
  *
- *    Unregister the current CPUFreq driver. Only call this if you have
+ * Unregister the current CPUFreq driver. Only call this if you have
  * the right to do so, i.e. if you have succeeded in initialising before!
  * Returns zero if successful, and -EINVAL if the cpufreq_driver is
  * currently not initialised.
@@ -1972,7 +2060,7 @@ static int __init cpufreq_core_init(void)
                init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
        }
 
-       cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj);
+       cpufreq_global_kobject = kobject_create();
        BUG_ON(!cpufreq_global_kobject);
        register_syscore_ops(&cpufreq_syscore_ops);
 
index dc9b72e25c1ab66c429fb65e9cb1d410ef4ee908..a849b2d499fa00abd99c186695555099abd941a5 100644 (file)
 #include <linux/kernel_stat.h>
 #include <linux/mutex.h>
 #include <linux/slab.h>
-#include <linux/tick.h>
 #include <linux/types.h>
 #include <linux/workqueue.h>
 #include <linux/cpu.h>
 
 #include "cpufreq_governor.h"
 
-static struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy)
-{
-       if (have_governor_per_policy())
-               return &policy->kobj;
-       else
-               return cpufreq_global_kobject;
-}
-
 static struct attribute_group *get_sysfs_attr(struct dbs_data *dbs_data)
 {
        if (have_governor_per_policy())
@@ -46,41 +37,6 @@ static struct attribute_group *get_sysfs_attr(struct dbs_data *dbs_data)
                return dbs_data->cdata->attr_group_gov_sys;
 }
 
-static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
-{
-       u64 idle_time;
-       u64 cur_wall_time;
-       u64 busy_time;
-
-       cur_wall_time = jiffies64_to_cputime64(get_jiffies_64());
-
-       busy_time = kcpustat_cpu(cpu).cpustat[CPUTIME_USER];
-       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];
-       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];
-       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];
-       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
-       busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];
-
-       idle_time = cur_wall_time - busy_time;
-       if (wall)
-               *wall = cputime_to_usecs(cur_wall_time);
-
-       return cputime_to_usecs(idle_time);
-}
-
-u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy)
-{
-       u64 idle_time = get_cpu_idle_time_us(cpu, io_busy ? wall : NULL);
-
-       if (idle_time == -1ULL)
-               return get_cpu_idle_time_jiffy(cpu, wall);
-       else if (!io_busy)
-               idle_time += get_cpu_iowait_time_us(cpu, wall);
-
-       return idle_time;
-}
-EXPORT_SYMBOL_GPL(get_cpu_idle_time);
-
 void dbs_check_cpu(struct dbs_data *dbs_data, int cpu)
 {
        struct cpu_dbs_common_info *cdbs = dbs_data->cdata->get_cpu_cdbs(cpu);
@@ -278,6 +234,9 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                        return rc;
                }
 
+               if (!have_governor_per_policy())
+                       WARN_ON(cpufreq_get_global_kobject());
+
                rc = sysfs_create_group(get_governor_parent_kobj(policy),
                                get_sysfs_attr(dbs_data));
                if (rc) {
@@ -316,6 +275,9 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                        sysfs_remove_group(get_governor_parent_kobj(policy),
                                        get_sysfs_attr(dbs_data));
 
+                       if (!have_governor_per_policy())
+                               cpufreq_put_global_kobject();
+
                        if ((dbs_data->cdata->governor == GOV_CONSERVATIVE) &&
                                (policy->governor->initialized == 1)) {
                                struct cs_ops *cs_ops = dbs_data->cdata->gov_ops;
index e16a96130cb3491d30f376728144cdca92e441cd..6663ec3b30565ac7efb6a7b5842e301ad2160bba 100644 (file)
@@ -81,7 +81,7 @@ static ssize_t show_##file_name##_gov_sys                             \
        return sprintf(buf, "%u\n", tuners->file_name);                 \
 }                                                                      \
                                                                        \
-static ssize_t show_##file_name##_gov_pol                                      \
+static ssize_t show_##file_name##_gov_pol                              \
 (struct cpufreq_policy *policy, char *buf)                             \
 {                                                                      \
        struct dbs_data *dbs_data = policy->governor_data;              \
@@ -91,7 +91,7 @@ static ssize_t show_##file_name##_gov_pol                                     \
 
 #define store_one(_gov, file_name)                                     \
 static ssize_t store_##file_name##_gov_sys                             \
-(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count)  \
+(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count) \
 {                                                                      \
        struct dbs_data *dbs_data = _gov##_dbs_cdata.gdbs_data;         \
        return store_##file_name(dbs_data, buf, count);                 \
@@ -256,7 +256,6 @@ static ssize_t show_sampling_rate_min_gov_pol                               \
        return sprintf(buf, "%u\n", dbs_data->min_sampling_rate);       \
 }
 
-u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy);
 void dbs_check_cpu(struct dbs_data *dbs_data, int cpu);
 bool need_load_eval(struct cpu_dbs_common_info *cdbs,
                unsigned int sampling_rate);
index ceee06849b9167bb63e423f2aee29ecba3751f57..9fef7d6e4e6a6f05a96e7b8153ecb0043e7a4f6e 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/cpufreq.h>
 #include <linux/init.h>
 
-
 static int cpufreq_governor_performance(struct cpufreq_policy *policy,
                                        unsigned int event)
 {
@@ -44,19 +43,16 @@ struct cpufreq_governor cpufreq_gov_performance = {
        .owner          = THIS_MODULE,
 };
 
-
 static int __init cpufreq_gov_performance_init(void)
 {
        return cpufreq_register_governor(&cpufreq_gov_performance);
 }
 
-
 static void __exit cpufreq_gov_performance_exit(void)
 {
        cpufreq_unregister_governor(&cpufreq_gov_performance);
 }
 
-
 MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>");
 MODULE_DESCRIPTION("CPUfreq policy governor 'performance'");
 MODULE_LICENSE("GPL");
index 2d948a1711551de4b1ad95b6fd5bbc455bccab36..32109a14f5dc04e0d99c89a8113428afa545bbb7 100644 (file)
@@ -1,7 +1,7 @@
 /*
- *  linux/drivers/cpufreq/cpufreq_powersave.c
+ * linux/drivers/cpufreq/cpufreq_powersave.c
  *
- *  Copyright (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
+ * Copyright (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
  *
  *
  * This program is free software; you can redistribute it and/or modify
@@ -48,13 +48,11 @@ static int __init cpufreq_gov_powersave_init(void)
        return cpufreq_register_governor(&cpufreq_gov_powersave);
 }
 
-
 static void __exit cpufreq_gov_powersave_exit(void)
 {
        cpufreq_unregister_governor(&cpufreq_gov_powersave);
 }
 
-
 MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>");
 MODULE_DESCRIPTION("CPUfreq policy governor 'powersave'");
 MODULE_LICENSE("GPL");
index fb65decffa28128ded8817441b2e5eff8ecad8e3..6d35caa911672306b9e0cdff1e008226f145dfa9 100644 (file)
@@ -27,7 +27,7 @@ static spinlock_t cpufreq_stats_lock;
 struct cpufreq_stats {
        unsigned int cpu;
        unsigned int total_trans;
-       unsigned long long  last_time;
+       unsigned long long last_time;
        unsigned int max_state;
        unsigned int state_num;
        unsigned int last_index;
@@ -116,7 +116,7 @@ static ssize_t show_trans_table(struct cpufreq_policy *policy, char *buf)
                len += snprintf(buf + len, PAGE_SIZE - len, "%9u: ",
                                stat->freq_table[i]);
 
-               for (j = 0; j < stat->state_num; j++)   {
+               for (j = 0; j < stat->state_num; j++) {
                        if (len >= PAGE_SIZE)
                                break;
                        len += snprintf(buf + len, PAGE_SIZE - len, "%9u ",
index bbeb9c0720a665ead5c76462d2f8882461f48e95..03078090b5f76e15d263f3a035f575f9e7901342 100644 (file)
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/smp.h>
-#include <linux/init.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
 #include <linux/cpufreq.h>
-#include <linux/cpu.h>
-#include <linux/types.h>
-#include <linux/fs.h>
-#include <linux/sysfs.h>
+#include <linux/init.h>
+#include <linux/module.h>
 #include <linux/mutex.h>
 
-/**
- * A few values needed by the userspace governor
- */
-static DEFINE_PER_CPU(unsigned int, cpu_max_freq);
-static DEFINE_PER_CPU(unsigned int, cpu_min_freq);
-static DEFINE_PER_CPU(unsigned int, cpu_cur_freq); /* current CPU freq */
-static DEFINE_PER_CPU(unsigned int, cpu_set_freq); /* CPU freq desired by
-                                                       userspace */
 static DEFINE_PER_CPU(unsigned int, cpu_is_managed);
-
 static DEFINE_MUTEX(userspace_mutex);
-static int cpus_using_userspace_governor;
-
-/* keep track of frequency transitions */
-static int
-userspace_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
-       void *data)
-{
-       struct cpufreq_freqs *freq = data;
-
-       if (!per_cpu(cpu_is_managed, freq->cpu))
-               return 0;
-
-       if (val == CPUFREQ_POSTCHANGE) {
-               pr_debug("saving cpu_cur_freq of cpu %u to be %u kHz\n",
-                               freq->cpu, freq->new);
-               per_cpu(cpu_cur_freq, freq->cpu) = freq->new;
-       }
-
-       return 0;
-}
-
-static struct notifier_block userspace_cpufreq_notifier_block = {
-       .notifier_call  = userspace_cpufreq_notifier
-};
-
 
 /**
  * cpufreq_set - set the CPU frequency
@@ -80,13 +38,6 @@ static int cpufreq_set(struct cpufreq_policy *policy, unsigned int freq)
        if (!per_cpu(cpu_is_managed, policy->cpu))
                goto err;
 
-       per_cpu(cpu_set_freq, policy->cpu) = freq;
-
-       if (freq < per_cpu(cpu_min_freq, policy->cpu))
-               freq = per_cpu(cpu_min_freq, policy->cpu);
-       if (freq > per_cpu(cpu_max_freq, policy->cpu))
-               freq = per_cpu(cpu_max_freq, policy->cpu);
-
        /*
         * We're safe from concurrent calls to ->target() here
         * as we hold the userspace_mutex lock. If we were calling
@@ -104,10 +55,9 @@ static int cpufreq_set(struct cpufreq_policy *policy, unsigned int freq)
        return ret;
 }
 
-
 static ssize_t show_speed(struct cpufreq_policy *policy, char *buf)
 {
-       return sprintf(buf, "%u\n", per_cpu(cpu_cur_freq, policy->cpu));
+       return sprintf(buf, "%u\n", policy->cur);
 }
 
 static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
@@ -119,73 +69,37 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
        switch (event) {
        case CPUFREQ_GOV_START:
                BUG_ON(!policy->cur);
-               mutex_lock(&userspace_mutex);
-
-               if (cpus_using_userspace_governor == 0) {
-                       cpufreq_register_notifier(
-                                       &userspace_cpufreq_notifier_block,
-                                       CPUFREQ_TRANSITION_NOTIFIER);
-               }
-               cpus_using_userspace_governor++;
+               pr_debug("started managing cpu %u\n", cpu);
 
+               mutex_lock(&userspace_mutex);
                per_cpu(cpu_is_managed, cpu) = 1;
-               per_cpu(cpu_min_freq, cpu) = policy->min;
-               per_cpu(cpu_max_freq, cpu) = policy->max;
-               per_cpu(cpu_cur_freq, cpu) = policy->cur;
-               per_cpu(cpu_set_freq, cpu) = policy->cur;
-               pr_debug("managing cpu %u started "
-                       "(%u - %u kHz, currently %u kHz)\n",
-                               cpu,
-                               per_cpu(cpu_min_freq, cpu),
-                               per_cpu(cpu_max_freq, cpu),
-                               per_cpu(cpu_cur_freq, cpu));
-
                mutex_unlock(&userspace_mutex);
                break;
        case CPUFREQ_GOV_STOP:
-               mutex_lock(&userspace_mutex);
-               cpus_using_userspace_governor--;
-               if (cpus_using_userspace_governor == 0) {
-                       cpufreq_unregister_notifier(
-                                       &userspace_cpufreq_notifier_block,
-                                       CPUFREQ_TRANSITION_NOTIFIER);
-               }
+               pr_debug("managing cpu %u stopped\n", cpu);
 
+               mutex_lock(&userspace_mutex);
                per_cpu(cpu_is_managed, cpu) = 0;
-               per_cpu(cpu_min_freq, cpu) = 0;
-               per_cpu(cpu_max_freq, cpu) = 0;
-               per_cpu(cpu_set_freq, cpu) = 0;
-               pr_debug("managing cpu %u stopped\n", cpu);
                mutex_unlock(&userspace_mutex);
                break;
        case CPUFREQ_GOV_LIMITS:
                mutex_lock(&userspace_mutex);
-               pr_debug("limit event for cpu %u: %u - %u kHz, "
-                       "currently %u kHz, last set to %u kHz\n",
+               pr_debug("limit event for cpu %u: %u - %u kHz, currently %u kHz\n",
                        cpu, policy->min, policy->max,
-                       per_cpu(cpu_cur_freq, cpu),
-                       per_cpu(cpu_set_freq, cpu));
-               if (policy->max < per_cpu(cpu_set_freq, cpu)) {
+                       policy->cur);
+
+               if (policy->max < policy->cur)
                        __cpufreq_driver_target(policy, policy->max,
                                                CPUFREQ_RELATION_H);
-               } else if (policy->min > per_cpu(cpu_set_freq, cpu)) {
+               else if (policy->min > policy->cur)
                        __cpufreq_driver_target(policy, policy->min,
                                                CPUFREQ_RELATION_L);
-               } else {
-                       __cpufreq_driver_target(policy,
-                                               per_cpu(cpu_set_freq, cpu),
-                                               CPUFREQ_RELATION_L);
-               }
-               per_cpu(cpu_min_freq, cpu) = policy->min;
-               per_cpu(cpu_max_freq, cpu) = policy->max;
-               per_cpu(cpu_cur_freq, cpu) = policy->cur;
                mutex_unlock(&userspace_mutex);
                break;
        }
        return rc;
 }
 
-
 #ifndef CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE
 static
 #endif
@@ -202,13 +116,11 @@ static int __init cpufreq_gov_userspace_init(void)
        return cpufreq_register_governor(&cpufreq_gov_userspace);
 }
 
-
 static void __exit cpufreq_gov_userspace_exit(void)
 {
        cpufreq_unregister_governor(&cpufreq_gov_userspace);
 }
 
-
 MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>, "
                "Russell King <rmk@arm.linux.org.uk>");
 MODULE_DESCRIPTION("CPUfreq policy governor 'userspace'");
index c33c76c360faa98c92e3232374609875e022c541..551dd655c6f2ac1d49fb1238ee20f38c213e3f36 100644 (file)
@@ -114,6 +114,9 @@ static int davinci_target(struct cpufreq_policy *policy,
                pdata->set_voltage(idx);
 
 out:
+       if (ret)
+               freqs.new = freqs.old;
+
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 
        return ret;
index 6ec6539ae0418895a4b54619e98eeac7d647159c..1fdb02b9f1ec84f221e8ba26dfeefd53105eb9a3 100644 (file)
@@ -57,13 +57,13 @@ static int dbx500_cpufreq_target(struct cpufreq_policy *policy,
        if (ret) {
                pr_err("dbx500-cpufreq: Failed to set armss_clk to %d Hz: error %d\n",
                       freqs.new * 1000, ret);
-               return ret;
+               freqs.new = freqs.old;
        }
 
        /* post change notification */
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 
-       return 0;
+       return ret;
 }
 
 static unsigned int dbx500_cpufreq_getspeed(unsigned int cpu)
index 37380fb92621c6606803237d10f4b9987efd6684..a60efaeb4cf8c17291ec97a0ba86bb383fe81d55 100644 (file)
@@ -161,6 +161,9 @@ postchange:
                current_multiplier);
        }
 #endif
+       if (err)
+               freqs.new = freqs.old;
+
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
        return err;
 }
@@ -188,7 +191,7 @@ static int eps_target(struct cpufreq_policy *policy,
        }
 
        /* Make frequency transition */
-       dest_state = centaur->freq_table[newstate].index & 0xffff;
+       dest_state = centaur->freq_table[newstate].driver_data & 0xffff;
        ret = eps_set_state(centaur, policy, dest_state);
        if (ret)
                printk(KERN_ERR "eps: Timeout!\n");
@@ -380,9 +383,9 @@ static int eps_cpu_init(struct cpufreq_policy *policy)
        f_table = &centaur->freq_table[0];
        if (brand != EPS_BRAND_C7M) {
                f_table[0].frequency = fsb * min_multiplier;
-               f_table[0].index = (min_multiplier << 8) | min_voltage;
+               f_table[0].driver_data = (min_multiplier << 8) | min_voltage;
                f_table[1].frequency = fsb * max_multiplier;
-               f_table[1].index = (max_multiplier << 8) | max_voltage;
+               f_table[1].driver_data = (max_multiplier << 8) | max_voltage;
                f_table[2].frequency = CPUFREQ_TABLE_END;
        } else {
                k = 0;
@@ -391,7 +394,7 @@ static int eps_cpu_init(struct cpufreq_policy *policy)
                for (i = min_multiplier; i <= max_multiplier; i++) {
                        voltage = (k * step) / 256 + min_voltage;
                        f_table[k].frequency = fsb * i;
-                       f_table[k].index = (i << 8) | voltage;
+                       f_table[k].driver_data = (i << 8) | voltage;
                        k++;
                }
                f_table[k].frequency = CPUFREQ_TABLE_END;
index 475b4f607f0d10c469e3f2352625d3273ade0376..0d32f02ef4d644e5ec915b9205fd5fdf929b30b0 100644 (file)
@@ -113,7 +113,8 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
                if (ret) {
                        pr_err("%s: failed to set cpu voltage to %d\n",
                                __func__, arm_volt);
-                       goto out;
+                       freqs.new = freqs.old;
+                       goto post_notify;
                }
        }
 
@@ -123,14 +124,19 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
                if (ret) {
                        pr_err("%s: failed to set cpu voltage to %d\n",
                                __func__, safe_arm_volt);
-                       goto out;
+                       freqs.new = freqs.old;
+                       goto post_notify;
                }
        }
 
        exynos_info->set_freq(old_index, index);
 
+post_notify:
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 
+       if (ret)
+               goto out;
+
        /* When the new frequency is lower than current frequency */
        if ((freqs.new < freqs.old) ||
           ((freqs.new > freqs.old) && safe_arm_volt)) {
index d7a79662e24c44bdb4c31c18530217b85255a019..f0d87412cc91742a73fa40a500b160387af9fb28 100644 (file)
@@ -34,8 +34,8 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
                        continue;
                }
-               pr_debug("table entry %u: %u kHz, %u index\n",
-                                       i, freq, table[i].index);
+               pr_debug("table entry %u: %u kHz, %u driver_data\n",
+                                       i, freq, table[i].driver_data);
                if (freq < min_freq)
                        min_freq = freq;
                if (freq > max_freq)
@@ -97,11 +97,11 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
                                   unsigned int *index)
 {
        struct cpufreq_frequency_table optimal = {
-               .index = ~0,
+               .driver_data = ~0,
                .frequency = 0,
        };
        struct cpufreq_frequency_table suboptimal = {
-               .index = ~0,
+               .driver_data = ~0,
                .frequency = 0,
        };
        unsigned int i;
@@ -129,12 +129,12 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
                        if (freq <= target_freq) {
                                if (freq >= optimal.frequency) {
                                        optimal.frequency = freq;
-                                       optimal.index = i;
+                                       optimal.driver_data = i;
                                }
                        } else {
                                if (freq <= suboptimal.frequency) {
                                        suboptimal.frequency = freq;
-                                       suboptimal.index = i;
+                                       suboptimal.driver_data = i;
                                }
                        }
                        break;
@@ -142,26 +142,26 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
                        if (freq >= target_freq) {
                                if (freq <= optimal.frequency) {
                                        optimal.frequency = freq;
-                                       optimal.index = i;
+                                       optimal.driver_data = i;
                                }
                        } else {
                                if (freq >= suboptimal.frequency) {
                                        suboptimal.frequency = freq;
-                                       suboptimal.index = i;
+                                       suboptimal.driver_data = i;
                                }
                        }
                        break;
                }
        }
-       if (optimal.index > i) {
-               if (suboptimal.index > i)
+       if (optimal.driver_data > i) {
+               if (suboptimal.driver_data > i)
                        return -EINVAL;
-               *index = suboptimal.index;
+               *index = suboptimal.driver_data;
        } else
-               *index = optimal.index;
+               *index = optimal.driver_data;
 
        pr_debug("target is %u (%u kHz, %u)\n", *index, table[*index].frequency,
-               table[*index].index);
+               table[*index].driver_data);
 
        return 0;
 }
index c0075dbaa6336a2ad92d1138dce15ef4ab6cb66f..573c14ea802df7690f0e57ff3d8764b46305e51c 100644 (file)
@@ -326,7 +326,7 @@ acpi_cpufreq_cpu_init (
        /* table init */
        for (i = 0; i <= data->acpi_data.state_count; i++)
        {
-               data->freq_table[i].index = i;
+               data->freq_table[i].driver_data = i;
                if (i < data->acpi_data.state_count) {
                        data->freq_table[i].frequency =
                              data->acpi_data.states[i].core_frequency * 1000;
index b78bc35973ba33f74cf795e67ba8eda00b069cc5..e37cdaedbb5b39b244e3aa6caec947721297999d 100644 (file)
@@ -68,8 +68,6 @@ static int imx6q_set_target(struct cpufreq_policy *policy,
        if (freqs.old == freqs.new)
                return 0;
 
-       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
-
        rcu_read_lock();
        opp = opp_find_freq_ceil(cpu_dev, &freq_hz);
        if (IS_ERR(opp)) {
@@ -86,13 +84,16 @@ static int imx6q_set_target(struct cpufreq_policy *policy,
                freqs.old / 1000, volt_old / 1000,
                freqs.new / 1000, volt / 1000);
 
+       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
+
        /* scaling up?  scale voltage before frequency */
        if (freqs.new > freqs.old) {
                ret = regulator_set_voltage_tol(arm_reg, volt, 0);
                if (ret) {
                        dev_err(cpu_dev,
                                "failed to scale vddarm up: %d\n", ret);
-                       return ret;
+                       freqs.new = freqs.old;
+                       goto post_notify;
                }
 
                /*
@@ -145,15 +146,18 @@ static int imx6q_set_target(struct cpufreq_policy *policy,
        if (ret) {
                dev_err(cpu_dev, "failed to set clock rate: %d\n", ret);
                regulator_set_voltage_tol(arm_reg, volt_old, 0);
-               return ret;
+               freqs.new = freqs.old;
+               goto post_notify;
        }
 
        /* scaling down?  scale voltage after frequency */
        if (freqs.new < freqs.old) {
                ret = regulator_set_voltage_tol(arm_reg, volt, 0);
-               if (ret)
+               if (ret) {
                        dev_warn(cpu_dev,
                                 "failed to scale vddarm down: %d\n", ret);
+                       ret = 0;
+               }
 
                if (freqs.old == FREQ_1P2_GHZ / 1000) {
                        regulator_set_voltage_tol(pu_reg,
@@ -163,9 +167,10 @@ static int imx6q_set_target(struct cpufreq_policy *policy,
                }
        }
 
+post_notify:
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 
-       return 0;
+       return ret;
 }
 
 static int imx6q_cpufreq_init(struct cpufreq_policy *policy)
index b2644af985ec8e741daf009262069694c671513b..c233ea617366fad2c7e4a3ed1b2bc0a7f500fda1 100644 (file)
@@ -59,7 +59,7 @@ static void kirkwood_cpufreq_set_cpu_state(struct cpufreq_policy *policy,
                unsigned int index)
 {
        struct cpufreq_freqs freqs;
-       unsigned int state = kirkwood_freq_table[index].index;
+       unsigned int state = kirkwood_freq_table[index].driver_data;
        unsigned long reg;
 
        freqs.old = kirkwood_cpufreq_get_cpu_frequency(0);
index b448638e34de0df1183a07d6b3d1e089f87e9b95..b6a0a7a406b06bf415de8e07f5d3730560d41ba0 100644 (file)
@@ -254,7 +254,7 @@ static void longhaul_setstate(struct cpufreq_policy *policy,
        u32 bm_timeout = 1000;
        unsigned int dir = 0;
 
-       mults_index = longhaul_table[table_index].index;
+       mults_index = longhaul_table[table_index].driver_data;
        /* Safety precautions */
        mult = mults[mults_index & 0x1f];
        if (mult == -1)
@@ -487,7 +487,7 @@ static int __cpuinit longhaul_get_ranges(void)
                if (ratio > maxmult || ratio < minmult)
                        continue;
                longhaul_table[k].frequency = calc_speed(ratio);
-               longhaul_table[k].index = j;
+               longhaul_table[k].driver_data   = j;
                k++;
        }
        if (k <= 1) {
@@ -508,8 +508,8 @@ static int __cpuinit longhaul_get_ranges(void)
                if (min_i != j) {
                        swap(longhaul_table[j].frequency,
                             longhaul_table[min_i].frequency);
-                       swap(longhaul_table[j].index,
-                            longhaul_table[min_i].index);
+                       swap(longhaul_table[j].driver_data,
+                            longhaul_table[min_i].driver_data);
                }
        }
 
@@ -517,7 +517,7 @@ static int __cpuinit longhaul_get_ranges(void)
 
        /* Find index we are running on */
        for (j = 0; j < k; j++) {
-               if (mults[longhaul_table[j].index & 0x1f] == mult) {
+               if (mults[longhaul_table[j].driver_data & 0x1f] == mult) {
                        longhaul_index = j;
                        break;
                }
@@ -613,7 +613,7 @@ static void __cpuinit longhaul_setup_voltagescaling(void)
                        pos = (speed - min_vid_speed) / kHz_step + minvid.pos;
                else
                        pos = minvid.pos;
-               longhaul_table[j].index |= mV_vrm_table[pos] << 8;
+               longhaul_table[j].driver_data |= mV_vrm_table[pos] << 8;
                vid = vrm_mV_table[mV_vrm_table[pos]];
                printk(KERN_INFO PFX "f: %d kHz, index: %d, vid: %d mV\n",
                                speed, j, vid.mV);
@@ -656,12 +656,12 @@ static int longhaul_target(struct cpufreq_policy *policy,
                 * this in hardware, C3 is old and we need to do this
                 * in software. */
                i = longhaul_index;
-               current_vid = (longhaul_table[longhaul_index].index >> 8);
+               current_vid = (longhaul_table[longhaul_index].driver_data >> 8);
                current_vid &= 0x1f;
                if (table_index > longhaul_index)
                        dir = 1;
                while (i != table_index) {
-                       vid = (longhaul_table[i].index >> 8) & 0x1f;
+                       vid = (longhaul_table[i].driver_data >> 8) & 0x1f;
                        if (vid != current_vid) {
                                longhaul_setstate(policy, i);
                                current_vid = vid;
index d53912768946b96c1c27b017dbaeb7a10e7c2feb..bb838b98507747a02ade005d99074a4c2a1d95a8 100644 (file)
@@ -72,7 +72,7 @@ static int loongson2_cpufreq_target(struct cpufreq_policy *policy,
 
        freq =
            ((cpu_clock_freq / 1000) *
-            loongson2_clockmod_table[newstate].index) / 8;
+            loongson2_clockmod_table[newstate].driver_data) / 8;
        if (freq < policy->min || freq > policy->max)
                return -EINVAL;
 
index 0279d18a57f96499bc3f67a5a9c4e8e0ce785081..29468a522ee9a799180b8cf18b178bb43d16acb7 100644 (file)
@@ -93,9 +93,6 @@ static int omap_target(struct cpufreq_policy *policy,
        if (freqs.old == freqs.new && policy->cur == freqs.new)
                return ret;
 
-       /* notifiers */
-       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
-
        freq = freqs.new * 1000;
        ret = clk_round_rate(mpu_clk, freq);
        if (IS_ERR_VALUE(ret)) {
@@ -125,6 +122,9 @@ static int omap_target(struct cpufreq_policy *policy,
                freqs.old / 1000, volt_old ? volt_old / 1000 : -1,
                freqs.new / 1000, volt ? volt / 1000 : -1);
 
+       /* notifiers */
+       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
+
        /* scaling up?  scale voltage before frequency */
        if (mpu_reg && (freqs.new > freqs.old)) {
                r = regulator_set_voltage(mpu_reg, volt - tol, volt + tol);
index 421ef37d0bb382dcfd1e35ad9e03d55880a7f808..9ee78170ff862a20cd7439e78d9ef0d71b542e77 100644 (file)
@@ -118,7 +118,7 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
                return -EINVAL;
 
        freqs.old = cpufreq_p4_get(policy->cpu);
-       freqs.new = stock_freq * p4clockmod_table[newstate].index / 8;
+       freqs.new = stock_freq * p4clockmod_table[newstate].driver_data / 8;
 
        if (freqs.new == freqs.old)
                return 0;
@@ -131,7 +131,7 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
         * Developer's Manual, Volume 3
         */
        for_each_cpu(i, policy->cpus)
-               cpufreq_p4_setdc(i, p4clockmod_table[newstate].index);
+               cpufreq_p4_setdc(i, p4clockmod_table[newstate].driver_data);
 
        /* notifiers */
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
similarity index 98%
rename from arch/powerpc/platforms/pasemi/cpufreq.c
rename to drivers/cpufreq/pasemi-cpufreq.c
index be1e7958909eac4079a4ec641fa231e2500707a4..b704da404067061a4acd831e78b63572b54afc8c 100644 (file)
@@ -204,7 +204,8 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
        /* initialize frequency table */
        for (i=0; pas_freqs[i].frequency!=CPUFREQ_TABLE_END; i++) {
-               pas_freqs[i].frequency = get_astate_freq(pas_freqs[i].index) * 100000;
+               pas_freqs[i].frequency =
+                       get_astate_freq(pas_freqs[i].driver_data) * 100000;
                pr_debug("%d: %d\n", i, pas_freqs[i].frequency);
        }
 
@@ -280,7 +281,7 @@ static int pas_cpufreq_target(struct cpufreq_policy *policy,
        pr_debug("setting frequency for cpu %d to %d kHz, 1/%d of max frequency\n",
                 policy->cpu,
                 pas_freqs[pas_astate_new].frequency,
-                pas_freqs[pas_astate_new].index);
+                pas_freqs[pas_astate_new].driver_data);
 
        current_astate = pas_astate_new;
 
index 0de00081a81e9b636d42a282123f902838a1e306..1581fcc4cf4a9f3cf8de7b782abe932328584ef0 100644 (file)
@@ -243,6 +243,8 @@ static int pcc_cpufreq_target(struct cpufreq_policy *policy,
        return 0;
 
 cmd_incomplete:
+       freqs.new = freqs.old;
+       cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
        iowrite16(0, &pcch_hdr->status);
        spin_unlock(&pcc_lock);
        return -EINVAL;
index ea0222a45b7b4241d66af2d4ba64e894a2caa178..ea8e10382ec56b46c6a378d0bf84801a1a221108 100644 (file)
@@ -58,7 +58,7 @@ static int powernow_k6_get_cpu_multiplier(void)
        msrval = POWERNOW_IOPORT + 0x0;
        wrmsr(MSR_K6_EPMR, msrval, 0); /* disable it again */
 
-       return clock_ratio[(invalue >> 5)&7].index;
+       return clock_ratio[(invalue >> 5)&7].driver_data;
 }
 
 
@@ -75,13 +75,13 @@ static void powernow_k6_set_state(struct cpufreq_policy *policy,
        unsigned long msrval;
        struct cpufreq_freqs freqs;
 
-       if (clock_ratio[best_i].index > max_multiplier) {
+       if (clock_ratio[best_i].driver_data > max_multiplier) {
                printk(KERN_ERR PFX "invalid target frequency\n");
                return;
        }
 
        freqs.old = busfreq * powernow_k6_get_cpu_multiplier();
-       freqs.new = busfreq * clock_ratio[best_i].index;
+       freqs.new = busfreq * clock_ratio[best_i].driver_data;
 
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
 
@@ -156,7 +156,7 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
 
        /* table init */
        for (i = 0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) {
-               f = clock_ratio[i].index;
+               f = clock_ratio[i].driver_data;
                if (f > max_multiplier)
                        clock_ratio[i].frequency = CPUFREQ_ENTRY_INVALID;
                else
index 53888dacbe585608b0af69d8a8fbe6df8612c54a..b9f80b713fda939c469472f7ad9193b37b374966 100644 (file)
@@ -186,7 +186,7 @@ static int get_ranges(unsigned char *pst)
                fid = *pst++;
 
                powernow_table[j].frequency = (fsb * fid_codes[fid]) / 10;
-               powernow_table[j].index = fid; /* lower 8 bits */
+               powernow_table[j].driver_data = fid; /* lower 8 bits */
 
                speed = powernow_table[j].frequency;
 
@@ -203,7 +203,7 @@ static int get_ranges(unsigned char *pst)
                        maximum_speed = speed;
 
                vid = *pst++;
-               powernow_table[j].index |= (vid << 8); /* upper 8 bits */
+               powernow_table[j].driver_data |= (vid << 8); /* upper 8 bits */
 
                pr_debug("   FID: 0x%x (%d.%dx [%dMHz])  "
                         "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10,
@@ -212,7 +212,7 @@ static int get_ranges(unsigned char *pst)
                         mobile_vid_table[vid]%1000);
        }
        powernow_table[number_scales].frequency = CPUFREQ_TABLE_END;
-       powernow_table[number_scales].index = 0;
+       powernow_table[number_scales].driver_data = 0;
 
        return 0;
 }
@@ -260,8 +260,8 @@ static void change_speed(struct cpufreq_policy *policy, unsigned int index)
         * vid are the upper 8 bits.
         */
 
-       fid = powernow_table[index].index & 0xFF;
-       vid = (powernow_table[index].index & 0xFF00) >> 8;
+       fid = powernow_table[index].driver_data & 0xFF;
+       vid = (powernow_table[index].driver_data & 0xFF00) >> 8;
 
        rdmsrl(MSR_K7_FID_VID_STATUS, fidvidstatus.val);
        cfid = fidvidstatus.bits.CFID;
@@ -373,8 +373,8 @@ static int powernow_acpi_init(void)
                fid = pc.bits.fid;
 
                powernow_table[i].frequency = fsb * fid_codes[fid] / 10;
-               powernow_table[i].index = fid; /* lower 8 bits */
-               powernow_table[i].index |= (vid << 8); /* upper 8 bits */
+               powernow_table[i].driver_data = fid; /* lower 8 bits */
+               powernow_table[i].driver_data |= (vid << 8); /* upper 8 bits */
 
                speed = powernow_table[i].frequency;
                speed_mhz = speed / 1000;
@@ -417,7 +417,7 @@ static int powernow_acpi_init(void)
        }
 
        powernow_table[i].frequency = CPUFREQ_TABLE_END;
-       powernow_table[i].index = 0;
+       powernow_table[i].driver_data = 0;
 
        /* notify BIOS that we exist */
        acpi_processor_notify_smm(THIS_MODULE);
index b828efe4b2f86976f66ce686ae335f754f5a7eeb..78f018f2a5deb5db485a718068825723ffeabba1 100644 (file)
@@ -584,9 +584,9 @@ static void print_basics(struct powernow_k8_data *data)
                                CPUFREQ_ENTRY_INVALID) {
                                printk(KERN_INFO PFX
                                        "fid 0x%x (%d MHz), vid 0x%x\n",
-                                       data->powernow_table[j].index & 0xff,
+                                       data->powernow_table[j].driver_data & 0xff,
                                        data->powernow_table[j].frequency/1000,
-                                       data->powernow_table[j].index >> 8);
+                                       data->powernow_table[j].driver_data >> 8);
                }
        }
        if (data->batps)
@@ -632,13 +632,13 @@ static int fill_powernow_table(struct powernow_k8_data *data,
 
        for (j = 0; j < data->numps; j++) {
                int freq;
-               powernow_table[j].index = pst[j].fid; /* lower 8 bits */
-               powernow_table[j].index |= (pst[j].vid << 8); /* upper 8 bits */
+               powernow_table[j].driver_data = pst[j].fid; /* lower 8 bits */
+               powernow_table[j].driver_data |= (pst[j].vid << 8); /* upper 8 bits */
                freq = find_khz_freq_from_fid(pst[j].fid);
                powernow_table[j].frequency = freq;
        }
        powernow_table[data->numps].frequency = CPUFREQ_TABLE_END;
-       powernow_table[data->numps].index = 0;
+       powernow_table[data->numps].driver_data = 0;
 
        if (query_current_values_with_pending_wait(data)) {
                kfree(powernow_table);
@@ -810,7 +810,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
 
        powernow_table[data->acpi_data.state_count].frequency =
                CPUFREQ_TABLE_END;
-       powernow_table[data->acpi_data.state_count].index = 0;
+       powernow_table[data->acpi_data.state_count].driver_data = 0;
        data->powernow_table = powernow_table;
 
        if (cpumask_first(cpu_core_mask(data->cpu)) == data->cpu)
@@ -865,7 +865,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data,
                pr_debug("   %d : fid 0x%x, vid 0x%x\n", i, fid, vid);
 
                index = fid | (vid<<8);
-               powernow_table[i].index = index;
+               powernow_table[i].driver_data = index;
 
                freq = find_khz_freq_from_fid(fid);
                powernow_table[i].frequency = freq;
@@ -941,8 +941,8 @@ static int transition_frequency_fidvid(struct powernow_k8_data *data,
         * the cpufreq frequency table in find_psb_table, vid
         * are the upper 8 bits.
         */
-       fid = data->powernow_table[index].index & 0xFF;
-       vid = (data->powernow_table[index].index & 0xFF00) >> 8;
+       fid = data->powernow_table[index].driver_data & 0xFF;
+       vid = (data->powernow_table[index].driver_data & 0xFF00) >> 8;
 
        pr_debug("table matched fid 0x%x, giving vid 0x%x\n", fid, vid);
 
@@ -967,9 +967,9 @@ static int transition_frequency_fidvid(struct powernow_k8_data *data,
 
        res = transition_fid_vid(data, fid, vid);
        if (res)
-               return res;
-
-       freqs.new = find_khz_freq_from_fid(data->currfid);
+               freqs.new = freqs.old;
+       else
+               freqs.new = find_khz_freq_from_fid(data->currfid);
 
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
        return res;
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c b/drivers/cpufreq/ppc-corenet-cpufreq.c
new file mode 100644 (file)
index 0000000..3cae452
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * CPU Frequency Scaling driver for Freescale PowerPC corenet SoCs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#define pr_fmt(fmt)    KBUILD_MODNAME ": " fmt
+
+#include <linux/clk.h>
+#include <linux/cpufreq.h>
+#include <linux/errno.h>
+#include <sysdev/fsl_soc.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+#include <linux/smp.h>
+
+/**
+ * struct cpu_data - per CPU data struct
+ * @clk: the clk of CPU
+ * @parent: the parent node of cpu clock
+ * @table: frequency table
+ */
+struct cpu_data {
+       struct clk *clk;
+       struct device_node *parent;
+       struct cpufreq_frequency_table *table;
+};
+
+/**
+ * struct soc_data - SoC specific data
+ * @freq_mask: mask the disallowed frequencies
+ * @flag: unique flags
+ */
+struct soc_data {
+       u32 freq_mask[4];
+       u32 flag;
+};
+
+#define FREQ_MASK      1
+/* see hardware specification for the allowed frqeuencies */
+static const struct soc_data sdata[] = {
+       { /* used by p2041 and p3041 */
+               .freq_mask = {0x8, 0x8, 0x2, 0x2},
+               .flag = FREQ_MASK,
+       },
+       { /* used by p5020 */
+               .freq_mask = {0x8, 0x2},
+               .flag = FREQ_MASK,
+       },
+       { /* used by p4080, p5040 */
+               .freq_mask = {0},
+               .flag = 0,
+       },
+};
+
+/*
+ * the minimum allowed core frequency, in Hz
+ * for chassis v1.0, >= platform frequency
+ * for chassis v2.0, >= platform frequency / 2
+ */
+static u32 min_cpufreq;
+static const u32 *fmask;
+
+/* serialize frequency changes  */
+static DEFINE_MUTEX(cpufreq_lock);
+static DEFINE_PER_CPU(struct cpu_data *, cpu_data);
+
+/* cpumask in a cluster */
+static DEFINE_PER_CPU(cpumask_var_t, cpu_mask);
+
+#ifndef CONFIG_SMP
+static inline const struct cpumask *cpu_core_mask(int cpu)
+{
+       return cpumask_of(0);
+}
+#endif
+
+static unsigned int corenet_cpufreq_get_speed(unsigned int cpu)
+{
+       struct cpu_data *data = per_cpu(cpu_data, cpu);
+
+       return clk_get_rate(data->clk) / 1000;
+}
+
+/* reduce the duplicated frequencies in frequency table */
+static void freq_table_redup(struct cpufreq_frequency_table *freq_table,
+               int count)
+{
+       int i, j;
+
+       for (i = 1; i < count; i++) {
+               for (j = 0; j < i; j++) {
+                       if (freq_table[j].frequency == CPUFREQ_ENTRY_INVALID ||
+                                       freq_table[j].frequency !=
+                                       freq_table[i].frequency)
+                               continue;
+
+                       freq_table[i].frequency = CPUFREQ_ENTRY_INVALID;
+                       break;
+               }
+       }
+}
+
+/* sort the frequencies in frequency table in descenting order */
+static void freq_table_sort(struct cpufreq_frequency_table *freq_table,
+               int count)
+{
+       int i, j, ind;
+       unsigned int freq, max_freq;
+       struct cpufreq_frequency_table table;
+       for (i = 0; i < count - 1; i++) {
+               max_freq = freq_table[i].frequency;
+               ind = i;
+               for (j = i + 1; j < count; j++) {
+                       freq = freq_table[j].frequency;
+                       if (freq == CPUFREQ_ENTRY_INVALID ||
+                                       freq <= max_freq)
+                               continue;
+                       ind = j;
+                       max_freq = freq;
+               }
+
+               if (ind != i) {
+                       /* exchange the frequencies */
+                       table.driver_data = freq_table[i].driver_data;
+                       table.frequency = freq_table[i].frequency;
+                       freq_table[i].driver_data = freq_table[ind].driver_data;
+                       freq_table[i].frequency = freq_table[ind].frequency;
+                       freq_table[ind].driver_data = table.driver_data;
+                       freq_table[ind].frequency = table.frequency;
+               }
+       }
+}
+
+static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy)
+{
+       struct device_node *np;
+       int i, count, ret;
+       u32 freq, mask;
+       struct clk *clk;
+       struct cpufreq_frequency_table *table;
+       struct cpu_data *data;
+       unsigned int cpu = policy->cpu;
+
+       np = of_get_cpu_node(cpu, NULL);
+       if (!np)
+               return -ENODEV;
+
+       data = kzalloc(sizeof(*data), GFP_KERNEL);
+       if (!data) {
+               pr_err("%s: no memory\n", __func__);
+               goto err_np;
+       }
+
+       data->clk = of_clk_get(np, 0);
+       if (IS_ERR(data->clk)) {
+               pr_err("%s: no clock information\n", __func__);
+               goto err_nomem2;
+       }
+
+       data->parent = of_parse_phandle(np, "clocks", 0);
+       if (!data->parent) {
+               pr_err("%s: could not get clock information\n", __func__);
+               goto err_nomem2;
+       }
+
+       count = of_property_count_strings(data->parent, "clock-names");
+       table = kcalloc(count + 1, sizeof(*table), GFP_KERNEL);
+       if (!table) {
+               pr_err("%s: no memory\n", __func__);
+               goto err_node;
+       }
+
+       if (fmask)
+               mask = fmask[get_hard_smp_processor_id(cpu)];
+       else
+               mask = 0x0;
+
+       for (i = 0; i < count; i++) {
+               clk = of_clk_get(data->parent, i);
+               freq = clk_get_rate(clk);
+               /*
+                * the clock is valid if its frequency is not masked
+                * and large than minimum allowed frequency.
+                */
+               if (freq < min_cpufreq || (mask & (1 << i)))
+                       table[i].frequency = CPUFREQ_ENTRY_INVALID;
+               else
+                       table[i].frequency = freq / 1000;
+               table[i].driver_data = i;
+       }
+       freq_table_redup(table, count);
+       freq_table_sort(table, count);
+       table[i].frequency = CPUFREQ_TABLE_END;
+
+       /* set the min and max frequency properly */
+       ret = cpufreq_frequency_table_cpuinfo(policy, table);
+       if (ret) {
+               pr_err("invalid frequency table: %d\n", ret);
+               goto err_nomem1;
+       }
+
+       data->table = table;
+       per_cpu(cpu_data, cpu) = data;
+
+       /* update ->cpus if we have cluster, no harm if not */
+       cpumask_copy(policy->cpus, per_cpu(cpu_mask, cpu));
+       for_each_cpu(i, per_cpu(cpu_mask, cpu))
+               per_cpu(cpu_data, i) = data;
+
+       policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
+       policy->cur = corenet_cpufreq_get_speed(policy->cpu);
+
+       cpufreq_frequency_table_get_attr(table, cpu);
+       of_node_put(np);
+
+       return 0;
+
+err_nomem1:
+       kfree(table);
+err_node:
+       of_node_put(data->parent);
+err_nomem2:
+       per_cpu(cpu_data, cpu) = NULL;
+       kfree(data);
+err_np:
+       of_node_put(np);
+
+       return -ENODEV;
+}
+
+static int __exit corenet_cpufreq_cpu_exit(struct cpufreq_policy *policy)
+{
+       struct cpu_data *data = per_cpu(cpu_data, policy->cpu);
+       unsigned int cpu;
+
+       cpufreq_frequency_table_put_attr(policy->cpu);
+       of_node_put(data->parent);
+       kfree(data->table);
+       kfree(data);
+
+       for_each_cpu(cpu, per_cpu(cpu_mask, policy->cpu))
+               per_cpu(cpu_data, cpu) = NULL;
+
+       return 0;
+}
+
+static int corenet_cpufreq_verify(struct cpufreq_policy *policy)
+{
+       struct cpufreq_frequency_table *table =
+               per_cpu(cpu_data, policy->cpu)->table;
+
+       return cpufreq_frequency_table_verify(policy, table);
+}
+
+static int corenet_cpufreq_target(struct cpufreq_policy *policy,
+               unsigned int target_freq, unsigned int relation)
+{
+       struct cpufreq_freqs freqs;
+       unsigned int new;
+       struct clk *parent;
+       int ret;
+       struct cpu_data *data = per_cpu(cpu_data, policy->cpu);
+
+       cpufreq_frequency_table_target(policy, data->table,
+                       target_freq, relation, &new);
+
+       if (policy->cur == data->table[new].frequency)
+               return 0;
+
+       freqs.old = policy->cur;
+       freqs.new = data->table[new].frequency;
+
+       mutex_lock(&cpufreq_lock);
+       cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
+
+       parent = of_clk_get(data->parent, data->table[new].driver_data);
+       ret = clk_set_parent(data->clk, parent);
+       if (ret)
+               freqs.new = freqs.old;
+
+       cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
+       mutex_unlock(&cpufreq_lock);
+
+       return ret;
+}
+
+static struct freq_attr *corenet_cpufreq_attr[] = {
+       &cpufreq_freq_attr_scaling_available_freqs,
+       NULL,
+};
+
+static struct cpufreq_driver ppc_corenet_cpufreq_driver = {
+       .name           = "ppc_cpufreq",
+       .owner          = THIS_MODULE,
+       .flags          = CPUFREQ_CONST_LOOPS,
+       .init           = corenet_cpufreq_cpu_init,
+       .exit           = __exit_p(corenet_cpufreq_cpu_exit),
+       .verify         = corenet_cpufreq_verify,
+       .target         = corenet_cpufreq_target,
+       .get            = corenet_cpufreq_get_speed,
+       .attr           = corenet_cpufreq_attr,
+};
+
+static const struct of_device_id node_matches[] __initdata = {
+       { .compatible = "fsl,p2041-clockgen", .data = &sdata[0], },
+       { .compatible = "fsl,p3041-clockgen", .data = &sdata[0], },
+       { .compatible = "fsl,p5020-clockgen", .data = &sdata[1], },
+       { .compatible = "fsl,p4080-clockgen", .data = &sdata[2], },
+       { .compatible = "fsl,p5040-clockgen", .data = &sdata[2], },
+       { .compatible = "fsl,qoriq-clockgen-2.0", },
+       {}
+};
+
+static int __init ppc_corenet_cpufreq_init(void)
+{
+       int ret;
+       struct device_node  *np;
+       const struct of_device_id *match;
+       const struct soc_data *data;
+       unsigned int cpu;
+
+       np = of_find_matching_node(NULL, node_matches);
+       if (!np)
+               return -ENODEV;
+
+       for_each_possible_cpu(cpu) {
+               if (!alloc_cpumask_var(&per_cpu(cpu_mask, cpu), GFP_KERNEL))
+                       goto err_mask;
+               cpumask_copy(per_cpu(cpu_mask, cpu), cpu_core_mask(cpu));
+       }
+
+       match = of_match_node(node_matches, np);
+       data = match->data;
+       if (data) {
+               if (data->flag)
+                       fmask = data->freq_mask;
+               min_cpufreq = fsl_get_sys_freq();
+       } else {
+               min_cpufreq = fsl_get_sys_freq() / 2;
+       }
+
+       of_node_put(np);
+
+       ret = cpufreq_register_driver(&ppc_corenet_cpufreq_driver);
+       if (!ret)
+               pr_info("Freescale PowerPC corenet CPU frequency scaling driver\n");
+
+       return ret;
+
+err_mask:
+       for_each_possible_cpu(cpu)
+               free_cpumask_var(per_cpu(cpu_mask, cpu));
+
+       return -ENOMEM;
+}
+module_init(ppc_corenet_cpufreq_init);
+
+static void __exit ppc_corenet_cpufreq_exit(void)
+{
+       unsigned int cpu;
+
+       for_each_possible_cpu(cpu)
+               free_cpumask_var(per_cpu(cpu_mask, cpu));
+
+       cpufreq_unregister_driver(&ppc_corenet_cpufreq_driver);
+}
+module_exit(ppc_corenet_cpufreq_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Tang Yuantian <Yuantian.Tang@freescale.com>");
+MODULE_DESCRIPTION("cpufreq driver for Freescale e500mc series SoCs");
index e577a1dbbfcd572be200a7a73f81728959bb24b5..5936f8d6f2cc3e855ce52a814705ee9d1e35b10b 100644 (file)
@@ -106,7 +106,7 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
        /* initialize frequency table */
        for (i=0; cbe_freqs[i].frequency!=CPUFREQ_TABLE_END; i++) {
-               cbe_freqs[i].frequency = max_freq / cbe_freqs[i].index;
+               cbe_freqs[i].frequency = max_freq / cbe_freqs[i].driver_data;
                pr_debug("%d: %d\n", i, cbe_freqs[i].frequency);
        }
 
@@ -165,7 +165,7 @@ static int cbe_cpufreq_target(struct cpufreq_policy *policy,
                 "1/%d of max frequency\n",
                 policy->cpu,
                 cbe_freqs[cbe_pmode_new].frequency,
-                cbe_freqs[cbe_pmode_new].index);
+                cbe_freqs[cbe_pmode_new].driver_data);
 
        rc = set_pmode(policy->cpu, cbe_pmode_new);
 
index 9e5bc8e388a0239ee5061fdd427c016e8abf68b5..fb3981ac829fdb0a1eb73483ee3484fe7426990c 100644 (file)
@@ -420,7 +420,7 @@ static int pxa_cpufreq_init(struct cpufreq_policy *policy)
        /* Generate pxa25x the run cpufreq_frequency_table struct */
        for (i = 0; i < NUM_PXA25x_RUN_FREQS; i++) {
                pxa255_run_freq_table[i].frequency = pxa255_run_freqs[i].khz;
-               pxa255_run_freq_table[i].index = i;
+               pxa255_run_freq_table[i].driver_data = i;
        }
        pxa255_run_freq_table[i].frequency = CPUFREQ_TABLE_END;
 
@@ -428,7 +428,7 @@ static int pxa_cpufreq_init(struct cpufreq_policy *policy)
        for (i = 0; i < NUM_PXA25x_TURBO_FREQS; i++) {
                pxa255_turbo_freq_table[i].frequency =
                        pxa255_turbo_freqs[i].khz;
-               pxa255_turbo_freq_table[i].index = i;
+               pxa255_turbo_freq_table[i].driver_data = i;
        }
        pxa255_turbo_freq_table[i].frequency = CPUFREQ_TABLE_END;
 
@@ -440,9 +440,9 @@ static int pxa_cpufreq_init(struct cpufreq_policy *policy)
                if (freq > pxa27x_maxfreq)
                        break;
                pxa27x_freq_table[i].frequency = freq;
-               pxa27x_freq_table[i].index = i;
+               pxa27x_freq_table[i].driver_data = i;
        }
-       pxa27x_freq_table[i].index = i;
+       pxa27x_freq_table[i].driver_data = i;
        pxa27x_freq_table[i].frequency = CPUFREQ_TABLE_END;
 
        /*
index 15d60f857ad567f92bfdb6735f9b2f7d51804a7c..9c92ef032a9e978800e4897a2a3e8322c0d1c031 100644 (file)
@@ -98,10 +98,10 @@ static int setup_freqs_table(struct cpufreq_policy *policy,
                return -ENOMEM;
 
        for (i = 0; i < num; i++) {
-               table[i].index = i;
+               table[i].driver_data = i;
                table[i].frequency = freqs[i].cpufreq_mhz * 1000;
        }
-       table[num].index = i;
+       table[num].driver_data = i;
        table[num].frequency = CPUFREQ_TABLE_END;
 
        pxa3xx_freqs = freqs;
index 4f1881eee3f12a803a58ae373f044551f87d4edb..e35865af96e2e1320a17bfdd001c84eb708d2c46 100644 (file)
@@ -244,7 +244,7 @@ static int s3c2416_cpufreq_set_target(struct cpufreq_policy *policy,
        if (ret != 0)
                goto out;
 
-       idx = s3c_freq->freq_table[i].index;
+       idx = s3c_freq->freq_table[i].driver_data;
 
        if (idx == SOURCE_HCLK)
                to_dvs = 1;
@@ -312,7 +312,7 @@ static void __init s3c2416_cpufreq_cfg_regulator(struct s3c2416_data *s3c_freq)
                if (freq->frequency == CPUFREQ_ENTRY_INVALID)
                        continue;
 
-               dvfs = &s3c2416_dvfs_table[freq->index];
+               dvfs = &s3c2416_dvfs_table[freq->driver_data];
                found = 0;
 
                /* Check only the min-voltage, more is always ok on S3C2416 */
@@ -462,7 +462,7 @@ static int __init s3c2416_cpufreq_driver_init(struct cpufreq_policy *policy)
        freq = s3c_freq->freq_table;
        while (freq->frequency != CPUFREQ_TABLE_END) {
                /* special handling for dvs mode */
-               if (freq->index == 0) {
+               if (freq->driver_data == 0) {
                        if (!s3c_freq->hclk) {
                                pr_debug("cpufreq: %dkHz unsupported as it would need unavailable dvs mode\n",
                                         freq->frequency);
index 27cacb524796994f2cc06a5bef1478aa8e4b9e06..13bb4bae64ee11505fb8a072d041ec9a8268bf84 100644 (file)
@@ -87,7 +87,7 @@ static int s3c64xx_cpufreq_set_target(struct cpufreq_policy *policy,
        freqs.old = clk_get_rate(armclk) / 1000;
        freqs.new = s3c64xx_freq_table[i].frequency;
        freqs.flags = 0;
-       dvfs = &s3c64xx_dvfs_table[s3c64xx_freq_table[i].index];
+       dvfs = &s3c64xx_dvfs_table[s3c64xx_freq_table[i].driver_data];
 
        if (freqs.old == freqs.new)
                return 0;
@@ -104,7 +104,8 @@ static int s3c64xx_cpufreq_set_target(struct cpufreq_policy *policy,
                if (ret != 0) {
                        pr_err("Failed to set VDDARM for %dkHz: %d\n",
                               freqs.new, ret);
-                       goto err;
+                       freqs.new = freqs.old;
+                       goto post_notify;
                }
        }
 #endif
@@ -113,10 +114,13 @@ static int s3c64xx_cpufreq_set_target(struct cpufreq_policy *policy,
        if (ret < 0) {
                pr_err("Failed to set rate %dkHz: %d\n",
                       freqs.new, ret);
-               goto err;
+               freqs.new = freqs.old;
        }
 
+post_notify:
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
+       if (ret)
+               goto err;
 
 #ifdef CONFIG_REGULATOR
        if (vddarm && freqs.new < freqs.old) {
index f740b134d27b2f9e87edb5e5d0e76713539ebf62..77a210975fc4b66ce737703f6904483d45368776 100644 (file)
@@ -71,7 +71,7 @@ static void sc520_freq_set_cpu_state(struct cpufreq_policy *policy,
        local_irq_disable();
 
        clockspeed_reg = *cpuctl & ~0x03;
-       *cpuctl = clockspeed_reg | sc520_freq_table[state].index;
+       *cpuctl = clockspeed_reg | sc520_freq_table[state].driver_data;
 
        local_irq_enable();
 
index 306ae462bba6ac951ce6383be391d4e4066610fe..93061a40877383b09ceff0cb7bd0bc2bba60a08a 100644 (file)
@@ -308,17 +308,17 @@ static int __init us2e_freq_cpu_init(struct cpufreq_policy *policy)
        struct cpufreq_frequency_table *table =
                &us2e_freq_table[cpu].table[0];
 
-       table[0].index = 0;
+       table[0].driver_data = 0;
        table[0].frequency = clock_tick / 1;
-       table[1].index = 1;
+       table[1].driver_data = 1;
        table[1].frequency = clock_tick / 2;
-       table[2].index = 2;
+       table[2].driver_data = 2;
        table[2].frequency = clock_tick / 4;
-       table[2].index = 3;
+       table[2].driver_data = 3;
        table[2].frequency = clock_tick / 6;
-       table[2].index = 4;
+       table[2].driver_data = 4;
        table[2].frequency = clock_tick / 8;
-       table[2].index = 5;
+       table[2].driver_data = 5;
        table[3].frequency = CPUFREQ_TABLE_END;
 
        policy->cpuinfo.transition_latency = 0;
index c71ee142347aadcd0ed6015ec7cc60c3f572e369..880ee293d61eda8c131187d65579a5216ce2b00d 100644 (file)
@@ -169,13 +169,13 @@ static int __init us3_freq_cpu_init(struct cpufreq_policy *policy)
        struct cpufreq_frequency_table *table =
                &us3_freq_table[cpu].table[0];
 
-       table[0].index = 0;
+       table[0].driver_data = 0;
        table[0].frequency = clock_tick / 1;
-       table[1].index = 1;
+       table[1].driver_data = 1;
        table[1].frequency = clock_tick / 2;
-       table[2].index = 2;
+       table[2].driver_data = 2;
        table[2].frequency = clock_tick / 32;
-       table[3].index = 0;
+       table[3].driver_data = 0;
        table[3].frequency = CPUFREQ_TABLE_END;
 
        policy->cpuinfo.transition_latency = 0;
index 156829f4576de63497147d6e72f5e1d05e2e5cae..c3efa7f2a9088d9ea43f68e149632939e357a8dd 100644 (file)
@@ -250,11 +250,11 @@ static int spear_cpufreq_driver_init(void)
        }
 
        for (i = 0; i < cnt; i++) {
-               freq_tbl[i].index = i;
+               freq_tbl[i].driver_data = i;
                freq_tbl[i].frequency = be32_to_cpup(val++);
        }
 
-       freq_tbl[i].index = i;
+       freq_tbl[i].driver_data = i;
        freq_tbl[i].frequency = CPUFREQ_TABLE_END;
 
        spear_cpufreq.freq_tbl = freq_tbl;
index 618e6f417b1cd48780d970c0b5a628e9b8024017..0915e712fbdcc3a6393c1974c12394e060cc3c1f 100644 (file)
@@ -79,11 +79,11 @@ static struct cpufreq_driver centrino_driver;
 
 /* Computes the correct form for IA32_PERF_CTL MSR for a particular
    frequency/voltage operating point; frequency in MHz, volts in mV.
-   This is stored as "index" in the structure. */
+   This is stored as "driver_data" in the structure. */
 #define OP(mhz, mv)                                                    \
        {                                                               \
                .frequency = (mhz) * 1000,                              \
-               .index = (((mhz)/100) << 8) | ((mv - 700) / 16)         \
+               .driver_data = (((mhz)/100) << 8) | ((mv - 700) / 16)           \
        }
 
 /*
@@ -307,7 +307,7 @@ static unsigned extract_clock(unsigned msr, unsigned int cpu, int failsafe)
                per_cpu(centrino_model, cpu)->op_points[i].frequency
                                                        != CPUFREQ_TABLE_END;
             i++) {
-               if (msr == per_cpu(centrino_model, cpu)->op_points[i].index)
+               if (msr == per_cpu(centrino_model, cpu)->op_points[i].driver_data)
                        return per_cpu(centrino_model, cpu)->
                                                        op_points[i].frequency;
        }
@@ -501,7 +501,7 @@ static int centrino_target (struct cpufreq_policy *policy,
                        break;
                }
 
-               msr = per_cpu(centrino_model, cpu)->op_points[newstate].index;
+               msr = per_cpu(centrino_model, cpu)->op_points[newstate].driver_data;
 
                if (first_cpu) {
                        rdmsr_on_cpu(good_cpu, MSR_IA32_PERF_CTL, &oldmsr, &h);
index c74c0e130ef4b2a16e20a768b05b5946b599a9d6..cd66b85d927caa47d5080f5c8b8da4bd03c51686 100644 (file)
 #include <linux/io.h>
 #include <linux/suspend.h>
 
-/* Frequency table index must be sequential starting at 0 */
 static struct cpufreq_frequency_table freq_table[] = {
-       { 0, 216000 },
-       { 1, 312000 },
-       { 2, 456000 },
-       { 3, 608000 },
-       { 4, 760000 },
-       { 5, 816000 },
-       { 6, 912000 },
-       { 7, 1000000 },
-       { 8, CPUFREQ_TABLE_END },
+       { .frequency = 216000 },
+       { .frequency = 312000 },
+       { .frequency = 456000 },
+       { .frequency = 608000 },
+       { .frequency = 760000 },
+       { .frequency = 816000 },
+       { .frequency = 912000 },
+       { .frequency = 1000000 },
+       { .frequency = CPUFREQ_TABLE_END },
 };
 
 #define NUM_CPUS       2
@@ -138,12 +137,12 @@ static int tegra_update_cpu_speed(struct cpufreq_policy *policy,
        if (ret) {
                pr_err("cpu-tegra: Failed to set cpu frequency to %d kHz\n",
                        freqs.new);
-               return ret;
+               freqs.new = freqs.old;
        }
 
        cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 
-       return 0;
+       return ret;
 }
 
 static unsigned long tegra_cpu_highest_speed(void)
index 66f80973596bd8833557d13c1bfc5426a6b1290d..ed79d7b78e7d85692fc56e175fb49befda4d14cd 100644 (file)
@@ -1724,9 +1724,9 @@ static long round_clock_rate(u8 clock, unsigned long rate)
 
 /* CPU FREQ table, may be changed due to if MAX_OPP is supported. */
 static struct cpufreq_frequency_table db8500_cpufreq_table[] = {
-       { .frequency = 200000, .index = ARM_EXTCLK,},
-       { .frequency = 400000, .index = ARM_50_OPP,},
-       { .frequency = 800000, .index = ARM_100_OPP,},
+       { .frequency = 200000, .driver_data = ARM_EXTCLK,},
+       { .frequency = 400000, .driver_data = ARM_50_OPP,},
+       { .frequency = 800000, .driver_data = ARM_100_OPP,},
        { .frequency = CPUFREQ_TABLE_END,}, /* To be used for MAX_OPP. */
        { .frequency = CPUFREQ_TABLE_END,},
 };
@@ -1901,7 +1901,7 @@ static int set_armss_rate(unsigned long rate)
                return -EINVAL;
 
        /* Set the new arm opp. */
-       return db8500_prcmu_set_arm_opp(db8500_cpufreq_table[i].index);
+       return db8500_prcmu_set_arm_opp(db8500_cpufreq_table[i].driver_data);
 }
 
 static int set_plldsi_rate(unsigned long rate)
@@ -3105,7 +3105,7 @@ static void db8500_prcmu_update_cpufreq(void)
 {
        if (prcmu_has_arm_maxopp()) {
                db8500_cpufreq_table[3].frequency = 1000000;
-               db8500_cpufreq_table[3].index = ARM_MAX_OPP;
+               db8500_cpufreq_table[3].driver_data = ARM_MAX_OPP;
        }
 }
 
index 7715de2629c104de4e98a87836ea2ef308a743c4..74727851820df42e5b6471a0799357ad66e850e1 100644 (file)
@@ -63,12 +63,12 @@ void clk_rate_table_build(struct clk *clk,
                else
                        freq = clk->parent->rate * mult / div;
 
-               freq_table[i].index = i;
+               freq_table[i].driver_data = i;
                freq_table[i].frequency = freq;
        }
 
        /* Termination entry */
-       freq_table[i].index = i;
+       freq_table[i].driver_data = i;
        freq_table[i].frequency = CPUFREQ_TABLE_END;
 }
 
index 037d36ae63e52d521def4ef34efeaf327479bcec..3c7ee2f903701fd3c6daf120c050dde556c7c3a4 100644 (file)
@@ -1,8 +1,8 @@
 /*
- *  linux/include/linux/cpufreq.h
+ * linux/include/linux/cpufreq.h
  *
- *  Copyright (C) 2001 Russell King
- *            (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
+ * Copyright (C) 2001 Russell King
+ *           (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -26,7 +26,6 @@
 /* Print length for names. Extra 1 space for accomodating '\n' in prints */
 #define CPUFREQ_NAME_PLEN (CPUFREQ_NAME_LEN + 1)
 
-
 /*********************************************************************
  *                     CPUFREQ NOTIFIER INTERFACE                    *
  *********************************************************************/
@@ -71,6 +70,10 @@ struct cpufreq_governor;
 
 /* /sys/devices/system/cpu/cpufreq: entry point for global variables */
 extern struct kobject *cpufreq_global_kobject;
+int cpufreq_get_global_kobject(void);
+void cpufreq_put_global_kobject(void);
+int cpufreq_sysfs_create_file(const struct attribute *attr);
+void cpufreq_sysfs_remove_file(const struct attribute *attr);
 
 #define CPUFREQ_ETERNAL                        (-1)
 struct cpufreq_cpuinfo {
@@ -107,6 +110,7 @@ struct cpufreq_policy {
        unsigned int            policy; /* see above */
        struct cpufreq_governor *governor; /* see below */
        void                    *governor_data;
+       bool                    governor_enabled; /* governor start/stop flag */
 
        struct work_struct      update; /* if update_policy() needs to be
                                         * called, but you're in IRQ context */
@@ -148,17 +152,18 @@ struct cpufreq_freqs {
        u8 flags;               /* flags of cpufreq_driver, see below. */
 };
 
-
 /**
- * cpufreq_scale - "old * mult / div" calculation for large values (32-bit-arch safe)
+ * cpufreq_scale - "old * mult / div" calculation for large values (32-bit-arch
+ * safe)
  * @old:   old value
  * @div:   divisor
  * @mult:  multiplier
  *
  *
- *    new = old * mult / div
+ * new = old * mult / div
  */
-static inline unsigned long cpufreq_scale(unsigned long old, u_int div, u_int mult)
+static inline unsigned long cpufreq_scale(unsigned long old, u_int div,
+               u_int mult)
 {
 #if BITS_PER_LONG == 32
 
@@ -211,14 +216,12 @@ extern int __cpufreq_driver_target(struct cpufreq_policy *policy,
                                   unsigned int target_freq,
                                   unsigned int relation);
 
-
 extern int __cpufreq_driver_getavg(struct cpufreq_policy *policy,
                                   unsigned int cpu);
 
 int cpufreq_register_governor(struct cpufreq_governor *governor);
 void cpufreq_unregister_governor(struct cpufreq_governor *governor);
 
-
 /*********************************************************************
  *                      CPUFREQ DRIVER INTERFACE                     *
  *********************************************************************/
@@ -229,7 +232,7 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor);
 struct freq_attr;
 
 struct cpufreq_driver {
-       struct module           *owner;
+       struct module           *owner;
        char                    name[CPUFREQ_NAME_LEN];
        u8                      flags;
        /*
@@ -277,11 +280,11 @@ struct cpufreq_driver {
 int cpufreq_register_driver(struct cpufreq_driver *driver_data);
 int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
 
-
 void cpufreq_notify_transition(struct cpufreq_policy *policy,
                struct cpufreq_freqs *freqs, unsigned int state);
 
-static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned int min, unsigned int max)
+static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy,
+               unsigned int min, unsigned int max)
 {
        if (policy->min < min)
                policy->min = min;
@@ -337,12 +340,16 @@ const char *cpufreq_get_current_driver(void);
 /*********************************************************************
  *                        CPUFREQ 2.6. INTERFACE                     *
  *********************************************************************/
+u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy);
 int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
 int cpufreq_update_policy(unsigned int cpu);
 bool have_governor_per_policy(void);
+struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy);
 
 #ifdef CONFIG_CPU_FREQ
-/* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */
+/*
+ * query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it
+ */
 unsigned int cpufreq_get(unsigned int cpu);
 #else
 static inline unsigned int cpufreq_get(unsigned int cpu)
@@ -351,7 +358,9 @@ static inline unsigned int cpufreq_get(unsigned int cpu)
 }
 #endif
 
-/* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */
+/*
+ * query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it
+ */
 #ifdef CONFIG_CPU_FREQ
 unsigned int cpufreq_quick_get(unsigned int cpu);
 unsigned int cpufreq_quick_get_max(unsigned int cpu);
@@ -366,16 +375,14 @@ static inline unsigned int cpufreq_quick_get_max(unsigned int cpu)
 }
 #endif
 
-
 /*********************************************************************
  *                       CPUFREQ DEFAULT GOVERNOR                    *
  *********************************************************************/
 
-
 /*
 Performance governor is fallback governor if any other gov failed to
 auto load due latency restrictions
-*/
* Performance governor is fallback governor if any other gov failed to auto
* load due latency restrictions
+ */
 #ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
 extern struct cpufreq_governor cpufreq_gov_performance;
 #endif
@@ -395,7 +402,6 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 #define CPUFREQ_DEFAULT_GOVERNOR       (&cpufreq_gov_conservative)
 #endif
 
-
 /*********************************************************************
  *                     FREQUENCY TABLE HELPERS                       *
  *********************************************************************/
@@ -404,7 +410,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 #define CPUFREQ_TABLE_END     ~1
 
 struct cpufreq_frequency_table {
-       unsigned int    index;     /* any */
+       unsigned int    driver_data; /* driver specific data, not used by core */
        unsigned int    frequency; /* kHz - doesn't need to be in ascending
                                    * order */
 };