Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
6ddee424
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
6ddee424
编写于
10月 25, 2013
作者:
R
Rafael J. Wysocki
浏览文件
操作
浏览文件
下载
差异文件
Merge back earlier 'pm-cpufreq' material.
Conflicts: drivers/cpufreq/omap-cpufreq.c
上级
e4db1c74
a814613b
变更
74
隐藏空白更改
内联
并排
Showing
74 changed file
with
464 addition
and
1513 deletion
+464
-1513
arch/arm/mach-davinci/Kconfig
arch/arm/mach-davinci/Kconfig
+0
-1
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/Kconfig
+0
-3
arch/arm/mach-sa1100/generic.c
arch/arm/mach-sa1100/generic.c
+21
-44
arch/arm/mach-sa1100/generic.h
arch/arm/mach-sa1100/generic.h
+2
-3
arch/arm/mach-ux500/Kconfig
arch/arm/mach-ux500/Kconfig
+0
-1
arch/blackfin/Kconfig
arch/blackfin/Kconfig
+0
-1
arch/cris/Kconfig
arch/cris/Kconfig
+0
-2
drivers/cpufreq/Kconfig
drivers/cpufreq/Kconfig
+0
-11
drivers/cpufreq/Kconfig.arm
drivers/cpufreq/Kconfig.arm
+0
-11
drivers/cpufreq/Kconfig.powerpc
drivers/cpufreq/Kconfig.powerpc
+0
-6
drivers/cpufreq/Kconfig.x86
drivers/cpufreq/Kconfig.x86
+0
-13
drivers/cpufreq/Makefile
drivers/cpufreq/Makefile
+1
-4
drivers/cpufreq/acpi-cpufreq.c
drivers/cpufreq/acpi-cpufreq.c
+8
-15
drivers/cpufreq/arm_big_little.c
drivers/cpufreq/arm_big_little.c
+7
-24
drivers/cpufreq/at32ap-cpufreq.c
drivers/cpufreq/at32ap-cpufreq.c
+48
-19
drivers/cpufreq/blackfin-cpufreq.c
drivers/cpufreq/blackfin-cpufreq.c
+4
-15
drivers/cpufreq/cpufreq-cpu0.c
drivers/cpufreq/cpufreq-cpu0.c
+4
-41
drivers/cpufreq/cpufreq-nforce2.c
drivers/cpufreq/cpufreq-nforce2.c
+1
-4
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq.c
+74
-67
drivers/cpufreq/cpufreq_governor.h
drivers/cpufreq/cpufreq_governor.h
+4
-1
drivers/cpufreq/cpufreq_userspace.c
drivers/cpufreq/cpufreq_userspace.c
+0
-11
drivers/cpufreq/cris-artpec3-cpufreq.c
drivers/cpufreq/cris-artpec3-cpufreq.c
+4
-34
drivers/cpufreq/cris-etraxfs-cpufreq.c
drivers/cpufreq/cris-etraxfs-cpufreq.c
+4
-32
drivers/cpufreq/davinci-cpufreq.c
drivers/cpufreq/davinci-cpufreq.c
+4
-29
drivers/cpufreq/dbx500-cpufreq.c
drivers/cpufreq/dbx500-cpufreq.c
+3
-39
drivers/cpufreq/e_powersaver.c
drivers/cpufreq/e_powersaver.c
+3
-16
drivers/cpufreq/elanfreq.c
drivers/cpufreq/elanfreq.c
+4
-37
drivers/cpufreq/exynos-cpufreq.c
drivers/cpufreq/exynos-cpufreq.c
+5
-31
drivers/cpufreq/exynos4210-cpufreq.c
drivers/cpufreq/exynos4210-cpufreq.c
+8
-59
drivers/cpufreq/exynos4x12-cpufreq.c
drivers/cpufreq/exynos4x12-cpufreq.c
+8
-61
drivers/cpufreq/exynos5440-cpufreq.c
drivers/cpufreq/exynos5440-cpufreq.c
+5
-22
drivers/cpufreq/freq_table.c
drivers/cpufreq/freq_table.c
+45
-14
drivers/cpufreq/gx-suspmod.c
drivers/cpufreq/gx-suspmod.c
+1
-4
drivers/cpufreq/highbank-cpufreq.c
drivers/cpufreq/highbank-cpufreq.c
+2
-1
drivers/cpufreq/ia64-acpi-cpufreq.c
drivers/cpufreq/ia64-acpi-cpufreq.c
+3
-28
drivers/cpufreq/imx6q-cpufreq.c
drivers/cpufreq/imx6q-cpufreq.c
+4
-33
drivers/cpufreq/integrator-cpufreq.c
drivers/cpufreq/integrator-cpufreq.c
+4
-10
drivers/cpufreq/intel_pstate.c
drivers/cpufreq/intel_pstate.c
+1
-3
drivers/cpufreq/kirkwood-cpufreq.c
drivers/cpufreq/kirkwood-cpufreq.c
+4
-32
drivers/cpufreq/longhaul.c
drivers/cpufreq/longhaul.c
+4
-28
drivers/cpufreq/longrun.c
drivers/cpufreq/longrun.c
+1
-3
drivers/cpufreq/loongson2_cpufreq.c
drivers/cpufreq/loongson2_cpufreq.c
+4
-20
drivers/cpufreq/maple-cpufreq.c
drivers/cpufreq/maple-cpufreq.c
+3
-23
drivers/cpufreq/omap-cpufreq.c
drivers/cpufreq/omap-cpufreq.c
+14
-50
drivers/cpufreq/p4-clockmod.c
drivers/cpufreq/p4-clockmod.c
+4
-23
drivers/cpufreq/pasemi-cpufreq.c
drivers/cpufreq/pasemi-cpufreq.c
+3
-22
drivers/cpufreq/pcc-cpufreq.c
drivers/cpufreq/pcc-cpufreq.c
+1
-9
drivers/cpufreq/pmac32-cpufreq.c
drivers/cpufreq/pmac32-cpufreq.c
+3
-20
drivers/cpufreq/pmac64-cpufreq.c
drivers/cpufreq/pmac64-cpufreq.c
+11
-28
drivers/cpufreq/powernow-k6.c
drivers/cpufreq/powernow-k6.c
+3
-29
drivers/cpufreq/powernow-k7.c
drivers/cpufreq/powernow-k7.c
+3
-17
drivers/cpufreq/powernow-k8.c
drivers/cpufreq/powernow-k8.c
+3
-24
drivers/cpufreq/ppc-corenet-cpufreq.c
drivers/cpufreq/ppc-corenet-cpufreq.c
+3
-19
drivers/cpufreq/ppc_cbe_cpufreq.c
drivers/cpufreq/ppc_cbe_cpufreq.c
+3
-16
drivers/cpufreq/pxa2xx-cpufreq.c
drivers/cpufreq/pxa2xx-cpufreq.c
+7
-23
drivers/cpufreq/pxa3xx-cpufreq.c
drivers/cpufreq/pxa3xx-cpufreq.c
+6
-11
drivers/cpufreq/s3c2416-cpufreq.c
drivers/cpufreq/s3c2416-cpufreq.c
+4
-25
drivers/cpufreq/s3c24xx-cpufreq.c
drivers/cpufreq/s3c24xx-cpufreq.c
+1
-26
drivers/cpufreq/s3c64xx-cpufreq.c
drivers/cpufreq/s3c64xx-cpufreq.c
+3
-14
drivers/cpufreq/s5pv210-cpufreq.c
drivers/cpufreq/s5pv210-cpufreq.c
+2
-16
drivers/cpufreq/sa1100-cpufreq.c
drivers/cpufreq/sa1100-cpufreq.c
+2
-8
drivers/cpufreq/sa1110-cpufreq.c
drivers/cpufreq/sa1110-cpufreq.c
+2
-8
drivers/cpufreq/sc520_freq.c
drivers/cpufreq/sc520_freq.c
+4
-30
drivers/cpufreq/sh-cpufreq.c
drivers/cpufreq/sh-cpufreq.c
+6
-16
drivers/cpufreq/sparc-us2e-cpufreq.c
drivers/cpufreq/sparc-us2e-cpufreq.c
+5
-9
drivers/cpufreq/sparc-us3-cpufreq.c
drivers/cpufreq/sparc-us3-cpufreq.c
+5
-9
drivers/cpufreq/spear-cpufreq.c
drivers/cpufreq/spear-cpufreq.c
+5
-34
drivers/cpufreq/speedstep-centrino.c
drivers/cpufreq/speedstep-centrino.c
+4
-36
drivers/cpufreq/speedstep-ich.c
drivers/cpufreq/speedstep-ich.c
+5
-49
drivers/cpufreq/speedstep-smi.c
drivers/cpufreq/speedstep-smi.c
+4
-47
drivers/cpufreq/tegra-cpufreq.c
drivers/cpufreq/tegra-cpufreq.c
+13
-20
drivers/cpufreq/unicore2-cpufreq.c
drivers/cpufreq/unicore2-cpufreq.c
+1
-4
drivers/thermal/Kconfig
drivers/thermal/Kconfig
+0
-1
include/linux/cpufreq.h
include/linux/cpufreq.h
+36
-14
未找到文件。
arch/arm/mach-davinci/Kconfig
浏览文件 @
6ddee424
...
...
@@ -40,7 +40,6 @@ 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
...
...
arch/arm/mach-pxa/Kconfig
浏览文件 @
6ddee424
...
...
@@ -615,14 +615,12 @@ 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
...
...
@@ -635,7 +633,6 @@ config CPU_PXA26x
config PXA3xx
bool
select CPU_XSC3
select CPU_FREQ_TABLE if CPU_FREQ
help
Select code specific to PXA3xx variants
...
...
arch/arm/mach-sa1100/generic.c
浏览文件 @
6ddee424
...
...
@@ -42,23 +42,24 @@ EXPORT_SYMBOL(reset_status);
/*
* This table is setup for a 3.6864MHz Crystal.
*/
static
const
unsigned
short
cclk_frequency_100khz
[
NR_FREQS
]
=
{
590
,
/* 59.0 MHz */
737
,
/* 73.7 MHz */
885
,
/* 88.5 MHz */
1032
,
/* 103.2 MHz */
1180
,
/* 118.0 MHz */
1327
,
/* 132.7 MHz */
1475
,
/* 147.5 MHz */
1622
,
/* 162.2 MHz */
1769
,
/* 176.9 MHz */
1917
,
/* 191.7 MHz */
2064
,
/* 206.4 MHz */
2212
,
/* 221.2 MHz */
2359
,
/* 235.9 MHz */
2507
,
/* 250.7 MHz */
2654
,
/* 265.4 MHz */
2802
/* 280.2 MHz */
struct
cpufreq_frequency_table
sa11x0_freq_table
[
NR_FREQS
+
1
]
=
{
{
.
frequency
=
59000
,
/* 59.0 MHz */
},
{
.
frequency
=
73700
,
/* 73.7 MHz */
},
{
.
frequency
=
88500
,
/* 88.5 MHz */
},
{
.
frequency
=
103200
,
/* 103.2 MHz */
},
{
.
frequency
=
118000
,
/* 118.0 MHz */
},
{
.
frequency
=
132700
,
/* 132.7 MHz */
},
{
.
frequency
=
147500
,
/* 147.5 MHz */
},
{
.
frequency
=
162200
,
/* 162.2 MHz */
},
{
.
frequency
=
176900
,
/* 176.9 MHz */
},
{
.
frequency
=
191700
,
/* 191.7 MHz */
},
{
.
frequency
=
206400
,
/* 206.4 MHz */
},
{
.
frequency
=
221200
,
/* 221.2 MHz */
},
{
.
frequency
=
235900
,
/* 235.9 MHz */
},
{
.
frequency
=
250700
,
/* 250.7 MHz */
},
{
.
frequency
=
265400
,
/* 265.4 MHz */
},
{
.
frequency
=
280200
,
/* 280.2 MHz */
},
{
.
frequency
=
CPUFREQ_TABLE_END
,
},
};
/* rounds up(!) */
...
...
@@ -66,10 +67,8 @@ unsigned int sa11x0_freq_to_ppcr(unsigned int khz)
{
int
i
;
khz
/=
100
;
for
(
i
=
0
;
i
<
NR_FREQS
;
i
++
)
if
(
cclk_frequency_100khz
[
i
]
>=
khz
)
if
(
sa11x0_freq_table
[
i
].
frequency
>=
khz
)
break
;
return
i
;
...
...
@@ -79,37 +78,15 @@ unsigned int sa11x0_ppcr_to_freq(unsigned int idx)
{
unsigned
int
freq
=
0
;
if
(
idx
<
NR_FREQS
)
freq
=
cclk_frequency_100khz
[
idx
]
*
100
;
freq
=
sa11x0_freq_table
[
idx
].
frequency
;
return
freq
;
}
/* make sure that only the "userspace" governor is run -- anything else wouldn't make sense on
* this platform, anyway.
*/
int
sa11x0_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
unsigned
int
tmp
;
if
(
policy
->
cpu
)
return
-
EINVAL
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
/* make sure that at least one frequency is within the policy */
tmp
=
cclk_frequency_100khz
[
sa11x0_freq_to_ppcr
(
policy
->
min
)]
*
100
;
if
(
tmp
>
policy
->
max
)
policy
->
max
=
tmp
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
return
0
;
}
unsigned
int
sa11x0_getspeed
(
unsigned
int
cpu
)
{
if
(
cpu
)
return
0
;
return
cclk_frequency_100khz
[
PPCR
&
0xf
]
*
100
;
return
sa11x0_freq_table
[
PPCR
&
0xf
].
frequency
;
}
/*
...
...
arch/arm/mach-sa1100/generic.h
浏览文件 @
6ddee424
...
...
@@ -3,6 +3,7 @@
*
* Author: Nicolas Pitre
*/
#include <linux/cpufreq.h>
#include <linux/reboot.h>
extern
void
sa1100_timer_init
(
void
);
...
...
@@ -19,10 +20,8 @@ extern void sa11x0_init_late(void);
extern
void
sa1110_mb_enable
(
void
);
extern
void
sa1110_mb_disable
(
void
);
struct
cpufreq_policy
;
extern
struct
cpufreq_frequency_table
sa11x0_freq_table
[];
extern
unsigned
int
sa11x0_freq_to_ppcr
(
unsigned
int
khz
);
extern
int
sa11x0_verify_speed
(
struct
cpufreq_policy
*
policy
);
extern
unsigned
int
sa11x0_getspeed
(
unsigned
int
cpu
);
extern
unsigned
int
sa11x0_ppcr_to_freq
(
unsigned
int
idx
);
...
...
arch/arm/mach-ux500/Kconfig
浏览文件 @
6ddee424
...
...
@@ -34,7 +34,6 @@ config UX500_SOC_COMMON
config UX500_SOC_DB8500
bool
select CPU_FREQ_TABLE if CPU_FREQ
select MFD_DB8500_PRCMU
select PINCTRL_DB8500
select PINCTRL_DB8540
...
...
arch/blackfin/Kconfig
浏览文件 @
6ddee424
...
...
@@ -1429,7 +1429,6 @@ source "drivers/cpufreq/Kconfig"
config BFIN_CPU_FREQ
bool
depends on CPU_FREQ
select CPU_FREQ_TABLE
default y
config CPU_VOLTAGE
...
...
arch/cris/Kconfig
浏览文件 @
6ddee424
...
...
@@ -130,13 +130,11 @@ 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.
...
...
drivers/cpufreq/Kconfig
浏览文件 @
6ddee424
...
...
@@ -17,15 +17,11 @@ config CPU_FREQ
if CPU_FREQ
config CPU_FREQ_TABLE
tristate
config CPU_FREQ_GOV_COMMON
bool
config CPU_FREQ_STAT
tristate "CPU frequency translation statistics"
select CPU_FREQ_TABLE
default y
help
This driver exports CPU frequency statistics information through sysfs
...
...
@@ -143,7 +139,6 @@ config CPU_FREQ_GOV_USERSPACE
config CPU_FREQ_GOV_ONDEMAND
tristate "'ondemand' cpufreq policy governor"
select CPU_FREQ_TABLE
select CPU_FREQ_GOV_COMMON
help
'ondemand' - This driver adds a dynamic cpufreq policy governor.
...
...
@@ -187,7 +182,6 @@ config CPU_FREQ_GOV_CONSERVATIVE
config GENERIC_CPUFREQ_CPU0
tristate "Generic CPU0 cpufreq driver"
depends on HAVE_CLK && REGULATOR && PM_OPP && OF
select CPU_FREQ_TABLE
help
This adds a generic cpufreq driver for CPU0 frequency management.
It supports both uniprocessor (UP) and symmetric multiprocessor (SMP)
...
...
@@ -223,7 +217,6 @@ depends on IA64
config IA64_ACPI_CPUFREQ
tristate "ACPI Processor P-States driver"
select CPU_FREQ_TABLE
depends on ACPI_PROCESSOR
help
This driver adds a CPUFreq driver which utilizes the ACPI
...
...
@@ -240,7 +233,6 @@ depends on MIPS
config LOONGSON2_CPUFREQ
tristate "Loongson2 CPUFreq Driver"
select CPU_FREQ_TABLE
help
This option adds a CPUFreq driver for loongson processors which
support software configurable cpu frequency.
...
...
@@ -262,7 +254,6 @@ menu "SPARC CPU frequency scaling drivers"
depends on SPARC64
config SPARC_US3_CPUFREQ
tristate "UltraSPARC-III CPU Frequency driver"
select CPU_FREQ_TABLE
help
This adds the CPUFreq driver for UltraSPARC-III processors.
...
...
@@ -272,7 +263,6 @@ config SPARC_US3_CPUFREQ
config SPARC_US2E_CPUFREQ
tristate "UltraSPARC-IIe CPU Frequency driver"
select CPU_FREQ_TABLE
help
This adds the CPUFreq driver for UltraSPARC-IIe processors.
...
...
@@ -285,7 +275,6 @@ menu "SH CPU Frequency scaling"
depends on SUPERH
config SH_CPU_FREQ
tristate "SuperH CPU Frequency driver"
select CPU_FREQ_TABLE
help
This adds the cpufreq driver for SuperH. Any CPU that supports
clock rate rounding through the clock framework can use this
...
...
drivers/cpufreq/Kconfig.arm
浏览文件 @
6ddee424
...
...
@@ -5,7 +5,6 @@
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,7 +17,6 @@ config ARM_DT_BL_CPUFREQ
config ARM_EXYNOS_CPUFREQ
bool
select CPU_FREQ_TABLE
config ARM_EXYNOS4210_CPUFREQ
bool "SAMSUNG EXYNOS4210"
...
...
@@ -58,7 +56,6 @@ config ARM_EXYNOS5440_CPUFREQ
depends on SOC_EXYNOS5440
depends on HAVE_CLK && PM_OPP && OF
default y
select CPU_FREQ_TABLE
help
This adds the CPUFreq driver for Samsung EXYNOS5440
SoC. The nature of exynos5440 clock controller is
...
...
@@ -85,7 +82,6 @@ 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.
...
...
@@ -101,7 +97,6 @@ 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.
...
...
@@ -110,7 +105,6 @@ config ARM_OMAP2PLUS_CPUFREQ
bool "TI OMAP2+"
depends on ARCH_OMAP2PLUS
default ARCH_OMAP2PLUS
select CPU_FREQ_TABLE
config ARM_S3C_CPUFREQ
bool
...
...
@@ -165,7 +159,6 @@ config ARM_S3C2412_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
...
...
@@ -196,7 +189,6 @@ config ARM_S3C2440_CPUFREQ
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.
...
...
@@ -206,7 +198,6 @@ config ARM_S3C64XX_CPUFREQ
config ARM_S5PV210_CPUFREQ
bool "Samsung S5PV210 and S5PC110"
depends on CPU_S5PV210
select CPU_FREQ_TABLE
default y
help
This adds the CPUFreq driver for Samsung S5PV210 and
...
...
@@ -223,7 +214,6 @@ 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.
...
...
@@ -231,7 +221,6 @@ config ARM_SPEAR_CPUFREQ
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.
drivers/cpufreq/Kconfig.powerpc
浏览文件 @
6ddee424
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.
...
...
@@ -20,7 +19,6 @@ config CPU_FREQ_CBE_PMI
config CPU_FREQ_MAPLE
bool "Support for Maple 970FX Evaluation Board"
depends on PPC_MAPLE
select CPU_FREQ_TABLE
help
This adds support for frequency switching on Maple 970FX
Evaluation Board and compatible boards (IBM JS2x blades).
...
...
@@ -28,7 +26,6 @@ config CPU_FREQ_MAPLE
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,
...
...
@@ -38,7 +35,6 @@ config PPC_CORENET_CPUFREQ
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
...
...
@@ -47,7 +43,6 @@ config CPU_FREQ_PMAC
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.
...
...
@@ -55,7 +50,6 @@ config CPU_FREQ_PMAC64
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
...
...
drivers/cpufreq/Kconfig.x86
浏览文件 @
6ddee424
...
...
@@ -31,7 +31,6 @@ config X86_PCC_CPUFREQ
config X86_ACPI_CPUFREQ
tristate "ACPI Processor P-States driver"
select CPU_FREQ_TABLE
depends on ACPI_PROCESSOR
help
This driver adds a CPUFreq driver which utilizes the ACPI
...
...
@@ -60,7 +59,6 @@ config X86_ACPI_CPUFREQ_CPB
config ELAN_CPUFREQ
tristate "AMD Elan SC400 and SC410"
select CPU_FREQ_TABLE
depends on MELAN
---help---
This adds the CPUFreq driver for AMD Elan SC400 and SC410
...
...
@@ -76,7 +74,6 @@ config ELAN_CPUFREQ
config SC520_CPUFREQ
tristate "AMD Elan SC520"
select CPU_FREQ_TABLE
depends on MELAN
---help---
This adds the CPUFreq driver for AMD Elan SC520 processor.
...
...
@@ -88,7 +85,6 @@ config SC520_CPUFREQ
config X86_POWERNOW_K6
tristate "AMD Mobile K6-2/K6-3 PowerNow!"
select CPU_FREQ_TABLE
depends on X86_32
help
This adds the CPUFreq driver for mobile AMD K6-2+ and mobile
...
...
@@ -100,7 +96,6 @@ config X86_POWERNOW_K6
config X86_POWERNOW_K7
tristate "AMD Mobile Athlon/Duron PowerNow!"
select CPU_FREQ_TABLE
depends on X86_32
help
This adds the CPUFreq driver for mobile AMD K7 mobile processors.
...
...
@@ -118,7 +113,6 @@ config X86_POWERNOW_K7_ACPI
config X86_POWERNOW_K8
tristate "AMD Opteron/Athlon64 PowerNow!"
select CPU_FREQ_TABLE
depends on ACPI && ACPI_PROCESSOR && X86_ACPI_CPUFREQ
help
This adds the CPUFreq driver for K8/early Opteron/Athlon64 processors.
...
...
@@ -132,7 +126,6 @@ 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
...
...
@@ -160,7 +153,6 @@ config X86_GX_SUSPMOD
config X86_SPEEDSTEP_CENTRINO
tristate "Intel Enhanced SpeedStep (deprecated)"
select CPU_FREQ_TABLE
select X86_SPEEDSTEP_CENTRINO_TABLE if X86_32
depends on X86_32 || (X86_64 && ACPI_PROCESSOR)
help
...
...
@@ -190,7 +182,6 @@ config X86_SPEEDSTEP_CENTRINO_TABLE
config X86_SPEEDSTEP_ICH
tristate "Intel Speedstep on ICH-M chipsets (ioport interface)"
select CPU_FREQ_TABLE
depends on X86_32
help
This adds the CPUFreq driver for certain mobile Intel Pentium III
...
...
@@ -204,7 +195,6 @@ config X86_SPEEDSTEP_ICH
config X86_SPEEDSTEP_SMI
tristate "Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface)"
select CPU_FREQ_TABLE
depends on X86_32
help
This adds the CPUFreq driver for certain mobile Intel Pentium III
...
...
@@ -217,7 +207,6 @@ config X86_SPEEDSTEP_SMI
config X86_P4_CLOCKMOD
tristate "Intel Pentium 4 clock modulation"
select CPU_FREQ_TABLE
help
This adds the CPUFreq driver for Intel Pentium 4 / XEON
processors. When enabled it will lower CPU temperature by skipping
...
...
@@ -259,7 +248,6 @@ config X86_LONGRUN
config X86_LONGHAUL
tristate "VIA Cyrix III Longhaul"
select CPU_FREQ_TABLE
depends on X86_32 && ACPI_PROCESSOR
help
This adds the CPUFreq driver for VIA Samuel/CyrixIII,
...
...
@@ -272,7 +260,6 @@ config X86_LONGHAUL
config X86_E_POWERSAVER
tristate "VIA C7 Enhanced PowerSaver (DANGEROUS)"
select CPU_FREQ_TABLE
depends on X86_32 && ACPI_PROCESSOR
help
This adds the CPUFreq driver for VIA C7 processors. However, this driver
...
...
drivers/cpufreq/Makefile
浏览文件 @
6ddee424
# CPUfreq core
obj-$(CONFIG_CPU_FREQ)
+=
cpufreq.o
obj-$(CONFIG_CPU_FREQ)
+=
cpufreq.o
freq_table.o
# CPUfreq stats
obj-$(CONFIG_CPU_FREQ_STAT)
+=
cpufreq_stats.o
...
...
@@ -11,9 +11,6 @@ obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o
obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE)
+=
cpufreq_conservative.o
obj-$(CONFIG_CPU_FREQ_GOV_COMMON)
+=
cpufreq_governor.o
# CPUfreq cross-arch helpers
obj-$(CONFIG_CPU_FREQ_TABLE)
+=
freq_table.o
obj-$(CONFIG_GENERIC_CPUFREQ_CPU0)
+=
cpufreq-cpu0.o
##################################################################################
...
...
drivers/cpufreq/acpi-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -516,15 +516,6 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
return
result
;
}
static
int
acpi_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
struct
acpi_cpufreq_data
*
data
=
per_cpu
(
acfreq_data
,
policy
->
cpu
);
pr_debug
(
"acpi_cpufreq_verify
\n
"
);
return
cpufreq_frequency_table_verify
(
policy
,
data
->
freq_table
);
}
static
unsigned
long
acpi_cpufreq_guess_freq
(
struct
acpi_cpufreq_data
*
data
,
unsigned
int
cpu
)
{
...
...
@@ -837,7 +828,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
data
->
freq_table
[
valid_states
].
frequency
=
CPUFREQ_TABLE_END
;
perf
->
state
=
0
;
result
=
cpufreq_
frequency_table_cpuinfo
(
policy
,
data
->
freq_table
);
result
=
cpufreq_
table_validate_and_show
(
policy
,
data
->
freq_table
);
if
(
result
)
goto
err_freqfree
;
...
...
@@ -846,12 +837,16 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
switch
(
perf
->
control_register
.
space_id
)
{
case
ACPI_ADR_SPACE_SYSTEM_IO
:
/* Current speed is unknown and not detectable by IO port */
/*
* The core will not set policy->cur, because
* cpufreq_driver->get is NULL, so we need to set it here.
* However, we have to guess it, because the current speed is
* unknown and not detectable via IO ports.
*/
policy
->
cur
=
acpi_cpufreq_guess_freq
(
data
,
policy
->
cpu
);
break
;
case
ACPI_ADR_SPACE_FIXED_HARDWARE
:
acpi_cpufreq_driver
.
get
=
get_cur_freq_on_cpu
;
policy
->
cur
=
get_cur_freq_on_cpu
(
cpu
);
break
;
default:
break
;
...
...
@@ -868,8 +863,6 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
(
u32
)
perf
->
states
[
i
].
power
,
(
u32
)
perf
->
states
[
i
].
transition_latency
);
cpufreq_frequency_table_get_attr
(
data
->
freq_table
,
policy
->
cpu
);
/*
* the first call to ->target() should result in us actually
* writing something to the appropriate registers.
...
...
@@ -929,7 +922,7 @@ static struct freq_attr *acpi_cpufreq_attr[] = {
};
static
struct
cpufreq_driver
acpi_cpufreq_driver
=
{
.
verify
=
acpi_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
acpi_cpufreq_target
,
.
bios_limit
=
acpi_processor_get_bios_limit
,
.
init
=
acpi_cpufreq_cpu_init
,
...
...
drivers/cpufreq/arm_big_little.c
浏览文件 @
6ddee424
...
...
@@ -47,14 +47,6 @@ static unsigned int bL_cpufreq_get(unsigned int cpu)
return
clk_get_rate
(
clk
[
cur_cluster
])
/
1000
;
}
/* Validate policy frequency range */
static
int
bL_cpufreq_verify_policy
(
struct
cpufreq_policy
*
policy
)
{
u32
cur_cluster
=
cpu_to_cluster
(
policy
->
cpu
);
return
cpufreq_frequency_table_verify
(
policy
,
freq_table
[
cur_cluster
]);
}
/* Set clock frequency */
static
int
bL_cpufreq_set_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
...
...
@@ -127,7 +119,7 @@ static int get_cluster_clk_and_freq_table(struct device *cpu_dev)
}
name
[
12
]
=
cluster
+
'0'
;
clk
[
cluster
]
=
clk_get
_sys
(
name
,
NULL
);
clk
[
cluster
]
=
clk_get
(
cpu_dev
,
name
);
if
(
!
IS_ERR
(
clk
[
cluster
]))
{
dev_dbg
(
cpu_dev
,
"%s: clk: %p & freq table: %p, cluster: %d
\n
"
,
__func__
,
clk
[
cluster
],
freq_table
[
cluster
],
...
...
@@ -165,7 +157,7 @@ static int bL_cpufreq_init(struct cpufreq_policy *policy)
if
(
ret
)
return
ret
;
ret
=
cpufreq_
frequency_table_cpuinfo
(
policy
,
freq_table
[
cur_cluster
]);
ret
=
cpufreq_
table_validate_and_show
(
policy
,
freq_table
[
cur_cluster
]);
if
(
ret
)
{
dev_err
(
cpu_dev
,
"CPU %d, cluster: %d invalid freq table
\n
"
,
policy
->
cpu
,
cur_cluster
);
...
...
@@ -173,16 +165,12 @@ static int bL_cpufreq_init(struct cpufreq_policy *policy)
return
ret
;
}
cpufreq_frequency_table_get_attr
(
freq_table
[
cur_cluster
],
policy
->
cpu
);
if
(
arm_bL_ops
->
get_transition_latency
)
policy
->
cpuinfo
.
transition_latency
=
arm_bL_ops
->
get_transition_latency
(
cpu_dev
);
else
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
policy
->
cur
=
bL_cpufreq_get
(
policy
->
cpu
);
cpumask_copy
(
policy
->
cpus
,
topology_core_cpumask
(
policy
->
cpu
));
dev_info
(
cpu_dev
,
"%s: CPU %d initialized
\n
"
,
__func__
,
policy
->
cpu
);
...
...
@@ -200,28 +188,23 @@ static int bL_cpufreq_exit(struct cpufreq_policy *policy)
return
-
ENODEV
;
}
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
put_cluster_clk_and_freq_table
(
cpu_dev
);
dev_dbg
(
cpu_dev
,
"%s: Exited, cpu: %d
\n
"
,
__func__
,
policy
->
cpu
);
return
0
;
}
/* Export freq_table to sysfs */
static
struct
freq_attr
*
bL_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
bL_cpufreq_driver
=
{
.
name
=
"arm-big-little"
,
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
bL_cpufreq_verify_policy
,
.
flags
=
CPUFREQ_STICKY
|
CPUFREQ_HAVE_GOVERNOR_PER_POLICY
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
bL_cpufreq_set_target
,
.
get
=
bL_cpufreq_get
,
.
init
=
bL_cpufreq_init
,
.
exit
=
bL_cpufreq_exit
,
.
have_governor_per_policy
=
true
,
.
attr
=
bL_cpufreq_attr
,
.
attr
=
cpufreq_generic_attr
,
};
int
bL_cpufreq_register
(
struct
cpufreq_arm_bL_ops
*
ops
)
...
...
drivers/cpufreq/at32ap-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -19,18 +19,10 @@
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/export.h>
#include <linux/slab.h>
static
struct
clk
*
cpuclk
;
static
int
at32_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
if
(
policy
->
cpu
!=
0
)
return
-
EINVAL
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
return
0
;
}
static
struct
cpufreq_frequency_table
*
freq_table
;
static
unsigned
int
at32_get_speed
(
unsigned
int
cpu
)
{
...
...
@@ -85,31 +77,68 @@ static int at32_set_target(struct cpufreq_policy *policy,
static
int
__init
at32_cpufreq_driver_init
(
struct
cpufreq_policy
*
policy
)
{
unsigned
int
frequency
,
rate
,
min_freq
;
int
retval
,
steps
,
i
;
if
(
policy
->
cpu
!=
0
)
return
-
EINVAL
;
cpuclk
=
clk_get
(
NULL
,
"cpu"
);
if
(
IS_ERR
(
cpuclk
))
{
pr_debug
(
"cpufreq: could not get CPU clk
\n
"
);
return
PTR_ERR
(
cpuclk
);
retval
=
PTR_ERR
(
cpuclk
);
goto
out_err
;
}
policy
->
cpuinfo
.
min_freq
=
(
clk_round_rate
(
cpuclk
,
1
)
+
500
)
/
1000
;
policy
->
cpuinfo
.
max_freq
=
(
clk_round_rate
(
cpuclk
,
~
0UL
)
+
500
)
/
1000
;
min_freq
=
(
clk_round_rate
(
cpuclk
,
1
)
+
500
)
/
1000
;
frequency
=
(
clk_round_rate
(
cpuclk
,
~
0UL
)
+
500
)
/
1000
;
policy
->
cpuinfo
.
transition_latency
=
0
;
policy
->
cur
=
at32_get_speed
(
0
);
policy
->
min
=
policy
->
cpuinfo
.
min_freq
;
policy
->
max
=
policy
->
cpuinfo
.
max_freq
;
printk
(
"cpufreq: AT32AP CPU frequency driver
\n
"
);
/*
* AVR32 CPU frequency rate scales in power of two between maximum and
* minimum, also add space for the table end marker.
*
* Further validate that the frequency is usable, and append it to the
* frequency table.
*/
steps
=
fls
(
frequency
/
min_freq
)
+
1
;
freq_table
=
kzalloc
(
steps
*
sizeof
(
struct
cpufreq_frequency_table
),
GFP_KERNEL
);
if
(
!
freq_table
)
{
retval
=
-
ENOMEM
;
goto
out_err_put_clk
;
}
for
(
i
=
0
;
i
<
(
steps
-
1
);
i
++
)
{
rate
=
clk_round_rate
(
cpuclk
,
frequency
*
1000
)
/
1000
;
return
0
;
if
(
rate
!=
frequency
)
freq_table
[
i
].
frequency
=
CPUFREQ_ENTRY_INVALID
;
else
freq_table
[
i
].
frequency
=
frequency
;
frequency
/=
2
;
}
freq_table
[
steps
-
1
].
frequency
=
CPUFREQ_TABLE_END
;
retval
=
cpufreq_table_validate_and_show
(
policy
,
freq_table
);
if
(
!
retval
)
{
printk
(
"cpufreq: AT32AP CPU frequency driver
\n
"
);
return
0
;
}
kfree
(
freq_table
);
out_err_put_clk:
clk_put
(
cpuclk
);
out_err:
return
retval
;
}
static
struct
cpufreq_driver
at32_driver
=
{
.
name
=
"at32ap"
,
.
init
=
at32_cpufreq_driver_init
,
.
verify
=
at32_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
at32_set_target
,
.
get
=
at32_get_speed
,
.
flags
=
CPUFREQ_STICKY
,
...
...
drivers/cpufreq/blackfin-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -191,11 +191,6 @@ static int bfin_target(struct cpufreq_policy *policy,
return
ret
;
}
static
int
bfin_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
bfin_freq_table
);
}
static
int
__bfin_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
...
...
@@ -209,23 +204,17 @@ static int __bfin_cpu_init(struct cpufreq_policy *policy)
policy
->
cpuinfo
.
transition_latency
=
50000
;
/* 50us assumed */
policy
->
cur
=
cclk
;
cpufreq_frequency_table_get_attr
(
bfin_freq_table
,
policy
->
cpu
);
return
cpufreq_frequency_table_cpuinfo
(
policy
,
bfin_freq_table
);
return
cpufreq_table_validate_and_show
(
policy
,
bfin_freq_table
);
}
static
struct
freq_attr
*
bfin_freq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
bfin_driver
=
{
.
verify
=
bfin_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
bfin_target
,
.
get
=
bfin_getfreq_khz
,
.
init
=
__bfin_cpu_init
,
.
exit
=
cpufreq_generic_exit
,
.
name
=
"bfin cpufreq"
,
.
attr
=
bfin_freq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
__init
bfin_cpu_init
(
void
)
...
...
drivers/cpufreq/cpufreq-cpu0.c
浏览文件 @
6ddee424
...
...
@@ -30,11 +30,6 @@ static struct clk *cpu_clk;
static
struct
regulator
*
cpu_reg
;
static
struct
cpufreq_frequency_table
*
freq_table
;
static
int
cpu0_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
freq_table
);
}
static
unsigned
int
cpu0_get_speed
(
unsigned
int
cpu
)
{
return
clk_get_rate
(
cpu_clk
)
/
1000
;
...
...
@@ -127,50 +122,18 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
static
int
cpu0_cpufreq_init
(
struct
cpufreq_policy
*
policy
)
{
int
ret
;
ret
=
cpufreq_frequency_table_cpuinfo
(
policy
,
freq_table
);
if
(
ret
)
{
pr_err
(
"invalid frequency table: %d
\n
"
,
ret
);
return
ret
;
}
policy
->
cpuinfo
.
transition_latency
=
transition_latency
;
policy
->
cur
=
clk_get_rate
(
cpu_clk
)
/
1000
;
/*
* The driver only supports the SMP configuartion where all processors
* share the clock and voltage and clock. Use cpufreq affected_cpus
* interface to have all CPUs scaled together.
*/
cpumask_setall
(
policy
->
cpus
);
cpufreq_frequency_table_get_attr
(
freq_table
,
policy
->
cpu
);
return
0
;
}
static
int
cpu0_cpufreq_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_generic_init
(
policy
,
freq_table
,
transition_latency
);
}
static
struct
freq_attr
*
cpu0_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
cpu0_cpufreq_driver
=
{
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
cpu
0_verify_speed
,
.
verify
=
cpu
freq_generic_frequency_table_verify
,
.
target
=
cpu0_set_target
,
.
get
=
cpu0_get_speed
,
.
init
=
cpu0_cpufreq_init
,
.
exit
=
cpu
0_cpufreq
_exit
,
.
exit
=
cpu
freq_generic
_exit
,
.
name
=
"generic_cpu0"
,
.
attr
=
cpu
0_cpufreq
_attr
,
.
attr
=
cpu
freq_generic
_attr
,
};
static
int
cpu0_cpufreq_probe
(
struct
platform_device
*
pdev
)
...
...
drivers/cpufreq/cpufreq-nforce2.c
浏览文件 @
6ddee424
...
...
@@ -303,9 +303,7 @@ static int nforce2_verify(struct cpufreq_policy *policy)
if
(
policy
->
min
<
(
fsb_pol_max
*
fid
*
100
))
policy
->
max
=
(
fsb_pol_max
+
1
)
*
fid
*
100
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
return
0
;
}
...
...
@@ -362,7 +360,6 @@ static int nforce2_cpu_init(struct cpufreq_policy *policy)
policy
->
min
=
policy
->
cpuinfo
.
min_freq
=
min_fsb
*
fid
*
100
;
policy
->
max
=
policy
->
cpuinfo
.
max_freq
=
max_fsb
*
fid
*
100
;
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
policy
->
cur
=
nforce2_get
(
policy
->
cpu
);
return
0
;
}
...
...
drivers/cpufreq/cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -67,13 +67,11 @@ static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
static
DEFINE_PER_CPU
(
struct
rw_semaphore
,
cpu_policy_rwsem
);
#define lock_policy_rwsem(mode, cpu) \
static
int
lock_policy_rwsem_##mode(int cpu) \
static
void
lock_policy_rwsem_##mode(int cpu) \
{ \
struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); \
BUG_ON(!policy); \
down_##mode(&per_cpu(cpu_policy_rwsem, policy->cpu)); \
\
return 0; \
}
lock_policy_rwsem
(
read
,
cpu
);
...
...
@@ -135,7 +133,7 @@ static DEFINE_MUTEX(cpufreq_governor_mutex);
bool
have_governor_per_policy
(
void
)
{
return
cpufreq_driver
->
have_governor_per_policy
;
return
!!
(
cpufreq_driver
->
flags
&
CPUFREQ_HAVE_GOVERNOR_PER_POLICY
)
;
}
EXPORT_SYMBOL_GPL
(
have_governor_per_policy
);
...
...
@@ -183,6 +181,37 @@ u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy)
}
EXPORT_SYMBOL_GPL
(
get_cpu_idle_time
);
/*
* This is a generic cpufreq init() routine which can be used by cpufreq
* drivers of SMP systems. It will do following:
* - validate & show freq table passed
* - set policies transition latency
* - policy->cpus with all possible CPUs
*/
int
cpufreq_generic_init
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
,
unsigned
int
transition_latency
)
{
int
ret
;
ret
=
cpufreq_table_validate_and_show
(
policy
,
table
);
if
(
ret
)
{
pr_err
(
"%s: invalid frequency table: %d
\n
"
,
__func__
,
ret
);
return
ret
;
}
policy
->
cpuinfo
.
transition_latency
=
transition_latency
;
/*
* The driver only supports the SMP configuartion where all processors
* share the clock and voltage and clock.
*/
cpumask_setall
(
policy
->
cpus
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
cpufreq_generic_init
);
struct
cpufreq_policy
*
cpufreq_cpu_get
(
unsigned
int
cpu
)
{
struct
cpufreq_policy
*
policy
=
NULL
;
...
...
@@ -414,7 +443,7 @@ show_one(scaling_min_freq, min);
show_one
(
scaling_max_freq
,
max
);
show_one
(
scaling_cur_freq
,
cur
);
static
int
__
cpufreq_set_policy
(
struct
cpufreq_policy
*
policy
,
static
int
cpufreq_set_policy
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_policy
*
new_policy
);
/**
...
...
@@ -435,7 +464,7 @@ static ssize_t store_##file_name \
if (ret != 1) \
return -EINVAL; \
\
ret =
__
cpufreq_set_policy(policy, &new_policy); \
ret = cpufreq_set_policy(policy, &new_policy); \
policy->user_policy.object = policy->object; \
\
return ret ? ret : count; \
...
...
@@ -493,11 +522,7 @@ 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
*/
ret
=
__cpufreq_set_policy
(
policy
,
&
new_policy
);
ret
=
cpufreq_set_policy
(
policy
,
&
new_policy
);
policy
->
user_policy
.
policy
=
policy
->
policy
;
policy
->
user_policy
.
governor
=
policy
->
governor
;
...
...
@@ -653,13 +678,12 @@ static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
{
struct
cpufreq_policy
*
policy
=
to_policy
(
kobj
);
struct
freq_attr
*
fattr
=
to_attr
(
attr
);
ssize_t
ret
=
-
EINVAL
;
ssize_t
ret
;
if
(
!
down_read_trylock
(
&
cpufreq_rwsem
))
goto
exit
;
return
-
EINVAL
;
if
(
lock_policy_rwsem_read
(
policy
->
cpu
)
<
0
)
goto
up_read
;
lock_policy_rwsem_read
(
policy
->
cpu
);
if
(
fattr
->
show
)
ret
=
fattr
->
show
(
policy
,
buf
);
...
...
@@ -667,10 +691,8 @@ static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
ret
=
-
EIO
;
unlock_policy_rwsem_read
(
policy
->
cpu
);
up_read:
up_read
(
&
cpufreq_rwsem
);
exit:
return
ret
;
}
...
...
@@ -689,8 +711,7 @@ static ssize_t store(struct kobject *kobj, struct attribute *attr,
if
(
!
down_read_trylock
(
&
cpufreq_rwsem
))
goto
unlock
;
if
(
lock_policy_rwsem_write
(
policy
->
cpu
)
<
0
)
goto
up_read
;
lock_policy_rwsem_write
(
policy
->
cpu
);
if
(
fattr
->
store
)
ret
=
fattr
->
store
(
policy
,
buf
,
count
);
...
...
@@ -699,7 +720,6 @@ static ssize_t store(struct kobject *kobj, struct attribute *attr,
unlock_policy_rwsem_write
(
policy
->
cpu
);
up_read:
up_read
(
&
cpufreq_rwsem
);
unlock:
put_online_cpus
();
...
...
@@ -844,11 +864,11 @@ static void cpufreq_init_policy(struct cpufreq_policy *policy)
int
ret
=
0
;
memcpy
(
&
new_policy
,
policy
,
sizeof
(
*
policy
));
/* assure that the starting sequence is run in
__
cpufreq_set_policy */
/* assure that the starting sequence is run in cpufreq_set_policy */
policy
->
governor
=
NULL
;
/* set default policy */
ret
=
__
cpufreq_set_policy
(
policy
,
&
new_policy
);
ret
=
cpufreq_set_policy
(
policy
,
&
new_policy
);
policy
->
user_policy
.
policy
=
policy
->
policy
;
policy
->
user_policy
.
governor
=
policy
->
governor
;
...
...
@@ -949,7 +969,7 @@ static void cpufreq_policy_free(struct cpufreq_policy *policy)
static
void
update_policy_cpu
(
struct
cpufreq_policy
*
policy
,
unsigned
int
cpu
)
{
if
(
cpu
==
policy
->
cpu
)
if
(
WARN_ON
(
cpu
==
policy
->
cpu
)
)
return
;
/*
...
...
@@ -966,9 +986,7 @@ static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)
up_write
(
&
per_cpu
(
cpu_policy_rwsem
,
policy
->
last_cpu
));
#ifdef CONFIG_CPU_FREQ_TABLE
cpufreq_frequency_table_update_policy_cpu
(
policy
);
#endif
blocking_notifier_call_chain
(
&
cpufreq_policy_notifier_list
,
CPUFREQ_UPDATE_POLICY_CPU
,
policy
);
}
...
...
@@ -1053,6 +1071,14 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
goto
err_set_policy_cpu
;
}
if
(
cpufreq_driver
->
get
)
{
policy
->
cur
=
cpufreq_driver
->
get
(
policy
->
cpu
);
if
(
!
policy
->
cur
)
{
pr_err
(
"%s: ->get() failed
\n
"
,
__func__
);
goto
err_get_freq
;
}
}
/* related cpus should atleast have policy->cpus */
cpumask_or
(
policy
->
related_cpus
,
policy
->
related_cpus
,
policy
->
cpus
);
...
...
@@ -1107,6 +1133,9 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
per_cpu
(
cpufreq_cpu_data
,
j
)
=
NULL
;
write_unlock_irqrestore
(
&
cpufreq_driver_lock
,
flags
);
err_get_freq:
if
(
cpufreq_driver
->
exit
)
cpufreq_driver
->
exit
(
policy
);
err_set_policy_cpu:
cpufreq_policy_free
(
policy
);
nomem_out:
...
...
@@ -1147,7 +1176,7 @@ static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *policy,
if
(
ret
)
{
pr_err
(
"%s: Failed to move kobj: %d"
,
__func__
,
ret
);
WARN_ON
(
lock_policy_rwsem_write
(
old_cpu
)
);
lock_policy_rwsem_write
(
old_cpu
);
cpumask_set_cpu
(
old_cpu
,
policy
->
cpus
);
unlock_policy_rwsem_write
(
old_cpu
);
...
...
@@ -1208,14 +1237,13 @@ static int __cpufreq_remove_dev_prepare(struct device *dev,
if
(
!
frozen
)
sysfs_remove_link
(
&
dev
->
kobj
,
"cpufreq"
);
}
else
if
(
cpus
>
1
)
{
new_cpu
=
cpufreq_nominate_new_policy_cpu
(
policy
,
cpu
,
frozen
);
if
(
new_cpu
>=
0
)
{
update_policy_cpu
(
policy
,
new_cpu
);
if
(
!
frozen
)
{
pr_debug
(
"%s: policy Kobject moved to cpu: %d
"
"from: %d
\n
"
,
__func__
,
new_cpu
,
cpu
);
pr_debug
(
"%s: policy Kobject moved to cpu: %d
from: %d
\n
"
,
__func__
,
new_cpu
,
cpu
);
}
}
}
...
...
@@ -1243,7 +1271,7 @@ static int __cpufreq_remove_dev_finish(struct device *dev,
return
-
EINVAL
;
}
WARN_ON
(
lock_policy_rwsem_write
(
cpu
)
);
lock_policy_rwsem_write
(
cpu
);
cpus
=
cpumask_weight
(
policy
->
cpus
);
if
(
cpus
>
1
)
...
...
@@ -1310,36 +1338,24 @@ static int __cpufreq_remove_dev_finish(struct device *dev,
}
/**
*
__
cpufreq_remove_dev - remove a CPU device
* cpufreq_remove_dev - remove a CPU device
*
* Removes the cpufreq interface for a CPU device.
* Caller should already have policy_rwsem in write mode for this CPU.
* This routine frees the rwsem before returning.
*/
static
inline
int
__cpufreq_remove_dev
(
struct
device
*
dev
,
struct
subsys_interface
*
sif
,
bool
frozen
)
{
int
ret
;
ret
=
__cpufreq_remove_dev_prepare
(
dev
,
sif
,
frozen
);
if
(
!
ret
)
ret
=
__cpufreq_remove_dev_finish
(
dev
,
sif
,
frozen
);
return
ret
;
}
static
int
cpufreq_remove_dev
(
struct
device
*
dev
,
struct
subsys_interface
*
sif
)
{
unsigned
int
cpu
=
dev
->
id
;
int
ret
val
;
int
ret
;
if
(
cpu_is_offline
(
cpu
))
return
0
;
retval
=
__cpufreq_remove_dev
(
dev
,
sif
,
false
);
return
retval
;
ret
=
__cpufreq_remove_dev_prepare
(
dev
,
sif
,
false
);
if
(
!
ret
)
ret
=
__cpufreq_remove_dev_finish
(
dev
,
sif
,
false
);
return
ret
;
}
static
void
handle_update
(
struct
work_struct
*
work
)
...
...
@@ -1466,14 +1482,11 @@ unsigned int cpufreq_get(unsigned int cpu)
if
(
!
down_read_trylock
(
&
cpufreq_rwsem
))
return
0
;
if
(
unlikely
(
lock_policy_rwsem_read
(
cpu
)))
goto
out_policy
;
lock_policy_rwsem_read
(
cpu
);
ret_freq
=
__cpufreq_get
(
cpu
);
unlock_policy_rwsem_read
(
cpu
);
out_policy:
up_read
(
&
cpufreq_rwsem
);
return
ret_freq
;
...
...
@@ -1697,14 +1710,12 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
{
int
ret
=
-
EINVAL
;
if
(
unlikely
(
lock_policy_rwsem_write
(
policy
->
cpu
)))
goto
fail
;
lock_policy_rwsem_write
(
policy
->
cpu
);
ret
=
__cpufreq_driver_target
(
policy
,
target_freq
,
relation
);
unlock_policy_rwsem_write
(
policy
->
cpu
);
fail:
return
ret
;
}
EXPORT_SYMBOL_GPL
(
cpufreq_driver_target
);
...
...
@@ -1871,10 +1882,10 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
EXPORT_SYMBOL
(
cpufreq_get_policy
);
/*
*
data
: current policy.
*
policy
: policy to be set.
*
policy
: current policy.
*
new_policy
: policy to be set.
*/
static
int
__
cpufreq_set_policy
(
struct
cpufreq_policy
*
policy
,
static
int
cpufreq_set_policy
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_policy
*
new_policy
)
{
int
ret
=
0
,
failed
=
1
;
...
...
@@ -1995,10 +2006,7 @@ int cpufreq_update_policy(unsigned int cpu)
goto
no_policy
;
}
if
(
unlikely
(
lock_policy_rwsem_write
(
cpu
)))
{
ret
=
-
EINVAL
;
goto
fail
;
}
lock_policy_rwsem_write
(
cpu
);
pr_debug
(
"updating policy for CPU %u
\n
"
,
cpu
);
memcpy
(
&
new_policy
,
policy
,
sizeof
(
*
policy
));
...
...
@@ -2023,11 +2031,10 @@ int cpufreq_update_policy(unsigned int cpu)
}
}
ret
=
__
cpufreq_set_policy
(
policy
,
&
new_policy
);
ret
=
cpufreq_set_policy
(
policy
,
&
new_policy
);
unlock_policy_rwsem_write
(
cpu
);
fail:
cpufreq_cpu_put
(
policy
);
no_policy:
return
ret
;
...
...
drivers/cpufreq/cpufreq_governor.h
浏览文件 @
6ddee424
...
...
@@ -191,7 +191,10 @@ struct common_dbs_data {
struct
attribute_group
*
attr_group_gov_sys
;
/* one governor - system */
struct
attribute_group
*
attr_group_gov_pol
;
/* one governor - policy */
/* Common data for platforms that don't set have_governor_per_policy */
/*
* Common data for platforms that don't set
* CPUFREQ_HAVE_GOVERNOR_PER_POLICY
*/
struct
dbs_data
*
gdbs_data
;
struct
cpu_dbs_common_info
*
(
*
get_cpu_cdbs
)(
int
cpu
);
...
...
drivers/cpufreq/cpufreq_userspace.c
浏览文件 @
6ddee424
...
...
@@ -38,18 +38,7 @@ static int cpufreq_set(struct cpufreq_policy *policy, unsigned int freq)
if
(
!
per_cpu
(
cpu_is_managed
,
policy
->
cpu
))
goto
err
;
/*
* We're safe from concurrent calls to ->target() here
* as we hold the userspace_mutex lock. If we were calling
* cpufreq_driver_target, a deadlock situation might occur:
* A: cpufreq_set (lock userspace_mutex) ->
* cpufreq_driver_target(lock policy->lock)
* B: cpufreq_set_policy(lock policy->lock) ->
* __cpufreq_governor ->
* cpufreq_governor_userspace (lock userspace_mutex)
*/
ret
=
__cpufreq_driver_target
(
policy
,
freq
,
CPUFREQ_RELATION_L
);
err:
mutex_unlock
(
&
userspace_mutex
);
return
ret
;
...
...
drivers/cpufreq/cris-artpec3-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -54,11 +54,6 @@ static void cris_freq_set_cpu_state(struct cpufreq_policy *policy,
cpufreq_notify_transition
(
policy
,
&
freqs
,
CPUFREQ_POSTCHANGE
);
};
static
int
cris_freq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
cris_freq_table
[
0
]);
}
static
int
cris_freq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
...
...
@@ -76,42 +71,17 @@ static int cris_freq_target(struct cpufreq_policy *policy,
static
int
cris_freq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
result
;
/* cpuinfo and default policy values */
policy
->
cpuinfo
.
transition_latency
=
1000000
;
/* 1ms */
policy
->
cur
=
cris_freq_get_cpu_frequency
(
0
);
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
cris_freq_table
);
if
(
result
)
return
(
result
);
cpufreq_frequency_table_get_attr
(
cris_freq_table
,
policy
->
cpu
);
return
0
;
}
static
int
cris_freq_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_generic_init
(
policy
,
cris_freq_table
,
1000000
);
}
static
struct
freq_attr
*
cris_freq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
cris_freq_driver
=
{
.
get
=
cris_freq_get_cpu_frequency
,
.
verify
=
c
ris_freq
_verify
,
.
verify
=
c
pufreq_generic_frequency_table
_verify
,
.
target
=
cris_freq_target
,
.
init
=
cris_freq_cpu_init
,
.
exit
=
c
ris_freq_cpu
_exit
,
.
exit
=
c
pufreq_generic
_exit
,
.
name
=
"cris_freq"
,
.
attr
=
c
ris_freq
_attr
,
.
attr
=
c
pufreq_generic
_attr
,
};
static
int
__init
cris_freq_init
(
void
)
...
...
drivers/cpufreq/cris-etraxfs-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -54,11 +54,6 @@ static void cris_freq_set_cpu_state(struct cpufreq_policy *policy,
cpufreq_notify_transition
(
policy
,
&
freqs
,
CPUFREQ_POSTCHANGE
);
};
static
int
cris_freq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
cris_freq_table
[
0
]);
}
static
int
cris_freq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
{
...
...
@@ -75,40 +70,17 @@ static int cris_freq_target(struct cpufreq_policy *policy,
static
int
cris_freq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
result
;
/* cpuinfo and default policy values */
policy
->
cpuinfo
.
transition_latency
=
1000000
;
/* 1ms */
policy
->
cur
=
cris_freq_get_cpu_frequency
(
0
);
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
cris_freq_table
);
if
(
result
)
return
(
result
);
cpufreq_frequency_table_get_attr
(
cris_freq_table
,
policy
->
cpu
);
return
0
;
}
static
int
cris_freq_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_generic_init
(
policy
,
cris_freq_table
,
1000000
);
}
static
struct
freq_attr
*
cris_freq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
cris_freq_driver
=
{
.
get
=
cris_freq_get_cpu_frequency
,
.
verify
=
c
ris_freq
_verify
,
.
verify
=
c
pufreq_generic_frequency_table
_verify
,
.
target
=
cris_freq_target
,
.
init
=
cris_freq_cpu_init
,
.
exit
=
c
ris_freq_cpu
_exit
,
.
exit
=
c
pufreq_generic
_exit
,
.
name
=
"cris_freq"
,
.
attr
=
c
ris_freq
_attr
,
.
attr
=
c
pufreq_generic
_attr
,
};
static
int
__init
cris_freq_init
(
void
)
...
...
drivers/cpufreq/davinci-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -50,9 +50,7 @@ static int davinci_verify_speed(struct cpufreq_policy *policy)
if
(
policy
->
cpu
)
return
-
EINVAL
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
policy
->
min
=
clk_round_rate
(
armclk
,
policy
->
min
*
1000
)
/
1000
;
policy
->
max
=
clk_round_rate
(
armclk
,
policy
->
max
*
1000
)
/
1000
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
...
...
@@ -138,47 +136,24 @@ static int davinci_cpu_init(struct cpufreq_policy *policy)
return
result
;
}
policy
->
cur
=
davinci_getspeed
(
0
);
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
freq_table
);
if
(
result
)
{
pr_err
(
"%s: cpufreq_frequency_table_cpuinfo() failed"
,
__func__
);
return
result
;
}
cpufreq_frequency_table_get_attr
(
freq_table
,
policy
->
cpu
);
/*
* Time measurement across the target() function yields ~1500-1800us
* time taken with no drivers on notification list.
* Setting the latency to 2000 us to accommodate addition of drivers
* to pre/post change notification list.
*/
policy
->
cpuinfo
.
transition_latency
=
2000
*
1000
;
return
0
;
return
cpufreq_generic_init
(
policy
,
freq_table
,
2000
*
1000
);
}
static
int
davinci_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
}
static
struct
freq_attr
*
davinci_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
davinci_driver
=
{
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
davinci_verify_speed
,
.
target
=
davinci_target
,
.
get
=
davinci_getspeed
,
.
init
=
davinci_cpu_init
,
.
exit
=
davinci_cpu
_exit
,
.
exit
=
cpufreq_generic
_exit
,
.
name
=
"davinci"
,
.
attr
=
davinci_cpufreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
__init
davinci_cpufreq_probe
(
struct
platform_device
*
pdev
)
...
...
drivers/cpufreq/dbx500-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -19,16 +19,6 @@
static
struct
cpufreq_frequency_table
*
freq_table
;
static
struct
clk
*
armss_clk
;
static
struct
freq_attr
*
dbx500_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
int
dbx500_cpufreq_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
freq_table
);
}
static
int
dbx500_cpufreq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
...
...
@@ -84,43 +74,17 @@ static unsigned int dbx500_cpufreq_getspeed(unsigned int cpu)
static
int
dbx500_cpufreq_init
(
struct
cpufreq_policy
*
policy
)
{
int
res
;
/* get policy fields based on the table */
res
=
cpufreq_frequency_table_cpuinfo
(
policy
,
freq_table
);
if
(
!
res
)
cpufreq_frequency_table_get_attr
(
freq_table
,
policy
->
cpu
);
else
{
pr_err
(
"dbx500-cpufreq: Failed to read policy table
\n
"
);
return
res
;
}
policy
->
min
=
policy
->
cpuinfo
.
min_freq
;
policy
->
max
=
policy
->
cpuinfo
.
max_freq
;
policy
->
cur
=
dbx500_cpufreq_getspeed
(
policy
->
cpu
);
policy
->
governor
=
CPUFREQ_DEFAULT_GOVERNOR
;
/*
* FIXME : Need to take time measurement across the target()
* function with no/some/all drivers in the notification
* list.
*/
policy
->
cpuinfo
.
transition_latency
=
20
*
1000
;
/* in ns */
/* policy sharing between dual CPUs */
cpumask_setall
(
policy
->
cpus
);
return
0
;
return
cpufreq_generic_init
(
policy
,
freq_table
,
20
*
1000
);
}
static
struct
cpufreq_driver
dbx500_cpufreq_driver
=
{
.
flags
=
CPUFREQ_STICKY
|
CPUFREQ_CONST_LOOPS
,
.
verify
=
dbx500_cpufreq_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
dbx500_cpufreq_target
,
.
get
=
dbx500_cpufreq_getspeed
,
.
init
=
dbx500_cpufreq_init
,
.
name
=
"DBX500"
,
.
attr
=
dbx500_cpufreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
dbx500_cpufreq_probe
(
struct
platform_device
*
pdev
)
...
...
drivers/cpufreq/e_powersaver.c
浏览文件 @
6ddee424
...
...
@@ -198,12 +198,6 @@ static int eps_target(struct cpufreq_policy *policy,
return
ret
;
}
static
int
eps_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
eps_cpu
[
policy
->
cpu
]
->
freq_table
[
0
]);
}
static
int
eps_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
unsigned
int
i
;
...
...
@@ -401,15 +395,13 @@ static int eps_cpu_init(struct cpufreq_policy *policy)
}
policy
->
cpuinfo
.
transition_latency
=
140000
;
/* 844mV -> 700mV in ns */
policy
->
cur
=
fsb
*
current_multiplier
;
ret
=
cpufreq_
frequency_table_cpuinfo
(
policy
,
&
centaur
->
freq_table
[
0
]);
ret
=
cpufreq_
table_validate_and_show
(
policy
,
&
centaur
->
freq_table
[
0
]);
if
(
ret
)
{
kfree
(
centaur
);
return
ret
;
}
cpufreq_frequency_table_get_attr
(
&
centaur
->
freq_table
[
0
],
policy
->
cpu
);
return
0
;
}
...
...
@@ -424,19 +416,14 @@ static int eps_cpu_exit(struct cpufreq_policy *policy)
return
0
;
}
static
struct
freq_attr
*
eps_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
eps_driver
=
{
.
verify
=
eps
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
eps_target
,
.
init
=
eps_cpu_init
,
.
exit
=
eps_cpu_exit
,
.
get
=
eps_get
,
.
name
=
"e_powersaver"
,
.
attr
=
eps
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
...
...
drivers/cpufreq/elanfreq.c
浏览文件 @
6ddee424
...
...
@@ -165,19 +165,6 @@ static void elanfreq_set_cpu_state(struct cpufreq_policy *policy,
};
/**
* elanfreq_validatespeed: test if frequency range is valid
* @policy: the policy to validate
*
* This function checks if a given frequency range in kHz is valid
* for the hardware supported by the driver.
*/
static
int
elanfreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
elanfreq_table
[
0
]);
}
static
int
elanfreq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
...
...
@@ -202,7 +189,6 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy)
{
struct
cpuinfo_x86
*
c
=
&
cpu_data
(
0
);
unsigned
int
i
;
int
result
;
/* capability check */
if
((
c
->
x86_vendor
!=
X86_VENDOR_AMD
)
||
...
...
@@ -221,21 +207,8 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy)
/* cpuinfo and default policy values */
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
policy
->
cur
=
elanfreq_get_cpu_frequency
(
0
);
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
elanfreq_table
);
if
(
result
)
return
result
;
cpufreq_frequency_table_get_attr
(
elanfreq_table
,
policy
->
cpu
);
return
0
;
}
static
int
elanfreq_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_table_validate_and_show
(
policy
,
elanfreq_table
);
}
...
...
@@ -261,20 +234,14 @@ __setup("elanfreq=", elanfreq_setup);
#endif
static
struct
freq_attr
*
elanfreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
elanfreq_driver
=
{
.
get
=
elanfreq_get_cpu_frequency
,
.
verify
=
elanfreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
elanfreq_target
,
.
init
=
elanfreq_cpu_init
,
.
exit
=
elanfreq_cpu
_exit
,
.
exit
=
cpufreq_generic
_exit
,
.
name
=
"elanfreq"
,
.
attr
=
elanfreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
const
struct
x86_cpu_id
elan_id
[]
=
{
...
...
drivers/cpufreq/exynos-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -31,12 +31,6 @@ static unsigned int locking_frequency;
static
bool
frequency_locked
;
static
DEFINE_MUTEX
(
cpufreq_lock
);
static
int
exynos_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
exynos_info
->
freq_table
);
}
static
unsigned
int
exynos_getspeed
(
unsigned
int
cpu
)
{
return
clk_get_rate
(
exynos_info
->
cpu_clk
)
/
1000
;
...
...
@@ -141,7 +135,7 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
if
((
freqs
.
new
<
freqs
.
old
)
||
((
freqs
.
new
>
freqs
.
old
)
&&
safe_arm_volt
))
{
/* down the voltage after frequency change */
regulator_set_voltage
(
arm_regulator
,
arm_volt
,
re
t
=
re
gulator_set_voltage
(
arm_regulator
,
arm_volt
,
arm_volt
);
if
(
ret
)
{
pr_err
(
"%s: failed to set cpu voltage to %d
\n
"
,
...
...
@@ -247,38 +241,18 @@ static struct notifier_block exynos_cpufreq_nb = {
static
int
exynos_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
policy
->
cur
=
policy
->
min
=
policy
->
max
=
exynos_getspeed
(
policy
->
cpu
);
cpufreq_frequency_table_get_attr
(
exynos_info
->
freq_table
,
policy
->
cpu
);
/* set the transition latency value */
policy
->
cpuinfo
.
transition_latency
=
100000
;
cpumask_setall
(
policy
->
cpus
);
return
cpufreq_frequency_table_cpuinfo
(
policy
,
exynos_info
->
freq_table
);
return
cpufreq_generic_init
(
policy
,
exynos_info
->
freq_table
,
100000
);
}
static
int
exynos_cpufreq_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
}
static
struct
freq_attr
*
exynos_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
exynos_driver
=
{
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
exynos_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
exynos_target
,
.
get
=
exynos_getspeed
,
.
init
=
exynos_cpufreq_cpu_init
,
.
exit
=
exynos_cpufreq_cpu
_exit
,
.
exit
=
cpufreq_generic
_exit
,
.
name
=
"exynos_cpufreq"
,
.
attr
=
exynos_cpufreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
#ifdef CONFIG_PM
.
suspend
=
exynos_cpufreq_suspend
,
.
resume
=
exynos_cpufreq_resume
,
...
...
drivers/cpufreq/exynos4210-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -81,9 +81,9 @@ static void exynos4210_set_clkdiv(unsigned int div_index)
static
void
exynos4210_set_apll
(
unsigned
int
index
)
{
unsigned
int
tmp
;
unsigned
int
tmp
,
freq
=
apll_freq_4210
[
index
].
freq
;
/*
1.
MUX_CORE_SEL = MPLL, ARMCLK uses MPLL for lock time */
/* MUX_CORE_SEL = MPLL, ARMCLK uses MPLL for lock time */
clk_set_parent
(
moutcore
,
mout_mpll
);
do
{
...
...
@@ -92,21 +92,9 @@ static void exynos4210_set_apll(unsigned int index)
tmp
&=
0x7
;
}
while
(
tmp
!=
0x2
);
/* 2. Set APLL Lock time */
__raw_writel
(
EXYNOS4_APLL_LOCKTIME
,
EXYNOS4_APLL_LOCK
);
/* 3. Change PLL PMS values */
tmp
=
__raw_readl
(
EXYNOS4_APLL_CON0
);
tmp
&=
~
((
0x3ff
<<
16
)
|
(
0x3f
<<
8
)
|
(
0x7
<<
0
));
tmp
|=
apll_freq_4210
[
index
].
mps
;
__raw_writel
(
tmp
,
EXYNOS4_APLL_CON0
);
clk_set_rate
(
mout_apll
,
freq
*
1000
);
/* 4. wait_lock_time */
do
{
tmp
=
__raw_readl
(
EXYNOS4_APLL_CON0
);
}
while
(
!
(
tmp
&
(
0x1
<<
EXYNOS4_APLLCON0_LOCKED_SHIFT
)));
/* 5. MUX_CORE_SEL = APLL */
/* MUX_CORE_SEL = APLL */
clk_set_parent
(
moutcore
,
mout_apll
);
do
{
...
...
@@ -115,53 +103,15 @@ static void exynos4210_set_apll(unsigned int index)
}
while
(
tmp
!=
(
0x1
<<
EXYNOS4_CLKSRC_CPU_MUXCORE_SHIFT
));
}
static
bool
exynos4210_pms_change
(
unsigned
int
old_index
,
unsigned
int
new_index
)
{
unsigned
int
old_pm
=
apll_freq_4210
[
old_index
].
mps
>>
8
;
unsigned
int
new_pm
=
apll_freq_4210
[
new_index
].
mps
>>
8
;
return
(
old_pm
==
new_pm
)
?
0
:
1
;
}
static
void
exynos4210_set_frequency
(
unsigned
int
old_index
,
unsigned
int
new_index
)
{
unsigned
int
tmp
;
if
(
old_index
>
new_index
)
{
if
(
!
exynos4210_pms_change
(
old_index
,
new_index
))
{
/* 1. Change the system clock divider values */
exynos4210_set_clkdiv
(
new_index
);
/* 2. Change just s value in apll m,p,s value */
tmp
=
__raw_readl
(
EXYNOS4_APLL_CON0
);
tmp
&=
~
(
0x7
<<
0
);
tmp
|=
apll_freq_4210
[
new_index
].
mps
&
0x7
;
__raw_writel
(
tmp
,
EXYNOS4_APLL_CON0
);
}
else
{
/* Clock Configuration Procedure */
/* 1. Change the system clock divider values */
exynos4210_set_clkdiv
(
new_index
);
/* 2. Change the apll m,p,s value */
exynos4210_set_apll
(
new_index
);
}
exynos4210_set_clkdiv
(
new_index
);
exynos4210_set_apll
(
new_index
);
}
else
if
(
old_index
<
new_index
)
{
if
(
!
exynos4210_pms_change
(
old_index
,
new_index
))
{
/* 1. Change just s value in apll m,p,s value */
tmp
=
__raw_readl
(
EXYNOS4_APLL_CON0
);
tmp
&=
~
(
0x7
<<
0
);
tmp
|=
apll_freq_4210
[
new_index
].
mps
&
0x7
;
__raw_writel
(
tmp
,
EXYNOS4_APLL_CON0
);
/* 2. Change the system clock divider values */
exynos4210_set_clkdiv
(
new_index
);
}
else
{
/* Clock Configuration Procedure */
/* 1. Change the apll m,p,s value */
exynos4210_set_apll
(
new_index
);
/* 2. Change the system clock divider values */
exynos4210_set_clkdiv
(
new_index
);
}
exynos4210_set_apll
(
new_index
);
exynos4210_set_clkdiv
(
new_index
);
}
}
...
...
@@ -194,7 +144,6 @@ int exynos4210_cpufreq_init(struct exynos_dvfs_info *info)
info
->
volt_table
=
exynos4210_volt_table
;
info
->
freq_table
=
exynos4210_freq_table
;
info
->
set_freq
=
exynos4210_set_frequency
;
info
->
need_apll_change
=
exynos4210_pms_change
;
return
0
;
...
...
drivers/cpufreq/exynos4x12-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -128,9 +128,9 @@ static void exynos4x12_set_clkdiv(unsigned int div_index)
static
void
exynos4x12_set_apll
(
unsigned
int
index
)
{
unsigned
int
tmp
,
pdiv
;
unsigned
int
tmp
,
freq
=
apll_freq_4x12
[
index
].
freq
;
/*
1.
MUX_CORE_SEL = MPLL, ARMCLK uses MPLL for lock time */
/* MUX_CORE_SEL = MPLL, ARMCLK uses MPLL for lock time */
clk_set_parent
(
moutcore
,
mout_mpll
);
do
{
...
...
@@ -140,24 +140,9 @@ static void exynos4x12_set_apll(unsigned int index)
tmp
&=
0x7
;
}
while
(
tmp
!=
0x2
);
/* 2. Set APLL Lock time */
pdiv
=
((
apll_freq_4x12
[
index
].
mps
>>
8
)
&
0x3f
);
clk_set_rate
(
mout_apll
,
freq
*
1000
);
__raw_writel
((
pdiv
*
250
),
EXYNOS4_APLL_LOCK
);
/* 3. Change PLL PMS values */
tmp
=
__raw_readl
(
EXYNOS4_APLL_CON0
);
tmp
&=
~
((
0x3ff
<<
16
)
|
(
0x3f
<<
8
)
|
(
0x7
<<
0
));
tmp
|=
apll_freq_4x12
[
index
].
mps
;
__raw_writel
(
tmp
,
EXYNOS4_APLL_CON0
);
/* 4. wait_lock_time */
do
{
cpu_relax
();
tmp
=
__raw_readl
(
EXYNOS4_APLL_CON0
);
}
while
(
!
(
tmp
&
(
0x1
<<
EXYNOS4_APLLCON0_LOCKED_SHIFT
)));
/* 5. MUX_CORE_SEL = APLL */
/* MUX_CORE_SEL = APLL */
clk_set_parent
(
moutcore
,
mout_apll
);
do
{
...
...
@@ -167,52 +152,15 @@ static void exynos4x12_set_apll(unsigned int index)
}
while
(
tmp
!=
(
0x1
<<
EXYNOS4_CLKSRC_CPU_MUXCORE_SHIFT
));
}
static
bool
exynos4x12_pms_change
(
unsigned
int
old_index
,
unsigned
int
new_index
)
{
unsigned
int
old_pm
=
apll_freq_4x12
[
old_index
].
mps
>>
8
;
unsigned
int
new_pm
=
apll_freq_4x12
[
new_index
].
mps
>>
8
;
return
(
old_pm
==
new_pm
)
?
0
:
1
;
}
static
void
exynos4x12_set_frequency
(
unsigned
int
old_index
,
unsigned
int
new_index
)
{
unsigned
int
tmp
;
if
(
old_index
>
new_index
)
{
if
(
!
exynos4x12_pms_change
(
old_index
,
new_index
))
{
/* 1. Change the system clock divider values */
exynos4x12_set_clkdiv
(
new_index
);
/* 2. Change just s value in apll m,p,s value */
tmp
=
__raw_readl
(
EXYNOS4_APLL_CON0
);
tmp
&=
~
(
0x7
<<
0
);
tmp
|=
apll_freq_4x12
[
new_index
].
mps
&
0x7
;
__raw_writel
(
tmp
,
EXYNOS4_APLL_CON0
);
}
else
{
/* Clock Configuration Procedure */
/* 1. Change the system clock divider values */
exynos4x12_set_clkdiv
(
new_index
);
/* 2. Change the apll m,p,s value */
exynos4x12_set_apll
(
new_index
);
}
exynos4x12_set_clkdiv
(
new_index
);
exynos4x12_set_apll
(
new_index
);
}
else
if
(
old_index
<
new_index
)
{
if
(
!
exynos4x12_pms_change
(
old_index
,
new_index
))
{
/* 1. Change just s value in apll m,p,s value */
tmp
=
__raw_readl
(
EXYNOS4_APLL_CON0
);
tmp
&=
~
(
0x7
<<
0
);
tmp
|=
apll_freq_4x12
[
new_index
].
mps
&
0x7
;
__raw_writel
(
tmp
,
EXYNOS4_APLL_CON0
);
/* 2. Change the system clock divider values */
exynos4x12_set_clkdiv
(
new_index
);
}
else
{
/* Clock Configuration Procedure */
/* 1. Change the apll m,p,s value */
exynos4x12_set_apll
(
new_index
);
/* 2. Change the system clock divider values */
exynos4x12_set_clkdiv
(
new_index
);
}
exynos4x12_set_apll
(
new_index
);
exynos4x12_set_clkdiv
(
new_index
);
}
}
...
...
@@ -250,7 +198,6 @@ int exynos4x12_cpufreq_init(struct exynos_dvfs_info *info)
info
->
volt_table
=
exynos4x12_volt_table
;
info
->
freq_table
=
exynos4x12_freq_table
;
info
->
set_freq
=
exynos4x12_set_frequency
;
info
->
need_apll_change
=
exynos4x12_pms_change
;
return
0
;
...
...
drivers/cpufreq/exynos5440-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -209,12 +209,6 @@ static void exynos_enable_dvfs(void)
dvfs_info
->
base
+
XMU_DVFS_CTRL
);
}
static
int
exynos_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
dvfs_info
->
freq_table
);
}
static
unsigned
int
exynos_getspeed
(
unsigned
int
cpu
)
{
return
dvfs_info
->
cur_frequency
;
...
...
@@ -324,30 +318,19 @@ static void exynos_sort_descend_freq_table(void)
static
int
exynos_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
ret
;
ret
=
cpufreq_frequency_table_cpuinfo
(
policy
,
dvfs_info
->
freq_table
);
if
(
ret
)
{
dev_err
(
dvfs_info
->
dev
,
"Invalid frequency table: %d
\n
"
,
ret
);
return
ret
;
}
policy
->
cur
=
dvfs_info
->
cur_frequency
;
policy
->
cpuinfo
.
transition_latency
=
dvfs_info
->
latency
;
cpumask_setall
(
policy
->
cpus
);
cpufreq_frequency_table_get_attr
(
dvfs_info
->
freq_table
,
policy
->
cpu
);
return
0
;
return
cpufreq_generic_init
(
policy
,
dvfs_info
->
freq_table
,
dvfs_info
->
latency
);
}
static
struct
cpufreq_driver
exynos_driver
=
{
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
exynos_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
exynos_target
,
.
get
=
exynos_getspeed
,
.
init
=
exynos_cpufreq_cpu_init
,
.
exit
=
cpufreq_generic_exit
,
.
name
=
CPUFREQ_NAME
,
.
attr
=
cpufreq_generic_attr
,
};
static
const
struct
of_device_id
exynos_cpufreq_match
[]
=
{
...
...
drivers/cpufreq/freq_table.c
浏览文件 @
6ddee424
...
...
@@ -54,31 +54,30 @@ EXPORT_SYMBOL_GPL(cpufreq_frequency_table_cpuinfo);
int
cpufreq_frequency_table_verify
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
)
{
unsigned
int
next_larger
=
~
0
;
unsigned
int
i
;
unsigned
int
count
=
0
;
unsigned
int
next_larger
=
~
0
,
freq
,
i
=
0
;
bool
found
=
false
;
pr_debug
(
"request for verification of policy (%u - %u kHz) for cpu %u
\n
"
,
policy
->
min
,
policy
->
max
,
policy
->
cpu
);
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
for
(
i
=
0
;
(
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
{
unsigned
int
freq
=
table
[
i
].
frequency
;
for
(;
freq
=
table
[
i
].
frequency
,
freq
!=
CPUFREQ_TABLE_END
;
i
++
)
{
if
(
freq
==
CPUFREQ_ENTRY_INVALID
)
continue
;
if
((
freq
>=
policy
->
min
)
&&
(
freq
<=
policy
->
max
))
count
++
;
else
if
((
next_larger
>
freq
)
&&
(
freq
>
policy
->
max
))
if
((
freq
>=
policy
->
min
)
&&
(
freq
<=
policy
->
max
))
{
found
=
true
;
break
;
}
if
((
next_larger
>
freq
)
&&
(
freq
>
policy
->
max
))
next_larger
=
freq
;
}
if
(
!
count
)
if
(
!
found
)
{
policy
->
max
=
next_larger
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
}
pr_debug
(
"verification lead to (%u - %u kHz) for cpu %u
\n
"
,
policy
->
min
,
policy
->
max
,
policy
->
cpu
);
...
...
@@ -87,6 +86,20 @@ int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
}
EXPORT_SYMBOL_GPL
(
cpufreq_frequency_table_verify
);
/*
* Generic routine to verify policy & frequency table, requires driver to call
* cpufreq_frequency_table_get_attr() prior to it.
*/
int
cpufreq_generic_frequency_table_verify
(
struct
cpufreq_policy
*
policy
)
{
struct
cpufreq_frequency_table
*
table
=
cpufreq_frequency_get_table
(
policy
->
cpu
);
if
(
!
table
)
return
-
ENODEV
;
return
cpufreq_frequency_table_verify
(
policy
,
table
);
}
EXPORT_SYMBOL_GPL
(
cpufreq_generic_frequency_table_verify
);
int
cpufreq_frequency_table_target
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
,
...
...
@@ -200,6 +213,12 @@ struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
};
EXPORT_SYMBOL_GPL
(
cpufreq_freq_attr_scaling_available_freqs
);
struct
freq_attr
*
cpufreq_generic_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
EXPORT_SYMBOL_GPL
(
cpufreq_generic_attr
);
/*
* if you use these, you must assure that the frequency table is valid
* all the time between get_attr and put_attr!
...
...
@@ -219,6 +238,18 @@ void cpufreq_frequency_table_put_attr(unsigned int cpu)
}
EXPORT_SYMBOL_GPL
(
cpufreq_frequency_table_put_attr
);
int
cpufreq_table_validate_and_show
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
)
{
int
ret
=
cpufreq_frequency_table_cpuinfo
(
policy
,
table
);
if
(
!
ret
)
cpufreq_frequency_table_get_attr
(
table
,
policy
->
cpu
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
cpufreq_table_validate_and_show
);
void
cpufreq_frequency_table_update_policy_cpu
(
struct
cpufreq_policy
*
policy
)
{
pr_debug
(
"Updating show_table for new_cpu %u from last_cpu %u
\n
"
,
...
...
drivers/cpufreq/gx-suspmod.c
浏览文件 @
6ddee424
...
...
@@ -401,7 +401,7 @@ static int cpufreq_gx_target(struct cpufreq_policy *policy,
static
int
cpufreq_gx_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
unsigned
int
maxfreq
,
curfreq
;
unsigned
int
maxfreq
;
if
(
!
policy
||
policy
->
cpu
!=
0
)
return
-
ENODEV
;
...
...
@@ -415,10 +415,8 @@ static int cpufreq_gx_cpu_init(struct cpufreq_policy *policy)
maxfreq
=
30000
*
gx_freq_mult
[
getCx86
(
CX86_DIR1
)
&
0x0f
];
stock_freq
=
maxfreq
;
curfreq
=
gx_get_cpuspeed
(
0
);
pr_debug
(
"cpu max frequency is %d.
\n
"
,
maxfreq
);
pr_debug
(
"cpu current frequency is %dkHz.
\n
"
,
curfreq
);
/* setup basic struct for cpufreq API */
policy
->
cpu
=
0
;
...
...
@@ -428,7 +426,6 @@ static int cpufreq_gx_cpu_init(struct cpufreq_policy *policy)
else
policy
->
min
=
maxfreq
/
POLICY_MIN_DIV
;
policy
->
max
=
maxfreq
;
policy
->
cur
=
curfreq
;
policy
->
cpuinfo
.
min_freq
=
maxfreq
/
max_duration
;
policy
->
cpuinfo
.
max_freq
=
maxfreq
;
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
...
...
drivers/cpufreq/highbank-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -66,7 +66,8 @@ static int hb_cpufreq_driver_init(void)
struct
device_node
*
np
;
int
ret
;
if
(
!
of_machine_is_compatible
(
"calxeda,highbank"
))
if
((
!
of_machine_is_compatible
(
"calxeda,highbank"
))
&&
(
!
of_machine_is_compatible
(
"calxeda,ecx-2000"
)))
return
-
ENODEV
;
cpu_dev
=
get_cpu_device
(
0
);
...
...
drivers/cpufreq/ia64-acpi-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -247,22 +247,6 @@ acpi_cpufreq_target (
}
static
int
acpi_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
unsigned
int
result
=
0
;
struct
cpufreq_acpi_io
*
data
=
acpi_io_data
[
policy
->
cpu
];
pr_debug
(
"acpi_cpufreq_verify
\n
"
);
result
=
cpufreq_frequency_table_verify
(
policy
,
data
->
freq_table
);
return
(
result
);
}
static
int
acpi_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
...
...
@@ -321,7 +305,6 @@ acpi_cpufreq_cpu_init (
data
->
acpi_data
.
states
[
i
].
transition_latency
*
1000
;
}
}
policy
->
cur
=
processor_get_freq
(
data
,
policy
->
cpu
);
/* table init */
for
(
i
=
0
;
i
<=
data
->
acpi_data
.
state_count
;
i
++
)
...
...
@@ -335,7 +318,7 @@ acpi_cpufreq_cpu_init (
}
}
result
=
cpufreq_
frequency_table_cpuinfo
(
policy
,
data
->
freq_table
);
result
=
cpufreq_
table_validate_and_show
(
policy
,
data
->
freq_table
);
if
(
result
)
{
goto
err_freqfree
;
}
...
...
@@ -356,8 +339,6 @@ acpi_cpufreq_cpu_init (
(
u32
)
data
->
acpi_data
.
states
[
i
].
status
,
(
u32
)
data
->
acpi_data
.
states
[
i
].
control
);
cpufreq_frequency_table_get_attr
(
data
->
freq_table
,
policy
->
cpu
);
/* the first call to ->target() should result in us actually
* writing something to the appropriate registers. */
data
->
resume
=
1
;
...
...
@@ -396,20 +377,14 @@ acpi_cpufreq_cpu_exit (
}
static
struct
freq_attr
*
acpi_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
acpi_cpufreq_driver
=
{
.
verify
=
acpi_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
acpi_cpufreq_target
,
.
get
=
acpi_cpufreq_get
,
.
init
=
acpi_cpufreq_cpu_init
,
.
exit
=
acpi_cpufreq_cpu_exit
,
.
name
=
"acpi-cpufreq"
,
.
attr
=
acpi_cpufreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
...
...
drivers/cpufreq/imx6q-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -35,11 +35,6 @@ static struct device *cpu_dev;
static
struct
cpufreq_frequency_table
*
freq_table
;
static
unsigned
int
transition_latency
;
static
int
imx6q_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
freq_table
);
}
static
unsigned
int
imx6q_get_speed
(
unsigned
int
cpu
)
{
return
clk_get_rate
(
arm_clk
)
/
1000
;
...
...
@@ -159,41 +154,17 @@ static int imx6q_set_target(struct cpufreq_policy *policy,
static
int
imx6q_cpufreq_init
(
struct
cpufreq_policy
*
policy
)
{
int
ret
;
ret
=
cpufreq_frequency_table_cpuinfo
(
policy
,
freq_table
);
if
(
ret
)
{
dev_err
(
cpu_dev
,
"invalid frequency table: %d
\n
"
,
ret
);
return
ret
;
}
policy
->
cpuinfo
.
transition_latency
=
transition_latency
;
policy
->
cur
=
clk_get_rate
(
arm_clk
)
/
1000
;
cpumask_setall
(
policy
->
cpus
);
cpufreq_frequency_table_get_attr
(
freq_table
,
policy
->
cpu
);
return
0
;
}
static
int
imx6q_cpufreq_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_generic_init
(
policy
,
freq_table
,
transition_latency
);
}
static
struct
freq_attr
*
imx6q_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
imx6q_cpufreq_driver
=
{
.
verify
=
imx6q_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
imx6q_set_target
,
.
get
=
imx6q_get_speed
,
.
init
=
imx6q_cpufreq_init
,
.
exit
=
imx6q_cpufreq
_exit
,
.
exit
=
cpufreq_generic
_exit
,
.
name
=
"imx6q-cpufreq"
,
.
attr
=
imx6q_cpufreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
imx6q_cpufreq_probe
(
struct
platform_device
*
pdev
)
...
...
drivers/cpufreq/integrator-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -59,9 +59,7 @@ static int integrator_verify_policy(struct cpufreq_policy *policy)
{
struct
icst_vco
vco
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
vco
=
icst_hz_to_vco
(
&
cclk_params
,
policy
->
max
*
1000
);
policy
->
max
=
icst_hz
(
&
cclk_params
,
vco
)
/
1000
;
...
...
@@ -69,10 +67,7 @@ static int integrator_verify_policy(struct cpufreq_policy *policy)
vco
=
icst_hz_to_vco
(
&
cclk_params
,
policy
->
min
*
1000
);
policy
->
min
=
icst_hz
(
&
cclk_params
,
vco
)
/
1000
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
return
0
;
}
...
...
@@ -186,10 +181,9 @@ static int integrator_cpufreq_init(struct cpufreq_policy *policy)
{
/* set default policy and cpuinfo */
policy
->
cpuinfo
.
max_freq
=
160000
;
policy
->
cpuinfo
.
min_freq
=
12000
;
policy
->
max
=
policy
->
cpuinfo
.
max_freq
=
160000
;
policy
->
min
=
policy
->
cpuinfo
.
min_freq
=
12000
;
policy
->
cpuinfo
.
transition_latency
=
1000000
;
/* 1 ms, assumed */
policy
->
cur
=
policy
->
min
=
policy
->
max
=
integrator_get
(
policy
->
cpu
);
return
0
;
}
...
...
drivers/cpufreq/intel_pstate.c
浏览文件 @
6ddee424
...
...
@@ -615,9 +615,7 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
static
int
intel_pstate_verify_policy
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
if
((
policy
->
policy
!=
CPUFREQ_POLICY_POWERSAVE
)
&&
(
policy
->
policy
!=
CPUFREQ_POLICY_PERFORMANCE
))
...
...
drivers/cpufreq/kirkwood-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -102,11 +102,6 @@ static void kirkwood_cpufreq_set_cpu_state(struct cpufreq_policy *policy,
cpufreq_notify_transition
(
policy
,
&
freqs
,
CPUFREQ_POSTCHANGE
);
};
static
int
kirkwood_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
kirkwood_freq_table
);
}
static
int
kirkwood_cpufreq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
...
...
@@ -125,40 +120,17 @@ static int kirkwood_cpufreq_target(struct cpufreq_policy *policy,
/* Module init and exit code */
static
int
kirkwood_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
result
;
/* cpuinfo and default policy values */
policy
->
cpuinfo
.
transition_latency
=
5000
;
/* 5uS */
policy
->
cur
=
kirkwood_cpufreq_get_cpu_frequency
(
0
);
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
kirkwood_freq_table
);
if
(
result
)
return
result
;
cpufreq_frequency_table_get_attr
(
kirkwood_freq_table
,
policy
->
cpu
);
return
0
;
}
static
int
kirkwood_cpufreq_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_generic_init
(
policy
,
kirkwood_freq_table
,
5000
);
}
static
struct
freq_attr
*
kirkwood_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
kirkwood_cpufreq_driver
=
{
.
get
=
kirkwood_cpufreq_get_cpu_frequency
,
.
verify
=
kirkwood_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
kirkwood_cpufreq_target
,
.
init
=
kirkwood_cpufreq_cpu_init
,
.
exit
=
kirkwood_cpufreq_cpu
_exit
,
.
exit
=
cpufreq_generic
_exit
,
.
name
=
"kirkwood-cpufreq"
,
.
attr
=
kirkwood_cpufreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
kirkwood_cpufreq_probe
(
struct
platform_device
*
pdev
)
...
...
drivers/cpufreq/longhaul.c
浏览文件 @
6ddee424
...
...
@@ -625,12 +625,6 @@ static void longhaul_setup_voltagescaling(void)
}
static
int
longhaul_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
longhaul_table
);
}
static
int
longhaul_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
{
...
...
@@ -919,36 +913,18 @@ static int longhaul_cpu_init(struct cpufreq_policy *policy)
longhaul_setup_voltagescaling
();
policy
->
cpuinfo
.
transition_latency
=
200000
;
/* nsec */
policy
->
cur
=
calc_speed
(
longhaul_get_cpu_mult
());
ret
=
cpufreq_frequency_table_cpuinfo
(
policy
,
longhaul_table
);
if
(
ret
)
return
ret
;
cpufreq_frequency_table_get_attr
(
longhaul_table
,
policy
->
cpu
);
return
0
;
return
cpufreq_table_validate_and_show
(
policy
,
longhaul_table
)
;
}
static
int
longhaul_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
}
static
struct
freq_attr
*
longhaul_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
longhaul_driver
=
{
.
verify
=
longhaul
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
longhaul_target
,
.
get
=
longhaul_get
,
.
init
=
longhaul_cpu_init
,
.
exit
=
longhaul_cpu
_exit
,
.
exit
=
cpufreq_generic
_exit
,
.
name
=
"longhaul"
,
.
attr
=
longhaul
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
const
struct
x86_cpu_id
longhaul_id
[]
=
{
...
...
drivers/cpufreq/longrun.c
浏览文件 @
6ddee424
...
...
@@ -129,9 +129,7 @@ static int longrun_verify_policy(struct cpufreq_policy *policy)
return
-
EINVAL
;
policy
->
cpu
=
0
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
if
((
policy
->
policy
!=
CPUFREQ_POLICY_POWERSAVE
)
&&
(
policy
->
policy
!=
CPUFREQ_POLICY_PERFORMANCE
))
...
...
drivers/cpufreq/loongson2_cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -131,40 +131,24 @@ static int loongson2_cpufreq_cpu_init(struct cpufreq_policy *policy)
return
ret
;
}
policy
->
cur
=
loongson2_cpufreq_get
(
policy
->
cpu
);
cpufreq_frequency_table_get_attr
(
&
loongson2_clockmod_table
[
0
],
policy
->
cpu
);
return
cpufreq_frequency_table_cpuinfo
(
policy
,
&
loongson2_clockmod_table
[
0
]);
}
static
int
loongson2_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
loongson2_clockmod_table
[
0
]);
return
cpufreq_generic_init
(
policy
,
&
loongson2_clockmod_table
[
0
],
0
);
}
static
int
loongson2_cpufreq_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
clk_put
(
cpuclk
);
return
0
;
}
static
struct
freq_attr
*
loongson2_table_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
loongson2_cpufreq_driver
=
{
.
name
=
"loongson2"
,
.
init
=
loongson2_cpufreq_cpu_init
,
.
verify
=
loongson2_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
loongson2_cpufreq_target
,
.
get
=
loongson2_cpufreq_get
,
.
exit
=
loongson2_cpufreq_exit
,
.
attr
=
loongson2_table
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
struct
platform_device_id
platform_device_ids
[]
=
{
...
...
drivers/cpufreq/maple-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -64,11 +64,6 @@ static struct cpufreq_frequency_table maple_cpu_freqs[] = {
{
0
,
CPUFREQ_TABLE_END
},
};
static
struct
freq_attr
*
maple_cpu_freqs_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
/* Power mode data is an array of the 32 bits PCR values to use for
* the various frequencies, retrieved from the device-tree
*/
...
...
@@ -135,11 +130,6 @@ static int maple_scom_query_freq(void)
* Common interface to the cpufreq core
*/
static
int
maple_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
maple_cpu_freqs
);
}
static
int
maple_cpufreq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
{
...
...
@@ -175,27 +165,17 @@ static unsigned int maple_cpufreq_get_speed(unsigned int cpu)
static
int
maple_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
policy
->
cpuinfo
.
transition_latency
=
12000
;
policy
->
cur
=
maple_cpu_freqs
[
maple_scom_query_freq
()].
frequency
;
/* secondary CPUs are tied to the primary one by the
* cpufreq core if in the secondary policy we tell it that
* it actually must be one policy together with all others. */
cpumask_setall
(
policy
->
cpus
);
cpufreq_frequency_table_get_attr
(
maple_cpu_freqs
,
policy
->
cpu
);
return
cpufreq_frequency_table_cpuinfo
(
policy
,
maple_cpu_freqs
);
return
cpufreq_generic_init
(
policy
,
maple_cpu_freqs
,
12000
);
}
static
struct
cpufreq_driver
maple_cpufreq_driver
=
{
.
name
=
"maple"
,
.
flags
=
CPUFREQ_CONST_LOOPS
,
.
init
=
maple_cpufreq_cpu_init
,
.
verify
=
maple_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
maple_cpufreq_target
,
.
get
=
maple_cpufreq_get_speed
,
.
attr
=
maple_cpu_freqs
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
__init
maple_cpufreq_init
(
void
)
...
...
drivers/cpufreq/omap-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -40,13 +40,6 @@ static struct clk *mpu_clk;
static
struct
device
*
mpu_dev
;
static
struct
regulator
*
mpu_reg
;
static
int
omap_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
if
(
!
freq_table
)
return
-
EINVAL
;
return
cpufreq_frequency_table_verify
(
policy
,
freq_table
);
}
static
unsigned
int
omap_getspeed
(
unsigned
int
cpu
)
{
unsigned
long
rate
;
...
...
@@ -167,81 +160,52 @@ static inline void freq_table_free(void)
static
int
omap_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
result
=
0
;
int
result
;
mpu_clk
=
clk_get
(
NULL
,
"cpufreq_ck"
);
if
(
IS_ERR
(
mpu_clk
))
return
PTR_ERR
(
mpu_clk
);
if
(
policy
->
cpu
>=
NR_CPUS
)
{
result
=
-
EINVAL
;
goto
fail_ck
;
}
policy
->
cur
=
omap_getspeed
(
policy
->
cpu
);
if
(
!
freq_table
)
if
(
!
freq_table
)
{
result
=
dev_pm_opp_init_cpufreq_table
(
mpu_dev
,
&
freq_table
);
if
(
result
)
{
dev_err
(
mpu_dev
,
"%s: cpu%d: failed creating freq table[%d]
\n
"
,
if
(
result
)
{
dev_err
(
mpu_dev
,
"%s: cpu%d: failed creating freq table[%d]
\n
"
,
__func__
,
policy
->
cpu
,
result
);
goto
fail_ck
;
goto
fail
;
}
}
atomic_inc_return
(
&
freq_table_users
);
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
freq_table
);
if
(
result
)
goto
fail_table
;
cpufreq_frequency_table_get_attr
(
freq_table
,
policy
->
cpu
);
policy
->
cur
=
omap_getspeed
(
policy
->
cpu
);
/*
* On OMAP SMP configuartion, both processors share the voltage
* and clock. So both CPUs needs to be scaled together and hence
* needs software co-ordination. Use cpufreq affected_cpus
* interface to handle this scenario. Additional is_smp() check
* is to keep SMP_ON_UP build working.
*/
if
(
is_smp
())
cpumask_setall
(
policy
->
cpus
);
/* FIXME: what's the actual transition time? */
policy
->
cpuinfo
.
transition_latency
=
300
*
1000
;
return
0
;
result
=
cpufreq_generic_init
(
policy
,
freq_table
,
300
*
1000
)
;
if
(
!
result
)
return
0
;
fail_table:
freq_table_free
();
fail
_ck
:
fail:
clk_put
(
mpu_clk
);
return
result
;
}
static
int
omap_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
freq_table_free
();
clk_put
(
mpu_clk
);
return
0
;
}
static
struct
freq_attr
*
omap_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
omap_driver
=
{
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
omap_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
omap_target
,
.
get
=
omap_getspeed
,
.
init
=
omap_cpu_init
,
.
exit
=
omap_cpu_exit
,
.
name
=
"omap"
,
.
attr
=
omap_cpufreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
omap_cpufreq_probe
(
struct
platform_device
*
pdev
)
...
...
drivers/cpufreq/p4-clockmod.c
浏览文件 @
6ddee424
...
...
@@ -140,12 +140,6 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
}
static
int
cpufreq_p4_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
p4clockmod_table
[
0
]);
}
static
unsigned
int
cpufreq_p4_get_frequency
(
struct
cpuinfo_x86
*
c
)
{
if
(
c
->
x86
==
0x06
)
{
...
...
@@ -230,25 +224,17 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
else
p4clockmod_table
[
i
].
frequency
=
(
stock_freq
*
i
)
/
8
;
}
cpufreq_frequency_table_get_attr
(
p4clockmod_table
,
policy
->
cpu
);
/* cpuinfo and default policy values */
/* the transition latency is set to be 1 higher than the maximum
* transition latency of the ondemand governor */
policy
->
cpuinfo
.
transition_latency
=
10000001
;
policy
->
cur
=
stock_freq
;
return
cpufreq_
frequency_table_cpuinfo
(
policy
,
&
p4clockmod_table
[
0
]);
return
cpufreq_
table_validate_and_show
(
policy
,
&
p4clockmod_table
[
0
]);
}
static
int
cpufreq_p4_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
}
static
unsigned
int
cpufreq_p4_get
(
unsigned
int
cpu
)
{
u32
l
,
h
;
...
...
@@ -267,19 +253,14 @@ static unsigned int cpufreq_p4_get(unsigned int cpu)
return
stock_freq
;
}
static
struct
freq_attr
*
p4clockmod_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
p4clockmod_driver
=
{
.
verify
=
cpufreq_
p4
_verify
,
.
verify
=
cpufreq_
generic_frequency_table
_verify
,
.
target
=
cpufreq_p4_target
,
.
init
=
cpufreq_p4_cpu_init
,
.
exit
=
cpufreq_
p4_cpu
_exit
,
.
exit
=
cpufreq_
generic
_exit
,
.
get
=
cpufreq_p4_get
,
.
name
=
"p4-clockmod"
,
.
attr
=
p4clockmod
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
const
struct
x86_cpu_id
cpufreq_p4_id
[]
=
{
...
...
drivers/cpufreq/pasemi-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -69,11 +69,6 @@ static struct cpufreq_frequency_table pas_freqs[] = {
{
0
,
CPUFREQ_TABLE_END
},
};
static
struct
freq_attr
*
pas_cpu_freqs_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
/*
* hardware specific functions
*/
...
...
@@ -209,22 +204,13 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)
pr_debug
(
"%d: %d
\n
"
,
i
,
pas_freqs
[
i
].
frequency
);
}
policy
->
cpuinfo
.
transition_latency
=
get_gizmo_latency
();
cur_astate
=
get_cur_astate
(
policy
->
cpu
);
pr_debug
(
"current astate is at %d
\n
"
,
cur_astate
);
policy
->
cur
=
pas_freqs
[
cur_astate
].
frequency
;
cpumask_copy
(
policy
->
cpus
,
cpu_online_mask
);
ppc_proc_freq
=
policy
->
cur
*
1000ul
;
cpufreq_frequency_table_get_attr
(
pas_freqs
,
policy
->
cpu
);
/* this ensures that policy->cpuinfo_min and policy->cpuinfo_max
* are set correctly
*/
return
cpufreq_frequency_table_cpuinfo
(
policy
,
pas_freqs
);
return
cpufreq_generic_init
(
policy
,
pas_freqs
,
get_gizmo_latency
());
out_unmap_sdcpwr:
iounmap
(
sdcpwr_mapbase
);
...
...
@@ -253,11 +239,6 @@ static int pas_cpufreq_cpu_exit(struct cpufreq_policy *policy)
return
0
;
}
static
int
pas_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
pas_freqs
);
}
static
int
pas_cpufreq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
...
...
@@ -300,9 +281,9 @@ static struct cpufreq_driver pas_cpufreq_driver = {
.
flags
=
CPUFREQ_CONST_LOOPS
,
.
init
=
pas_cpufreq_cpu_init
,
.
exit
=
pas_cpufreq_cpu_exit
,
.
verify
=
pas_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
pas_cpufreq_target
,
.
attr
=
pas_cpu_freqs
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
/*
...
...
drivers/cpufreq/pcc-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -111,8 +111,7 @@ static struct pcc_cpu __percpu *pcc_cpu_info;
static
int
pcc_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
return
0
;
}
...
...
@@ -560,13 +559,6 @@ static int pcc_cpufreq_cpu_init(struct cpufreq_policy *policy)
ioread32
(
&
pcch_hdr
->
nominal
)
*
1000
;
policy
->
min
=
policy
->
cpuinfo
.
min_freq
=
ioread32
(
&
pcch_hdr
->
minimum_frequency
)
*
1000
;
policy
->
cur
=
pcc_get_freq
(
cpu
);
if
(
!
policy
->
cur
)
{
pr_debug
(
"init: Unable to get current CPU frequency
\n
"
);
result
=
-
EINVAL
;
goto
out
;
}
pr_debug
(
"init: policy->max is %d, policy->min is %d
\n
"
,
policy
->
max
,
policy
->
min
);
...
...
drivers/cpufreq/pmac32-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -86,11 +86,6 @@ static struct cpufreq_frequency_table pmac_cpu_freqs[] = {
{
0
,
CPUFREQ_TABLE_END
},
};
static
struct
freq_attr
*
pmac_cpu_freqs_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
inline
void
local_delay
(
unsigned
long
ms
)
{
if
(
no_schedule
)
...
...
@@ -378,11 +373,6 @@ static unsigned int pmac_cpufreq_get_speed(unsigned int cpu)
return
cur_freq
;
}
static
int
pmac_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
pmac_cpu_freqs
);
}
static
int
pmac_cpufreq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
...
...
@@ -402,14 +392,7 @@ static int pmac_cpufreq_target( struct cpufreq_policy *policy,
static
int
pmac_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
if
(
policy
->
cpu
!=
0
)
return
-
ENODEV
;
policy
->
cpuinfo
.
transition_latency
=
transition_latency
;
policy
->
cur
=
cur_freq
;
cpufreq_frequency_table_get_attr
(
pmac_cpu_freqs
,
policy
->
cpu
);
return
cpufreq_frequency_table_cpuinfo
(
policy
,
pmac_cpu_freqs
);
return
cpufreq_generic_init
(
policy
,
pmac_cpu_freqs
,
transition_latency
);
}
static
u32
read_gpio
(
struct
device_node
*
np
)
...
...
@@ -469,14 +452,14 @@ static int pmac_cpufreq_resume(struct cpufreq_policy *policy)
}
static
struct
cpufreq_driver
pmac_cpufreq_driver
=
{
.
verify
=
pmac_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
pmac_cpufreq_target
,
.
get
=
pmac_cpufreq_get_speed
,
.
init
=
pmac_cpufreq_cpu_init
,
.
suspend
=
pmac_cpufreq_suspend
,
.
resume
=
pmac_cpufreq_resume
,
.
flags
=
CPUFREQ_PM_NO_WARN
,
.
attr
=
pmac_cpu_freqs
_attr
,
.
attr
=
cpufreq_generic
_attr
,
.
name
=
"powermac"
,
};
...
...
drivers/cpufreq/pmac64-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -70,11 +70,6 @@ static struct cpufreq_frequency_table g5_cpu_freqs[] = {
{
0
,
CPUFREQ_TABLE_END
},
};
static
struct
freq_attr
*
g5_cpu_freqs_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
/* Power mode data is an array of the 32 bits PCR values to use for
* the various frequencies, retrieved from the device-tree
*/
...
...
@@ -142,7 +137,7 @@ static void g5_vdnap_switch_volt(int speed_mode)
pmf_call_one
(
pfunc_vdnap0_complete
,
&
args
);
if
(
done
)
break
;
msleep
(
1
);
usleep_range
(
1000
,
1000
);
}
if
(
done
==
0
)
printk
(
KERN_WARNING
"cpufreq: Timeout in clock slewing !
\n
"
);
...
...
@@ -241,7 +236,7 @@ static void g5_pfunc_switch_volt(int speed_mode)
if
(
pfunc_cpu1_volt_low
)
pmf_call_one
(
pfunc_cpu1_volt_low
,
NULL
);
}
msleep
(
1
0
);
/* should be faster , to fix */
usleep_range
(
10000
,
1000
0
);
/* should be faster , to fix */
}
/*
...
...
@@ -286,7 +281,7 @@ static int g5_pfunc_switch_freq(int speed_mode)
pmf_call_one
(
pfunc_slewing_done
,
&
args
);
if
(
done
)
break
;
msleep
(
1
);
usleep_range
(
500
,
500
);
}
if
(
done
==
0
)
printk
(
KERN_WARNING
"cpufreq: Timeout in clock slewing !
\n
"
);
...
...
@@ -317,11 +312,6 @@ static int g5_pfunc_query_freq(void)
* Common interface to the cpufreq core
*/
static
int
g5_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
g5_cpu_freqs
);
}
static
int
g5_cpufreq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
{
...
...
@@ -357,27 +347,17 @@ static unsigned int g5_cpufreq_get_speed(unsigned int cpu)
static
int
g5_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
policy
->
cpuinfo
.
transition_latency
=
transition_latency
;
policy
->
cur
=
g5_cpu_freqs
[
g5_query_freq
()].
frequency
;
/* secondary CPUs are tied to the primary one by the
* cpufreq core if in the secondary policy we tell it that
* it actually must be one policy together with all others. */
cpumask_copy
(
policy
->
cpus
,
cpu_online_mask
);
cpufreq_frequency_table_get_attr
(
g5_cpu_freqs
,
policy
->
cpu
);
return
cpufreq_frequency_table_cpuinfo
(
policy
,
g5_cpu_freqs
);
return
cpufreq_generic_init
(
policy
,
g5_cpu_freqs
,
transition_latency
);
}
static
struct
cpufreq_driver
g5_cpufreq_driver
=
{
.
name
=
"powermac"
,
.
flags
=
CPUFREQ_CONST_LOOPS
,
.
init
=
g5_cpufreq_cpu_init
,
.
verify
=
g5_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
g5_cpufreq_target
,
.
get
=
g5_cpufreq_get_speed
,
.
attr
=
g5_cpu_freqs
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
...
...
@@ -397,7 +377,8 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpunode)
/* Check supported platforms */
if
(
of_machine_is_compatible
(
"PowerMac8,1"
)
||
of_machine_is_compatible
(
"PowerMac8,2"
)
||
of_machine_is_compatible
(
"PowerMac9,1"
))
of_machine_is_compatible
(
"PowerMac9,1"
)
||
of_machine_is_compatible
(
"PowerMac12,1"
))
use_volts_smu
=
1
;
else
if
(
of_machine_is_compatible
(
"PowerMac11,2"
))
use_volts_vdnap
=
1
;
...
...
@@ -647,8 +628,10 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpunode)
g5_cpu_freqs
[
0
].
frequency
=
max_freq
;
g5_cpu_freqs
[
1
].
frequency
=
min_freq
;
/* Based on a measurement on Xserve G5, rounded up. */
transition_latency
=
10
*
NSEC_PER_MSEC
;
/* Set callbacks */
transition_latency
=
CPUFREQ_ETERNAL
;
g5_switch_volt
=
g5_pfunc_switch_volt
;
g5_switch_freq
=
g5_pfunc_switch_freq
;
g5_query_freq
=
g5_pfunc_query_freq
;
...
...
drivers/cpufreq/powernow-k6.c
浏览文件 @
6ddee424
...
...
@@ -104,19 +104,6 @@ static void powernow_k6_set_state(struct cpufreq_policy *policy,
}
/**
* powernow_k6_verify - verifies a new CPUfreq policy
* @policy: new policy
*
* Policy must be within lowest and highest possible CPU Frequency,
* and at least one possible state must be within min and max.
*/
static
int
powernow_k6_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
clock_ratio
[
0
]);
}
/**
* powernow_k6_setpolicy - sets a new CPUFreq policy
* @policy: new policy
...
...
@@ -145,7 +132,6 @@ static int powernow_k6_target(struct cpufreq_policy *policy,
static
int
powernow_k6_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
unsigned
int
i
,
f
;
int
result
;
if
(
policy
->
cpu
!=
0
)
return
-
ENODEV
;
...
...
@@ -165,15 +151,8 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
/* cpuinfo and default policy values */
policy
->
cpuinfo
.
transition_latency
=
200000
;
policy
->
cur
=
busfreq
*
max_multiplier
;
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
clock_ratio
);
if
(
result
)
return
result
;
cpufreq_frequency_table_get_attr
(
clock_ratio
,
policy
->
cpu
);
return
0
;
return
cpufreq_table_validate_and_show
(
policy
,
clock_ratio
)
;
}
...
...
@@ -195,19 +174,14 @@ static unsigned int powernow_k6_get(unsigned int cpu)
return
ret
;
}
static
struct
freq_attr
*
powernow_k6_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
powernow_k6_driver
=
{
.
verify
=
powernow_k6
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
powernow_k6_target
,
.
init
=
powernow_k6_cpu_init
,
.
exit
=
powernow_k6_cpu_exit
,
.
get
=
powernow_k6_get
,
.
name
=
"powernow-k6"
,
.
attr
=
powernow_k6
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
const
struct
x86_cpu_id
powernow_k6_ids
[]
=
{
...
...
drivers/cpufreq/powernow-k7.c
浏览文件 @
6ddee424
...
...
@@ -549,11 +549,6 @@ static int powernow_target(struct cpufreq_policy *policy,
}
static
int
powernow_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
powernow_table
);
}
/*
* We use the fact that the bus frequency is somehow
* a multiple of 100000/3 khz, then we compute sgtc according
...
...
@@ -678,11 +673,7 @@ static int powernow_cpu_init(struct cpufreq_policy *policy)
policy
->
cpuinfo
.
transition_latency
=
cpufreq_scale
(
2000000UL
,
fsb
,
latency
);
policy
->
cur
=
powernow_get
(
0
);
cpufreq_frequency_table_get_attr
(
powernow_table
,
policy
->
cpu
);
return
cpufreq_frequency_table_cpuinfo
(
policy
,
powernow_table
);
return
cpufreq_table_validate_and_show
(
policy
,
powernow_table
);
}
static
int
powernow_cpu_exit
(
struct
cpufreq_policy
*
policy
)
...
...
@@ -701,13 +692,8 @@ static int powernow_cpu_exit(struct cpufreq_policy *policy)
return
0
;
}
static
struct
freq_attr
*
powernow_table_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
powernow_driver
=
{
.
verify
=
powernow
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
powernow_target
,
.
get
=
powernow_get
,
#ifdef CONFIG_X86_POWERNOW_K7_ACPI
...
...
@@ -716,7 +702,7 @@ static struct cpufreq_driver powernow_driver = {
.
init
=
powernow_cpu_init
,
.
exit
=
powernow_cpu_exit
,
.
name
=
"powernow-k7"
,
.
attr
=
powernow_table
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
__init
powernow_init
(
void
)
...
...
drivers/cpufreq/powernow-k8.c
浏览文件 @
6ddee424
...
...
@@ -1053,17 +1053,6 @@ static int powernowk8_target(struct cpufreq_policy *pol,
return
work_on_cpu
(
pol
->
cpu
,
powernowk8_target_fn
,
&
pta
);
}
/* Driver entry point to verify the policy and range of frequencies */
static
int
powernowk8_verify
(
struct
cpufreq_policy
*
pol
)
{
struct
powernow_k8_data
*
data
=
per_cpu
(
powernow_data
,
pol
->
cpu
);
if
(
!
data
)
return
-
EINVAL
;
return
cpufreq_frequency_table_verify
(
pol
,
data
->
powernow_table
);
}
struct
init_on_cpu
{
struct
powernow_k8_data
*
data
;
int
rc
;
...
...
@@ -1152,11 +1141,8 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol)
cpumask_copy
(
pol
->
cpus
,
cpu_core_mask
(
pol
->
cpu
));
data
->
available_cores
=
pol
->
cpus
;
pol
->
cur
=
find_khz_freq_from_fid
(
data
->
currfid
);
pr_debug
(
"policy current frequency %d kHz
\n
"
,
pol
->
cur
);
/* min/max the cpu is capable of */
if
(
cpufreq_
frequency_table_cpuinfo
(
pol
,
data
->
powernow_table
))
{
if
(
cpufreq_
table_validate_and_show
(
pol
,
data
->
powernow_table
))
{
printk
(
KERN_ERR
FW_BUG
PFX
"invalid powernow_table
\n
"
);
powernow_k8_cpu_exit_acpi
(
data
);
kfree
(
data
->
powernow_table
);
...
...
@@ -1164,8 +1150,6 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol)
return
-
EINVAL
;
}
cpufreq_frequency_table_get_attr
(
data
->
powernow_table
,
pol
->
cpu
);
pr_debug
(
"cpu_init done, current fid 0x%x, vid 0x%x
\n
"
,
data
->
currfid
,
data
->
currvid
);
...
...
@@ -1227,20 +1211,15 @@ static unsigned int powernowk8_get(unsigned int cpu)
return
khz
;
}
static
struct
freq_attr
*
powernow_k8_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
cpufreq_amd64_driver
=
{
.
verify
=
powernowk8
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
powernowk8_target
,
.
bios_limit
=
acpi_processor_get_bios_limit
,
.
init
=
powernowk8_cpu_init
,
.
exit
=
powernowk8_cpu_exit
,
.
get
=
powernowk8_get
,
.
name
=
"powernow-k8"
,
.
attr
=
powernow_k8
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
void
__request_acpi_cpufreq
(
void
)
...
...
drivers/cpufreq/ppc-corenet-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -202,7 +202,7 @@ static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy)
table
[
i
].
frequency
=
CPUFREQ_TABLE_END
;
/* set the min and max frequency properly */
ret
=
cpufreq_
frequency_table_cpuinfo
(
policy
,
table
);
ret
=
cpufreq_
table_validate_and_show
(
policy
,
table
);
if
(
ret
)
{
pr_err
(
"invalid frequency table: %d
\n
"
,
ret
);
goto
err_nomem1
;
...
...
@@ -217,9 +217,6 @@ static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy)
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
;
...
...
@@ -253,14 +250,6 @@ static int __exit corenet_cpufreq_cpu_exit(struct cpufreq_policy *policy)
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
)
{
...
...
@@ -293,20 +282,15 @@ static int corenet_cpufreq_target(struct cpufreq_policy *policy,
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"
,
.
flags
=
CPUFREQ_CONST_LOOPS
,
.
init
=
corenet_cpufreq_cpu_init
,
.
exit
=
__exit_p
(
corenet_cpufreq_cpu_exit
),
.
verify
=
c
orenet_cpufreq
_verify
,
.
verify
=
c
pufreq_generic_frequency_table
_verify
,
.
target
=
corenet_cpufreq_target
,
.
get
=
corenet_cpufreq_get_speed
,
.
attr
=
c
orenet_cpufreq
_attr
,
.
attr
=
c
pufreq_generic
_attr
,
};
static
const
struct
of_device_id
node_matches
[]
__initdata
=
{
...
...
drivers/cpufreq/ppc_cbe_cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -123,22 +123,9 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
cpumask_copy
(
policy
->
cpus
,
cpu_sibling_mask
(
policy
->
cpu
));
#endif
cpufreq_frequency_table_get_attr
(
cbe_freqs
,
policy
->
cpu
);
/* this ensures that policy->cpuinfo_min
* and policy->cpuinfo_max are set correctly */
return
cpufreq_frequency_table_cpuinfo
(
policy
,
cbe_freqs
);
}
static
int
cbe_cpufreq_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
}
static
int
cbe_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
cbe_freqs
);
return
cpufreq_table_validate_and_show
(
policy
,
cbe_freqs
);
}
static
int
cbe_cpufreq_target
(
struct
cpufreq_policy
*
policy
,
...
...
@@ -176,10 +163,10 @@ static int cbe_cpufreq_target(struct cpufreq_policy *policy,
}
static
struct
cpufreq_driver
cbe_cpufreq_driver
=
{
.
verify
=
c
be_cpufreq
_verify
,
.
verify
=
c
pufreq_generic_frequency_table
_verify
,
.
target
=
cbe_cpufreq_target
,
.
init
=
cbe_cpufreq_cpu_init
,
.
exit
=
c
be_cpufreq_cpu
_exit
,
.
exit
=
c
pufreq_generic
_exit
,
.
name
=
"cbe-cpufreq"
,
.
flags
=
CPUFREQ_CONST_LOOPS
,
};
...
...
drivers/cpufreq/pxa2xx-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -262,23 +262,6 @@ static u32 mdrefr_dri(unsigned int freq)
return
(
interval
-
(
cpu_is_pxa27x
()
?
31
:
0
))
/
32
;
}
/* find a valid frequency point */
static
int
pxa_verify_policy
(
struct
cpufreq_policy
*
policy
)
{
struct
cpufreq_frequency_table
*
pxa_freqs_table
;
pxa_freqs_t
*
pxa_freqs
;
int
ret
;
find_freq_tables
(
&
pxa_freqs_table
,
&
pxa_freqs
);
ret
=
cpufreq_frequency_table_verify
(
policy
,
pxa_freqs_table
);
if
(
freq_debug
)
pr_debug
(
"Verified CPU policy: %dKhz min to %dKhz max
\n
"
,
policy
->
min
,
policy
->
max
);
return
ret
;
}
static
unsigned
int
pxa_cpufreq_get
(
unsigned
int
cpu
)
{
return
get_clk_frequency_khz
(
0
);
...
...
@@ -414,8 +397,6 @@ static int pxa_cpufreq_init(struct cpufreq_policy *policy)
/* set default policy and cpuinfo */
policy
->
cpuinfo
.
transition_latency
=
1000
;
/* FIXME: 1 ms, assumed */
policy
->
cur
=
get_clk_frequency_khz
(
0
);
/* current freq */
policy
->
min
=
policy
->
max
=
policy
->
cur
;
/* Generate pxa25x the run cpufreq_frequency_table struct */
for
(
i
=
0
;
i
<
NUM_PXA25x_RUN_FREQS
;
i
++
)
{
...
...
@@ -453,10 +434,12 @@ static int pxa_cpufreq_init(struct cpufreq_policy *policy)
find_freq_tables
(
&
pxa255_freq_table
,
&
pxa255_freqs
);
pr_info
(
"PXA255 cpufreq using %s frequency table
\n
"
,
pxa255_turbo_table
?
"turbo"
:
"run"
);
cpufreq_frequency_table_cpuinfo
(
policy
,
pxa255_freq_table
);
cpufreq_table_validate_and_show
(
policy
,
pxa255_freq_table
);
}
else
if
(
cpu_is_pxa27x
())
{
cpufreq_table_validate_and_show
(
policy
,
pxa27x_freq_table
);
}
else
if
(
cpu_is_pxa27x
())
cpufreq_frequency_table_cpuinfo
(
policy
,
pxa27x_freq_table
);
printk
(
KERN_INFO
"PXA CPU frequency change support initialized
\n
"
);
...
...
@@ -464,9 +447,10 @@ static int pxa_cpufreq_init(struct cpufreq_policy *policy)
}
static
struct
cpufreq_driver
pxa_cpufreq_driver
=
{
.
verify
=
pxa_verify_polic
y
,
.
verify
=
cpufreq_generic_frequency_table_verif
y
,
.
target
=
pxa_set_target
,
.
init
=
pxa_cpufreq_init
,
.
exit
=
cpufreq_generic_exit
,
.
get
=
pxa_cpufreq_get
,
.
name
=
"PXA2xx"
,
};
...
...
drivers/cpufreq/pxa3xx-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -108,7 +108,7 @@ static int setup_freqs_table(struct cpufreq_policy *policy,
pxa3xx_freqs_num
=
num
;
pxa3xx_freqs_table
=
table
;
return
cpufreq_
frequency_table_cpuinfo
(
policy
,
table
);
return
cpufreq_
table_validate_and_show
(
policy
,
table
);
}
static
void
__update_core_freq
(
struct
pxa3xx_freq_info
*
info
)
...
...
@@ -150,11 +150,6 @@ static void __update_bus_freq(struct pxa3xx_freq_info *info)
cpu_relax
();
}
static
int
pxa3xx_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
pxa3xx_freqs_table
);
}
static
unsigned
int
pxa3xx_cpufreq_get
(
unsigned
int
cpu
)
{
return
pxa3xx_get_clk_frequency_khz
(
0
);
...
...
@@ -206,11 +201,10 @@ static int pxa3xx_cpufreq_init(struct cpufreq_policy *policy)
int
ret
=
-
EINVAL
;
/* set default policy and cpuinfo */
policy
->
cpuinfo
.
min_freq
=
104000
;
policy
->
cpuinfo
.
max_freq
=
(
cpu_is_pxa320
())
?
806000
:
624000
;
policy
->
min
=
policy
->
cpuinfo
.
min_freq
=
104000
;
policy
->
max
=
policy
->
cpuinfo
.
max_freq
=
(
cpu_is_pxa320
())
?
806000
:
624000
;
policy
->
cpuinfo
.
transition_latency
=
1000
;
/* FIXME: 1 ms, assumed */
policy
->
max
=
pxa3xx_get_clk_frequency_khz
(
0
);
policy
->
cur
=
policy
->
min
=
policy
->
max
;
if
(
cpu_is_pxa300
()
||
cpu_is_pxa310
())
ret
=
setup_freqs_table
(
policy
,
pxa300_freqs
,
...
...
@@ -230,9 +224,10 @@ static int pxa3xx_cpufreq_init(struct cpufreq_policy *policy)
}
static
struct
cpufreq_driver
pxa3xx_cpufreq_driver
=
{
.
verify
=
pxa3xx_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
pxa3xx_cpufreq_set
,
.
init
=
pxa3xx_cpufreq_init
,
.
exit
=
cpufreq_generic_exit
,
.
get
=
pxa3xx_cpufreq_get
,
.
name
=
"pxa3xx-cpufreq"
,
};
...
...
drivers/cpufreq/s3c2416-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -87,16 +87,6 @@ static struct cpufreq_frequency_table s3c2450_freq_table[] = {
{
0
,
CPUFREQ_TABLE_END
},
};
static
int
s3c2416_cpufreq_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
struct
s3c2416_data
*
s3c_freq
=
&
s3c2416_cpufreq
;
if
(
policy
->
cpu
!=
0
)
return
-
EINVAL
;
return
cpufreq_frequency_table_verify
(
policy
,
s3c_freq
->
freq_table
);
}
static
unsigned
int
s3c2416_cpufreq_get_speed
(
unsigned
int
cpu
)
{
struct
s3c2416_data
*
s3c_freq
=
&
s3c2416_cpufreq
;
...
...
@@ -486,20 +476,14 @@ static int __init s3c2416_cpufreq_driver_init(struct cpufreq_policy *policy)
freq
++
;
}
policy
->
cur
=
clk_get_rate
(
s3c_freq
->
armclk
)
/
1000
;
/* Datasheet says PLL stabalisation time must be at least 300us,
* so but add some fudge. (reference in LOCKCON0 register description)
*/
policy
->
cpuinfo
.
transition_latency
=
(
500
*
1000
)
+
s3c_freq
->
regulator_latency
;
ret
=
cpufreq_frequency_table_cpuinfo
(
policy
,
s3c_freq
->
freq_table
);
ret
=
cpufreq_generic_init
(
policy
,
s3c_freq
->
freq_table
,
(
500
*
1000
)
+
s3c_freq
->
regulator_latency
);
if
(
ret
)
goto
err_freq_table
;
cpufreq_frequency_table_get_attr
(
s3c_freq
->
freq_table
,
0
);
register_reboot_notifier
(
&
s3c2416_cpufreq_reboot_notifier
);
return
0
;
...
...
@@ -518,19 +502,14 @@ static int __init s3c2416_cpufreq_driver_init(struct cpufreq_policy *policy)
return
ret
;
}
static
struct
freq_attr
*
s3c2416_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
s3c2416_cpufreq_driver
=
{
.
flags
=
0
,
.
verify
=
s3c2416_cpufreq_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
s3c2416_cpufreq_set_target
,
.
get
=
s3c2416_cpufreq_get_speed
,
.
init
=
s3c2416_cpufreq_driver_init
,
.
name
=
"s3c2416"
,
.
attr
=
s3c2416_cpufreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
__init
s3c2416_cpufreq_init
(
void
)
...
...
drivers/cpufreq/s3c24xx-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -373,23 +373,7 @@ struct clk *s3c_cpufreq_clk_get(struct device *dev, const char *name)
static
int
s3c_cpufreq_init
(
struct
cpufreq_policy
*
policy
)
{
printk
(
KERN_INFO
"%s: initialising policy %p
\n
"
,
__func__
,
policy
);
if
(
policy
->
cpu
!=
0
)
return
-
EINVAL
;
policy
->
cur
=
s3c_cpufreq_get
(
0
);
policy
->
min
=
policy
->
cpuinfo
.
min_freq
=
0
;
policy
->
max
=
policy
->
cpuinfo
.
max_freq
=
cpu_cur
.
info
->
max
.
fclk
/
1000
;
policy
->
governor
=
CPUFREQ_DEFAULT_GOVERNOR
;
/* feed the latency information from the cpu driver */
policy
->
cpuinfo
.
transition_latency
=
cpu_cur
.
info
->
latency
;
if
(
ftab
)
cpufreq_frequency_table_cpuinfo
(
policy
,
ftab
);
return
0
;
return
cpufreq_generic_init
(
policy
,
ftab
,
cpu_cur
.
info
->
latency
);
}
static
int
__init
s3c_cpufreq_initclks
(
void
)
...
...
@@ -416,14 +400,6 @@ static int __init s3c_cpufreq_initclks(void)
return
0
;
}
static
int
s3c_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
if
(
policy
->
cpu
!=
0
)
return
-
EINVAL
;
return
0
;
}
#ifdef CONFIG_PM
static
struct
cpufreq_frequency_table
suspend_pll
;
static
unsigned
int
suspend_freq
;
...
...
@@ -473,7 +449,6 @@ static int s3c_cpufreq_resume(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
s3c24xx_driver
=
{
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
s3c_cpufreq_verify
,
.
target
=
s3c_cpufreq_target
,
.
get
=
s3c_cpufreq_get
,
.
init
=
s3c_cpufreq_init
,
...
...
drivers/cpufreq/s3c64xx-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -54,14 +54,6 @@ static struct cpufreq_frequency_table s3c64xx_freq_table[] = {
};
#endif
static
int
s3c64xx_cpufreq_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
if
(
policy
->
cpu
!=
0
)
return
-
EINVAL
;
return
cpufreq_frequency_table_verify
(
policy
,
s3c64xx_freq_table
);
}
static
unsigned
int
s3c64xx_cpufreq_get_speed
(
unsigned
int
cpu
)
{
if
(
cpu
!=
0
)
...
...
@@ -243,15 +235,12 @@ static int s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
freq
++
;
}
policy
->
cur
=
clk_get_rate
(
armclk
)
/
1000
;
/* Datasheet says PLL stabalisation time (if we were to use
* the PLLs, which we don't currently) is ~300us worst case,
* but add some fudge.
*/
policy
->
cpuinfo
.
transition_latency
=
(
500
*
1000
)
+
regulator_latency
;
ret
=
cpufreq_frequency_table_cpuinfo
(
policy
,
s3c64xx_freq_table
);
ret
=
cpufreq_generic_init
(
policy
,
s3c64xx_freq_table
,
(
500
*
1000
)
+
regulator_latency
);
if
(
ret
!=
0
)
{
pr_err
(
"Failed to configure frequency table: %d
\n
"
,
ret
);
...
...
@@ -264,7 +253,7 @@ static int s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
s3c64xx_cpufreq_driver
=
{
.
flags
=
0
,
.
verify
=
s3c64xx_cpufreq_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
s3c64xx_cpufreq_set_target
,
.
get
=
s3c64xx_cpufreq_get_speed
,
.
init
=
s3c64xx_cpufreq_driver_init
,
...
...
drivers/cpufreq/s5pv210-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -174,14 +174,6 @@ static void s5pv210_set_refresh(enum s5pv210_dmc_port ch, unsigned long freq)
__raw_writel
(
tmp1
,
reg
);
}
static
int
s5pv210_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
if
(
policy
->
cpu
)
return
-
EINVAL
;
return
cpufreq_frequency_table_verify
(
policy
,
s5pv210_freq_table
);
}
static
unsigned
int
s5pv210_getspeed
(
unsigned
int
cpu
)
{
if
(
cpu
)
...
...
@@ -551,13 +543,7 @@ static int __init s5pv210_cpu_init(struct cpufreq_policy *policy)
s5pv210_dram_conf
[
1
].
refresh
=
(
__raw_readl
(
S5P_VA_DMC1
+
0x30
)
*
1000
);
s5pv210_dram_conf
[
1
].
freq
=
clk_get_rate
(
dmc1_clk
);
policy
->
cur
=
policy
->
min
=
policy
->
max
=
s5pv210_getspeed
(
0
);
cpufreq_frequency_table_get_attr
(
s5pv210_freq_table
,
policy
->
cpu
);
policy
->
cpuinfo
.
transition_latency
=
40000
;
return
cpufreq_frequency_table_cpuinfo
(
policy
,
s5pv210_freq_table
);
return
cpufreq_generic_init
(
policy
,
s5pv210_freq_table
,
40000
);
out_dmc1:
clk_put
(
dmc0_clk
);
...
...
@@ -605,7 +591,7 @@ static int s5pv210_cpufreq_reboot_notifier_event(struct notifier_block *this,
static
struct
cpufreq_driver
s5pv210_driver
=
{
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
s5pv210_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
s5pv210_target
,
.
get
=
s5pv210_getspeed
,
.
init
=
s5pv210_cpu_init
,
...
...
drivers/cpufreq/sa1100-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -218,18 +218,12 @@ static int sa1100_target(struct cpufreq_policy *policy,
static
int
__init
sa1100_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
if
(
policy
->
cpu
!=
0
)
return
-
EINVAL
;
policy
->
cur
=
policy
->
min
=
policy
->
max
=
sa11x0_getspeed
(
0
);
policy
->
cpuinfo
.
min_freq
=
59000
;
policy
->
cpuinfo
.
max_freq
=
287000
;
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
return
0
;
return
cpufreq_generic_init
(
policy
,
sa11x0_freq_table
,
CPUFREQ_ETERNAL
);
}
static
struct
cpufreq_driver
sa1100_driver
__refdata
=
{
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
sa11x0_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
sa1100_target
,
.
get
=
sa11x0_getspeed
,
.
init
=
sa1100_cpu_init
,
...
...
drivers/cpufreq/sa1110-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -332,20 +332,14 @@ static int sa1110_target(struct cpufreq_policy *policy,
static
int
__init
sa1110_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
if
(
policy
->
cpu
!=
0
)
return
-
EINVAL
;
policy
->
cur
=
policy
->
min
=
policy
->
max
=
sa11x0_getspeed
(
0
);
policy
->
cpuinfo
.
min_freq
=
59000
;
policy
->
cpuinfo
.
max_freq
=
287000
;
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
return
0
;
return
cpufreq_generic_init
(
policy
,
sa11x0_freq_table
,
CPUFREQ_ETERNAL
);
}
/* sa1110_driver needs __refdata because it must remain after init registers
* it with cpufreq_register_driver() */
static
struct
cpufreq_driver
sa1110_driver
__refdata
=
{
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
sa11x0_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
sa1110_target
,
.
get
=
sa11x0_getspeed
,
.
init
=
sa1110_cpu_init
,
...
...
drivers/cpufreq/sc520_freq.c
浏览文件 @
6ddee424
...
...
@@ -78,11 +78,6 @@ static void sc520_freq_set_cpu_state(struct cpufreq_policy *policy,
cpufreq_notify_transition
(
policy
,
&
freqs
,
CPUFREQ_POSTCHANGE
);
};
static
int
sc520_freq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
sc520_freq_table
[
0
]);
}
static
int
sc520_freq_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
...
...
@@ -106,7 +101,6 @@ static int sc520_freq_target(struct cpufreq_policy *policy,
static
int
sc520_freq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
struct
cpuinfo_x86
*
c
=
&
cpu_data
(
0
);
int
result
;
/* capability check */
if
(
c
->
x86_vendor
!=
X86_VENDOR_AMD
||
...
...
@@ -115,39 +109,19 @@ static int sc520_freq_cpu_init(struct cpufreq_policy *policy)
/* cpuinfo and default policy values */
policy
->
cpuinfo
.
transition_latency
=
1000000
;
/* 1ms */
policy
->
cur
=
sc520_freq_get_cpu_frequency
(
0
);
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
sc520_freq_table
);
if
(
result
)
return
result
;
cpufreq_frequency_table_get_attr
(
sc520_freq_table
,
policy
->
cpu
);
return
0
;
}
static
int
sc520_freq_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_table_validate_and_show
(
policy
,
sc520_freq_table
);
}
static
struct
freq_attr
*
sc520_freq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
sc520_freq_driver
=
{
.
get
=
sc520_freq_get_cpu_frequency
,
.
verify
=
sc520_freq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
sc520_freq_target
,
.
init
=
sc520_freq_cpu_init
,
.
exit
=
sc520_freq_cpu
_exit
,
.
exit
=
cpufreq_generic
_exit
,
.
name
=
"sc520_freq"
,
.
attr
=
sc520_freq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
const
struct
x86_cpu_id
sc520_ids
[]
=
{
...
...
drivers/cpufreq/sh-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -87,15 +87,12 @@ static int sh_cpufreq_verify(struct cpufreq_policy *policy)
if
(
freq_table
)
return
cpufreq_frequency_table_verify
(
policy
,
freq_table
);
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
policy
->
min
=
(
clk_round_rate
(
cpuclk
,
1
)
+
500
)
/
1000
;
policy
->
max
=
(
clk_round_rate
(
cpuclk
,
~
0UL
)
+
500
)
/
1000
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
return
0
;
}
...
...
@@ -114,15 +111,13 @@ static int sh_cpufreq_cpu_init(struct cpufreq_policy *policy)
return
PTR_ERR
(
cpuclk
);
}
policy
->
cur
=
sh_cpufreq_get
(
cpu
);
freq_table
=
cpuclk
->
nr_freqs
?
cpuclk
->
freq_table
:
NULL
;
if
(
freq_table
)
{
int
result
;
result
=
cpufreq_
frequency_table_cpuinfo
(
policy
,
freq_table
);
if
(
!
result
)
cpufreq_frequency_table_get_attr
(
freq_table
,
cpu
)
;
result
=
cpufreq_
table_validate_and_show
(
policy
,
freq_table
);
if
(
result
)
return
result
;
}
else
{
dev_notice
(
dev
,
"no frequency table found, falling back "
"to rate rounding.
\n
"
);
...
...
@@ -154,11 +149,6 @@ static int sh_cpufreq_cpu_exit(struct cpufreq_policy *policy)
return
0
;
}
static
struct
freq_attr
*
sh_freq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
sh_cpufreq_driver
=
{
.
name
=
"sh"
,
.
get
=
sh_cpufreq_get
,
...
...
@@ -166,7 +156,7 @@ static struct cpufreq_driver sh_cpufreq_driver = {
.
verify
=
sh_cpufreq_verify
,
.
init
=
sh_cpufreq_cpu_init
,
.
exit
=
sh_cpufreq_cpu_exit
,
.
attr
=
sh_freq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
__init
sh_cpufreq_module_init
(
void
)
...
...
drivers/cpufreq/sparc-us2e-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -295,12 +295,6 @@ static int us2e_freq_target(struct cpufreq_policy *policy,
return
0
;
}
static
int
us2e_freq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
us2e_freq_table
[
policy
->
cpu
].
table
[
0
]);
}
static
int
__init
us2e_freq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
unsigned
int
cpu
=
policy
->
cpu
;
...
...
@@ -324,13 +318,15 @@ static int __init us2e_freq_cpu_init(struct cpufreq_policy *policy)
policy
->
cpuinfo
.
transition_latency
=
0
;
policy
->
cur
=
clock_tick
;
return
cpufreq_
frequency_table_cpuinfo
(
policy
,
table
);
return
cpufreq_
table_validate_and_show
(
policy
,
table
);
}
static
int
us2e_freq_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
if
(
cpufreq_us2e_driver
)
if
(
cpufreq_us2e_driver
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
us2e_set_cpu_divider_index
(
policy
,
0
);
}
return
0
;
}
...
...
@@ -361,7 +357,7 @@ static int __init us2e_freq_init(void)
goto
err_out
;
driver
->
init
=
us2e_freq_cpu_init
;
driver
->
verify
=
us2e_freq
_verify
;
driver
->
verify
=
cpufreq_generic_frequency_table
_verify
;
driver
->
target
=
us2e_freq_target
;
driver
->
get
=
us2e_freq_get
;
driver
->
exit
=
us2e_freq_cpu_exit
;
...
...
drivers/cpufreq/sparc-us3-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -156,12 +156,6 @@ static int us3_freq_target(struct cpufreq_policy *policy,
return
0
;
}
static
int
us3_freq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
us3_freq_table
[
policy
->
cpu
].
table
[
0
]);
}
static
int
__init
us3_freq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
unsigned
int
cpu
=
policy
->
cpu
;
...
...
@@ -181,13 +175,15 @@ static int __init us3_freq_cpu_init(struct cpufreq_policy *policy)
policy
->
cpuinfo
.
transition_latency
=
0
;
policy
->
cur
=
clock_tick
;
return
cpufreq_
frequency_table_cpuinfo
(
policy
,
table
);
return
cpufreq_
table_validate_and_show
(
policy
,
table
);
}
static
int
us3_freq_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
if
(
cpufreq_us3_driver
)
if
(
cpufreq_us3_driver
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
us3_set_cpu_divider_index
(
policy
,
0
);
}
return
0
;
}
...
...
@@ -222,7 +218,7 @@ static int __init us3_freq_init(void)
goto
err_out
;
driver
->
init
=
us3_freq_cpu_init
;
driver
->
verify
=
us3_freq
_verify
;
driver
->
verify
=
cpufreq_generic_frequency_table
_verify
;
driver
->
target
=
us3_freq_target
;
driver
->
get
=
us3_freq_get
;
driver
->
exit
=
us3_freq_cpu_exit
;
...
...
drivers/cpufreq/spear-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -30,11 +30,6 @@ static struct {
u32
cnt
;
}
spear_cpufreq
;
static
int
spear_cpufreq_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
spear_cpufreq
.
freq_tbl
);
}
static
unsigned
int
spear_cpufreq_get
(
unsigned
int
cpu
)
{
return
clk_get_rate
(
spear_cpufreq
.
clk
)
/
1000
;
...
...
@@ -176,43 +171,19 @@ static int spear_cpufreq_target(struct cpufreq_policy *policy,
static
int
spear_cpufreq_init
(
struct
cpufreq_policy
*
policy
)
{
int
ret
;
ret
=
cpufreq_frequency_table_cpuinfo
(
policy
,
spear_cpufreq
.
freq_tbl
);
if
(
ret
)
{
pr_err
(
"cpufreq_frequency_table_cpuinfo() failed"
);
return
ret
;
}
cpufreq_frequency_table_get_attr
(
spear_cpufreq
.
freq_tbl
,
policy
->
cpu
);
policy
->
cpuinfo
.
transition_latency
=
spear_cpufreq
.
transition_latency
;
policy
->
cur
=
spear_cpufreq_get
(
0
);
cpumask_setall
(
policy
->
cpus
);
return
0
;
}
static
int
spear_cpufreq_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_generic_init
(
policy
,
spear_cpufreq
.
freq_tbl
,
spear_cpufreq
.
transition_latency
);
}
static
struct
freq_attr
*
spear_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
spear_cpufreq_driver
=
{
.
name
=
"cpufreq-spear"
,
.
flags
=
CPUFREQ_STICKY
,
.
verify
=
spear_cpufreq
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
spear_cpufreq_target
,
.
get
=
spear_cpufreq_get
,
.
init
=
spear_cpufreq_init
,
.
exit
=
spear_cpufreq
_exit
,
.
attr
=
spear_cpufreq
_attr
,
.
exit
=
cpufreq_generic
_exit
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
spear_cpufreq_driver_init
(
void
)
...
...
drivers/cpufreq/speedstep-centrino.c
浏览文件 @
6ddee424
...
...
@@ -343,9 +343,7 @@ static unsigned int get_cur_freq(unsigned int cpu)
static
int
centrino_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
struct
cpuinfo_x86
*
cpu
=
&
cpu_data
(
policy
->
cpu
);
unsigned
freq
;
unsigned
l
,
h
;
int
ret
;
int
i
;
/* Only Intel makes Enhanced Speedstep-capable CPUs */
...
...
@@ -373,9 +371,8 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
return
-
ENODEV
;
}
if
(
centrino_cpu_init_table
(
policy
))
{
if
(
centrino_cpu_init_table
(
policy
))
return
-
ENODEV
;
}
/* Check to see if Enhanced SpeedStep is enabled, and try to
enable it if not. */
...
...
@@ -395,22 +392,11 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
}
}
freq
=
get_cur_freq
(
policy
->
cpu
);
policy
->
cpuinfo
.
transition_latency
=
10000
;
/* 10uS transition latency */
policy
->
cur
=
freq
;
pr_debug
(
"centrino_cpu_init: cur=%dkHz
\n
"
,
policy
->
cur
);
ret
=
cpufreq_frequency_table_cpuinfo
(
policy
,
ret
urn
cpufreq_table_validate_and_show
(
policy
,
per_cpu
(
centrino_model
,
policy
->
cpu
)
->
op_points
);
if
(
ret
)
return
(
ret
);
cpufreq_frequency_table_get_attr
(
per_cpu
(
centrino_model
,
policy
->
cpu
)
->
op_points
,
policy
->
cpu
);
return
0
;
}
static
int
centrino_cpu_exit
(
struct
cpufreq_policy
*
policy
)
...
...
@@ -427,19 +413,6 @@ static int centrino_cpu_exit(struct cpufreq_policy *policy)
return
0
;
}
/**
* centrino_verify - verifies a new CPUFreq policy
* @policy: new policy
*
* Limit must be within this model's frequency range at least one
* border included.
*/
static
int
centrino_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
per_cpu
(
centrino_model
,
policy
->
cpu
)
->
op_points
);
}
/**
* centrino_setpolicy - set a new CPUFreq policy
* @policy: new policy
...
...
@@ -561,20 +534,15 @@ static int centrino_target (struct cpufreq_policy *policy,
return
retval
;
}
static
struct
freq_attr
*
centrino_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
centrino_driver
=
{
.
name
=
"centrino"
,
/* should be speedstep-centrino,
but there's a 16 char limit */
.
init
=
centrino_cpu_init
,
.
exit
=
centrino_cpu_exit
,
.
verify
=
c
entrino
_verify
,
.
verify
=
c
pufreq_generic_frequency_table
_verify
,
.
target
=
centrino_target
,
.
get
=
get_cur_freq
,
.
attr
=
centrino
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
/*
...
...
drivers/cpufreq/speedstep-ich.c
浏览文件 @
6ddee424
...
...
@@ -289,18 +289,6 @@ static int speedstep_target(struct cpufreq_policy *policy,
}
/**
* speedstep_verify - verifies a new CPUFreq policy
* @policy: new policy
*
* Limit must be within speedstep_low_freq and speedstep_high_freq, with
* at least one border included.
*/
static
int
speedstep_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
speedstep_freqs
[
0
]);
}
struct
get_freqs
{
struct
cpufreq_policy
*
policy
;
int
ret
;
...
...
@@ -320,8 +308,7 @@ static void get_freqs_on_cpu(void *_get_freqs)
static
int
speedstep_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
result
;
unsigned
int
policy_cpu
,
speed
;
unsigned
int
policy_cpu
;
struct
get_freqs
gf
;
/* only run on CPU to be set, or on its sibling */
...
...
@@ -336,49 +323,18 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
if
(
gf
.
ret
)
return
gf
.
ret
;
/* get current speed setting */
speed
=
speedstep_get
(
policy_cpu
);
if
(
!
speed
)
return
-
EIO
;
pr_debug
(
"currently at %s speed setting - %i MHz
\n
"
,
(
speed
==
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
)
?
"low"
:
"high"
,
(
speed
/
1000
));
/* cpuinfo and default policy values */
policy
->
cur
=
speed
;
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
speedstep_freqs
);
if
(
result
)
return
result
;
cpufreq_frequency_table_get_attr
(
speedstep_freqs
,
policy
->
cpu
);
return
0
;
}
static
int
speedstep_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_table_validate_and_show
(
policy
,
speedstep_freqs
);
}
static
struct
freq_attr
*
speedstep_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
speedstep_driver
=
{
.
name
=
"speedstep-ich"
,
.
verify
=
speedstep
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
speedstep_target
,
.
init
=
speedstep_cpu_init
,
.
exit
=
speedstep_cpu
_exit
,
.
exit
=
cpufreq_generic
_exit
,
.
get
=
speedstep_get
,
.
attr
=
speedstep
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
const
struct
x86_cpu_id
ss_smi_ids
[]
=
{
...
...
drivers/cpufreq/speedstep-smi.c
浏览文件 @
6ddee424
...
...
@@ -264,23 +264,9 @@ static int speedstep_target(struct cpufreq_policy *policy,
}
/**
* speedstep_verify - verifies a new CPUFreq policy
* @policy: new policy
*
* Limit must be within speedstep_low_freq and speedstep_high_freq, with
* at least one border included.
*/
static
int
speedstep_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
speedstep_freqs
[
0
]);
}
static
int
speedstep_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
result
;
unsigned
int
speed
,
state
;
unsigned
int
*
low
,
*
high
;
/* capability check */
...
...
@@ -316,32 +302,8 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
pr_debug
(
"workaround worked.
\n
"
);
}
/* get current speed setting */
state
=
speedstep_get_state
();
speed
=
speedstep_freqs
[
state
].
frequency
;
pr_debug
(
"currently at %s speed setting - %i MHz
\n
"
,
(
speed
==
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
)
?
"low"
:
"high"
,
(
speed
/
1000
));
/* cpuinfo and default policy values */
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
policy
->
cur
=
speed
;
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
speedstep_freqs
);
if
(
result
)
return
result
;
cpufreq_frequency_table_get_attr
(
speedstep_freqs
,
policy
->
cpu
);
return
0
;
}
static
int
speedstep_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
return
cpufreq_table_validate_and_show
(
policy
,
speedstep_freqs
);
}
static
unsigned
int
speedstep_get
(
unsigned
int
cpu
)
...
...
@@ -362,20 +324,15 @@ static int speedstep_resume(struct cpufreq_policy *policy)
return
result
;
}
static
struct
freq_attr
*
speedstep_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
speedstep_driver
=
{
.
name
=
"speedstep-smi"
,
.
verify
=
speedstep
_verify
,
.
verify
=
cpufreq_generic_frequency_table
_verify
,
.
target
=
speedstep_target
,
.
init
=
speedstep_cpu_init
,
.
exit
=
speedstep_cpu
_exit
,
.
exit
=
cpufreq_generic
_exit
,
.
get
=
speedstep_get
,
.
resume
=
speedstep_resume
,
.
attr
=
speedstep
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
const
struct
x86_cpu_id
ss_smi_ids
[]
=
{
...
...
drivers/cpufreq/tegra-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -51,11 +51,6 @@ static unsigned long target_cpu_speed[NUM_CPUS];
static
DEFINE_MUTEX
(
tegra_cpu_lock
);
static
bool
is_suspended
;
static
int
tegra_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
freq_table
);
}
static
unsigned
int
tegra_getspeed
(
unsigned
int
cpu
)
{
unsigned
long
rate
;
...
...
@@ -209,21 +204,23 @@ static struct notifier_block tegra_cpu_pm_notifier = {
static
int
tegra_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
ret
;
if
(
policy
->
cpu
>=
NUM_CPUS
)
return
-
EINVAL
;
clk_prepare_enable
(
emc_clk
);
clk_prepare_enable
(
cpu_clk
);
cpufreq_frequency_table_cpuinfo
(
policy
,
freq_table
);
cpufreq_frequency_table_get_attr
(
freq_table
,
policy
->
cpu
);
policy
->
cur
=
tegra_getspeed
(
policy
->
cpu
);
target_cpu_speed
[
policy
->
cpu
]
=
policy
->
cur
;
target_cpu_speed
[
policy
->
cpu
]
=
tegra_getspeed
(
policy
->
cpu
);
/* FIXME: what's the actual transition time? */
policy
->
cpuinfo
.
transition_latency
=
300
*
1000
;
cpumask_copy
(
policy
->
cpus
,
cpu_possible_mask
);
ret
=
cpufreq_generic_init
(
policy
,
freq_table
,
300
*
1000
);
if
(
ret
)
{
clk_disable_unprepare
(
cpu_clk
);
clk_disable_unprepare
(
emc_clk
);
return
ret
;
}
if
(
policy
->
cpu
==
0
)
register_pm_notifier
(
&
tegra_cpu_pm_notifier
);
...
...
@@ -233,24 +230,20 @@ static int tegra_cpu_init(struct cpufreq_policy *policy)
static
int
tegra_cpu_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_cpuinfo
(
policy
,
freq_table
);
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
clk_disable_unprepare
(
cpu_clk
);
clk_disable_unprepare
(
emc_clk
);
return
0
;
}
static
struct
freq_attr
*
tegra_cpufreq_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
static
struct
cpufreq_driver
tegra_cpufreq_driver
=
{
.
verify
=
tegra_verify_speed
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target
=
tegra_target
,
.
get
=
tegra_getspeed
,
.
init
=
tegra_cpu_init
,
.
exit
=
tegra_cpu_exit
,
.
name
=
"tegra"
,
.
attr
=
tegra_cpufreq
_attr
,
.
attr
=
cpufreq_generic
_attr
,
};
static
int
__init
tegra_cpufreq_init
(
void
)
...
...
drivers/cpufreq/unicore2-cpufreq.c
浏览文件 @
6ddee424
...
...
@@ -29,9 +29,7 @@ static int ucv2_verify_speed(struct cpufreq_policy *policy)
if
(
policy
->
cpu
)
return
-
EINVAL
;
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
cpufreq_verify_within_cpu_limits
(
policy
);
return
0
;
}
...
...
@@ -68,7 +66,6 @@ static int __init ucv2_cpu_init(struct cpufreq_policy *policy)
{
if
(
policy
->
cpu
!=
0
)
return
-
EINVAL
;
policy
->
cur
=
ucv2_getspeed
(
0
);
policy
->
min
=
policy
->
cpuinfo
.
min_freq
=
250000
;
policy
->
max
=
policy
->
cpuinfo
.
max_freq
=
1000000
;
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
...
...
drivers/thermal/Kconfig
浏览文件 @
6ddee424
...
...
@@ -78,7 +78,6 @@ config THERMAL_GOV_USER_SPACE
config CPU_THERMAL
bool "generic cpu cooling support"
depends on CPU_FREQ
select CPU_FREQ_TABLE
help
This implements the generic cpu cooling mechanism through frequency
reduction. An ACPI version of this already exists
...
...
include/linux/cpufreq.h
浏览文件 @
6ddee424
...
...
@@ -180,13 +180,6 @@ __ATTR(_name, 0644, show_##_name, store_##_name)
struct
cpufreq_driver
{
char
name
[
CPUFREQ_NAME_LEN
];
u8
flags
;
/*
* This should be set by platforms having multiple clock-domains, i.e.
* supporting multiple policies. With this sysfs directories of governor
* would be created in cpu/cpu<num>/cpufreq/ directory and so they can
* use the same governor with different tunables for different clusters.
*/
bool
have_governor_per_policy
;
/* needed by all drivers */
int
(
*
init
)
(
struct
cpufreq_policy
*
policy
);
...
...
@@ -211,13 +204,22 @@ struct cpufreq_driver {
};
/* flags */
#define CPUFREQ_STICKY 0x01
/* the driver isn't removed even if
* all ->init() calls failed */
#define CPUFREQ_CONST_LOOPS 0x02
/* loops_per_jiffy or other kernel
* "constants" aren't affected by
* frequency transitions */
#define CPUFREQ_PM_NO_WARN 0x04
/* don't warn on suspend/resume speed
* mismatches */
#define CPUFREQ_STICKY (1 << 0)
/* driver isn't removed even if
all ->init() calls failed */
#define CPUFREQ_CONST_LOOPS (1 << 1)
/* loops_per_jiffy or other
kernel "constants" aren't
affected by frequency
transitions */
#define CPUFREQ_PM_NO_WARN (1 << 2)
/* don't warn on suspend/resume
speed mismatches */
/*
* This should be set by platforms having multiple clock-domains, i.e.
* supporting multiple policies. With this sysfs directories of governor would
* be created in cpu/cpu<num>/cpufreq/ directory and so they can use the same
* governor with different tunables for different clusters.
*/
#define CPUFREQ_HAVE_GOVERNOR_PER_POLICY (1 << 3)
int
cpufreq_register_driver
(
struct
cpufreq_driver
*
driver_data
);
int
cpufreq_unregister_driver
(
struct
cpufreq_driver
*
driver_data
);
...
...
@@ -240,6 +242,13 @@ static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy,
return
;
}
static
inline
void
cpufreq_verify_within_cpu_limits
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_verify_within_limits
(
policy
,
policy
->
cpuinfo
.
min_freq
,
policy
->
cpuinfo
.
max_freq
);
}
/*********************************************************************
* CPUFREQ NOTIFIER INTERFACE *
*********************************************************************/
...
...
@@ -392,6 +401,7 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
int
cpufreq_frequency_table_verify
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
);
int
cpufreq_generic_frequency_table_verify
(
struct
cpufreq_policy
*
policy
);
int
cpufreq_frequency_table_target
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
,
...
...
@@ -407,8 +417,20 @@ struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
/* the following are really really optional */
extern
struct
freq_attr
cpufreq_freq_attr_scaling_available_freqs
;
extern
struct
freq_attr
*
cpufreq_generic_attr
[];
void
cpufreq_frequency_table_get_attr
(
struct
cpufreq_frequency_table
*
table
,
unsigned
int
cpu
);
void
cpufreq_frequency_table_put_attr
(
unsigned
int
cpu
);
int
cpufreq_table_validate_and_show
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
);
int
cpufreq_generic_init
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
,
unsigned
int
transition_latency
);
static
inline
int
cpufreq_generic_exit
(
struct
cpufreq_policy
*
policy
)
{
cpufreq_frequency_table_put_attr
(
policy
->
cpu
);
return
0
;
}
#endif
/* _LINUX_CPUFREQ_H */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录