Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
37c14794
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看板
提交
37c14794
编写于
5月 08, 2014
作者:
R
Rafael J. Wysocki
浏览文件
操作
浏览文件
下载
差异文件
Merge back earlier 'pm-cpufreq' material.
上级
89ca3b88
a0dd7b79
变更
39
隐藏空白更改
内联
并排
Showing
39 changed file
with
418 addition
and
391 deletion
+418
-391
Documentation/ABI/testing/sysfs-devices-system-cpu
Documentation/ABI/testing/sysfs-devices-system-cpu
+2
-2
Documentation/cpu-freq/core.txt
Documentation/cpu-freq/core.txt
+29
-0
Documentation/cpu-freq/cpu-drivers.txt
Documentation/cpu-freq/cpu-drivers.txt
+19
-0
Documentation/cpu-freq/index.txt
Documentation/cpu-freq/index.txt
+2
-2
Documentation/power/opp.txt
Documentation/power/opp.txt
+5
-35
MAINTAINERS
MAINTAINERS
+0
-2
arch/arm/mach-davinci/da850.c
arch/arm/mach-davinci/da850.c
+5
-4
arch/mips/loongson/lemote-2f/clock.c
arch/mips/loongson/lemote-2f/clock.c
+5
-11
drivers/base/power/opp.c
drivers/base/power/opp.c
+0
-91
drivers/cpufreq/Kconfig.arm
drivers/cpufreq/Kconfig.arm
+2
-2
drivers/cpufreq/Kconfig.x86
drivers/cpufreq/Kconfig.x86
+2
-2
drivers/cpufreq/Makefile
drivers/cpufreq/Makefile
+2
-0
drivers/cpufreq/acpi-cpufreq.c
drivers/cpufreq/acpi-cpufreq.c
+4
-5
drivers/cpufreq/arm_big_little.c
drivers/cpufreq/arm_big_little.c
+8
-8
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq.c
+25
-0
drivers/cpufreq/cpufreq_opp.c
drivers/cpufreq/cpufreq_opp.c
+110
-0
drivers/cpufreq/cpufreq_stats.c
drivers/cpufreq/cpufreq_stats.c
+8
-16
drivers/cpufreq/dbx500-cpufreq.c
drivers/cpufreq/dbx500-cpufreq.c
+3
-5
drivers/cpufreq/elanfreq.c
drivers/cpufreq/elanfreq.c
+4
-5
drivers/cpufreq/exynos-cpufreq.c
drivers/cpufreq/exynos-cpufreq.c
+17
-15
drivers/cpufreq/exynos-cpufreq.h
drivers/cpufreq/exynos-cpufreq.h
+1
-0
drivers/cpufreq/exynos5440-cpufreq.c
drivers/cpufreq/exynos5440-cpufreq.c
+15
-15
drivers/cpufreq/freq_table.c
drivers/cpufreq/freq_table.c
+25
-31
drivers/cpufreq/intel_pstate.c
drivers/cpufreq/intel_pstate.c
+4
-7
drivers/cpufreq/longhaul.c
drivers/cpufreq/longhaul.c
+5
-6
drivers/cpufreq/pasemi-cpufreq.c
drivers/cpufreq/pasemi-cpufreq.c
+5
-5
drivers/cpufreq/powernow-k6.c
drivers/cpufreq/powernow-k6.c
+7
-7
drivers/cpufreq/ppc_cbe_cpufreq.c
drivers/cpufreq/ppc_cbe_cpufreq.c
+5
-4
drivers/cpufreq/s3c2416-cpufreq.c
drivers/cpufreq/s3c2416-cpufreq.c
+17
-23
drivers/cpufreq/s3c64xx-cpufreq.c
drivers/cpufreq/s3c64xx-cpufreq.c
+5
-10
drivers/cpufreq/speedstep-centrino.c
drivers/cpufreq/speedstep-centrino.c
+1
-1
drivers/mfd/db8500-prcmu.c
drivers/mfd/db8500-prcmu.c
+8
-11
drivers/net/irda/sh_sir.c
drivers/net/irda/sh_sir.c
+5
-9
drivers/sh/clk/core.c
drivers/sh/clk/core.c
+5
-15
drivers/thermal/cpu_cooling.c
drivers/thermal/cpu_cooling.c
+13
-20
include/linux/cpufreq.h
include/linux/cpufreq.h
+43
-0
include/linux/pm_opp.h
include/linux/pm_opp.h
+0
-20
tools/power/cpupower/Makefile
tools/power/cpupower/Makefile
+1
-1
tools/power/cpupower/debug/kernel/cpufreq-test_tsc.c
tools/power/cpupower/debug/kernel/cpufreq-test_tsc.c
+1
-1
未找到文件。
Documentation/ABI/testing/sysfs-devices-system-cpu
浏览文件 @
37c14794
...
@@ -128,7 +128,7 @@ Description: Discover cpuidle policy and mechanism
...
@@ -128,7 +128,7 @@ Description: Discover cpuidle policy and mechanism
What: /sys/devices/system/cpu/cpu#/cpufreq/*
What: /sys/devices/system/cpu/cpu#/cpufreq/*
Date: pre-git history
Date: pre-git history
Contact:
cpufreq
@vger.kernel.org
Contact:
linux-pm
@vger.kernel.org
Description: Discover and change clock speed of CPUs
Description: Discover and change clock speed of CPUs
Clock scaling allows you to change the clock speed of the
Clock scaling allows you to change the clock speed of the
...
@@ -146,7 +146,7 @@ Description: Discover and change clock speed of CPUs
...
@@ -146,7 +146,7 @@ Description: Discover and change clock speed of CPUs
What: /sys/devices/system/cpu/cpu#/cpufreq/freqdomain_cpus
What: /sys/devices/system/cpu/cpu#/cpufreq/freqdomain_cpus
Date: June 2013
Date: June 2013
Contact:
cpufreq
@vger.kernel.org
Contact:
linux-pm
@vger.kernel.org
Description: Discover CPUs in the same CPU frequency coordination domain
Description: Discover CPUs in the same CPU frequency coordination domain
freqdomain_cpus is the list of CPUs (online+offline) that share
freqdomain_cpus is the list of CPUs (online+offline) that share
...
...
Documentation/cpu-freq/core.txt
浏览文件 @
37c14794
...
@@ -20,6 +20,7 @@ Contents:
...
@@ -20,6 +20,7 @@ Contents:
---------
---------
1. CPUFreq core and interfaces
1. CPUFreq core and interfaces
2. CPUFreq notifiers
2. CPUFreq notifiers
3. CPUFreq Table Generation with Operating Performance Point (OPP)
1. General Information
1. General Information
=======================
=======================
...
@@ -92,3 +93,31 @@ values:
...
@@ -92,3 +93,31 @@ values:
cpu - number of the affected CPU
cpu - number of the affected CPU
old - old frequency
old - old frequency
new - new frequency
new - new frequency
3. CPUFreq Table Generation with Operating Performance Point (OPP)
==================================================================
For details about OPP, see Documentation/power/opp.txt
dev_pm_opp_init_cpufreq_table - cpufreq framework typically is initialized with
cpufreq_frequency_table_cpuinfo which is provided with the list of
frequencies that are available for operation. This function provides
a ready to use conversion routine to translate the OPP layer's internal
information about the available frequencies into a format readily
providable to cpufreq.
WARNING: Do not use this function in interrupt context.
Example:
soc_pm_init()
{
/* Do things */
r = dev_pm_opp_init_cpufreq_table(dev, &freq_table);
if (!r)
cpufreq_frequency_table_cpuinfo(policy, freq_table);
/* Do other things */
}
NOTE: This function is available only if CONFIG_CPU_FREQ is enabled in
addition to CONFIG_PM_OPP.
dev_pm_opp_free_cpufreq_table - Free up the table allocated by dev_pm_opp_init_cpufreq_table
Documentation/cpu-freq/cpu-drivers.txt
浏览文件 @
37c14794
...
@@ -228,3 +228,22 @@ is the corresponding frequency table helper for the ->target
...
@@ -228,3 +228,22 @@ is the corresponding frequency table helper for the ->target
stage. Just pass the values to this function, and the unsigned int
stage. Just pass the values to this function, and the unsigned int
index returns the number of the frequency table entry which contains
index returns the number of the frequency table entry which contains
the frequency the CPU shall be set to.
the frequency the CPU shall be set to.
The following macros can be used as iterators over cpufreq_frequency_table:
cpufreq_for_each_entry(pos, table) - iterates over all entries of frequency
table.
cpufreq-for_each_valid_entry(pos, table) - iterates over all entries,
excluding CPUFREQ_ENTRY_INVALID frequencies.
Use arguments "pos" - a cpufreq_frequency_table * as a loop cursor and
"table" - the cpufreq_frequency_table * you want to iterate over.
For example:
struct cpufreq_frequency_table *pos, *driver_freq_table;
cpufreq_for_each_entry(pos, driver_freq_table) {
/* Do something with pos */
pos->frequency = ...
}
Documentation/cpu-freq/index.txt
浏览文件 @
37c14794
...
@@ -35,8 +35,8 @@ Mailing List
...
@@ -35,8 +35,8 @@ Mailing List
------------
------------
There is a CPU frequency changing CVS commit and general list where
There is a CPU frequency changing CVS commit and general list where
you can report bugs, problems or submit patches. To post a message,
you can report bugs, problems or submit patches. To post a message,
send an email to
cpufreq
@vger.kernel.org, to subscribe go to
send an email to
linux-pm
@vger.kernel.org, to subscribe go to
http://vger.kernel.org/vger-lists.html#
cpufreq
and follow the
http://vger.kernel.org/vger-lists.html#
linux-pm
and follow the
instructions there.
instructions there.
Links
Links
...
...
Documentation/power/opp.txt
浏览文件 @
37c14794
...
@@ -10,8 +10,7 @@ Contents
...
@@ -10,8 +10,7 @@ Contents
3. OPP Search Functions
3. OPP Search Functions
4. OPP Availability Control Functions
4. OPP Availability Control Functions
5. OPP Data Retrieval Functions
5. OPP Data Retrieval Functions
6. Cpufreq Table Generation
6. Data Structures
7. Data Structures
1. Introduction
1. Introduction
===============
===============
...
@@ -72,7 +71,6 @@ operations until that OPP could be re-enabled if possible.
...
@@ -72,7 +71,6 @@ operations until that OPP could be re-enabled if possible.
OPP library facilitates this concept in it's implementation. The following
OPP library facilitates this concept in it's implementation. The following
operational functions operate only on available opps:
operational functions operate only on available opps:
opp_find_freq_{ceil, floor}, dev_pm_opp_get_voltage, dev_pm_opp_get_freq, dev_pm_opp_get_opp_count
opp_find_freq_{ceil, floor}, dev_pm_opp_get_voltage, dev_pm_opp_get_freq, dev_pm_opp_get_opp_count
and dev_pm_opp_init_cpufreq_table
dev_pm_opp_find_freq_exact is meant to be used to find the opp pointer which can then
dev_pm_opp_find_freq_exact is meant to be used to find the opp pointer which can then
be used for dev_pm_opp_enable/disable functions to make an opp available as required.
be used for dev_pm_opp_enable/disable functions to make an opp available as required.
...
@@ -96,10 +94,9 @@ using RCU read locks. The opp_find_freq_{exact,ceil,floor},
...
@@ -96,10 +94,9 @@ using RCU read locks. The opp_find_freq_{exact,ceil,floor},
opp_get_{voltage, freq, opp_count} fall into this category.
opp_get_{voltage, freq, opp_count} fall into this category.
opp_{add,enable,disable} are updaters which use mutex and implement it's own
opp_{add,enable,disable} are updaters which use mutex and implement it's own
RCU locking mechanisms. dev_pm_opp_init_cpufreq_table acts as an updater and uses
RCU locking mechanisms. These functions should *NOT* be called under RCU locks
mutex to implment RCU updater strategy. These functions should *NOT* be called
and other contexts that prevent blocking functions in RCU or mutex operations
under RCU locks and other contexts that prevent blocking functions in RCU or
from working.
mutex operations from working.
2. Initial OPP List Registration
2. Initial OPP List Registration
================================
================================
...
@@ -311,34 +308,7 @@ dev_pm_opp_get_opp_count - Retrieve the number of available opps for a device
...
@@ -311,34 +308,7 @@ dev_pm_opp_get_opp_count - Retrieve the number of available opps for a device
/* Do other things */
/* Do other things */
}
}
6. Cpufreq Table Generation
6. Data Structures
===========================
dev_pm_opp_init_cpufreq_table - cpufreq framework typically is initialized with
cpufreq_frequency_table_cpuinfo which is provided with the list of
frequencies that are available for operation. This function provides
a ready to use conversion routine to translate the OPP layer's internal
information about the available frequencies into a format readily
providable to cpufreq.
WARNING: Do not use this function in interrupt context.
Example:
soc_pm_init()
{
/* Do things */
r = dev_pm_opp_init_cpufreq_table(dev, &freq_table);
if (!r)
cpufreq_frequency_table_cpuinfo(policy, freq_table);
/* Do other things */
}
NOTE: This function is available only if CONFIG_CPU_FREQ is enabled in
addition to CONFIG_PM as power management feature is required to
dynamically scale voltage and frequency in a system.
dev_pm_opp_free_cpufreq_table - Free up the table allocated by dev_pm_opp_init_cpufreq_table
7. Data Structures
==================
==================
Typically an SoC contains multiple voltage domains which are variable. Each
Typically an SoC contains multiple voltage domains which are variable. Each
domain is represented by a device pointer. The relationship to OPP can be
domain is represented by a device pointer. The relationship to OPP can be
...
...
MAINTAINERS
浏览文件 @
37c14794
...
@@ -2415,7 +2415,6 @@ F: drivers/net/ethernet/ti/cpmac.c
...
@@ -2415,7 +2415,6 @@ F: drivers/net/ethernet/ti/cpmac.c
CPU FREQUENCY DRIVERS
CPU FREQUENCY DRIVERS
M: Rafael J. Wysocki <rjw@rjwysocki.net>
M: Rafael J. Wysocki <rjw@rjwysocki.net>
M: Viresh Kumar <viresh.kumar@linaro.org>
M: Viresh Kumar <viresh.kumar@linaro.org>
L: cpufreq@vger.kernel.org
L: linux-pm@vger.kernel.org
L: linux-pm@vger.kernel.org
S: Maintained
S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
...
@@ -2426,7 +2425,6 @@ F: include/linux/cpufreq.h
...
@@ -2426,7 +2425,6 @@ F: include/linux/cpufreq.h
CPU FREQUENCY DRIVERS - ARM BIG LITTLE
CPU FREQUENCY DRIVERS - ARM BIG LITTLE
M: Viresh Kumar <viresh.kumar@linaro.org>
M: Viresh Kumar <viresh.kumar@linaro.org>
M: Sudeep Holla <sudeep.holla@arm.com>
M: Sudeep Holla <sudeep.holla@arm.com>
L: cpufreq@vger.kernel.org
L: linux-pm@vger.kernel.org
L: linux-pm@vger.kernel.org
W: http://www.arm.com/products/processors/technologies/biglittleprocessing.php
W: http://www.arm.com/products/processors/technologies/biglittleprocessing.php
S: Maintained
S: Maintained
...
...
arch/arm/mach-davinci/da850.c
浏览文件 @
37c14794
...
@@ -1092,20 +1092,21 @@ int da850_register_cpufreq(char *async_clk)
...
@@ -1092,20 +1092,21 @@ int da850_register_cpufreq(char *async_clk)
static
int
da850_round_armrate
(
struct
clk
*
clk
,
unsigned
long
rate
)
static
int
da850_round_armrate
(
struct
clk
*
clk
,
unsigned
long
rate
)
{
{
int
i
,
ret
=
0
,
diff
;
int
ret
=
0
,
diff
;
unsigned
int
best
=
(
unsigned
int
)
-
1
;
unsigned
int
best
=
(
unsigned
int
)
-
1
;
struct
cpufreq_frequency_table
*
table
=
cpufreq_info
.
freq_table
;
struct
cpufreq_frequency_table
*
table
=
cpufreq_info
.
freq_table
;
struct
cpufreq_frequency_table
*
pos
;
rate
/=
1000
;
/* convert to kHz */
rate
/=
1000
;
/* convert to kHz */
for
(
i
=
0
;
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_entry
(
pos
,
table
)
{
diff
=
table
[
i
].
frequency
-
rate
;
diff
=
pos
->
frequency
-
rate
;
if
(
diff
<
0
)
if
(
diff
<
0
)
diff
=
-
diff
;
diff
=
-
diff
;
if
(
diff
<
best
)
{
if
(
diff
<
best
)
{
best
=
diff
;
best
=
diff
;
ret
=
table
[
i
].
frequency
;
ret
=
pos
->
frequency
;
}
}
}
}
...
...
arch/mips/loongson/lemote-2f/clock.c
浏览文件 @
37c14794
...
@@ -91,9 +91,9 @@ EXPORT_SYMBOL(clk_put);
...
@@ -91,9 +91,9 @@ EXPORT_SYMBOL(clk_put);
int
clk_set_rate
(
struct
clk
*
clk
,
unsigned
long
rate
)
int
clk_set_rate
(
struct
clk
*
clk
,
unsigned
long
rate
)
{
{
struct
cpufreq_frequency_table
*
pos
;
int
ret
=
0
;
int
ret
=
0
;
int
regval
;
int
regval
;
int
i
;
if
(
likely
(
clk
->
ops
&&
clk
->
ops
->
set_rate
))
{
if
(
likely
(
clk
->
ops
&&
clk
->
ops
->
set_rate
))
{
unsigned
long
flags
;
unsigned
long
flags
;
...
@@ -106,22 +106,16 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
...
@@ -106,22 +106,16 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
if
(
unlikely
(
clk
->
flags
&
CLK_RATE_PROPAGATES
))
if
(
unlikely
(
clk
->
flags
&
CLK_RATE_PROPAGATES
))
propagate_rate
(
clk
);
propagate_rate
(
clk
);
for
(
i
=
0
;
loongson2_clockmod_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
cpufreq_for_each_valid_entry
(
pos
,
loongson2_clockmod_table
)
i
++
)
{
if
(
rate
==
pos
->
frequency
)
if
(
loongson2_clockmod_table
[
i
].
frequency
==
CPUFREQ_ENTRY_INVALID
)
continue
;
if
(
rate
==
loongson2_clockmod_table
[
i
].
frequency
)
break
;
break
;
}
if
(
rate
!=
pos
->
frequency
)
if
(
rate
!=
loongson2_clockmod_table
[
i
].
frequency
)
return
-
ENOTSUPP
;
return
-
ENOTSUPP
;
clk
->
rate
=
rate
;
clk
->
rate
=
rate
;
regval
=
LOONGSON_CHIPCFG0
;
regval
=
LOONGSON_CHIPCFG0
;
regval
=
(
regval
&
~
0x7
)
|
regval
=
(
regval
&
~
0x7
)
|
(
pos
->
driver_data
-
1
);
(
loongson2_clockmod_table
[
i
].
driver_data
-
1
);
LOONGSON_CHIPCFG0
=
regval
;
LOONGSON_CHIPCFG0
=
regval
;
return
ret
;
return
ret
;
...
...
drivers/base/power/opp.c
浏览文件 @
37c14794
...
@@ -15,7 +15,6 @@
...
@@ -15,7 +15,6 @@
#include <linux/errno.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <linux/err.h>
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/cpufreq.h>
#include <linux/device.h>
#include <linux/device.h>
#include <linux/list.h>
#include <linux/list.h>
#include <linux/rculist.h>
#include <linux/rculist.h>
...
@@ -596,96 +595,6 @@ int dev_pm_opp_disable(struct device *dev, unsigned long freq)
...
@@ -596,96 +595,6 @@ int dev_pm_opp_disable(struct device *dev, unsigned long freq)
}
}
EXPORT_SYMBOL_GPL
(
dev_pm_opp_disable
);
EXPORT_SYMBOL_GPL
(
dev_pm_opp_disable
);
#ifdef CONFIG_CPU_FREQ
/**
* dev_pm_opp_init_cpufreq_table() - create a cpufreq table for a device
* @dev: device for which we do this operation
* @table: Cpufreq table returned back to caller
*
* Generate a cpufreq table for a provided device- this assumes that the
* opp list is already initialized and ready for usage.
*
* This function allocates required memory for the cpufreq table. It is
* expected that the caller does the required maintenance such as freeing
* the table as required.
*
* Returns -EINVAL for bad pointers, -ENODEV if the device is not found, -ENOMEM
* if no memory available for the operation (table is not populated), returns 0
* if successful and table is populated.
*
* WARNING: It is important for the callers to ensure refreshing their copy of
* the table if any of the mentioned functions have been invoked in the interim.
*
* Locking: The internal device_opp and opp structures are RCU protected.
* To simplify the logic, we pretend we are updater and hold relevant mutex here
* Callers should ensure that this function is *NOT* called under RCU protection
* or in contexts where mutex locking cannot be used.
*/
int
dev_pm_opp_init_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
)
{
struct
device_opp
*
dev_opp
;
struct
dev_pm_opp
*
opp
;
struct
cpufreq_frequency_table
*
freq_table
;
int
i
=
0
;
/* Pretend as if I am an updater */
mutex_lock
(
&
dev_opp_list_lock
);
dev_opp
=
find_device_opp
(
dev
);
if
(
IS_ERR
(
dev_opp
))
{
int
r
=
PTR_ERR
(
dev_opp
);
mutex_unlock
(
&
dev_opp_list_lock
);
dev_err
(
dev
,
"%s: Device OPP not found (%d)
\n
"
,
__func__
,
r
);
return
r
;
}
freq_table
=
kzalloc
(
sizeof
(
struct
cpufreq_frequency_table
)
*
(
dev_pm_opp_get_opp_count
(
dev
)
+
1
),
GFP_KERNEL
);
if
(
!
freq_table
)
{
mutex_unlock
(
&
dev_opp_list_lock
);
dev_warn
(
dev
,
"%s: Unable to allocate frequency table
\n
"
,
__func__
);
return
-
ENOMEM
;
}
list_for_each_entry
(
opp
,
&
dev_opp
->
opp_list
,
node
)
{
if
(
opp
->
available
)
{
freq_table
[
i
].
driver_data
=
i
;
freq_table
[
i
].
frequency
=
opp
->
rate
/
1000
;
i
++
;
}
}
mutex_unlock
(
&
dev_opp_list_lock
);
freq_table
[
i
].
driver_data
=
i
;
freq_table
[
i
].
frequency
=
CPUFREQ_TABLE_END
;
*
table
=
&
freq_table
[
0
];
return
0
;
}
EXPORT_SYMBOL_GPL
(
dev_pm_opp_init_cpufreq_table
);
/**
* dev_pm_opp_free_cpufreq_table() - free the cpufreq table
* @dev: device for which we do this operation
* @table: table to free
*
* Free up the table allocated by dev_pm_opp_init_cpufreq_table
*/
void
dev_pm_opp_free_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
)
{
if
(
!
table
)
return
;
kfree
(
*
table
);
*
table
=
NULL
;
}
EXPORT_SYMBOL_GPL
(
dev_pm_opp_free_cpufreq_table
);
#endif
/* CONFIG_CPU_FREQ */
/**
/**
* dev_pm_opp_get_notifier() - find notifier_head of the device with opp
* dev_pm_opp_get_notifier() - find notifier_head of the device with opp
* @dev: device pointer used to lookup device OPPs.
* @dev: device pointer used to lookup device OPPs.
...
...
drivers/cpufreq/Kconfig.arm
浏览文件 @
37c14794
...
@@ -85,7 +85,7 @@ config ARM_EXYNOS_CPU_FREQ_BOOST_SW
...
@@ -85,7 +85,7 @@ config ARM_EXYNOS_CPU_FREQ_BOOST_SW
It allows usage of special frequencies for Samsung Exynos
It allows usage of special frequencies for Samsung Exynos
processors if thermal conditions are appropriate.
processors if thermal conditions are appropriate.
It re
g
uires, for safe operation, thermal framework with properly
It re
q
uires, for safe operation, thermal framework with properly
defined trip points.
defined trip points.
If in doubt, say N.
If in doubt, say N.
...
@@ -186,7 +186,7 @@ config ARM_S3C2416_CPUFREQ
...
@@ -186,7 +186,7 @@ config ARM_S3C2416_CPUFREQ
S3C2450 SoC. The S3C2416 supports changing the rate of the
S3C2450 SoC. The S3C2416 supports changing the rate of the
armdiv clock source and also entering a so called dynamic
armdiv clock source and also entering a so called dynamic
voltage scaling mode in which it is possible to reduce the
voltage scaling mode in which it is possible to reduce the
core voltage of the
cpu
.
core voltage of the
CPU
.
If in doubt, say N.
If in doubt, say N.
...
...
drivers/cpufreq/Kconfig.x86
浏览文件 @
37c14794
...
@@ -10,7 +10,7 @@ config X86_INTEL_PSTATE
...
@@ -10,7 +10,7 @@ config X86_INTEL_PSTATE
The driver implements an internal governor and will become
The driver implements an internal governor and will become
the scaling driver and governor for Sandy bridge processors.
the scaling driver and governor for Sandy bridge processors.
When this driver is enabled it will become the p
er
ferred
When this driver is enabled it will become the p
re
ferred
scaling driver for Sandy bridge processors.
scaling driver for Sandy bridge processors.
If in doubt, say N.
If in doubt, say N.
...
@@ -52,7 +52,7 @@ config X86_ACPI_CPUFREQ_CPB
...
@@ -52,7 +52,7 @@ config X86_ACPI_CPUFREQ_CPB
help
help
The powernow-k8 driver used to provide a sysfs knob called "cpb"
The powernow-k8 driver used to provide a sysfs knob called "cpb"
to disable the Core Performance Boosting feature of AMD CPUs. This
to disable the Core Performance Boosting feature of AMD CPUs. This
file has now been superse
e
ded by the more generic "boost" entry.
file has now been superseded by the more generic "boost" entry.
By enabling this option the acpi_cpufreq driver provides the old
By enabling this option the acpi_cpufreq driver provides the old
entry in addition to the new boost ones, for compatibility reasons.
entry in addition to the new boost ones, for compatibility reasons.
...
...
drivers/cpufreq/Makefile
浏览文件 @
37c14794
# CPUfreq core
# CPUfreq core
obj-$(CONFIG_CPU_FREQ)
+=
cpufreq.o freq_table.o
obj-$(CONFIG_CPU_FREQ)
+=
cpufreq.o freq_table.o
obj-$(CONFIG_PM_OPP)
+=
cpufreq_opp.o
# CPUfreq stats
# CPUfreq stats
obj-$(CONFIG_CPU_FREQ_STAT)
+=
cpufreq_stats.o
obj-$(CONFIG_CPU_FREQ_STAT)
+=
cpufreq_stats.o
...
...
drivers/cpufreq/acpi-cpufreq.c
浏览文件 @
37c14794
...
@@ -213,7 +213,7 @@ static unsigned extract_io(u32 value, struct acpi_cpufreq_data *data)
...
@@ -213,7 +213,7 @@ static unsigned extract_io(u32 value, struct acpi_cpufreq_data *data)
static
unsigned
extract_msr
(
u32
msr
,
struct
acpi_cpufreq_data
*
data
)
static
unsigned
extract_msr
(
u32
msr
,
struct
acpi_cpufreq_data
*
data
)
{
{
int
i
;
struct
cpufreq_frequency_table
*
pos
;
struct
acpi_processor_performance
*
perf
;
struct
acpi_processor_performance
*
perf
;
if
(
boot_cpu_data
.
x86_vendor
==
X86_VENDOR_AMD
)
if
(
boot_cpu_data
.
x86_vendor
==
X86_VENDOR_AMD
)
...
@@ -223,10 +223,9 @@ static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data)
...
@@ -223,10 +223,9 @@ static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data)
perf
=
data
->
acpi_data
;
perf
=
data
->
acpi_data
;
for
(
i
=
0
;
data
->
freq_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_entry
(
pos
,
data
->
freq_table
)
if
(
msr
==
perf
->
states
[
data
->
freq_table
[
i
].
driver_data
].
status
)
if
(
msr
==
perf
->
states
[
pos
->
driver_data
].
status
)
return
data
->
freq_table
[
i
].
frequency
;
return
pos
->
frequency
;
}
return
data
->
freq_table
[
0
].
frequency
;
return
data
->
freq_table
[
0
].
frequency
;
}
}
...
...
drivers/cpufreq/arm_big_little.c
浏览文件 @
37c14794
...
@@ -226,22 +226,22 @@ static inline u32 get_table_count(struct cpufreq_frequency_table *table)
...
@@ -226,22 +226,22 @@ static inline u32 get_table_count(struct cpufreq_frequency_table *table)
/* get the minimum frequency in the cpufreq_frequency_table */
/* get the minimum frequency in the cpufreq_frequency_table */
static
inline
u32
get_table_min
(
struct
cpufreq_frequency_table
*
table
)
static
inline
u32
get_table_min
(
struct
cpufreq_frequency_table
*
table
)
{
{
int
i
;
struct
cpufreq_frequency_table
*
pos
;
uint32_t
min_freq
=
~
0
;
uint32_t
min_freq
=
~
0
;
for
(
i
=
0
;
(
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
cpufreq_for_each_entry
(
pos
,
table
)
if
(
table
[
i
].
frequency
<
min_freq
)
if
(
pos
->
frequency
<
min_freq
)
min_freq
=
table
[
i
].
frequency
;
min_freq
=
pos
->
frequency
;
return
min_freq
;
return
min_freq
;
}
}
/* get the maximum frequency in the cpufreq_frequency_table */
/* get the maximum frequency in the cpufreq_frequency_table */
static
inline
u32
get_table_max
(
struct
cpufreq_frequency_table
*
table
)
static
inline
u32
get_table_max
(
struct
cpufreq_frequency_table
*
table
)
{
{
int
i
;
struct
cpufreq_frequency_table
*
pos
;
uint32_t
max_freq
=
0
;
uint32_t
max_freq
=
0
;
for
(
i
=
0
;
(
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
cpufreq_for_each_entry
(
pos
,
table
)
if
(
table
[
i
].
frequency
>
max_freq
)
if
(
pos
->
frequency
>
max_freq
)
max_freq
=
table
[
i
].
frequency
;
max_freq
=
pos
->
frequency
;
return
max_freq
;
return
max_freq
;
}
}
...
...
drivers/cpufreq/cpufreq.c
浏览文件 @
37c14794
...
@@ -237,6 +237,17 @@ void cpufreq_cpu_put(struct cpufreq_policy *policy)
...
@@ -237,6 +237,17 @@ void cpufreq_cpu_put(struct cpufreq_policy *policy)
}
}
EXPORT_SYMBOL_GPL
(
cpufreq_cpu_put
);
EXPORT_SYMBOL_GPL
(
cpufreq_cpu_put
);
bool
cpufreq_next_valid
(
struct
cpufreq_frequency_table
**
pos
)
{
while
((
*
pos
)
->
frequency
!=
CPUFREQ_TABLE_END
)
if
((
*
pos
)
->
frequency
!=
CPUFREQ_ENTRY_INVALID
)
return
true
;
else
(
*
pos
)
++
;
return
false
;
}
EXPORT_SYMBOL_GPL
(
cpufreq_next_valid
);
/*********************************************************************
/*********************************************************************
* EXTERNALLY AFFECTING FREQUENCY CHANGES *
* EXTERNALLY AFFECTING FREQUENCY CHANGES *
*********************************************************************/
*********************************************************************/
...
@@ -354,6 +365,18 @@ static void cpufreq_notify_post_transition(struct cpufreq_policy *policy,
...
@@ -354,6 +365,18 @@ static void cpufreq_notify_post_transition(struct cpufreq_policy *policy,
void
cpufreq_freq_transition_begin
(
struct
cpufreq_policy
*
policy
,
void
cpufreq_freq_transition_begin
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_freqs
*
freqs
)
struct
cpufreq_freqs
*
freqs
)
{
{
/*
* Catch double invocations of _begin() which lead to self-deadlock.
* ASYNC_NOTIFICATION drivers are left out because the cpufreq core
* doesn't invoke _begin() on their behalf, and hence the chances of
* double invocations are very low. Moreover, there are scenarios
* where these checks can emit false-positive warnings in these
* drivers; so we avoid that by skipping them altogether.
*/
WARN_ON
(
!
(
cpufreq_driver
->
flags
&
CPUFREQ_ASYNC_NOTIFICATION
)
&&
current
==
policy
->
transition_task
);
wait:
wait:
wait_event
(
policy
->
transition_wait
,
!
policy
->
transition_ongoing
);
wait_event
(
policy
->
transition_wait
,
!
policy
->
transition_ongoing
);
...
@@ -365,6 +388,7 @@ void cpufreq_freq_transition_begin(struct cpufreq_policy *policy,
...
@@ -365,6 +388,7 @@ void cpufreq_freq_transition_begin(struct cpufreq_policy *policy,
}
}
policy
->
transition_ongoing
=
true
;
policy
->
transition_ongoing
=
true
;
policy
->
transition_task
=
current
;
spin_unlock
(
&
policy
->
transition_lock
);
spin_unlock
(
&
policy
->
transition_lock
);
...
@@ -381,6 +405,7 @@ void cpufreq_freq_transition_end(struct cpufreq_policy *policy,
...
@@ -381,6 +405,7 @@ void cpufreq_freq_transition_end(struct cpufreq_policy *policy,
cpufreq_notify_post_transition
(
policy
,
freqs
,
transition_failed
);
cpufreq_notify_post_transition
(
policy
,
freqs
,
transition_failed
);
policy
->
transition_ongoing
=
false
;
policy
->
transition_ongoing
=
false
;
policy
->
transition_task
=
NULL
;
wake_up
(
&
policy
->
transition_wait
);
wake_up
(
&
policy
->
transition_wait
);
}
}
...
...
drivers/cpufreq/cpufreq_opp.c
0 → 100644
浏览文件 @
37c14794
/*
* Generic OPP helper interface for CPUFreq drivers
*
* Copyright (C) 2009-2014 Texas Instruments Incorporated.
* Nishanth Menon
* Romit Dasgupta
* Kevin Hilman
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/cpufreq.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/errno.h>
#include <linux/export.h>
#include <linux/kernel.h>
#include <linux/pm_opp.h>
#include <linux/rcupdate.h>
#include <linux/slab.h>
/**
* dev_pm_opp_init_cpufreq_table() - create a cpufreq table for a device
* @dev: device for which we do this operation
* @table: Cpufreq table returned back to caller
*
* Generate a cpufreq table for a provided device- this assumes that the
* opp list is already initialized and ready for usage.
*
* This function allocates required memory for the cpufreq table. It is
* expected that the caller does the required maintenance such as freeing
* the table as required.
*
* Returns -EINVAL for bad pointers, -ENODEV if the device is not found, -ENOMEM
* if no memory available for the operation (table is not populated), returns 0
* if successful and table is populated.
*
* WARNING: It is important for the callers to ensure refreshing their copy of
* the table if any of the mentioned functions have been invoked in the interim.
*
* Locking: The internal device_opp and opp structures are RCU protected.
* Since we just use the regular accessor functions to access the internal data
* structures, we use RCU read lock inside this function. As a result, users of
* this function DONOT need to use explicit locks for invoking.
*/
int
dev_pm_opp_init_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
)
{
struct
dev_pm_opp
*
opp
;
struct
cpufreq_frequency_table
*
freq_table
=
NULL
;
int
i
,
max_opps
,
ret
=
0
;
unsigned
long
rate
;
rcu_read_lock
();
max_opps
=
dev_pm_opp_get_opp_count
(
dev
);
if
(
max_opps
<=
0
)
{
ret
=
max_opps
?
max_opps
:
-
ENODATA
;
goto
out
;
}
freq_table
=
kzalloc
(
sizeof
(
*
freq_table
)
*
(
max_opps
+
1
),
GFP_KERNEL
);
if
(
!
freq_table
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
for
(
i
=
0
,
rate
=
0
;
i
<
max_opps
;
i
++
,
rate
++
)
{
/* find next rate */
opp
=
dev_pm_opp_find_freq_ceil
(
dev
,
&
rate
);
if
(
IS_ERR
(
opp
))
{
ret
=
PTR_ERR
(
opp
);
goto
out
;
}
freq_table
[
i
].
driver_data
=
i
;
freq_table
[
i
].
frequency
=
rate
/
1000
;
}
freq_table
[
i
].
driver_data
=
i
;
freq_table
[
i
].
frequency
=
CPUFREQ_TABLE_END
;
*
table
=
&
freq_table
[
0
];
out:
rcu_read_unlock
();
if
(
ret
)
kfree
(
freq_table
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
dev_pm_opp_init_cpufreq_table
);
/**
* dev_pm_opp_free_cpufreq_table() - free the cpufreq table
* @dev: device for which we do this operation
* @table: table to free
*
* Free up the table allocated by dev_pm_opp_init_cpufreq_table
*/
void
dev_pm_opp_free_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
)
{
if
(
!
table
)
return
;
kfree
(
*
table
);
*
table
=
NULL
;
}
EXPORT_SYMBOL_GPL
(
dev_pm_opp_free_cpufreq_table
);
drivers/cpufreq/cpufreq_stats.c
浏览文件 @
37c14794
...
@@ -182,11 +182,11 @@ static void cpufreq_stats_free_table(unsigned int cpu)
...
@@ -182,11 +182,11 @@ static void cpufreq_stats_free_table(unsigned int cpu)
static
int
__cpufreq_stats_create_table
(
struct
cpufreq_policy
*
policy
)
static
int
__cpufreq_stats_create_table
(
struct
cpufreq_policy
*
policy
)
{
{
unsigned
int
i
,
j
,
count
=
0
,
ret
=
0
;
unsigned
int
i
,
count
=
0
,
ret
=
0
;
struct
cpufreq_stats
*
stat
;
struct
cpufreq_stats
*
stat
;
unsigned
int
alloc_size
;
unsigned
int
alloc_size
;
unsigned
int
cpu
=
policy
->
cpu
;
unsigned
int
cpu
=
policy
->
cpu
;
struct
cpufreq_frequency_table
*
table
;
struct
cpufreq_frequency_table
*
pos
,
*
table
;
table
=
cpufreq_frequency_get_table
(
cpu
);
table
=
cpufreq_frequency_get_table
(
cpu
);
if
(
unlikely
(
!
table
))
if
(
unlikely
(
!
table
))
...
@@ -205,12 +205,8 @@ static int __cpufreq_stats_create_table(struct cpufreq_policy *policy)
...
@@ -205,12 +205,8 @@ static int __cpufreq_stats_create_table(struct cpufreq_policy *policy)
stat
->
cpu
=
cpu
;
stat
->
cpu
=
cpu
;
per_cpu
(
cpufreq_stats_table
,
cpu
)
=
stat
;
per_cpu
(
cpufreq_stats_table
,
cpu
)
=
stat
;
for
(
i
=
0
;
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_valid_entry
(
pos
,
table
)
unsigned
int
freq
=
table
[
i
].
frequency
;
if
(
freq
==
CPUFREQ_ENTRY_INVALID
)
continue
;
count
++
;
count
++
;
}
alloc_size
=
count
*
sizeof
(
int
)
+
count
*
sizeof
(
u64
);
alloc_size
=
count
*
sizeof
(
int
)
+
count
*
sizeof
(
u64
);
...
@@ -228,15 +224,11 @@ static int __cpufreq_stats_create_table(struct cpufreq_policy *policy)
...
@@ -228,15 +224,11 @@ static int __cpufreq_stats_create_table(struct cpufreq_policy *policy)
#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
stat
->
trans_table
=
stat
->
freq_table
+
count
;
stat
->
trans_table
=
stat
->
freq_table
+
count
;
#endif
#endif
j
=
0
;
i
=
0
;
for
(
i
=
0
;
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_valid_entry
(
pos
,
table
)
unsigned
int
freq
=
table
[
i
].
frequency
;
if
(
freq_table_get_index
(
stat
,
pos
->
frequency
)
==
-
1
)
if
(
freq
==
CPUFREQ_ENTRY_INVALID
)
stat
->
freq_table
[
i
++
]
=
pos
->
frequency
;
continue
;
stat
->
state_num
=
i
;
if
(
freq_table_get_index
(
stat
,
freq
)
==
-
1
)
stat
->
freq_table
[
j
++
]
=
freq
;
}
stat
->
state_num
=
j
;
spin_lock
(
&
cpufreq_stats_lock
);
spin_lock
(
&
cpufreq_stats_lock
);
stat
->
last_time
=
get_jiffies_64
();
stat
->
last_time
=
get_jiffies_64
();
stat
->
last_index
=
freq_table_get_index
(
stat
,
policy
->
cur
);
stat
->
last_index
=
freq_table_get_index
(
stat
,
policy
->
cur
);
...
...
drivers/cpufreq/dbx500-cpufreq.c
浏览文件 @
37c14794
...
@@ -45,7 +45,7 @@ static struct cpufreq_driver dbx500_cpufreq_driver = {
...
@@ -45,7 +45,7 @@ static struct cpufreq_driver dbx500_cpufreq_driver = {
static
int
dbx500_cpufreq_probe
(
struct
platform_device
*
pdev
)
static
int
dbx500_cpufreq_probe
(
struct
platform_device
*
pdev
)
{
{
int
i
=
0
;
struct
cpufreq_frequency_table
*
pos
;
freq_table
=
dev_get_platdata
(
&
pdev
->
dev
);
freq_table
=
dev_get_platdata
(
&
pdev
->
dev
);
if
(
!
freq_table
)
{
if
(
!
freq_table
)
{
...
@@ -60,10 +60,8 @@ static int dbx500_cpufreq_probe(struct platform_device *pdev)
...
@@ -60,10 +60,8 @@ static int dbx500_cpufreq_probe(struct platform_device *pdev)
}
}
pr_info
(
"dbx500-cpufreq: Available frequencies:
\n
"
);
pr_info
(
"dbx500-cpufreq: Available frequencies:
\n
"
);
while
(
freq_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
)
{
cpufreq_for_each_entry
(
pos
,
freq_table
)
pr_info
(
" %d Mhz
\n
"
,
freq_table
[
i
].
frequency
/
1000
);
pr_info
(
" %d Mhz
\n
"
,
pos
->
frequency
/
1000
);
i
++
;
}
return
cpufreq_register_driver
(
&
dbx500_cpufreq_driver
);
return
cpufreq_register_driver
(
&
dbx500_cpufreq_driver
);
}
}
...
...
drivers/cpufreq/elanfreq.c
浏览文件 @
37c14794
...
@@ -147,7 +147,7 @@ static int elanfreq_target(struct cpufreq_policy *policy,
...
@@ -147,7 +147,7 @@ static int elanfreq_target(struct cpufreq_policy *policy,
static
int
elanfreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
static
int
elanfreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
{
struct
cpuinfo_x86
*
c
=
&
cpu_data
(
0
);
struct
cpuinfo_x86
*
c
=
&
cpu_data
(
0
);
unsigned
int
i
;
struct
cpufreq_frequency_table
*
pos
;
/* capability check */
/* capability check */
if
((
c
->
x86_vendor
!=
X86_VENDOR_AMD
)
||
if
((
c
->
x86_vendor
!=
X86_VENDOR_AMD
)
||
...
@@ -159,10 +159,9 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy)
...
@@ -159,10 +159,9 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy)
max_freq
=
elanfreq_get_cpu_frequency
(
0
);
max_freq
=
elanfreq_get_cpu_frequency
(
0
);
/* table init */
/* table init */
for
(
i
=
0
;
(
elanfreq_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
{
cpufreq_for_each_entry
(
pos
,
elanfreq_table
)
if
(
elanfreq_table
[
i
].
frequency
>
max_freq
)
if
(
pos
->
frequency
>
max_freq
)
elanfreq_table
[
i
].
frequency
=
CPUFREQ_ENTRY_INVALID
;
pos
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
}
/* cpuinfo and default policy values */
/* cpuinfo and default policy values */
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
...
...
drivers/cpufreq/exynos-cpufreq.c
浏览文件 @
37c14794
...
@@ -29,17 +29,16 @@ static unsigned int locking_frequency;
...
@@ -29,17 +29,16 @@ static unsigned int locking_frequency;
static
int
exynos_cpufreq_get_index
(
unsigned
int
freq
)
static
int
exynos_cpufreq_get_index
(
unsigned
int
freq
)
{
{
struct
cpufreq_frequency_table
*
freq_table
=
exynos_info
->
freq_table
;
struct
cpufreq_frequency_table
*
freq_table
=
exynos_info
->
freq_table
;
int
index
;
struct
cpufreq_frequency_table
*
pos
;
for
(
index
=
0
;
cpufreq_for_each_entry
(
pos
,
freq_table
)
freq_table
[
index
].
frequency
!=
CPUFREQ_TABLE_END
;
index
++
)
if
(
pos
->
frequency
==
freq
)
if
(
freq_table
[
index
].
frequency
==
freq
)
break
;
break
;
if
(
freq_table
[
index
].
frequency
==
CPUFREQ_TABLE_END
)
if
(
pos
->
frequency
==
CPUFREQ_TABLE_END
)
return
-
EINVAL
;
return
-
EINVAL
;
return
index
;
return
pos
-
freq_table
;
}
}
static
int
exynos_cpufreq_scale
(
unsigned
int
target_freq
)
static
int
exynos_cpufreq_scale
(
unsigned
int
target_freq
)
...
@@ -49,6 +48,7 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
...
@@ -49,6 +48,7 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
struct
cpufreq_policy
*
policy
=
cpufreq_cpu_get
(
0
);
struct
cpufreq_policy
*
policy
=
cpufreq_cpu_get
(
0
);
unsigned
int
arm_volt
,
safe_arm_volt
=
0
;
unsigned
int
arm_volt
,
safe_arm_volt
=
0
;
unsigned
int
mpll_freq_khz
=
exynos_info
->
mpll_freq_khz
;
unsigned
int
mpll_freq_khz
=
exynos_info
->
mpll_freq_khz
;
struct
device
*
dev
=
exynos_info
->
dev
;
unsigned
int
old_freq
;
unsigned
int
old_freq
;
int
index
,
old_index
;
int
index
,
old_index
;
int
ret
=
0
;
int
ret
=
0
;
...
@@ -90,8 +90,8 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
...
@@ -90,8 +90,8 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
/* Firstly, voltage up to increase frequency */
/* Firstly, voltage up to increase frequency */
ret
=
regulator_set_voltage
(
arm_regulator
,
arm_volt
,
arm_volt
);
ret
=
regulator_set_voltage
(
arm_regulator
,
arm_volt
,
arm_volt
);
if
(
ret
)
{
if
(
ret
)
{
pr_err
(
"%s:
failed to set cpu voltage to %d
\n
"
,
dev_err
(
dev
,
"
failed to set cpu voltage to %d
\n
"
,
__func__
,
arm_volt
);
arm_volt
);
return
ret
;
return
ret
;
}
}
}
}
...
@@ -100,8 +100,8 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
...
@@ -100,8 +100,8 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
ret
=
regulator_set_voltage
(
arm_regulator
,
safe_arm_volt
,
ret
=
regulator_set_voltage
(
arm_regulator
,
safe_arm_volt
,
safe_arm_volt
);
safe_arm_volt
);
if
(
ret
)
{
if
(
ret
)
{
pr_err
(
"%s:
failed to set cpu voltage to %d
\n
"
,
dev_err
(
dev
,
"
failed to set cpu voltage to %d
\n
"
,
__func__
,
safe_arm_volt
);
safe_arm_volt
);
return
ret
;
return
ret
;
}
}
}
}
...
@@ -115,8 +115,8 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
...
@@ -115,8 +115,8 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
ret
=
regulator_set_voltage
(
arm_regulator
,
arm_volt
,
ret
=
regulator_set_voltage
(
arm_regulator
,
arm_volt
,
arm_volt
);
arm_volt
);
if
(
ret
)
{
if
(
ret
)
{
pr_err
(
"%s:
failed to set cpu voltage to %d
\n
"
,
dev_err
(
dev
,
"
failed to set cpu voltage to %d
\n
"
,
__func__
,
arm_volt
);
arm_volt
);
goto
out
;
goto
out
;
}
}
}
}
...
@@ -163,6 +163,8 @@ static int exynos_cpufreq_probe(struct platform_device *pdev)
...
@@ -163,6 +163,8 @@ static int exynos_cpufreq_probe(struct platform_device *pdev)
if
(
!
exynos_info
)
if
(
!
exynos_info
)
return
-
ENOMEM
;
return
-
ENOMEM
;
exynos_info
->
dev
=
&
pdev
->
dev
;
if
(
soc_is_exynos4210
())
if
(
soc_is_exynos4210
())
ret
=
exynos4210_cpufreq_init
(
exynos_info
);
ret
=
exynos4210_cpufreq_init
(
exynos_info
);
else
if
(
soc_is_exynos4212
()
||
soc_is_exynos4412
())
else
if
(
soc_is_exynos4212
()
||
soc_is_exynos4412
())
...
@@ -176,13 +178,13 @@ static int exynos_cpufreq_probe(struct platform_device *pdev)
...
@@ -176,13 +178,13 @@ static int exynos_cpufreq_probe(struct platform_device *pdev)
goto
err_vdd_arm
;
goto
err_vdd_arm
;
if
(
exynos_info
->
set_freq
==
NULL
)
{
if
(
exynos_info
->
set_freq
==
NULL
)
{
pr_err
(
"%s: No set_freq function (ERR)
\n
"
,
__func__
);
dev_err
(
&
pdev
->
dev
,
"No set_freq function (ERR)
\n
"
);
goto
err_vdd_arm
;
goto
err_vdd_arm
;
}
}
arm_regulator
=
regulator_get
(
NULL
,
"vdd_arm"
);
arm_regulator
=
regulator_get
(
NULL
,
"vdd_arm"
);
if
(
IS_ERR
(
arm_regulator
))
{
if
(
IS_ERR
(
arm_regulator
))
{
pr_err
(
"%s: failed to get resource vdd_arm
\n
"
,
__func__
);
dev_err
(
&
pdev
->
dev
,
"failed to get resource vdd_arm
\n
"
);
goto
err_vdd_arm
;
goto
err_vdd_arm
;
}
}
...
@@ -192,7 +194,7 @@ static int exynos_cpufreq_probe(struct platform_device *pdev)
...
@@ -192,7 +194,7 @@ static int exynos_cpufreq_probe(struct platform_device *pdev)
if
(
!
cpufreq_register_driver
(
&
exynos_driver
))
if
(
!
cpufreq_register_driver
(
&
exynos_driver
))
return
0
;
return
0
;
pr_err
(
"%s: failed to register cpufreq driver
\n
"
,
__func__
);
dev_err
(
&
pdev
->
dev
,
"failed to register cpufreq driver
\n
"
);
regulator_put
(
arm_regulator
);
regulator_put
(
arm_regulator
);
err_vdd_arm:
err_vdd_arm:
kfree
(
exynos_info
);
kfree
(
exynos_info
);
...
...
drivers/cpufreq/exynos-cpufreq.h
浏览文件 @
37c14794
...
@@ -34,6 +34,7 @@ struct apll_freq {
...
@@ -34,6 +34,7 @@ struct apll_freq {
};
};
struct
exynos_dvfs_info
{
struct
exynos_dvfs_info
{
struct
device
*
dev
;
unsigned
long
mpll_freq_khz
;
unsigned
long
mpll_freq_khz
;
unsigned
int
pll_safe_idx
;
unsigned
int
pll_safe_idx
;
struct
clk
*
cpu_clk
;
struct
clk
*
cpu_clk
;
...
...
drivers/cpufreq/exynos5440-cpufreq.c
浏览文件 @
37c14794
...
@@ -114,25 +114,23 @@ static struct cpufreq_freqs freqs;
...
@@ -114,25 +114,23 @@ static struct cpufreq_freqs freqs;
static
int
init_div_table
(
void
)
static
int
init_div_table
(
void
)
{
{
struct
cpufreq_frequency_table
*
freq_tbl
=
dvfs_info
->
freq_table
;
struct
cpufreq_frequency_table
*
pos
,
*
freq_tbl
=
dvfs_info
->
freq_table
;
unsigned
int
tmp
,
clk_div
,
ema_div
,
freq
,
volt_id
;
unsigned
int
tmp
,
clk_div
,
ema_div
,
freq
,
volt_id
;
int
i
=
0
;
struct
dev_pm_opp
*
opp
;
struct
dev_pm_opp
*
opp
;
rcu_read_lock
();
rcu_read_lock
();
for
(
i
=
0
;
freq_tbl
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_entry
(
pos
,
freq_tbl
)
{
opp
=
dev_pm_opp_find_freq_exact
(
dvfs_info
->
dev
,
opp
=
dev_pm_opp_find_freq_exact
(
dvfs_info
->
dev
,
freq_tbl
[
i
].
frequency
*
1000
,
true
);
pos
->
frequency
*
1000
,
true
);
if
(
IS_ERR
(
opp
))
{
if
(
IS_ERR
(
opp
))
{
rcu_read_unlock
();
rcu_read_unlock
();
dev_err
(
dvfs_info
->
dev
,
dev_err
(
dvfs_info
->
dev
,
"failed to find valid OPP for %u KHZ
\n
"
,
"failed to find valid OPP for %u KHZ
\n
"
,
freq_tbl
[
i
].
frequency
);
pos
->
frequency
);
return
PTR_ERR
(
opp
);
return
PTR_ERR
(
opp
);
}
}
freq
=
freq_tbl
[
i
].
frequency
/
1000
;
/* In MHZ */
freq
=
pos
->
frequency
/
1000
;
/* In MHZ */
clk_div
=
((
freq
/
CPU_DIV_FREQ_MAX
)
&
P0_7_CPUCLKDEV_MASK
)
clk_div
=
((
freq
/
CPU_DIV_FREQ_MAX
)
&
P0_7_CPUCLKDEV_MASK
)
<<
P0_7_CPUCLKDEV_SHIFT
;
<<
P0_7_CPUCLKDEV_SHIFT
;
clk_div
|=
((
freq
/
CPU_ATB_FREQ_MAX
)
&
P0_7_ATBCLKDEV_MASK
)
clk_div
|=
((
freq
/
CPU_ATB_FREQ_MAX
)
&
P0_7_ATBCLKDEV_MASK
)
...
@@ -157,7 +155,8 @@ static int init_div_table(void)
...
@@ -157,7 +155,8 @@ static int init_div_table(void)
tmp
=
(
clk_div
|
ema_div
|
(
volt_id
<<
P0_7_VDD_SHIFT
)
tmp
=
(
clk_div
|
ema_div
|
(
volt_id
<<
P0_7_VDD_SHIFT
)
|
((
freq
/
FREQ_UNIT
)
<<
P0_7_FREQ_SHIFT
));
|
((
freq
/
FREQ_UNIT
)
<<
P0_7_FREQ_SHIFT
));
__raw_writel
(
tmp
,
dvfs_info
->
base
+
XMU_PMU_P0_7
+
4
*
i
);
__raw_writel
(
tmp
,
dvfs_info
->
base
+
XMU_PMU_P0_7
+
4
*
(
pos
-
freq_tbl
));
}
}
rcu_read_unlock
();
rcu_read_unlock
();
...
@@ -166,8 +165,9 @@ static int init_div_table(void)
...
@@ -166,8 +165,9 @@ static int init_div_table(void)
static
void
exynos_enable_dvfs
(
unsigned
int
cur_frequency
)
static
void
exynos_enable_dvfs
(
unsigned
int
cur_frequency
)
{
{
unsigned
int
tmp
,
i
,
cpu
;
unsigned
int
tmp
,
cpu
;
struct
cpufreq_frequency_table
*
freq_table
=
dvfs_info
->
freq_table
;
struct
cpufreq_frequency_table
*
freq_table
=
dvfs_info
->
freq_table
;
struct
cpufreq_frequency_table
*
pos
;
/* Disable DVFS */
/* Disable DVFS */
__raw_writel
(
0
,
dvfs_info
->
base
+
XMU_DVFS_CTRL
);
__raw_writel
(
0
,
dvfs_info
->
base
+
XMU_DVFS_CTRL
);
...
@@ -182,15 +182,15 @@ static void exynos_enable_dvfs(unsigned int cur_frequency)
...
@@ -182,15 +182,15 @@ static void exynos_enable_dvfs(unsigned int cur_frequency)
__raw_writel
(
tmp
,
dvfs_info
->
base
+
XMU_PMUIRQEN
);
__raw_writel
(
tmp
,
dvfs_info
->
base
+
XMU_PMUIRQEN
);
/* Set initial performance index */
/* Set initial performance index */
for
(
i
=
0
;
freq_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
cpufreq_for_each_entry
(
pos
,
freq_table
)
if
(
freq_table
[
i
].
frequency
==
cur_frequency
)
if
(
pos
->
frequency
==
cur_frequency
)
break
;
break
;
if
(
freq_table
[
i
].
frequency
==
CPUFREQ_TABLE_END
)
{
if
(
pos
->
frequency
==
CPUFREQ_TABLE_END
)
{
dev_crit
(
dvfs_info
->
dev
,
"Boot up frequency not supported
\n
"
);
dev_crit
(
dvfs_info
->
dev
,
"Boot up frequency not supported
\n
"
);
/* Assign the highest frequency */
/* Assign the highest frequency */
i
=
0
;
pos
=
freq_table
;
cur_frequency
=
freq_table
[
i
].
frequency
;
cur_frequency
=
pos
->
frequency
;
}
}
dev_info
(
dvfs_info
->
dev
,
"Setting dvfs initial frequency = %uKHZ"
,
dev_info
(
dvfs_info
->
dev
,
"Setting dvfs initial frequency = %uKHZ"
,
...
@@ -199,7 +199,7 @@ static void exynos_enable_dvfs(unsigned int cur_frequency)
...
@@ -199,7 +199,7 @@ static void exynos_enable_dvfs(unsigned int cur_frequency)
for
(
cpu
=
0
;
cpu
<
CONFIG_NR_CPUS
;
cpu
++
)
{
for
(
cpu
=
0
;
cpu
<
CONFIG_NR_CPUS
;
cpu
++
)
{
tmp
=
__raw_readl
(
dvfs_info
->
base
+
XMU_C0_3_PSTATE
+
cpu
*
4
);
tmp
=
__raw_readl
(
dvfs_info
->
base
+
XMU_C0_3_PSTATE
+
cpu
*
4
);
tmp
&=
~
(
P_VALUE_MASK
<<
C0_3_PSTATE_NEW_SHIFT
);
tmp
&=
~
(
P_VALUE_MASK
<<
C0_3_PSTATE_NEW_SHIFT
);
tmp
|=
(
i
<<
C0_3_PSTATE_NEW_SHIFT
);
tmp
|=
(
(
pos
-
freq_table
)
<<
C0_3_PSTATE_NEW_SHIFT
);
__raw_writel
(
tmp
,
dvfs_info
->
base
+
XMU_C0_3_PSTATE
+
cpu
*
4
);
__raw_writel
(
tmp
,
dvfs_info
->
base
+
XMU_C0_3_PSTATE
+
cpu
*
4
);
}
}
...
...
drivers/cpufreq/freq_table.c
浏览文件 @
37c14794
...
@@ -21,22 +21,19 @@
...
@@ -21,22 +21,19 @@
int
cpufreq_frequency_table_cpuinfo
(
struct
cpufreq_policy
*
policy
,
int
cpufreq_frequency_table_cpuinfo
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
)
struct
cpufreq_frequency_table
*
table
)
{
{
struct
cpufreq_frequency_table
*
pos
;
unsigned
int
min_freq
=
~
0
;
unsigned
int
min_freq
=
~
0
;
unsigned
int
max_freq
=
0
;
unsigned
int
max_freq
=
0
;
unsigned
int
i
;
unsigned
int
freq
;
for
(
i
=
0
;
(
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
{
cpufreq_for_each_valid_entry
(
pos
,
table
)
{
unsigned
int
freq
=
table
[
i
].
frequency
;
freq
=
pos
->
frequency
;
if
(
freq
==
CPUFREQ_ENTRY_INVALID
)
{
pr_debug
(
"table entry %u is invalid, skipping
\n
"
,
i
);
continue
;
}
if
(
!
cpufreq_boost_enabled
()
if
(
!
cpufreq_boost_enabled
()
&&
(
table
[
i
].
flags
&
CPUFREQ_BOOST_FREQ
))
&&
(
pos
->
flags
&
CPUFREQ_BOOST_FREQ
))
continue
;
continue
;
pr_debug
(
"table entry %u: %u kHz
\n
"
,
i
,
freq
);
pr_debug
(
"table entry %u: %u kHz
\n
"
,
(
int
)(
pos
-
table
)
,
freq
);
if
(
freq
<
min_freq
)
if
(
freq
<
min_freq
)
min_freq
=
freq
;
min_freq
=
freq
;
if
(
freq
>
max_freq
)
if
(
freq
>
max_freq
)
...
@@ -57,7 +54,8 @@ EXPORT_SYMBOL_GPL(cpufreq_frequency_table_cpuinfo);
...
@@ -57,7 +54,8 @@ EXPORT_SYMBOL_GPL(cpufreq_frequency_table_cpuinfo);
int
cpufreq_frequency_table_verify
(
struct
cpufreq_policy
*
policy
,
int
cpufreq_frequency_table_verify
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
)
struct
cpufreq_frequency_table
*
table
)
{
{
unsigned
int
next_larger
=
~
0
,
freq
,
i
=
0
;
struct
cpufreq_frequency_table
*
pos
;
unsigned
int
freq
,
next_larger
=
~
0
;
bool
found
=
false
;
bool
found
=
false
;
pr_debug
(
"request for verification of policy (%u - %u kHz) for cpu %u
\n
"
,
pr_debug
(
"request for verification of policy (%u - %u kHz) for cpu %u
\n
"
,
...
@@ -65,9 +63,9 @@ int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
...
@@ -65,9 +63,9 @@ int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
cpufreq_verify_within_cpu_limits
(
policy
);
cpufreq_verify_within_cpu_limits
(
policy
);
for
(;
freq
=
table
[
i
].
frequency
,
freq
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_valid_entry
(
pos
,
table
)
{
if
(
freq
==
CPUFREQ_ENTRY_INVALID
)
freq
=
pos
->
frequency
;
continue
;
if
((
freq
>=
policy
->
min
)
&&
(
freq
<=
policy
->
max
))
{
if
((
freq
>=
policy
->
min
)
&&
(
freq
<=
policy
->
max
))
{
found
=
true
;
found
=
true
;
break
;
break
;
...
@@ -118,7 +116,8 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
...
@@ -118,7 +116,8 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
.
driver_data
=
~
0
,
.
driver_data
=
~
0
,
.
frequency
=
0
,
.
frequency
=
0
,
};
};
unsigned
int
i
;
struct
cpufreq_frequency_table
*
pos
;
unsigned
int
freq
,
i
=
0
;
pr_debug
(
"request for target %u kHz (relation: %u) for cpu %u
\n
"
,
pr_debug
(
"request for target %u kHz (relation: %u) for cpu %u
\n
"
,
target_freq
,
relation
,
policy
->
cpu
);
target_freq
,
relation
,
policy
->
cpu
);
...
@@ -132,10 +131,10 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
...
@@ -132,10 +131,10 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
break
;
break
;
}
}
for
(
i
=
0
;
(
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
{
cpufreq_for_each_valid_entry
(
pos
,
table
)
{
unsigned
int
freq
=
table
[
i
].
frequency
;
freq
=
pos
->
frequency
;
if
(
freq
==
CPUFREQ_ENTRY_INVALID
)
continu
e
;
i
=
pos
-
tabl
e
;
if
((
freq
<
policy
->
min
)
||
(
freq
>
policy
->
max
))
if
((
freq
<
policy
->
min
)
||
(
freq
>
policy
->
max
))
continue
;
continue
;
switch
(
relation
)
{
switch
(
relation
)
{
...
@@ -184,8 +183,7 @@ EXPORT_SYMBOL_GPL(cpufreq_frequency_table_target);
...
@@ -184,8 +183,7 @@ EXPORT_SYMBOL_GPL(cpufreq_frequency_table_target);
int
cpufreq_frequency_table_get_index
(
struct
cpufreq_policy
*
policy
,
int
cpufreq_frequency_table_get_index
(
struct
cpufreq_policy
*
policy
,
unsigned
int
freq
)
unsigned
int
freq
)
{
{
struct
cpufreq_frequency_table
*
table
;
struct
cpufreq_frequency_table
*
pos
,
*
table
;
int
i
;
table
=
cpufreq_frequency_get_table
(
policy
->
cpu
);
table
=
cpufreq_frequency_get_table
(
policy
->
cpu
);
if
(
unlikely
(
!
table
))
{
if
(
unlikely
(
!
table
))
{
...
@@ -193,10 +191,9 @@ int cpufreq_frequency_table_get_index(struct cpufreq_policy *policy,
...
@@ -193,10 +191,9 @@ int cpufreq_frequency_table_get_index(struct cpufreq_policy *policy,
return
-
ENOENT
;
return
-
ENOENT
;
}
}
for
(
i
=
0
;
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_valid_entry
(
pos
,
table
)
if
(
table
[
i
].
frequency
==
freq
)
if
(
pos
->
frequency
==
freq
)
return
i
;
return
pos
-
table
;
}
return
-
EINVAL
;
return
-
EINVAL
;
}
}
...
@@ -208,16 +205,13 @@ EXPORT_SYMBOL_GPL(cpufreq_frequency_table_get_index);
...
@@ -208,16 +205,13 @@ EXPORT_SYMBOL_GPL(cpufreq_frequency_table_get_index);
static
ssize_t
show_available_freqs
(
struct
cpufreq_policy
*
policy
,
char
*
buf
,
static
ssize_t
show_available_freqs
(
struct
cpufreq_policy
*
policy
,
char
*
buf
,
bool
show_boost
)
bool
show_boost
)
{
{
unsigned
int
i
=
0
;
ssize_t
count
=
0
;
ssize_t
count
=
0
;
struct
cpufreq_frequency_table
*
table
=
policy
->
freq_table
;
struct
cpufreq_frequency_table
*
pos
,
*
table
=
policy
->
freq_table
;
if
(
!
table
)
if
(
!
table
)
return
-
ENODEV
;
return
-
ENODEV
;
for
(
i
=
0
;
(
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
{
cpufreq_for_each_valid_entry
(
pos
,
table
)
{
if
(
table
[
i
].
frequency
==
CPUFREQ_ENTRY_INVALID
)
continue
;
/*
/*
* show_boost = true and driver_data = BOOST freq
* show_boost = true and driver_data = BOOST freq
* display BOOST freqs
* display BOOST freqs
...
@@ -229,10 +223,10 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
...
@@ -229,10 +223,10 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
* show_boost = false and driver_data != BOOST freq
* show_boost = false and driver_data != BOOST freq
* display NON BOOST freqs
* display NON BOOST freqs
*/
*/
if
(
show_boost
^
(
table
[
i
].
flags
&
CPUFREQ_BOOST_FREQ
))
if
(
show_boost
^
(
pos
->
flags
&
CPUFREQ_BOOST_FREQ
))
continue
;
continue
;
count
+=
sprintf
(
&
buf
[
count
],
"%d "
,
table
[
i
].
frequency
);
count
+=
sprintf
(
&
buf
[
count
],
"%d "
,
pos
->
frequency
);
}
}
count
+=
sprintf
(
&
buf
[
count
],
"
\n
"
);
count
+=
sprintf
(
&
buf
[
count
],
"
\n
"
);
...
...
drivers/cpufreq/intel_pstate.c
浏览文件 @
37c14794
...
@@ -32,8 +32,6 @@
...
@@ -32,8 +32,6 @@
#include <asm/msr.h>
#include <asm/msr.h>
#include <asm/cpu_device_id.h>
#include <asm/cpu_device_id.h>
#define SAMPLE_COUNT 3
#define BYT_RATIOS 0x66a
#define BYT_RATIOS 0x66a
#define BYT_VIDS 0x66b
#define BYT_VIDS 0x66b
#define BYT_TURBO_RATIOS 0x66c
#define BYT_TURBO_RATIOS 0x66c
...
@@ -553,14 +551,13 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
...
@@ -553,14 +551,13 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
intel_pstate_set_pstate
(
cpu
,
cpu
->
pstate
.
max_pstate
);
intel_pstate_set_pstate
(
cpu
,
cpu
->
pstate
.
max_pstate
);
}
}
static
inline
void
intel_pstate_calc_busy
(
struct
cpudata
*
cpu
,
static
inline
void
intel_pstate_calc_busy
(
struct
cpudata
*
cpu
)
struct
sample
*
sample
)
{
{
struct
sample
*
sample
=
&
cpu
->
sample
;
int32_t
core_pct
;
int32_t
core_pct
;
int32_t
c0_pct
;
int32_t
c0_pct
;
core_pct
=
div_fp
(
int_tofp
((
sample
->
aperf
)),
core_pct
=
div_fp
(
int_tofp
(
sample
->
aperf
),
int_tofp
(
sample
->
mperf
));
int_tofp
((
sample
->
mperf
)));
core_pct
=
mul_fp
(
core_pct
,
int_tofp
(
100
));
core_pct
=
mul_fp
(
core_pct
,
int_tofp
(
100
));
FP_ROUNDUP
(
core_pct
);
FP_ROUNDUP
(
core_pct
);
...
@@ -592,7 +589,7 @@ static inline void intel_pstate_sample(struct cpudata *cpu)
...
@@ -592,7 +589,7 @@ static inline void intel_pstate_sample(struct cpudata *cpu)
cpu
->
sample
.
mperf
-=
cpu
->
prev_mperf
;
cpu
->
sample
.
mperf
-=
cpu
->
prev_mperf
;
cpu
->
sample
.
tsc
-=
cpu
->
prev_tsc
;
cpu
->
sample
.
tsc
-=
cpu
->
prev_tsc
;
intel_pstate_calc_busy
(
cpu
,
&
cpu
->
sample
);
intel_pstate_calc_busy
(
cpu
);
cpu
->
prev_aperf
=
aperf
;
cpu
->
prev_aperf
=
aperf
;
cpu
->
prev_mperf
=
mperf
;
cpu
->
prev_mperf
=
mperf
;
...
...
drivers/cpufreq/longhaul.c
浏览文件 @
37c14794
...
@@ -530,6 +530,7 @@ static int longhaul_get_ranges(void)
...
@@ -530,6 +530,7 @@ static int longhaul_get_ranges(void)
static
void
longhaul_setup_voltagescaling
(
void
)
static
void
longhaul_setup_voltagescaling
(
void
)
{
{
struct
cpufreq_frequency_table
*
freq_pos
;
union
msr_longhaul
longhaul
;
union
msr_longhaul
longhaul
;
struct
mV_pos
minvid
,
maxvid
,
vid
;
struct
mV_pos
minvid
,
maxvid
,
vid
;
unsigned
int
j
,
speed
,
pos
,
kHz_step
,
numvscales
;
unsigned
int
j
,
speed
,
pos
,
kHz_step
,
numvscales
;
...
@@ -608,18 +609,16 @@ static void longhaul_setup_voltagescaling(void)
...
@@ -608,18 +609,16 @@ static void longhaul_setup_voltagescaling(void)
/* Calculate kHz for one voltage step */
/* Calculate kHz for one voltage step */
kHz_step
=
(
highest_speed
-
min_vid_speed
)
/
numvscales
;
kHz_step
=
(
highest_speed
-
min_vid_speed
)
/
numvscales
;
j
=
0
;
cpufreq_for_each_entry
(
freq_pos
,
longhaul_table
)
{
while
(
longhaul_table
[
j
].
frequency
!=
CPUFREQ_TABLE_END
)
{
speed
=
freq_pos
->
frequency
;
speed
=
longhaul_table
[
j
].
frequency
;
if
(
speed
>
min_vid_speed
)
if
(
speed
>
min_vid_speed
)
pos
=
(
speed
-
min_vid_speed
)
/
kHz_step
+
minvid
.
pos
;
pos
=
(
speed
-
min_vid_speed
)
/
kHz_step
+
minvid
.
pos
;
else
else
pos
=
minvid
.
pos
;
pos
=
minvid
.
pos
;
longhaul_table
[
j
].
driver_data
|=
mV_vrm_table
[
pos
]
<<
8
;
freq_pos
->
driver_data
|=
mV_vrm_table
[
pos
]
<<
8
;
vid
=
vrm_mV_table
[
mV_vrm_table
[
pos
]];
vid
=
vrm_mV_table
[
mV_vrm_table
[
pos
]];
printk
(
KERN_INFO
PFX
"f: %d kHz, index: %d, vid: %d mV
\n
"
,
printk
(
KERN_INFO
PFX
"f: %d kHz, index: %d, vid: %d mV
\n
"
,
speed
,
j
,
vid
.
mV
);
speed
,
(
int
)(
freq_pos
-
longhaul_table
),
vid
.
mV
);
j
++
;
}
}
can_scale_voltage
=
1
;
can_scale_voltage
=
1
;
...
...
drivers/cpufreq/pasemi-cpufreq.c
浏览文件 @
37c14794
...
@@ -136,9 +136,10 @@ void restore_astate(int cpu)
...
@@ -136,9 +136,10 @@ void restore_astate(int cpu)
static
int
pas_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
static
int
pas_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
{
struct
cpufreq_frequency_table
*
pos
;
const
u32
*
max_freqp
;
const
u32
*
max_freqp
;
u32
max_freq
;
u32
max_freq
;
int
i
,
cur_astate
;
int
cur_astate
;
struct
resource
res
;
struct
resource
res
;
struct
device_node
*
cpu
,
*
dn
;
struct
device_node
*
cpu
,
*
dn
;
int
err
=
-
ENODEV
;
int
err
=
-
ENODEV
;
...
@@ -197,10 +198,9 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)
...
@@ -197,10 +198,9 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)
pr_debug
(
"initializing frequency table
\n
"
);
pr_debug
(
"initializing frequency table
\n
"
);
/* initialize frequency table */
/* initialize frequency table */
for
(
i
=
0
;
pas_freqs
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_entry
(
pos
,
pas_freqs
)
{
pas_freqs
[
i
].
frequency
=
pos
->
frequency
=
get_astate_freq
(
pos
->
driver_data
)
*
100000
;
get_astate_freq
(
pas_freqs
[
i
].
driver_data
)
*
100000
;
pr_debug
(
"%d: %d
\n
"
,
(
int
)(
pos
-
pas_freqs
),
pos
->
frequency
);
pr_debug
(
"%d: %d
\n
"
,
i
,
pas_freqs
[
i
].
frequency
);
}
}
cur_astate
=
get_cur_astate
(
policy
->
cpu
);
cur_astate
=
get_cur_astate
(
policy
->
cpu
);
...
...
drivers/cpufreq/powernow-k6.c
浏览文件 @
37c14794
...
@@ -151,6 +151,7 @@ static int powernow_k6_target(struct cpufreq_policy *policy,
...
@@ -151,6 +151,7 @@ static int powernow_k6_target(struct cpufreq_policy *policy,
static
int
powernow_k6_cpu_init
(
struct
cpufreq_policy
*
policy
)
static
int
powernow_k6_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
{
struct
cpufreq_frequency_table
*
pos
;
unsigned
int
i
,
f
;
unsigned
int
i
,
f
;
unsigned
khz
;
unsigned
khz
;
...
@@ -168,12 +169,11 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
...
@@ -168,12 +169,11 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
}
}
}
}
if
(
param_max_multiplier
)
{
if
(
param_max_multiplier
)
{
for
(
i
=
0
;
(
clock_ratio
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
{
cpufreq_for_each_entry
(
pos
,
clock_ratio
)
if
(
clock_ratio
[
i
].
driver_data
==
param_max_multiplier
)
{
if
(
pos
->
driver_data
==
param_max_multiplier
)
{
max_multiplier
=
param_max_multiplier
;
max_multiplier
=
param_max_multiplier
;
goto
have_max_multiplier
;
goto
have_max_multiplier
;
}
}
}
printk
(
KERN_ERR
"powernow-k6: invalid max_multiplier parameter, valid parameters 20, 30, 35, 40, 45, 50, 55, 60
\n
"
);
printk
(
KERN_ERR
"powernow-k6: invalid max_multiplier parameter, valid parameters 20, 30, 35, 40, 45, 50, 55, 60
\n
"
);
return
-
EINVAL
;
return
-
EINVAL
;
}
}
...
@@ -201,12 +201,12 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
...
@@ -201,12 +201,12 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
param_busfreq
=
busfreq
*
10
;
param_busfreq
=
busfreq
*
10
;
/* table init */
/* table init */
for
(
i
=
0
;
(
clock_ratio
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
{
cpufreq_for_each_entry
(
pos
,
clock_ratio
)
{
f
=
clock_ratio
[
i
].
driver_data
;
f
=
pos
->
driver_data
;
if
(
f
>
max_multiplier
)
if
(
f
>
max_multiplier
)
clock_ratio
[
i
].
frequency
=
CPUFREQ_ENTRY_INVALID
;
pos
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
else
else
clock_ratio
[
i
].
frequency
=
busfreq
*
f
;
pos
->
frequency
=
busfreq
*
f
;
}
}
/* cpuinfo and default policy values */
/* cpuinfo and default policy values */
...
...
drivers/cpufreq/ppc_cbe_cpufreq.c
浏览文件 @
37c14794
...
@@ -67,9 +67,10 @@ static int set_pmode(unsigned int cpu, unsigned int slow_mode)
...
@@ -67,9 +67,10 @@ static int set_pmode(unsigned int cpu, unsigned int slow_mode)
static
int
cbe_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
static
int
cbe_cpufreq_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
{
struct
cpufreq_frequency_table
*
pos
;
const
u32
*
max_freqp
;
const
u32
*
max_freqp
;
u32
max_freq
;
u32
max_freq
;
int
i
,
cur_pmode
;
int
cur_pmode
;
struct
device_node
*
cpu
;
struct
device_node
*
cpu
;
cpu
=
of_get_cpu_node
(
policy
->
cpu
,
NULL
);
cpu
=
of_get_cpu_node
(
policy
->
cpu
,
NULL
);
...
@@ -102,9 +103,9 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
...
@@ -102,9 +103,9 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
pr_debug
(
"initializing frequency table
\n
"
);
pr_debug
(
"initializing frequency table
\n
"
);
/* initialize frequency table */
/* initialize frequency table */
for
(
i
=
0
;
cbe_freqs
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_entry
(
pos
,
cbe_freqs
)
{
cbe_freqs
[
i
].
frequency
=
max_freq
/
cbe_freqs
[
i
].
driver_data
;
pos
->
frequency
=
max_freq
/
pos
->
driver_data
;
pr_debug
(
"%d: %d
\n
"
,
i
,
cbe_freqs
[
i
].
frequency
);
pr_debug
(
"%d: %d
\n
"
,
(
int
)(
pos
-
cbe_freqs
),
pos
->
frequency
);
}
}
/* if DEBUG is enabled set_pmode() measures the latency
/* if DEBUG is enabled set_pmode() measures the latency
...
...
drivers/cpufreq/s3c2416-cpufreq.c
浏览文件 @
37c14794
...
@@ -266,7 +266,7 @@ static int s3c2416_cpufreq_set_target(struct cpufreq_policy *policy,
...
@@ -266,7 +266,7 @@ static int s3c2416_cpufreq_set_target(struct cpufreq_policy *policy,
static
void
__init
s3c2416_cpufreq_cfg_regulator
(
struct
s3c2416_data
*
s3c_freq
)
static
void
__init
s3c2416_cpufreq_cfg_regulator
(
struct
s3c2416_data
*
s3c_freq
)
{
{
int
count
,
v
,
i
,
found
;
int
count
,
v
,
i
,
found
;
struct
cpufreq_frequency_table
*
freq
;
struct
cpufreq_frequency_table
*
pos
;
struct
s3c2416_dvfs
*
dvfs
;
struct
s3c2416_dvfs
*
dvfs
;
count
=
regulator_count_voltages
(
s3c_freq
->
vddarm
);
count
=
regulator_count_voltages
(
s3c_freq
->
vddarm
);
...
@@ -275,12 +275,11 @@ static void __init s3c2416_cpufreq_cfg_regulator(struct s3c2416_data *s3c_freq)
...
@@ -275,12 +275,11 @@ static void __init s3c2416_cpufreq_cfg_regulator(struct s3c2416_data *s3c_freq)
return
;
return
;
}
}
freq
=
s3c_freq
->
freq_table
;
if
(
!
count
)
while
(
count
>
0
&&
freq
->
frequency
!=
CPUFREQ_TABLE_END
)
{
goto
out
;
if
(
freq
->
frequency
==
CPUFREQ_ENTRY_INVALID
)
continue
;
dvfs
=
&
s3c2416_dvfs_table
[
freq
->
driver_data
];
cpufreq_for_each_valid_entry
(
pos
,
s3c_freq
->
freq_table
)
{
dvfs
=
&
s3c2416_dvfs_table
[
pos
->
driver_data
];
found
=
0
;
found
=
0
;
/* Check only the min-voltage, more is always ok on S3C2416 */
/* Check only the min-voltage, more is always ok on S3C2416 */
...
@@ -292,13 +291,12 @@ static void __init s3c2416_cpufreq_cfg_regulator(struct s3c2416_data *s3c_freq)
...
@@ -292,13 +291,12 @@ static void __init s3c2416_cpufreq_cfg_regulator(struct s3c2416_data *s3c_freq)
if
(
!
found
)
{
if
(
!
found
)
{
pr_debug
(
"cpufreq: %dkHz unsupported by regulator
\n
"
,
pr_debug
(
"cpufreq: %dkHz unsupported by regulator
\n
"
,
freq
->
frequency
);
pos
->
frequency
);
freq
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
pos
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
}
}
freq
++
;
}
}
out:
/* Guessed */
/* Guessed */
s3c_freq
->
regulator_latency
=
1
*
1000
*
1000
;
s3c_freq
->
regulator_latency
=
1
*
1000
*
1000
;
}
}
...
@@ -338,7 +336,7 @@ static struct notifier_block s3c2416_cpufreq_reboot_notifier = {
...
@@ -338,7 +336,7 @@ static struct notifier_block s3c2416_cpufreq_reboot_notifier = {
static
int
__init
s3c2416_cpufreq_driver_init
(
struct
cpufreq_policy
*
policy
)
static
int
__init
s3c2416_cpufreq_driver_init
(
struct
cpufreq_policy
*
policy
)
{
{
struct
s3c2416_data
*
s3c_freq
=
&
s3c2416_cpufreq
;
struct
s3c2416_data
*
s3c_freq
=
&
s3c2416_cpufreq
;
struct
cpufreq_frequency_table
*
freq
;
struct
cpufreq_frequency_table
*
pos
;
struct
clk
*
msysclk
;
struct
clk
*
msysclk
;
unsigned
long
rate
;
unsigned
long
rate
;
int
ret
;
int
ret
;
...
@@ -427,31 +425,27 @@ static int __init s3c2416_cpufreq_driver_init(struct cpufreq_policy *policy)
...
@@ -427,31 +425,27 @@ static int __init s3c2416_cpufreq_driver_init(struct cpufreq_policy *policy)
s3c_freq
->
regulator_latency
=
0
;
s3c_freq
->
regulator_latency
=
0
;
#endif
#endif
freq
=
s3c_freq
->
freq_table
;
cpufreq_for_each_entry
(
pos
,
s3c_freq
->
freq_table
)
{
while
(
freq
->
frequency
!=
CPUFREQ_TABLE_END
)
{
/* special handling for dvs mode */
/* special handling for dvs mode */
if
(
freq
->
driver_data
==
0
)
{
if
(
pos
->
driver_data
==
0
)
{
if
(
!
s3c_freq
->
hclk
)
{
if
(
!
s3c_freq
->
hclk
)
{
pr_debug
(
"cpufreq: %dkHz unsupported as it would need unavailable dvs mode
\n
"
,
pr_debug
(
"cpufreq: %dkHz unsupported as it would need unavailable dvs mode
\n
"
,
freq
->
frequency
);
pos
->
frequency
);
freq
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
pos
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
}
else
{
}
else
{
freq
++
;
continue
;
continue
;
}
}
}
}
/* Check for frequencies we can generate */
/* Check for frequencies we can generate */
rate
=
clk_round_rate
(
s3c_freq
->
armdiv
,
rate
=
clk_round_rate
(
s3c_freq
->
armdiv
,
freq
->
frequency
*
1000
);
pos
->
frequency
*
1000
);
rate
/=
1000
;
rate
/=
1000
;
if
(
rate
!=
freq
->
frequency
)
{
if
(
rate
!=
pos
->
frequency
)
{
pr_debug
(
"cpufreq: %dkHz unsupported by clock (clk_round_rate return %lu)
\n
"
,
pr_debug
(
"cpufreq: %dkHz unsupported by clock (clk_round_rate return %lu)
\n
"
,
freq
->
frequency
,
rate
);
pos
->
frequency
,
rate
);
freq
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
pos
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
}
}
freq
++
;
}
}
/* Datasheet says PLL stabalisation time must be at least 300us,
/* Datasheet says PLL stabalisation time must be at least 300us,
...
...
drivers/cpufreq/s3c64xx-cpufreq.c
浏览文件 @
37c14794
...
@@ -118,11 +118,10 @@ static void __init s3c64xx_cpufreq_config_regulator(void)
...
@@ -118,11 +118,10 @@ static void __init s3c64xx_cpufreq_config_regulator(void)
pr_err
(
"Unable to check supported voltages
\n
"
);
pr_err
(
"Unable to check supported voltages
\n
"
);
}
}
freq
=
s3c64xx_freq_table
;
if
(
!
count
)
while
(
count
>
0
&&
freq
->
frequency
!=
CPUFREQ_TABLE_END
)
{
goto
out
;
if
(
freq
->
frequency
==
CPUFREQ_ENTRY_INVALID
)
continue
;
cpufreq_for_each_valid_entry
(
freq
,
s3c64xx_freq_table
)
{
dvfs
=
&
s3c64xx_dvfs_table
[
freq
->
driver_data
];
dvfs
=
&
s3c64xx_dvfs_table
[
freq
->
driver_data
];
found
=
0
;
found
=
0
;
...
@@ -137,10 +136,9 @@ static void __init s3c64xx_cpufreq_config_regulator(void)
...
@@ -137,10 +136,9 @@ static void __init s3c64xx_cpufreq_config_regulator(void)
freq
->
frequency
);
freq
->
frequency
);
freq
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
freq
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
}
}
freq
++
;
}
}
out:
/* Guess based on having to do an I2C/SPI write; in future we
/* Guess based on having to do an I2C/SPI write; in future we
* will be able to query the regulator performance here. */
* will be able to query the regulator performance here. */
regulator_latency
=
1
*
1000
*
1000
;
regulator_latency
=
1
*
1000
*
1000
;
...
@@ -179,8 +177,7 @@ static int s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
...
@@ -179,8 +177,7 @@ static int s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
}
}
#endif
#endif
freq
=
s3c64xx_freq_table
;
cpufreq_for_each_entry
(
freq
,
s3c64xx_freq_table
)
{
while
(
freq
->
frequency
!=
CPUFREQ_TABLE_END
)
{
unsigned
long
r
;
unsigned
long
r
;
/* Check for frequencies we can generate */
/* Check for frequencies we can generate */
...
@@ -196,8 +193,6 @@ static int s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
...
@@ -196,8 +193,6 @@ static int s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
* frequency is the maximum we can support. */
* frequency is the maximum we can support. */
if
(
!
vddarm
&&
freq
->
frequency
>
clk_get_rate
(
policy
->
clk
)
/
1000
)
if
(
!
vddarm
&&
freq
->
frequency
>
clk_get_rate
(
policy
->
clk
)
/
1000
)
freq
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
freq
->
frequency
=
CPUFREQ_ENTRY_INVALID
;
freq
++
;
}
}
/* Datasheet says PLL stabalisation time (if we were to use
/* Datasheet says PLL stabalisation time (if we were to use
...
...
drivers/cpufreq/speedstep-centrino.c
浏览文件 @
37c14794
...
@@ -28,7 +28,7 @@
...
@@ -28,7 +28,7 @@
#include <asm/cpu_device_id.h>
#include <asm/cpu_device_id.h>
#define PFX "speedstep-centrino: "
#define PFX "speedstep-centrino: "
#define MAINTAINER "
cpufreq
@vger.kernel.org"
#define MAINTAINER "
linux-pm
@vger.kernel.org"
#define INTEL_MSR_RANGE (0xffff)
#define INTEL_MSR_RANGE (0xffff)
...
...
drivers/mfd/db8500-prcmu.c
浏览文件 @
37c14794
...
@@ -1734,18 +1734,17 @@ static struct cpufreq_frequency_table db8500_cpufreq_table[] = {
...
@@ -1734,18 +1734,17 @@ static struct cpufreq_frequency_table db8500_cpufreq_table[] = {
static
long
round_armss_rate
(
unsigned
long
rate
)
static
long
round_armss_rate
(
unsigned
long
rate
)
{
{
struct
cpufreq_frequency_table
*
pos
;
long
freq
=
0
;
long
freq
=
0
;
int
i
=
0
;
/* cpufreq table frequencies is in KHz. */
/* cpufreq table frequencies is in KHz. */
rate
=
rate
/
1000
;
rate
=
rate
/
1000
;
/* Find the corresponding arm opp from the cpufreq table. */
/* Find the corresponding arm opp from the cpufreq table. */
while
(
db8500_cpufreq_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
)
{
cpufreq_for_each_entry
(
pos
,
db8500_cpufreq_table
)
{
freq
=
db8500_cpufreq_table
[
i
].
frequency
;
freq
=
pos
->
frequency
;
if
(
freq
==
rate
)
if
(
freq
==
rate
)
break
;
break
;
i
++
;
}
}
/* Return the last valid value, even if a match was not found. */
/* Return the last valid value, even if a match was not found. */
...
@@ -1886,23 +1885,21 @@ static void set_clock_rate(u8 clock, unsigned long rate)
...
@@ -1886,23 +1885,21 @@ static void set_clock_rate(u8 clock, unsigned long rate)
static
int
set_armss_rate
(
unsigned
long
rate
)
static
int
set_armss_rate
(
unsigned
long
rate
)
{
{
int
i
=
0
;
struct
cpufreq_frequency_table
*
pos
;
/* cpufreq table frequencies is in KHz. */
/* cpufreq table frequencies is in KHz. */
rate
=
rate
/
1000
;
rate
=
rate
/
1000
;
/* Find the corresponding arm opp from the cpufreq table. */
/* Find the corresponding arm opp from the cpufreq table. */
while
(
db8500_cpufreq_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
)
{
cpufreq_for_each_entry
(
pos
,
db8500_cpufreq_table
)
if
(
db8500_cpufreq_table
[
i
].
frequency
==
rate
)
if
(
pos
->
frequency
==
rate
)
break
;
break
;
i
++
;
}
if
(
db8500_cpufreq_table
[
i
].
frequency
!=
rate
)
if
(
pos
->
frequency
!=
rate
)
return
-
EINVAL
;
return
-
EINVAL
;
/* Set the new arm opp. */
/* Set the new arm opp. */
return
db8500_prcmu_set_arm_opp
(
db8500_cpufreq_table
[
i
].
driver_data
);
return
db8500_prcmu_set_arm_opp
(
pos
->
driver_data
);
}
}
static
int
set_plldsi_rate
(
unsigned
long
rate
)
static
int
set_plldsi_rate
(
unsigned
long
rate
)
...
...
drivers/net/irda/sh_sir.c
浏览文件 @
37c14794
...
@@ -217,21 +217,17 @@ static int sh_sir_crc_init(struct sh_sir_self *self)
...
@@ -217,21 +217,17 @@ static int sh_sir_crc_init(struct sh_sir_self *self)
static
u32
sh_sir_find_sclk
(
struct
clk
*
irda_clk
)
static
u32
sh_sir_find_sclk
(
struct
clk
*
irda_clk
)
{
{
struct
cpufreq_frequency_table
*
freq_table
=
irda_clk
->
freq_table
;
struct
cpufreq_frequency_table
*
freq_table
=
irda_clk
->
freq_table
;
struct
cpufreq_frequency_table
*
pos
;
struct
clk
*
pclk
=
clk_get
(
NULL
,
"peripheral_clk"
);
struct
clk
*
pclk
=
clk_get
(
NULL
,
"peripheral_clk"
);
u32
limit
,
min
=
0xffffffff
,
tmp
;
u32
limit
,
min
=
0xffffffff
,
tmp
;
int
i
,
i
ndex
=
0
;
int
index
=
0
;
limit
=
clk_get_rate
(
pclk
);
limit
=
clk_get_rate
(
pclk
);
clk_put
(
pclk
);
clk_put
(
pclk
);
/* IrDA can not set over peripheral_clk */
/* IrDA can not set over peripheral_clk */
for
(
i
=
0
;
cpufreq_for_each_valid_entry
(
pos
,
freq_table
)
{
freq_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
u32
freq
=
pos
->
frequency
;
i
++
)
{
u32
freq
=
freq_table
[
i
].
frequency
;
if
(
freq
==
CPUFREQ_ENTRY_INVALID
)
continue
;
/* IrDA should not over peripheral_clk */
/* IrDA should not over peripheral_clk */
if
(
freq
>
limit
)
if
(
freq
>
limit
)
...
@@ -240,7 +236,7 @@ static u32 sh_sir_find_sclk(struct clk *irda_clk)
...
@@ -240,7 +236,7 @@ static u32 sh_sir_find_sclk(struct clk *irda_clk)
tmp
=
freq
%
SCLK_BASE
;
tmp
=
freq
%
SCLK_BASE
;
if
(
tmp
<
min
)
{
if
(
tmp
<
min
)
{
min
=
tmp
;
min
=
tmp
;
index
=
i
;
index
=
pos
-
freq_table
;
}
}
}
}
...
...
drivers/sh/clk/core.c
浏览文件 @
37c14794
...
@@ -196,17 +196,11 @@ int clk_rate_table_find(struct clk *clk,
...
@@ -196,17 +196,11 @@ int clk_rate_table_find(struct clk *clk,
struct
cpufreq_frequency_table
*
freq_table
,
struct
cpufreq_frequency_table
*
freq_table
,
unsigned
long
rate
)
unsigned
long
rate
)
{
{
int
i
;
struct
cpufreq_frequency_table
*
pos
;
for
(
i
=
0
;
freq_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
unsigned
long
freq
=
freq_table
[
i
].
frequency
;
if
(
freq
==
CPUFREQ_ENTRY_INVALID
)
cpufreq_for_each_valid_entry
(
pos
,
freq_table
)
continue
;
if
(
pos
->
frequency
==
rate
)
return
pos
-
freq_table
;
if
(
freq
==
rate
)
return
i
;
}
return
-
ENOENT
;
return
-
ENOENT
;
}
}
...
@@ -575,11 +569,7 @@ long clk_round_parent(struct clk *clk, unsigned long target,
...
@@ -575,11 +569,7 @@ long clk_round_parent(struct clk *clk, unsigned long target,
return
abs
(
target
-
*
best_freq
);
return
abs
(
target
-
*
best_freq
);
}
}
for
(
freq
=
parent
->
freq_table
;
freq
->
frequency
!=
CPUFREQ_TABLE_END
;
cpufreq_for_each_valid_entry
(
freq
,
parent
->
freq_table
)
{
freq
++
)
{
if
(
freq
->
frequency
==
CPUFREQ_ENTRY_INVALID
)
continue
;
if
(
unlikely
(
freq
->
frequency
/
target
<=
div_min
-
1
))
{
if
(
unlikely
(
freq
->
frequency
/
target
<=
div_min
-
1
))
{
unsigned
long
freq_max
;
unsigned
long
freq_max
;
...
...
drivers/thermal/cpu_cooling.c
浏览文件 @
37c14794
...
@@ -144,11 +144,11 @@ static int get_property(unsigned int cpu, unsigned long input,
...
@@ -144,11 +144,11 @@ static int get_property(unsigned int cpu, unsigned long input,
unsigned
int
*
output
,
unsigned
int
*
output
,
enum
cpufreq_cooling_property
property
)
enum
cpufreq_cooling_property
property
)
{
{
int
i
,
j
;
int
i
;
unsigned
long
max_level
=
0
,
level
=
0
;
unsigned
long
max_level
=
0
,
level
=
0
;
unsigned
int
freq
=
CPUFREQ_ENTRY_INVALID
;
unsigned
int
freq
=
CPUFREQ_ENTRY_INVALID
;
int
descend
=
-
1
;
int
descend
=
-
1
;
struct
cpufreq_frequency_table
*
table
=
struct
cpufreq_frequency_table
*
pos
,
*
table
=
cpufreq_frequency_get_table
(
cpu
);
cpufreq_frequency_get_table
(
cpu
);
if
(
!
output
)
if
(
!
output
)
...
@@ -157,20 +157,16 @@ static int get_property(unsigned int cpu, unsigned long input,
...
@@ -157,20 +157,16 @@ static int get_property(unsigned int cpu, unsigned long input,
if
(
!
table
)
if
(
!
table
)
return
-
EINVAL
;
return
-
EINVAL
;
for
(
i
=
0
;
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
cpufreq_for_each_valid_entry
(
pos
,
table
)
{
/* ignore invalid entries */
if
(
table
[
i
].
frequency
==
CPUFREQ_ENTRY_INVALID
)
continue
;
/* ignore duplicate entry */
/* ignore duplicate entry */
if
(
freq
==
table
[
i
].
frequency
)
if
(
freq
==
pos
->
frequency
)
continue
;
continue
;
/* get the frequency order */
/* get the frequency order */
if
(
freq
!=
CPUFREQ_ENTRY_INVALID
&&
descend
==
-
1
)
if
(
freq
!=
CPUFREQ_ENTRY_INVALID
&&
descend
==
-
1
)
descend
=
!!
(
freq
>
table
[
i
].
frequency
)
;
descend
=
freq
>
pos
->
frequency
;
freq
=
table
[
i
].
frequency
;
freq
=
pos
->
frequency
;
max_level
++
;
max_level
++
;
}
}
...
@@ -190,29 +186,26 @@ static int get_property(unsigned int cpu, unsigned long input,
...
@@ -190,29 +186,26 @@ static int get_property(unsigned int cpu, unsigned long input,
if
(
property
==
GET_FREQ
)
if
(
property
==
GET_FREQ
)
level
=
descend
?
input
:
(
max_level
-
input
);
level
=
descend
?
input
:
(
max_level
-
input
);
for
(
i
=
0
,
j
=
0
;
table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
;
i
++
)
{
i
=
0
;
/* ignore invalid entry */
cpufreq_for_each_valid_entry
(
pos
,
table
)
{
if
(
table
[
i
].
frequency
==
CPUFREQ_ENTRY_INVALID
)
continue
;
/* ignore duplicate entry */
/* ignore duplicate entry */
if
(
freq
==
table
[
i
].
frequency
)
if
(
freq
==
pos
->
frequency
)
continue
;
continue
;
/* now we have a valid frequency entry */
/* now we have a valid frequency entry */
freq
=
table
[
i
].
frequency
;
freq
=
pos
->
frequency
;
if
(
property
==
GET_LEVEL
&&
(
unsigned
int
)
input
==
freq
)
{
if
(
property
==
GET_LEVEL
&&
(
unsigned
int
)
input
==
freq
)
{
/* get level by frequency */
/* get level by frequency */
*
output
=
descend
?
j
:
(
max_level
-
j
);
*
output
=
descend
?
i
:
(
max_level
-
i
);
return
0
;
return
0
;
}
}
if
(
property
==
GET_FREQ
&&
level
==
j
)
{
if
(
property
==
GET_FREQ
&&
level
==
i
)
{
/* get frequency by level */
/* get frequency by level */
*
output
=
freq
;
*
output
=
freq
;
return
0
;
return
0
;
}
}
j
++
;
i
++
;
}
}
return
-
EINVAL
;
return
-
EINVAL
;
...
...
include/linux/cpufreq.h
浏览文件 @
37c14794
...
@@ -110,6 +110,7 @@ struct cpufreq_policy {
...
@@ -110,6 +110,7 @@ struct cpufreq_policy {
bool
transition_ongoing
;
/* Tracks transition status */
bool
transition_ongoing
;
/* Tracks transition status */
spinlock_t
transition_lock
;
spinlock_t
transition_lock
;
wait_queue_head_t
transition_wait
;
wait_queue_head_t
transition_wait
;
struct
task_struct
*
transition_task
;
/* Task which is doing the transition */
};
};
/* Only for ACPI */
/* Only for ACPI */
...
@@ -468,6 +469,48 @@ struct cpufreq_frequency_table {
...
@@ -468,6 +469,48 @@ struct cpufreq_frequency_table {
* order */
* order */
};
};
#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP)
int
dev_pm_opp_init_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
);
void
dev_pm_opp_free_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
);
#else
static
inline
int
dev_pm_opp_init_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
)
{
return
-
EINVAL
;
}
static
inline
void
dev_pm_opp_free_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
)
{
}
#endif
bool
cpufreq_next_valid
(
struct
cpufreq_frequency_table
**
pos
);
/*
* cpufreq_for_each_entry - iterate over a cpufreq_frequency_table
* @pos: the cpufreq_frequency_table * to use as a loop cursor.
* @table: the cpufreq_frequency_table * to iterate over.
*/
#define cpufreq_for_each_entry(pos, table) \
for (pos = table; pos->frequency != CPUFREQ_TABLE_END; pos++)
/*
* cpufreq_for_each_valid_entry - iterate over a cpufreq_frequency_table
* excluding CPUFREQ_ENTRY_INVALID frequencies.
* @pos: the cpufreq_frequency_table * to use as a loop cursor.
* @table: the cpufreq_frequency_table * to iterate over.
*/
#define cpufreq_for_each_valid_entry(pos, table) \
for (pos = table; cpufreq_next_valid(&pos); pos++)
int
cpufreq_frequency_table_cpuinfo
(
struct
cpufreq_policy
*
policy
,
int
cpufreq_frequency_table_cpuinfo
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_frequency_table
*
table
);
struct
cpufreq_frequency_table
*
table
);
...
...
include/linux/pm_opp.h
浏览文件 @
37c14794
...
@@ -15,7 +15,6 @@
...
@@ -15,7 +15,6 @@
#define __LINUX_OPP_H__
#define __LINUX_OPP_H__
#include <linux/err.h>
#include <linux/err.h>
#include <linux/cpufreq.h>
#include <linux/notifier.h>
#include <linux/notifier.h>
struct
dev_pm_opp
;
struct
dev_pm_opp
;
...
@@ -117,23 +116,4 @@ static inline int of_init_opp_table(struct device *dev)
...
@@ -117,23 +116,4 @@ static inline int of_init_opp_table(struct device *dev)
}
}
#endif
#endif
#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP)
int
dev_pm_opp_init_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
);
void
dev_pm_opp_free_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
);
#else
static
inline
int
dev_pm_opp_init_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
)
{
return
-
EINVAL
;
}
static
inline
void
dev_pm_opp_free_cpufreq_table
(
struct
device
*
dev
,
struct
cpufreq_frequency_table
**
table
)
{
}
#endif
/* CONFIG_CPU_FREQ */
#endif
/* __LINUX_OPP_H__ */
#endif
/* __LINUX_OPP_H__ */
tools/power/cpupower/Makefile
浏览文件 @
37c14794
...
@@ -62,7 +62,7 @@ LIB_MAJ= 0.0.0
...
@@ -62,7 +62,7 @@ LIB_MAJ= 0.0.0
LIB_MIN
=
0
LIB_MIN
=
0
PACKAGE
=
cpupower
PACKAGE
=
cpupower
PACKAGE_BUGREPORT
=
cpufreq
@vger.kernel.org
PACKAGE_BUGREPORT
=
linux-pm
@vger.kernel.org
LANGUAGES
=
de fr it cs pt
LANGUAGES
=
de fr it cs pt
...
...
tools/power/cpupower/debug/kernel/cpufreq-test_tsc.c
浏览文件 @
37c14794
...
@@ -18,7 +18,7 @@
...
@@ -18,7 +18,7 @@
* 5.) if the third value, "diff_pmtmr", changes between 2. and 4., the
* 5.) if the third value, "diff_pmtmr", changes between 2. and 4., the
* TSC-based delay routine on the Linux kernel does not correctly
* TSC-based delay routine on the Linux kernel does not correctly
* handle the cpufreq transition. Please report this to
* handle the cpufreq transition. Please report this to
*
cpufreq
@vger.kernel.org
*
linux-pm
@vger.kernel.org
*/
*/
#include <linux/kernel.h>
#include <linux/kernel.h>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录