aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-04-08 07:28:02 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-04-08 07:28:02 -0400
commitfe10739284bae68b57d3dbcad81f34772cfd2716 (patch)
tree896fa694b7f6a46266ff8eb5291c35781be53e25
parent8c73c4d8319f38ec1a1fc630a88cbcb79cb1a8f6 (diff)
parentf334a1e8434c49b6f9c947d3eb7caf712fbcc3fa (diff)
Merge branch 'pm-cpufreq'
* pm-cpufreq: cpufreq: ppc: Remove duplicate inclusion of fsl_soc.h cpufreq: create another field .flags in cpufreq_frequency_table cpufreq: use kzalloc() to allocate memory for cpufreq_frequency_table cpufreq: don't print value of .driver_data from core cpufreq: ia64: don't set .driver_data to index cpufreq: powernv: Select CPUFreq related Kconfig options for powernv cpufreq: powernv: Use cpufreq_frequency_table.driver_data to store pstate ids cpufreq: powernv: cpufreq driver for powernv platform cpufreq: at32ap: don't declare local variable as static cpufreq: loongson2_cpufreq: don't declare local variable as static cpufreq: unicore32: fix typo issue for 'clk' cpufreq: exynos: Disable on multiplatform build
-rw-r--r--arch/mips/loongson/lemote-2f/clock.c20
-rw-r--r--arch/powerpc/configs/pseries_defconfig1
-rw-r--r--arch/powerpc/configs/pseries_le_defconfig1
-rw-r--r--arch/powerpc/include/asm/reg.h4
-rw-r--r--arch/powerpc/platforms/powernv/Kconfig6
-rw-r--r--drivers/cpufreq/Kconfig.arm6
-rw-r--r--drivers/cpufreq/Kconfig.powerpc8
-rw-r--r--drivers/cpufreq/Makefile1
-rw-r--r--drivers/cpufreq/acpi-cpufreq.c2
-rw-r--r--drivers/cpufreq/at32ap-cpufreq.c2
-rw-r--r--drivers/cpufreq/cris-artpec3-cpufreq.c6
-rw-r--r--drivers/cpufreq/cris-etraxfs-cpufreq.c6
-rw-r--r--drivers/cpufreq/elanfreq.c18
-rw-r--r--drivers/cpufreq/exynos4210-cpufreq.c12
-rw-r--r--drivers/cpufreq/exynos4x12-cpufreq.c30
-rw-r--r--drivers/cpufreq/exynos5250-cpufreq.c34
-rw-r--r--drivers/cpufreq/freq_table.c11
-rw-r--r--drivers/cpufreq/ia64-acpi-cpufreq.c3
-rw-r--r--drivers/cpufreq/kirkwood-cpufreq.c6
-rw-r--r--drivers/cpufreq/longhaul.c2
-rw-r--r--drivers/cpufreq/loongson2_cpufreq.c2
-rw-r--r--drivers/cpufreq/maple-cpufreq.c6
-rw-r--r--drivers/cpufreq/p4-clockmod.c20
-rw-r--r--drivers/cpufreq/pasemi-cpufreq.c12
-rw-r--r--drivers/cpufreq/pmac32-cpufreq.c6
-rw-r--r--drivers/cpufreq/pmac64-cpufreq.c6
-rw-r--r--drivers/cpufreq/powernow-k6.c18
-rw-r--r--drivers/cpufreq/powernow-k8.c5
-rw-r--r--drivers/cpufreq/powernv-cpufreq.c341
-rw-r--r--drivers/cpufreq/ppc-corenet-cpufreq.c1
-rw-r--r--drivers/cpufreq/ppc_cbe_cpufreq.c18
-rw-r--r--drivers/cpufreq/s3c2416-cpufreq.c20
-rw-r--r--drivers/cpufreq/s3c24xx-cpufreq.c4
-rw-r--r--drivers/cpufreq/s3c64xx-cpufreq.c26
-rw-r--r--drivers/cpufreq/s5pv210-cpufreq.c12
-rw-r--r--drivers/cpufreq/sc520_freq.c6
-rw-r--r--drivers/cpufreq/spear-cpufreq.c7
-rw-r--r--drivers/cpufreq/speedstep-ich.c6
-rw-r--r--drivers/cpufreq/speedstep-smi.c6
-rw-r--r--drivers/cpufreq/unicore2-cpufreq.c2
-rw-r--r--include/linux/cpufreq.h9
41 files changed, 535 insertions, 177 deletions
diff --git a/arch/mips/loongson/lemote-2f/clock.c b/arch/mips/loongson/lemote-2f/clock.c
index aed32b88576c..e1f427f4f5f3 100644
--- a/arch/mips/loongson/lemote-2f/clock.c
+++ b/arch/mips/loongson/lemote-2f/clock.c
@@ -28,16 +28,16 @@ enum {
28}; 28};
29 29
30struct cpufreq_frequency_table loongson2_clockmod_table[] = { 30struct cpufreq_frequency_table loongson2_clockmod_table[] = {
31 {DC_RESV, CPUFREQ_ENTRY_INVALID}, 31 {0, DC_RESV, CPUFREQ_ENTRY_INVALID},
32 {DC_ZERO, CPUFREQ_ENTRY_INVALID}, 32 {0, DC_ZERO, CPUFREQ_ENTRY_INVALID},
33 {DC_25PT, 0}, 33 {0, DC_25PT, 0},
34 {DC_37PT, 0}, 34 {0, DC_37PT, 0},
35 {DC_50PT, 0}, 35 {0, DC_50PT, 0},
36 {DC_62PT, 0}, 36 {0, DC_62PT, 0},
37 {DC_75PT, 0}, 37 {0, DC_75PT, 0},
38 {DC_87PT, 0}, 38 {0, DC_87PT, 0},
39 {DC_DISABLE, 0}, 39 {0, DC_DISABLE, 0},
40 {DC_RESV, CPUFREQ_TABLE_END}, 40 {0, DC_RESV, CPUFREQ_TABLE_END},
41}; 41};
42EXPORT_SYMBOL_GPL(loongson2_clockmod_table); 42EXPORT_SYMBOL_GPL(loongson2_clockmod_table);
43 43
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig
index 9ea8342bd219..a905063281cc 100644
--- a/arch/powerpc/configs/pseries_defconfig
+++ b/arch/powerpc/configs/pseries_defconfig
@@ -306,3 +306,4 @@ CONFIG_KVM_BOOK3S_64=m
306CONFIG_KVM_BOOK3S_64_HV=y 306CONFIG_KVM_BOOK3S_64_HV=y
307CONFIG_TRANSPARENT_HUGEPAGE=y 307CONFIG_TRANSPARENT_HUGEPAGE=y
308CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y 308CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
309CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
diff --git a/arch/powerpc/configs/pseries_le_defconfig b/arch/powerpc/configs/pseries_le_defconfig
index 3c84f9d87980..58e3dbf43ca4 100644
--- a/arch/powerpc/configs/pseries_le_defconfig
+++ b/arch/powerpc/configs/pseries_le_defconfig
@@ -301,3 +301,4 @@ CONFIG_CRYPTO_LZO=m
301# CONFIG_CRYPTO_ANSI_CPRNG is not set 301# CONFIG_CRYPTO_ANSI_CPRNG is not set
302CONFIG_CRYPTO_DEV_NX=y 302CONFIG_CRYPTO_DEV_NX=y
303CONFIG_CRYPTO_DEV_NX_ENCRYPT=m 303CONFIG_CRYPTO_DEV_NX_ENCRYPT=m
304CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index 0dcc48af25a3..e5d2e0bc7e03 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -272,6 +272,10 @@
272#define SPRN_HSRR1 0x13B /* Hypervisor Save/Restore 1 */ 272#define SPRN_HSRR1 0x13B /* Hypervisor Save/Restore 1 */
273#define SPRN_IC 0x350 /* Virtual Instruction Count */ 273#define SPRN_IC 0x350 /* Virtual Instruction Count */
274#define SPRN_VTB 0x351 /* Virtual Time Base */ 274#define SPRN_VTB 0x351 /* Virtual Time Base */
275#define SPRN_PMICR 0x354 /* Power Management Idle Control Reg */
276#define SPRN_PMSR 0x355 /* Power Management Status Reg */
277#define SPRN_PMCR 0x374 /* Power Management Control Register */
278
275/* HFSCR and FSCR bit numbers are the same */ 279/* HFSCR and FSCR bit numbers are the same */
276#define FSCR_TAR_LG 8 /* Enable Target Address Register */ 280#define FSCR_TAR_LG 8 /* Enable Target Address Register */
277#define FSCR_EBB_LG 7 /* Enable Event Based Branching */ 281#define FSCR_EBB_LG 7 /* Enable Event Based Branching */
diff --git a/arch/powerpc/platforms/powernv/Kconfig b/arch/powerpc/platforms/powernv/Kconfig
index 895e8a20a3fc..c252ee95bddf 100644
--- a/arch/powerpc/platforms/powernv/Kconfig
+++ b/arch/powerpc/platforms/powernv/Kconfig
@@ -11,6 +11,12 @@ config PPC_POWERNV
11 select PPC_UDBG_16550 11 select PPC_UDBG_16550
12 select PPC_SCOM 12 select PPC_SCOM
13 select ARCH_RANDOM 13 select ARCH_RANDOM
14 select CPU_FREQ
15 select CPU_FREQ_GOV_PERFORMANCE
16 select CPU_FREQ_GOV_POWERSAVE
17 select CPU_FREQ_GOV_USERSPACE
18 select CPU_FREQ_GOV_ONDEMAND
19 select CPU_FREQ_GOV_CONSERVATIVE
14 default y 20 default y
15 21
16config PPC_POWERNV_RTAS 22config PPC_POWERNV_RTAS
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 1e2b9db563ec..0e9cce82844b 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -30,7 +30,7 @@ config ARM_EXYNOS_CPUFREQ
30 30
31config ARM_EXYNOS4210_CPUFREQ 31config ARM_EXYNOS4210_CPUFREQ
32 bool "SAMSUNG EXYNOS4210" 32 bool "SAMSUNG EXYNOS4210"
33 depends on CPU_EXYNOS4210 33 depends on CPU_EXYNOS4210 && !ARCH_MULTIPLATFORM
34 default y 34 default y
35 select ARM_EXYNOS_CPUFREQ 35 select ARM_EXYNOS_CPUFREQ
36 help 36 help
@@ -41,7 +41,7 @@ config ARM_EXYNOS4210_CPUFREQ
41 41
42config ARM_EXYNOS4X12_CPUFREQ 42config ARM_EXYNOS4X12_CPUFREQ
43 bool "SAMSUNG EXYNOS4x12" 43 bool "SAMSUNG EXYNOS4x12"
44 depends on (SOC_EXYNOS4212 || SOC_EXYNOS4412) 44 depends on (SOC_EXYNOS4212 || SOC_EXYNOS4412) && !ARCH_MULTIPLATFORM
45 default y 45 default y
46 select ARM_EXYNOS_CPUFREQ 46 select ARM_EXYNOS_CPUFREQ
47 help 47 help
@@ -52,7 +52,7 @@ config ARM_EXYNOS4X12_CPUFREQ
52 52
53config ARM_EXYNOS5250_CPUFREQ 53config ARM_EXYNOS5250_CPUFREQ
54 bool "SAMSUNG EXYNOS5250" 54 bool "SAMSUNG EXYNOS5250"
55 depends on SOC_EXYNOS5250 55 depends on SOC_EXYNOS5250 && !ARCH_MULTIPLATFORM
56 default y 56 default y
57 select ARM_EXYNOS_CPUFREQ 57 select ARM_EXYNOS_CPUFREQ
58 help 58 help
diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
index ca0021a96e19..72564b701b4a 100644
--- a/drivers/cpufreq/Kconfig.powerpc
+++ b/drivers/cpufreq/Kconfig.powerpc
@@ -54,3 +54,11 @@ config PPC_PASEMI_CPUFREQ
54 help 54 help
55 This adds the support for frequency switching on PA Semi 55 This adds the support for frequency switching on PA Semi
56 PWRficient processors. 56 PWRficient processors.
57
58config POWERNV_CPUFREQ
59 tristate "CPU frequency scaling for IBM POWERNV platform"
60 depends on PPC_POWERNV
61 default y
62 help
63 This adds support for CPU frequency switching on IBM POWERNV
64 platform
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 74945652dd7a..0dbb963c1aef 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -86,6 +86,7 @@ obj-$(CONFIG_PPC_CORENET_CPUFREQ) += ppc-corenet-cpufreq.o
86obj-$(CONFIG_CPU_FREQ_PMAC) += pmac32-cpufreq.o 86obj-$(CONFIG_CPU_FREQ_PMAC) += pmac32-cpufreq.o
87obj-$(CONFIG_CPU_FREQ_PMAC64) += pmac64-cpufreq.o 87obj-$(CONFIG_CPU_FREQ_PMAC64) += pmac64-cpufreq.o
88obj-$(CONFIG_PPC_PASEMI_CPUFREQ) += pasemi-cpufreq.o 88obj-$(CONFIG_PPC_PASEMI_CPUFREQ) += pasemi-cpufreq.o
89obj-$(CONFIG_POWERNV_CPUFREQ) += powernv-cpufreq.o
89 90
90################################################################################## 91##################################################################################
91# Other platform drivers 92# Other platform drivers
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index d5eaedbe464f..000e4e0afd7e 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -754,7 +754,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
754 goto err_unreg; 754 goto err_unreg;
755 } 755 }
756 756
757 data->freq_table = kmalloc(sizeof(*data->freq_table) * 757 data->freq_table = kzalloc(sizeof(*data->freq_table) *
758 (perf->state_count+1), GFP_KERNEL); 758 (perf->state_count+1), GFP_KERNEL);
759 if (!data->freq_table) { 759 if (!data->freq_table) {
760 result = -ENOMEM; 760 result = -ENOMEM;
diff --git a/drivers/cpufreq/at32ap-cpufreq.c b/drivers/cpufreq/at32ap-cpufreq.c
index a1c79f549edb..7b612c8bb09e 100644
--- a/drivers/cpufreq/at32ap-cpufreq.c
+++ b/drivers/cpufreq/at32ap-cpufreq.c
@@ -52,7 +52,7 @@ static int at32_set_target(struct cpufreq_policy *policy, unsigned int index)
52static int at32_cpufreq_driver_init(struct cpufreq_policy *policy) 52static int at32_cpufreq_driver_init(struct cpufreq_policy *policy)
53{ 53{
54 unsigned int frequency, rate, min_freq; 54 unsigned int frequency, rate, min_freq;
55 static struct clk *cpuclk; 55 struct clk *cpuclk;
56 int retval, steps, i; 56 int retval, steps, i;
57 57
58 if (policy->cpu != 0) 58 if (policy->cpu != 0)
diff --git a/drivers/cpufreq/cris-artpec3-cpufreq.c b/drivers/cpufreq/cris-artpec3-cpufreq.c
index d4573032cbbc..601b88c490cf 100644
--- a/drivers/cpufreq/cris-artpec3-cpufreq.c
+++ b/drivers/cpufreq/cris-artpec3-cpufreq.c
@@ -15,9 +15,9 @@ static struct notifier_block cris_sdram_freq_notifier_block = {
15}; 15};
16 16
17static struct cpufreq_frequency_table cris_freq_table[] = { 17static struct cpufreq_frequency_table cris_freq_table[] = {
18 {0x01, 6000}, 18 {0, 0x01, 6000},
19 {0x02, 200000}, 19 {0, 0x02, 200000},
20 {0, CPUFREQ_TABLE_END}, 20 {0, 0, CPUFREQ_TABLE_END},
21}; 21};
22 22
23static unsigned int cris_freq_get_cpu_frequency(unsigned int cpu) 23static unsigned int cris_freq_get_cpu_frequency(unsigned int cpu)
diff --git a/drivers/cpufreq/cris-etraxfs-cpufreq.c b/drivers/cpufreq/cris-etraxfs-cpufreq.c
index 13c3361437f7..22b2cdde74d9 100644
--- a/drivers/cpufreq/cris-etraxfs-cpufreq.c
+++ b/drivers/cpufreq/cris-etraxfs-cpufreq.c
@@ -15,9 +15,9 @@ static struct notifier_block cris_sdram_freq_notifier_block = {
15}; 15};
16 16
17static struct cpufreq_frequency_table cris_freq_table[] = { 17static struct cpufreq_frequency_table cris_freq_table[] = {
18 {0x01, 6000}, 18 {0, 0x01, 6000},
19 {0x02, 200000}, 19 {0, 0x02, 200000},
20 {0, CPUFREQ_TABLE_END}, 20 {0, 0, CPUFREQ_TABLE_END},
21}; 21};
22 22
23static unsigned int cris_freq_get_cpu_frequency(unsigned int cpu) 23static unsigned int cris_freq_get_cpu_frequency(unsigned int cpu)
diff --git a/drivers/cpufreq/elanfreq.c b/drivers/cpufreq/elanfreq.c
index c987e94708f5..7f5d2a68c353 100644
--- a/drivers/cpufreq/elanfreq.c
+++ b/drivers/cpufreq/elanfreq.c
@@ -56,15 +56,15 @@ static struct s_elan_multiplier elan_multiplier[] = {
56}; 56};
57 57
58static struct cpufreq_frequency_table elanfreq_table[] = { 58static struct cpufreq_frequency_table elanfreq_table[] = {
59 {0, 1000}, 59 {0, 0, 1000},
60 {1, 2000}, 60 {0, 1, 2000},
61 {2, 4000}, 61 {0, 2, 4000},
62 {3, 8000}, 62 {0, 3, 8000},
63 {4, 16000}, 63 {0, 4, 16000},
64 {5, 33000}, 64 {0, 5, 33000},
65 {6, 66000}, 65 {0, 6, 66000},
66 {7, 99000}, 66 {0, 7, 99000},
67 {0, CPUFREQ_TABLE_END}, 67 {0, 0, CPUFREQ_TABLE_END},
68}; 68};
69 69
70 70
diff --git a/drivers/cpufreq/exynos4210-cpufreq.c b/drivers/cpufreq/exynos4210-cpufreq.c
index 40d84c43d8f4..6384e5b9a347 100644
--- a/drivers/cpufreq/exynos4210-cpufreq.c
+++ b/drivers/cpufreq/exynos4210-cpufreq.c
@@ -29,12 +29,12 @@ static unsigned int exynos4210_volt_table[] = {
29}; 29};
30 30
31static struct cpufreq_frequency_table exynos4210_freq_table[] = { 31static struct cpufreq_frequency_table exynos4210_freq_table[] = {
32 {L0, 1200 * 1000}, 32 {0, L0, 1200 * 1000},
33 {L1, 1000 * 1000}, 33 {0, L1, 1000 * 1000},
34 {L2, 800 * 1000}, 34 {0, L2, 800 * 1000},
35 {L3, 500 * 1000}, 35 {0, L3, 500 * 1000},
36 {L4, 200 * 1000}, 36 {0, L4, 200 * 1000},
37 {0, CPUFREQ_TABLE_END}, 37 {0, 0, CPUFREQ_TABLE_END},
38}; 38};
39 39
40static struct apll_freq apll_freq_4210[] = { 40static struct apll_freq apll_freq_4210[] = {
diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index 7c11ace3b3fc..466c76ad335b 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -30,21 +30,21 @@ static unsigned int exynos4x12_volt_table[] = {
30}; 30};
31 31
32static struct cpufreq_frequency_table exynos4x12_freq_table[] = { 32static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
33 {CPUFREQ_BOOST_FREQ, 1500 * 1000}, 33 {CPUFREQ_BOOST_FREQ, L0, 1500 * 1000},
34 {L1, 1400 * 1000}, 34 {0, L1, 1400 * 1000},
35 {L2, 1300 * 1000}, 35 {0, L2, 1300 * 1000},
36 {L3, 1200 * 1000}, 36 {0, L3, 1200 * 1000},
37 {L4, 1100 * 1000}, 37 {0, L4, 1100 * 1000},
38 {L5, 1000 * 1000}, 38 {0, L5, 1000 * 1000},
39 {L6, 900 * 1000}, 39 {0, L6, 900 * 1000},
40 {L7, 800 * 1000}, 40 {0, L7, 800 * 1000},
41 {L8, 700 * 1000}, 41 {0, L8, 700 * 1000},
42 {L9, 600 * 1000}, 42 {0, L9, 600 * 1000},
43 {L10, 500 * 1000}, 43 {0, L10, 500 * 1000},
44 {L11, 400 * 1000}, 44 {0, L11, 400 * 1000},
45 {L12, 300 * 1000}, 45 {0, L12, 300 * 1000},
46 {L13, 200 * 1000}, 46 {0, L13, 200 * 1000},
47 {0, CPUFREQ_TABLE_END}, 47 {0, 0, CPUFREQ_TABLE_END},
48}; 48};
49 49
50static struct apll_freq *apll_freq_4x12; 50static struct apll_freq *apll_freq_4x12;
diff --git a/drivers/cpufreq/exynos5250-cpufreq.c b/drivers/cpufreq/exynos5250-cpufreq.c
index 5f90b82a4082..363a0b3fe1b1 100644
--- a/drivers/cpufreq/exynos5250-cpufreq.c
+++ b/drivers/cpufreq/exynos5250-cpufreq.c
@@ -34,23 +34,23 @@ static unsigned int exynos5250_volt_table[] = {
34}; 34};
35 35
36static struct cpufreq_frequency_table exynos5250_freq_table[] = { 36static struct cpufreq_frequency_table exynos5250_freq_table[] = {
37 {L0, 1700 * 1000}, 37 {0, L0, 1700 * 1000},
38 {L1, 1600 * 1000}, 38 {0, L1, 1600 * 1000},
39 {L2, 1500 * 1000}, 39 {0, L2, 1500 * 1000},
40 {L3, 1400 * 1000}, 40 {0, L3, 1400 * 1000},
41 {L4, 1300 * 1000}, 41 {0, L4, 1300 * 1000},
42 {L5, 1200 * 1000}, 42 {0, L5, 1200 * 1000},
43 {L6, 1100 * 1000}, 43 {0, L6, 1100 * 1000},
44 {L7, 1000 * 1000}, 44 {0, L7, 1000 * 1000},
45 {L8, 900 * 1000}, 45 {0, L8, 900 * 1000},
46 {L9, 800 * 1000}, 46 {0, L9, 800 * 1000},
47 {L10, 700 * 1000}, 47 {0, L10, 700 * 1000},
48 {L11, 600 * 1000}, 48 {0, L11, 600 * 1000},
49 {L12, 500 * 1000}, 49 {0, L12, 500 * 1000},
50 {L13, 400 * 1000}, 50 {0, L13, 400 * 1000},
51 {L14, 300 * 1000}, 51 {0, L14, 300 * 1000},
52 {L15, 200 * 1000}, 52 {0, L15, 200 * 1000},
53 {0, CPUFREQ_TABLE_END}, 53 {0, 0, CPUFREQ_TABLE_END},
54}; 54};
55 55
56static struct apll_freq apll_freq_5250[] = { 56static struct apll_freq apll_freq_5250[] = {
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index 65a477075b3f..08e7bbcf6d73 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -33,11 +33,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
33 continue; 33 continue;
34 } 34 }
35 if (!cpufreq_boost_enabled() 35 if (!cpufreq_boost_enabled()
36 && table[i].driver_data == CPUFREQ_BOOST_FREQ) 36 && (table[i].flags & CPUFREQ_BOOST_FREQ))
37 continue; 37 continue;
38 38
39 pr_debug("table entry %u: %u kHz, %u driver_data\n", 39 pr_debug("table entry %u: %u kHz\n", i, freq);
40 i, freq, table[i].driver_data);
41 if (freq < min_freq) 40 if (freq < min_freq)
42 min_freq = freq; 41 min_freq = freq;
43 if (freq > max_freq) 42 if (freq > max_freq)
@@ -175,8 +174,8 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
175 } else 174 } else
176 *index = optimal.driver_data; 175 *index = optimal.driver_data;
177 176
178 pr_debug("target is %u (%u kHz, %u)\n", *index, table[*index].frequency, 177 pr_debug("target index is %u, freq is:%u kHz\n", *index,
179 table[*index].driver_data); 178 table[*index].frequency);
180 179
181 return 0; 180 return 0;
182} 181}
@@ -230,7 +229,7 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
230 * show_boost = false and driver_data != BOOST freq 229 * show_boost = false and driver_data != BOOST freq
231 * display NON BOOST freqs 230 * display NON BOOST freqs
232 */ 231 */
233 if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ)) 232 if (show_boost ^ (table[i].flags & CPUFREQ_BOOST_FREQ))
234 continue; 233 continue;
235 234
236 count += sprintf(&buf[count], "%d ", table[i].frequency); 235 count += sprintf(&buf[count], "%d ", table[i].frequency);
diff --git a/drivers/cpufreq/ia64-acpi-cpufreq.c b/drivers/cpufreq/ia64-acpi-cpufreq.c
index a22b5d182e0e..c30aaa6a54e8 100644
--- a/drivers/cpufreq/ia64-acpi-cpufreq.c
+++ b/drivers/cpufreq/ia64-acpi-cpufreq.c
@@ -254,7 +254,7 @@ acpi_cpufreq_cpu_init (
254 } 254 }
255 255
256 /* alloc freq_table */ 256 /* alloc freq_table */
257 data->freq_table = kmalloc(sizeof(*data->freq_table) * 257 data->freq_table = kzalloc(sizeof(*data->freq_table) *
258 (data->acpi_data.state_count + 1), 258 (data->acpi_data.state_count + 1),
259 GFP_KERNEL); 259 GFP_KERNEL);
260 if (!data->freq_table) { 260 if (!data->freq_table) {
@@ -275,7 +275,6 @@ acpi_cpufreq_cpu_init (
275 /* table init */ 275 /* table init */
276 for (i = 0; i <= data->acpi_data.state_count; i++) 276 for (i = 0; i <= data->acpi_data.state_count; i++)
277 { 277 {
278 data->freq_table[i].driver_data = i;
279 if (i < data->acpi_data.state_count) { 278 if (i < data->acpi_data.state_count) {
280 data->freq_table[i].frequency = 279 data->freq_table[i].frequency =
281 data->acpi_data.states[i].core_frequency * 1000; 280 data->acpi_data.states[i].core_frequency * 1000;
diff --git a/drivers/cpufreq/kirkwood-cpufreq.c b/drivers/cpufreq/kirkwood-cpufreq.c
index 3d114bc5a97a..37a480680cd0 100644
--- a/drivers/cpufreq/kirkwood-cpufreq.c
+++ b/drivers/cpufreq/kirkwood-cpufreq.c
@@ -43,9 +43,9 @@ static struct priv
43 * table. 43 * table.
44 */ 44 */
45static struct cpufreq_frequency_table kirkwood_freq_table[] = { 45static struct cpufreq_frequency_table kirkwood_freq_table[] = {
46 {STATE_CPU_FREQ, 0}, /* CPU uses cpuclk */ 46 {0, STATE_CPU_FREQ, 0}, /* CPU uses cpuclk */
47 {STATE_DDR_FREQ, 0}, /* CPU uses ddrclk */ 47 {0, STATE_DDR_FREQ, 0}, /* CPU uses ddrclk */
48 {0, CPUFREQ_TABLE_END}, 48 {0, 0, CPUFREQ_TABLE_END},
49}; 49};
50 50
51static unsigned int kirkwood_cpufreq_get_cpu_frequency(unsigned int cpu) 51static unsigned int kirkwood_cpufreq_get_cpu_frequency(unsigned int cpu)
diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c
index 5c440f87ba8a..d00e5d1abd25 100644
--- a/drivers/cpufreq/longhaul.c
+++ b/drivers/cpufreq/longhaul.c
@@ -475,7 +475,7 @@ static int longhaul_get_ranges(void)
475 return -EINVAL; 475 return -EINVAL;
476 } 476 }
477 477
478 longhaul_table = kmalloc((numscales + 1) * sizeof(*longhaul_table), 478 longhaul_table = kzalloc((numscales + 1) * sizeof(*longhaul_table),
479 GFP_KERNEL); 479 GFP_KERNEL);
480 if (!longhaul_table) 480 if (!longhaul_table)
481 return -ENOMEM; 481 return -ENOMEM;
diff --git a/drivers/cpufreq/loongson2_cpufreq.c b/drivers/cpufreq/loongson2_cpufreq.c
index a3588d61d933..f0bc31f5db27 100644
--- a/drivers/cpufreq/loongson2_cpufreq.c
+++ b/drivers/cpufreq/loongson2_cpufreq.c
@@ -69,7 +69,7 @@ static int loongson2_cpufreq_target(struct cpufreq_policy *policy,
69 69
70static int loongson2_cpufreq_cpu_init(struct cpufreq_policy *policy) 70static int loongson2_cpufreq_cpu_init(struct cpufreq_policy *policy)
71{ 71{
72 static struct clk *cpuclk; 72 struct clk *cpuclk;
73 int i; 73 int i;
74 unsigned long rate; 74 unsigned long rate;
75 int ret; 75 int ret;
diff --git a/drivers/cpufreq/maple-cpufreq.c b/drivers/cpufreq/maple-cpufreq.c
index c4dfa42a75ac..cc3408fc073f 100644
--- a/drivers/cpufreq/maple-cpufreq.c
+++ b/drivers/cpufreq/maple-cpufreq.c
@@ -59,9 +59,9 @@
59#define CPUFREQ_LOW 1 59#define CPUFREQ_LOW 1
60 60
61static struct cpufreq_frequency_table maple_cpu_freqs[] = { 61static struct cpufreq_frequency_table maple_cpu_freqs[] = {
62 {CPUFREQ_HIGH, 0}, 62 {0, CPUFREQ_HIGH, 0},
63 {CPUFREQ_LOW, 0}, 63 {0, CPUFREQ_LOW, 0},
64 {0, CPUFREQ_TABLE_END}, 64 {0, 0, CPUFREQ_TABLE_END},
65}; 65};
66 66
67/* Power mode data is an array of the 32 bits PCR values to use for 67/* Power mode data is an array of the 32 bits PCR values to use for
diff --git a/drivers/cpufreq/p4-clockmod.c b/drivers/cpufreq/p4-clockmod.c
index 74f593e70e19..529cfd92158f 100644
--- a/drivers/cpufreq/p4-clockmod.c
+++ b/drivers/cpufreq/p4-clockmod.c
@@ -92,16 +92,16 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
92 92
93 93
94static struct cpufreq_frequency_table p4clockmod_table[] = { 94static struct cpufreq_frequency_table p4clockmod_table[] = {
95 {DC_RESV, CPUFREQ_ENTRY_INVALID}, 95 {0, DC_RESV, CPUFREQ_ENTRY_INVALID},
96 {DC_DFLT, 0}, 96 {0, DC_DFLT, 0},
97 {DC_25PT, 0}, 97 {0, DC_25PT, 0},
98 {DC_38PT, 0}, 98 {0, DC_38PT, 0},
99 {DC_50PT, 0}, 99 {0, DC_50PT, 0},
100 {DC_64PT, 0}, 100 {0, DC_64PT, 0},
101 {DC_75PT, 0}, 101 {0, DC_75PT, 0},
102 {DC_88PT, 0}, 102 {0, DC_88PT, 0},
103 {DC_DISABLE, 0}, 103 {0, DC_DISABLE, 0},
104 {DC_RESV, CPUFREQ_TABLE_END}, 104 {0, DC_RESV, CPUFREQ_TABLE_END},
105}; 105};
106 106
107 107
diff --git a/drivers/cpufreq/pasemi-cpufreq.c b/drivers/cpufreq/pasemi-cpufreq.c
index 6a2b7d3e85a7..84c84b5f0f3a 100644
--- a/drivers/cpufreq/pasemi-cpufreq.c
+++ b/drivers/cpufreq/pasemi-cpufreq.c
@@ -60,12 +60,12 @@ static int current_astate;
60 60
61/* We support 5(A0-A4) power states excluding turbo(A5-A6) modes */ 61/* We support 5(A0-A4) power states excluding turbo(A5-A6) modes */
62static struct cpufreq_frequency_table pas_freqs[] = { 62static struct cpufreq_frequency_table pas_freqs[] = {
63 {0, 0}, 63 {0, 0, 0},
64 {1, 0}, 64 {0, 1, 0},
65 {2, 0}, 65 {0, 2, 0},
66 {3, 0}, 66 {0, 3, 0},
67 {4, 0}, 67 {0, 4, 0},
68 {0, CPUFREQ_TABLE_END}, 68 {0, 0, CPUFREQ_TABLE_END},
69}; 69};
70 70
71/* 71/*
diff --git a/drivers/cpufreq/pmac32-cpufreq.c b/drivers/cpufreq/pmac32-cpufreq.c
index cf55d202f332..7615180d7ee3 100644
--- a/drivers/cpufreq/pmac32-cpufreq.c
+++ b/drivers/cpufreq/pmac32-cpufreq.c
@@ -81,9 +81,9 @@ static int is_pmu_based;
81#define CPUFREQ_LOW 1 81#define CPUFREQ_LOW 1
82 82
83static struct cpufreq_frequency_table pmac_cpu_freqs[] = { 83static struct cpufreq_frequency_table pmac_cpu_freqs[] = {
84 {CPUFREQ_HIGH, 0}, 84 {0, CPUFREQ_HIGH, 0},
85 {CPUFREQ_LOW, 0}, 85 {0, CPUFREQ_LOW, 0},
86 {0, CPUFREQ_TABLE_END}, 86 {0, 0, CPUFREQ_TABLE_END},
87}; 87};
88 88
89static inline void local_delay(unsigned long ms) 89static inline void local_delay(unsigned long ms)
diff --git a/drivers/cpufreq/pmac64-cpufreq.c b/drivers/cpufreq/pmac64-cpufreq.c
index 6a338f8c3860..8bc422977b5b 100644
--- a/drivers/cpufreq/pmac64-cpufreq.c
+++ b/drivers/cpufreq/pmac64-cpufreq.c
@@ -65,9 +65,9 @@
65#define CPUFREQ_LOW 1 65#define CPUFREQ_LOW 1
66 66
67static struct cpufreq_frequency_table g5_cpu_freqs[] = { 67static struct cpufreq_frequency_table g5_cpu_freqs[] = {
68 {CPUFREQ_HIGH, 0}, 68 {0, CPUFREQ_HIGH, 0},
69 {CPUFREQ_LOW, 0}, 69 {0, CPUFREQ_LOW, 0},
70 {0, CPUFREQ_TABLE_END}, 70 {0, 0, CPUFREQ_TABLE_END},
71}; 71};
72 72
73/* Power mode data is an array of the 32 bits PCR values to use for 73/* Power mode data is an array of the 32 bits PCR values to use for
diff --git a/drivers/cpufreq/powernow-k6.c b/drivers/cpufreq/powernow-k6.c
index 62c6f2e5afce..49f120e1bc7b 100644
--- a/drivers/cpufreq/powernow-k6.c
+++ b/drivers/cpufreq/powernow-k6.c
@@ -37,15 +37,15 @@ MODULE_PARM_DESC(bus_frequency, "Bus frequency in kHz");
37 37
38/* Clock ratio multiplied by 10 - see table 27 in AMD#23446 */ 38/* Clock ratio multiplied by 10 - see table 27 in AMD#23446 */
39static struct cpufreq_frequency_table clock_ratio[] = { 39static struct cpufreq_frequency_table clock_ratio[] = {
40 {60, /* 110 -> 6.0x */ 0}, 40 {0, 60, /* 110 -> 6.0x */ 0},
41 {55, /* 011 -> 5.5x */ 0}, 41 {0, 55, /* 011 -> 5.5x */ 0},
42 {50, /* 001 -> 5.0x */ 0}, 42 {0, 50, /* 001 -> 5.0x */ 0},
43 {45, /* 000 -> 4.5x */ 0}, 43 {0, 45, /* 000 -> 4.5x */ 0},
44 {40, /* 010 -> 4.0x */ 0}, 44 {0, 40, /* 010 -> 4.0x */ 0},
45 {35, /* 111 -> 3.5x */ 0}, 45 {0, 35, /* 111 -> 3.5x */ 0},
46 {30, /* 101 -> 3.0x */ 0}, 46 {0, 30, /* 101 -> 3.0x */ 0},
47 {20, /* 100 -> 2.0x */ 0}, 47 {0, 20, /* 100 -> 2.0x */ 0},
48 {0, CPUFREQ_TABLE_END} 48 {0, 0, CPUFREQ_TABLE_END}
49}; 49};
50 50
51static const u8 index_to_register[8] = { 6, 3, 1, 0, 2, 7, 5, 4 }; 51static const u8 index_to_register[8] = { 6, 3, 1, 0, 2, 7, 5, 4 };
diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c
index 770a9e1b3468..1b6ae6b57c11 100644
--- a/drivers/cpufreq/powernow-k8.c
+++ b/drivers/cpufreq/powernow-k8.c
@@ -623,7 +623,7 @@ static int fill_powernow_table(struct powernow_k8_data *data,
623 if (check_pst_table(data, pst, maxvid)) 623 if (check_pst_table(data, pst, maxvid))
624 return -EINVAL; 624 return -EINVAL;
625 625
626 powernow_table = kmalloc((sizeof(*powernow_table) 626 powernow_table = kzalloc((sizeof(*powernow_table)
627 * (data->numps + 1)), GFP_KERNEL); 627 * (data->numps + 1)), GFP_KERNEL);
628 if (!powernow_table) { 628 if (!powernow_table) {
629 printk(KERN_ERR PFX "powernow_table memory alloc failure\n"); 629 printk(KERN_ERR PFX "powernow_table memory alloc failure\n");
@@ -793,7 +793,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
793 } 793 }
794 794
795 /* fill in data->powernow_table */ 795 /* fill in data->powernow_table */
796 powernow_table = kmalloc((sizeof(*powernow_table) 796 powernow_table = kzalloc((sizeof(*powernow_table)
797 * (data->acpi_data.state_count + 1)), GFP_KERNEL); 797 * (data->acpi_data.state_count + 1)), GFP_KERNEL);
798 if (!powernow_table) { 798 if (!powernow_table) {
799 pr_debug("powernow_table memory alloc failure\n"); 799 pr_debug("powernow_table memory alloc failure\n");
@@ -810,7 +810,6 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
810 810
811 powernow_table[data->acpi_data.state_count].frequency = 811 powernow_table[data->acpi_data.state_count].frequency =
812 CPUFREQ_TABLE_END; 812 CPUFREQ_TABLE_END;
813 powernow_table[data->acpi_data.state_count].driver_data = 0;
814 data->powernow_table = powernow_table; 813 data->powernow_table = powernow_table;
815 814
816 if (cpumask_first(cpu_core_mask(data->cpu)) == data->cpu) 815 if (cpumask_first(cpu_core_mask(data->cpu)) == data->cpu)
diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
new file mode 100644
index 000000000000..9edccc63245d
--- /dev/null
+++ b/drivers/cpufreq/powernv-cpufreq.c
@@ -0,0 +1,341 @@
1/*
2 * POWERNV cpufreq driver for the IBM POWER processors
3 *
4 * (C) Copyright IBM 2014
5 *
6 * Author: Vaidyanathan Srinivasan <svaidy at linux.vnet.ibm.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 */
19
20#define pr_fmt(fmt) "powernv-cpufreq: " fmt
21
22#include <linux/kernel.h>
23#include <linux/sysfs.h>
24#include <linux/cpumask.h>
25#include <linux/module.h>
26#include <linux/cpufreq.h>
27#include <linux/smp.h>
28#include <linux/of.h>
29
30#include <asm/cputhreads.h>
31#include <asm/reg.h>
32
33#define POWERNV_MAX_PSTATES 256
34
35static struct cpufreq_frequency_table powernv_freqs[POWERNV_MAX_PSTATES+1];
36
37/*
38 * Note: The set of pstates consists of contiguous integers, the
39 * smallest of which is indicated by powernv_pstate_info.min, the
40 * largest of which is indicated by powernv_pstate_info.max.
41 *
42 * The nominal pstate is the highest non-turbo pstate in this
43 * platform. This is indicated by powernv_pstate_info.nominal.
44 */
45static struct powernv_pstate_info {
46 int min;
47 int max;
48 int nominal;
49 int nr_pstates;
50} powernv_pstate_info;
51
52/*
53 * Initialize the freq table based on data obtained
54 * from the firmware passed via device-tree
55 */
56static int init_powernv_pstates(void)
57{
58 struct device_node *power_mgt;
59 int i, pstate_min, pstate_max, pstate_nominal, nr_pstates = 0;
60 const __be32 *pstate_ids, *pstate_freqs;
61 u32 len_ids, len_freqs;
62
63 power_mgt = of_find_node_by_path("/ibm,opal/power-mgt");
64 if (!power_mgt) {
65 pr_warn("power-mgt node not found\n");
66 return -ENODEV;
67 }
68
69 if (of_property_read_u32(power_mgt, "ibm,pstate-min", &pstate_min)) {
70 pr_warn("ibm,pstate-min node not found\n");
71 return -ENODEV;
72 }
73
74 if (of_property_read_u32(power_mgt, "ibm,pstate-max", &pstate_max)) {
75 pr_warn("ibm,pstate-max node not found\n");
76 return -ENODEV;
77 }
78
79 if (of_property_read_u32(power_mgt, "ibm,pstate-nominal",
80 &pstate_nominal)) {
81 pr_warn("ibm,pstate-nominal not found\n");
82 return -ENODEV;
83 }
84 pr_info("cpufreq pstate min %d nominal %d max %d\n", pstate_min,
85 pstate_nominal, pstate_max);
86
87 pstate_ids = of_get_property(power_mgt, "ibm,pstate-ids", &len_ids);
88 if (!pstate_ids) {
89 pr_warn("ibm,pstate-ids not found\n");
90 return -ENODEV;
91 }
92
93 pstate_freqs = of_get_property(power_mgt, "ibm,pstate-frequencies-mhz",
94 &len_freqs);
95 if (!pstate_freqs) {
96 pr_warn("ibm,pstate-frequencies-mhz not found\n");
97 return -ENODEV;
98 }
99
100 WARN_ON(len_ids != len_freqs);
101 nr_pstates = min(len_ids, len_freqs) / sizeof(u32);
102 if (!nr_pstates) {
103 pr_warn("No PStates found\n");
104 return -ENODEV;
105 }
106
107 pr_debug("NR PStates %d\n", nr_pstates);
108 for (i = 0; i < nr_pstates; i++) {
109 u32 id = be32_to_cpu(pstate_ids[i]);
110 u32 freq = be32_to_cpu(pstate_freqs[i]);
111
112 pr_debug("PState id %d freq %d MHz\n", id, freq);
113 powernv_freqs[i].frequency = freq * 1000; /* kHz */
114 powernv_freqs[i].driver_data = id;
115 }
116 /* End of list marker entry */
117 powernv_freqs[i].frequency = CPUFREQ_TABLE_END;
118
119 powernv_pstate_info.min = pstate_min;
120 powernv_pstate_info.max = pstate_max;
121 powernv_pstate_info.nominal = pstate_nominal;
122 powernv_pstate_info.nr_pstates = nr_pstates;
123
124 return 0;
125}
126
127/* Returns the CPU frequency corresponding to the pstate_id. */
128static unsigned int pstate_id_to_freq(int pstate_id)
129{
130 int i;
131
132 i = powernv_pstate_info.max - pstate_id;
133 BUG_ON(i >= powernv_pstate_info.nr_pstates || i < 0);
134
135 return powernv_freqs[i].frequency;
136}
137
138/*
139 * cpuinfo_nominal_freq_show - Show the nominal CPU frequency as indicated by
140 * the firmware
141 */
142static ssize_t cpuinfo_nominal_freq_show(struct cpufreq_policy *policy,
143 char *buf)
144{
145 return sprintf(buf, "%u\n",
146 pstate_id_to_freq(powernv_pstate_info.nominal));
147}
148
149struct freq_attr cpufreq_freq_attr_cpuinfo_nominal_freq =
150 __ATTR_RO(cpuinfo_nominal_freq);
151
152static struct freq_attr *powernv_cpu_freq_attr[] = {
153 &cpufreq_freq_attr_scaling_available_freqs,
154 &cpufreq_freq_attr_cpuinfo_nominal_freq,
155 NULL,
156};
157
158/* Helper routines */
159
160/* Access helpers to power mgt SPR */
161
162static inline unsigned long get_pmspr(unsigned long sprn)
163{
164 switch (sprn) {
165 case SPRN_PMCR:
166 return mfspr(SPRN_PMCR);
167
168 case SPRN_PMICR:
169 return mfspr(SPRN_PMICR);
170
171 case SPRN_PMSR:
172 return mfspr(SPRN_PMSR);
173 }
174 BUG();
175}
176
177static inline void set_pmspr(unsigned long sprn, unsigned long val)
178{
179 switch (sprn) {
180 case SPRN_PMCR:
181 mtspr(SPRN_PMCR, val);
182 return;
183
184 case SPRN_PMICR:
185 mtspr(SPRN_PMICR, val);
186 return;
187 }
188 BUG();
189}
190
191/*
192 * Use objects of this type to query/update
193 * pstates on a remote CPU via smp_call_function.
194 */
195struct powernv_smp_call_data {
196 unsigned int freq;
197 int pstate_id;
198};
199
200/*
201 * powernv_read_cpu_freq: Reads the current frequency on this CPU.
202 *
203 * Called via smp_call_function.
204 *
205 * Note: The caller of the smp_call_function should pass an argument of
206 * the type 'struct powernv_smp_call_data *' along with this function.
207 *
208 * The current frequency on this CPU will be returned via
209 * ((struct powernv_smp_call_data *)arg)->freq;
210 */
211static void powernv_read_cpu_freq(void *arg)
212{
213 unsigned long pmspr_val;
214 s8 local_pstate_id;
215 struct powernv_smp_call_data *freq_data = arg;
216
217 pmspr_val = get_pmspr(SPRN_PMSR);
218
219 /*
220 * The local pstate id corresponds bits 48..55 in the PMSR.
221 * Note: Watch out for the sign!
222 */
223 local_pstate_id = (pmspr_val >> 48) & 0xFF;
224 freq_data->pstate_id = local_pstate_id;
225 freq_data->freq = pstate_id_to_freq(freq_data->pstate_id);
226
227 pr_debug("cpu %d pmsr %016lX pstate_id %d frequency %d kHz\n",
228 raw_smp_processor_id(), pmspr_val, freq_data->pstate_id,
229 freq_data->freq);
230}
231
232/*
233 * powernv_cpufreq_get: Returns the CPU frequency as reported by the
234 * firmware for CPU 'cpu'. This value is reported through the sysfs
235 * file cpuinfo_cur_freq.
236 */
237unsigned int powernv_cpufreq_get(unsigned int cpu)
238{
239 struct powernv_smp_call_data freq_data;
240
241 smp_call_function_any(cpu_sibling_mask(cpu), powernv_read_cpu_freq,
242 &freq_data, 1);
243
244 return freq_data.freq;
245}
246
247/*
248 * set_pstate: Sets the pstate on this CPU.
249 *
250 * This is called via an smp_call_function.
251 *
252 * The caller must ensure that freq_data is of the type
253 * (struct powernv_smp_call_data *) and the pstate_id which needs to be set
254 * on this CPU should be present in freq_data->pstate_id.
255 */
256static void set_pstate(void *freq_data)
257{
258 unsigned long val;
259 unsigned long pstate_ul =
260 ((struct powernv_smp_call_data *) freq_data)->pstate_id;
261
262 val = get_pmspr(SPRN_PMCR);
263 val = val & 0x0000FFFFFFFFFFFFULL;
264
265 pstate_ul = pstate_ul & 0xFF;
266
267 /* Set both global(bits 56..63) and local(bits 48..55) PStates */
268 val = val | (pstate_ul << 56) | (pstate_ul << 48);
269
270 pr_debug("Setting cpu %d pmcr to %016lX\n",
271 raw_smp_processor_id(), val);
272 set_pmspr(SPRN_PMCR, val);
273}
274
275/*
276 * powernv_cpufreq_target_index: Sets the frequency corresponding to
277 * the cpufreq table entry indexed by new_index on the cpus in the
278 * mask policy->cpus
279 */
280static int powernv_cpufreq_target_index(struct cpufreq_policy *policy,
281 unsigned int new_index)
282{
283 struct powernv_smp_call_data freq_data;
284
285 freq_data.pstate_id = powernv_freqs[new_index].driver_data;
286
287 /*
288 * Use smp_call_function to send IPI and execute the
289 * mtspr on target CPU. We could do that without IPI
290 * if current CPU is within policy->cpus (core)
291 */
292 smp_call_function_any(policy->cpus, set_pstate, &freq_data, 1);
293
294 return 0;
295}
296
297static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
298{
299 int base, i;
300
301 base = cpu_first_thread_sibling(policy->cpu);
302
303 for (i = 0; i < threads_per_core; i++)
304 cpumask_set_cpu(base + i, policy->cpus);
305
306 return cpufreq_table_validate_and_show(policy, powernv_freqs);
307}
308
309static struct cpufreq_driver powernv_cpufreq_driver = {
310 .name = "powernv-cpufreq",
311 .flags = CPUFREQ_CONST_LOOPS,
312 .init = powernv_cpufreq_cpu_init,
313 .verify = cpufreq_generic_frequency_table_verify,
314 .target_index = powernv_cpufreq_target_index,
315 .get = powernv_cpufreq_get,
316 .attr = powernv_cpu_freq_attr,
317};
318
319static int __init powernv_cpufreq_init(void)
320{
321 int rc = 0;
322
323 /* Discover pstates from device tree and init */
324 rc = init_powernv_pstates();
325 if (rc) {
326 pr_info("powernv-cpufreq disabled. System does not support PState control\n");
327 return rc;
328 }
329
330 return cpufreq_register_driver(&powernv_cpufreq_driver);
331}
332module_init(powernv_cpufreq_init);
333
334static void __exit powernv_cpufreq_exit(void)
335{
336 cpufreq_unregister_driver(&powernv_cpufreq_driver);
337}
338module_exit(powernv_cpufreq_exit);
339
340MODULE_LICENSE("GPL");
341MODULE_AUTHOR("Vaidyanathan Srinivasan <svaidy at linux.vnet.ibm.com>");
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c b/drivers/cpufreq/ppc-corenet-cpufreq.c
index 3bd9123e7026..b7e677be1df0 100644
--- a/drivers/cpufreq/ppc-corenet-cpufreq.c
+++ b/drivers/cpufreq/ppc-corenet-cpufreq.c
@@ -13,7 +13,6 @@
13#include <linux/clk.h> 13#include <linux/clk.h>
14#include <linux/cpufreq.h> 14#include <linux/cpufreq.h>
15#include <linux/errno.h> 15#include <linux/errno.h>
16#include <sysdev/fsl_soc.h>
17#include <linux/init.h> 16#include <linux/init.h>
18#include <linux/kernel.h> 17#include <linux/kernel.h>
19#include <linux/module.h> 18#include <linux/module.h>
diff --git a/drivers/cpufreq/ppc_cbe_cpufreq.c b/drivers/cpufreq/ppc_cbe_cpufreq.c
index af7b1cabd1e7..5be8a48dba74 100644
--- a/drivers/cpufreq/ppc_cbe_cpufreq.c
+++ b/drivers/cpufreq/ppc_cbe_cpufreq.c
@@ -32,15 +32,15 @@
32 32
33/* the CBE supports an 8 step frequency scaling */ 33/* the CBE supports an 8 step frequency scaling */
34static struct cpufreq_frequency_table cbe_freqs[] = { 34static struct cpufreq_frequency_table cbe_freqs[] = {
35 {1, 0}, 35 {0, 1, 0},
36 {2, 0}, 36 {0, 2, 0},
37 {3, 0}, 37 {0, 3, 0},
38 {4, 0}, 38 {0, 4, 0},
39 {5, 0}, 39 {0, 5, 0},
40 {6, 0}, 40 {0, 6, 0},
41 {8, 0}, 41 {0, 8, 0},
42 {10, 0}, 42 {0, 10, 0},
43 {0, CPUFREQ_TABLE_END}, 43 {0, 0, CPUFREQ_TABLE_END},
44}; 44};
45 45
46/* 46/*
diff --git a/drivers/cpufreq/s3c2416-cpufreq.c b/drivers/cpufreq/s3c2416-cpufreq.c
index 826b8be23099..4626f90559b5 100644
--- a/drivers/cpufreq/s3c2416-cpufreq.c
+++ b/drivers/cpufreq/s3c2416-cpufreq.c
@@ -72,19 +72,19 @@ static struct s3c2416_dvfs s3c2416_dvfs_table[] = {
72#endif 72#endif
73 73
74static struct cpufreq_frequency_table s3c2416_freq_table[] = { 74static struct cpufreq_frequency_table s3c2416_freq_table[] = {
75 { SOURCE_HCLK, FREQ_DVS }, 75 { 0, SOURCE_HCLK, FREQ_DVS },
76 { SOURCE_ARMDIV, 133333 }, 76 { 0, SOURCE_ARMDIV, 133333 },
77 { SOURCE_ARMDIV, 266666 }, 77 { 0, SOURCE_ARMDIV, 266666 },
78 { SOURCE_ARMDIV, 400000 }, 78 { 0, SOURCE_ARMDIV, 400000 },
79 { 0, CPUFREQ_TABLE_END }, 79 { 0, 0, CPUFREQ_TABLE_END },
80}; 80};
81 81
82static struct cpufreq_frequency_table s3c2450_freq_table[] = { 82static struct cpufreq_frequency_table s3c2450_freq_table[] = {
83 { SOURCE_HCLK, FREQ_DVS }, 83 { 0, SOURCE_HCLK, FREQ_DVS },
84 { SOURCE_ARMDIV, 133500 }, 84 { 0, SOURCE_ARMDIV, 133500 },
85 { SOURCE_ARMDIV, 267000 }, 85 { 0, SOURCE_ARMDIV, 267000 },
86 { SOURCE_ARMDIV, 534000 }, 86 { 0, SOURCE_ARMDIV, 534000 },
87 { 0, CPUFREQ_TABLE_END }, 87 { 0, 0, CPUFREQ_TABLE_END },
88}; 88};
89 89
90static unsigned int s3c2416_cpufreq_get_speed(unsigned int cpu) 90static unsigned int s3c2416_cpufreq_get_speed(unsigned int cpu)
diff --git a/drivers/cpufreq/s3c24xx-cpufreq.c b/drivers/cpufreq/s3c24xx-cpufreq.c
index a3dc192d21f9..be1b2b5c9753 100644
--- a/drivers/cpufreq/s3c24xx-cpufreq.c
+++ b/drivers/cpufreq/s3c24xx-cpufreq.c
@@ -586,7 +586,7 @@ static int s3c_cpufreq_build_freq(void)
586 size = cpu_cur.info->calc_freqtable(&cpu_cur, NULL, 0); 586 size = cpu_cur.info->calc_freqtable(&cpu_cur, NULL, 0);
587 size++; 587 size++;
588 588
589 ftab = kmalloc(sizeof(*ftab) * size, GFP_KERNEL); 589 ftab = kzalloc(sizeof(*ftab) * size, GFP_KERNEL);
590 if (!ftab) { 590 if (!ftab) {
591 printk(KERN_ERR "%s: no memory for tables\n", __func__); 591 printk(KERN_ERR "%s: no memory for tables\n", __func__);
592 return -ENOMEM; 592 return -ENOMEM;
@@ -664,7 +664,7 @@ int __init s3c_plltab_register(struct cpufreq_frequency_table *plls,
664 664
665 size = sizeof(*vals) * (plls_no + 1); 665 size = sizeof(*vals) * (plls_no + 1);
666 666
667 vals = kmalloc(size, GFP_KERNEL); 667 vals = kzalloc(size, GFP_KERNEL);
668 if (vals) { 668 if (vals) {
669 memcpy(vals, plls, size); 669 memcpy(vals, plls, size);
670 pll_reg = vals; 670 pll_reg = vals;
diff --git a/drivers/cpufreq/s3c64xx-cpufreq.c b/drivers/cpufreq/s3c64xx-cpufreq.c
index c4226de079ab..ff7d3ecb85f0 100644
--- a/drivers/cpufreq/s3c64xx-cpufreq.c
+++ b/drivers/cpufreq/s3c64xx-cpufreq.c
@@ -37,19 +37,19 @@ static struct s3c64xx_dvfs s3c64xx_dvfs_table[] = {
37}; 37};
38 38
39static struct cpufreq_frequency_table s3c64xx_freq_table[] = { 39static struct cpufreq_frequency_table s3c64xx_freq_table[] = {
40 { 0, 66000 }, 40 { 0, 0, 66000 },
41 { 0, 100000 }, 41 { 0, 0, 100000 },
42 { 0, 133000 }, 42 { 0, 0, 133000 },
43 { 1, 200000 }, 43 { 0, 1, 200000 },
44 { 1, 222000 }, 44 { 0, 1, 222000 },
45 { 1, 266000 }, 45 { 0, 1, 266000 },
46 { 2, 333000 }, 46 { 0, 2, 333000 },
47 { 2, 400000 }, 47 { 0, 2, 400000 },
48 { 2, 532000 }, 48 { 0, 2, 532000 },
49 { 2, 533000 }, 49 { 0, 2, 533000 },
50 { 3, 667000 }, 50 { 0, 3, 667000 },
51 { 4, 800000 }, 51 { 0, 4, 800000 },
52 { 0, CPUFREQ_TABLE_END }, 52 { 0, 0, CPUFREQ_TABLE_END },
53}; 53};
54#endif 54#endif
55 55
diff --git a/drivers/cpufreq/s5pv210-cpufreq.c b/drivers/cpufreq/s5pv210-cpufreq.c
index 72421534fff5..ab2c1a40d437 100644
--- a/drivers/cpufreq/s5pv210-cpufreq.c
+++ b/drivers/cpufreq/s5pv210-cpufreq.c
@@ -64,12 +64,12 @@ enum s5pv210_dmc_port {
64}; 64};
65 65
66static struct cpufreq_frequency_table s5pv210_freq_table[] = { 66static struct cpufreq_frequency_table s5pv210_freq_table[] = {
67 {L0, 1000*1000}, 67 {0, L0, 1000*1000},
68 {L1, 800*1000}, 68 {0, L1, 800*1000},
69 {L2, 400*1000}, 69 {0, L2, 400*1000},
70 {L3, 200*1000}, 70 {0, L3, 200*1000},
71 {L4, 100*1000}, 71 {0, L4, 100*1000},
72 {0, CPUFREQ_TABLE_END}, 72 {0, 0, CPUFREQ_TABLE_END},
73}; 73};
74 74
75static struct regulator *arm_regulator; 75static struct regulator *arm_regulator;
diff --git a/drivers/cpufreq/sc520_freq.c b/drivers/cpufreq/sc520_freq.c
index 69371bf0886d..ac84e4818014 100644
--- a/drivers/cpufreq/sc520_freq.c
+++ b/drivers/cpufreq/sc520_freq.c
@@ -33,9 +33,9 @@ static __u8 __iomem *cpuctl;
33#define PFX "sc520_freq: " 33#define PFX "sc520_freq: "
34 34
35static struct cpufreq_frequency_table sc520_freq_table[] = { 35static struct cpufreq_frequency_table sc520_freq_table[] = {
36 {0x01, 100000}, 36 {0, 0x01, 100000},
37 {0x02, 133000}, 37 {0, 0x02, 133000},
38 {0, CPUFREQ_TABLE_END}, 38 {0, 0, CPUFREQ_TABLE_END},
39}; 39};
40 40
41static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu) 41static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu)
diff --git a/drivers/cpufreq/spear-cpufreq.c b/drivers/cpufreq/spear-cpufreq.c
index 4cfdcff8a310..38678396636d 100644
--- a/drivers/cpufreq/spear-cpufreq.c
+++ b/drivers/cpufreq/spear-cpufreq.c
@@ -195,18 +195,15 @@ static int spear_cpufreq_probe(struct platform_device *pdev)
195 cnt = prop->length / sizeof(u32); 195 cnt = prop->length / sizeof(u32);
196 val = prop->value; 196 val = prop->value;
197 197
198 freq_tbl = kmalloc(sizeof(*freq_tbl) * (cnt + 1), GFP_KERNEL); 198 freq_tbl = kzalloc(sizeof(*freq_tbl) * (cnt + 1), GFP_KERNEL);
199 if (!freq_tbl) { 199 if (!freq_tbl) {
200 ret = -ENOMEM; 200 ret = -ENOMEM;
201 goto out_put_node; 201 goto out_put_node;
202 } 202 }
203 203
204 for (i = 0; i < cnt; i++) { 204 for (i = 0; i < cnt; i++)
205 freq_tbl[i].driver_data = i;
206 freq_tbl[i].frequency = be32_to_cpup(val++); 205 freq_tbl[i].frequency = be32_to_cpup(val++);
207 }
208 206
209 freq_tbl[i].driver_data = i;
210 freq_tbl[i].frequency = CPUFREQ_TABLE_END; 207 freq_tbl[i].frequency = CPUFREQ_TABLE_END;
211 208
212 spear_cpufreq.freq_tbl = freq_tbl; 209 spear_cpufreq.freq_tbl = freq_tbl;
diff --git a/drivers/cpufreq/speedstep-ich.c b/drivers/cpufreq/speedstep-ich.c
index 394ac159312a..1a07b5904ed5 100644
--- a/drivers/cpufreq/speedstep-ich.c
+++ b/drivers/cpufreq/speedstep-ich.c
@@ -49,9 +49,9 @@ static u32 pmbase;
49 * are in kHz for the time being. 49 * are in kHz for the time being.
50 */ 50 */
51static struct cpufreq_frequency_table speedstep_freqs[] = { 51static struct cpufreq_frequency_table speedstep_freqs[] = {
52 {SPEEDSTEP_HIGH, 0}, 52 {0, SPEEDSTEP_HIGH, 0},
53 {SPEEDSTEP_LOW, 0}, 53 {0, SPEEDSTEP_LOW, 0},
54 {0, CPUFREQ_TABLE_END}, 54 {0, 0, CPUFREQ_TABLE_END},
55}; 55};
56 56
57 57
diff --git a/drivers/cpufreq/speedstep-smi.c b/drivers/cpufreq/speedstep-smi.c
index db5d274dc13a..8635eec96da5 100644
--- a/drivers/cpufreq/speedstep-smi.c
+++ b/drivers/cpufreq/speedstep-smi.c
@@ -42,9 +42,9 @@ static enum speedstep_processor speedstep_processor;
42 * are in kHz for the time being. 42 * are in kHz for the time being.
43 */ 43 */
44static struct cpufreq_frequency_table speedstep_freqs[] = { 44static struct cpufreq_frequency_table speedstep_freqs[] = {
45 {SPEEDSTEP_HIGH, 0}, 45 {0, SPEEDSTEP_HIGH, 0},
46 {SPEEDSTEP_LOW, 0}, 46 {0, SPEEDSTEP_LOW, 0},
47 {0, CPUFREQ_TABLE_END}, 47 {0, 0, CPUFREQ_TABLE_END},
48}; 48};
49 49
50#define GET_SPEEDSTEP_OWNER 0 50#define GET_SPEEDSTEP_OWNER 0
diff --git a/drivers/cpufreq/unicore2-cpufreq.c b/drivers/cpufreq/unicore2-cpufreq.c
index 13be802b6170..8d045afa7fb4 100644
--- a/drivers/cpufreq/unicore2-cpufreq.c
+++ b/drivers/cpufreq/unicore2-cpufreq.c
@@ -45,7 +45,7 @@ static int ucv2_target(struct cpufreq_policy *policy,
45 freqs.new = target_freq; 45 freqs.new = target_freq;
46 46
47 cpufreq_freq_transition_begin(policy, &freqs); 47 cpufreq_freq_transition_begin(policy, &freqs);
48 ret = clk_set_rate(policy->mclk, target_freq * 1000); 48 ret = clk_set_rate(policy->clk, target_freq * 1000);
49 cpufreq_freq_transition_end(policy, &freqs, ret); 49 cpufreq_freq_transition_end(policy, &freqs, ret);
50 50
51 return ret; 51 return ret;
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index c48e595f623e..5ae5100c1f24 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -455,11 +455,14 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
455 * FREQUENCY TABLE HELPERS * 455 * FREQUENCY TABLE HELPERS *
456 *********************************************************************/ 456 *********************************************************************/
457 457
458#define CPUFREQ_ENTRY_INVALID ~0 458/* Special Values of .frequency field */
459#define CPUFREQ_TABLE_END ~1 459#define CPUFREQ_ENTRY_INVALID ~0
460#define CPUFREQ_BOOST_FREQ ~2 460#define CPUFREQ_TABLE_END ~1
461/* Special Values of .flags field */
462#define CPUFREQ_BOOST_FREQ (1 << 0)
461 463
462struct cpufreq_frequency_table { 464struct cpufreq_frequency_table {
465 unsigned int flags;
463 unsigned int driver_data; /* driver specific data, not used by core */ 466 unsigned int driver_data; /* driver specific data, not used by core */
464 unsigned int frequency; /* kHz - doesn't need to be in ascending 467 unsigned int frequency; /* kHz - doesn't need to be in ascending
465 * order */ 468 * order */