Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
934a3595
Commit
934a3595
authored
Feb 13, 2006
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
parents
b4d9eda0
7d5e350f
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
61 additions
and
54 deletions
+61
-54
arch/i386/kernel/timers/timer_tsc.c
arch/i386/kernel/timers/timer_tsc.c
+5
-0
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq.c
+56
-54
No files found.
arch/i386/kernel/timers/timer_tsc.c
View file @
934a3595
...
@@ -282,6 +282,10 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
...
@@ -282,6 +282,10 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
if
(
val
!=
CPUFREQ_RESUMECHANGE
)
if
(
val
!=
CPUFREQ_RESUMECHANGE
)
write_seqlock_irq
(
&
xtime_lock
);
write_seqlock_irq
(
&
xtime_lock
);
if
(
!
ref_freq
)
{
if
(
!
ref_freq
)
{
if
(
!
freq
->
old
){
ref_freq
=
freq
->
new
;
goto
end
;
}
ref_freq
=
freq
->
old
;
ref_freq
=
freq
->
old
;
loops_per_jiffy_ref
=
cpu_data
[
freq
->
cpu
].
loops_per_jiffy
;
loops_per_jiffy_ref
=
cpu_data
[
freq
->
cpu
].
loops_per_jiffy
;
#ifndef CONFIG_SMP
#ifndef CONFIG_SMP
...
@@ -307,6 +311,7 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
...
@@ -307,6 +311,7 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
#endif
#endif
}
}
end:
if
(
val
!=
CPUFREQ_RESUMECHANGE
)
if
(
val
!=
CPUFREQ_RESUMECHANGE
)
write_sequnlock_irq
(
&
xtime_lock
);
write_sequnlock_irq
(
&
xtime_lock
);
...
...
drivers/cpufreq/cpufreq.c
View file @
934a3595
...
@@ -35,8 +35,8 @@
...
@@ -35,8 +35,8 @@
* level driver of CPUFreq support, and its spinlock. This lock
* level driver of CPUFreq support, and its spinlock. This lock
* also protects the cpufreq_cpu_data array.
* also protects the cpufreq_cpu_data array.
*/
*/
static
struct
cpufreq_driver
*
cpufreq_driver
;
static
struct
cpufreq_driver
*
cpufreq_driver
;
static
struct
cpufreq_policy
*
cpufreq_cpu_data
[
NR_CPUS
];
static
struct
cpufreq_policy
*
cpufreq_cpu_data
[
NR_CPUS
];
static
DEFINE_SPINLOCK
(
cpufreq_driver_lock
);
static
DEFINE_SPINLOCK
(
cpufreq_driver_lock
);
/* internal prototypes */
/* internal prototypes */
...
@@ -50,15 +50,15 @@ static void handle_update(void *data);
...
@@ -50,15 +50,15 @@ static void handle_update(void *data);
* changes to devices when the CPU clock speed changes.
* changes to devices when the CPU clock speed changes.
* The mutex locks both lists.
* The mutex locks both lists.
*/
*/
static
struct
notifier_block
*
cpufreq_policy_notifier_list
;
static
struct
notifier_block
*
cpufreq_policy_notifier_list
;
static
struct
notifier_block
*
cpufreq_transition_notifier_list
;
static
struct
notifier_block
*
cpufreq_transition_notifier_list
;
static
DECLARE_RWSEM
(
cpufreq_notifier_rwsem
);
static
DECLARE_RWSEM
(
cpufreq_notifier_rwsem
);
static
LIST_HEAD
(
cpufreq_governor_list
);
static
LIST_HEAD
(
cpufreq_governor_list
);
static
DEFINE_MUTEX
(
cpufreq_governor_mutex
);
static
DEFINE_MUTEX
(
cpufreq_governor_mutex
);
struct
cpufreq_policy
*
cpufreq_cpu_get
(
unsigned
int
cpu
)
struct
cpufreq_policy
*
cpufreq_cpu_get
(
unsigned
int
cpu
)
{
{
struct
cpufreq_policy
*
data
;
struct
cpufreq_policy
*
data
;
unsigned
long
flags
;
unsigned
long
flags
;
...
@@ -85,20 +85,19 @@ struct cpufreq_policy * cpufreq_cpu_get(unsigned int cpu)
...
@@ -85,20 +85,19 @@ struct cpufreq_policy * cpufreq_cpu_get(unsigned int cpu)
if
(
!
kobject_get
(
&
data
->
kobj
))
if
(
!
kobject_get
(
&
data
->
kobj
))
goto
err_out_put_module
;
goto
err_out_put_module
;
spin_unlock_irqrestore
(
&
cpufreq_driver_lock
,
flags
);
spin_unlock_irqrestore
(
&
cpufreq_driver_lock
,
flags
);
return
data
;
return
data
;
err_out_put_module:
err_out_put_module:
module_put
(
cpufreq_driver
->
owner
);
module_put
(
cpufreq_driver
->
owner
);
err_out_unlock:
err_out_unlock:
spin_unlock_irqrestore
(
&
cpufreq_driver_lock
,
flags
);
spin_unlock_irqrestore
(
&
cpufreq_driver_lock
,
flags
);
err_out:
err_out:
return
NULL
;
return
NULL
;
}
}
EXPORT_SYMBOL_GPL
(
cpufreq_cpu_get
);
EXPORT_SYMBOL_GPL
(
cpufreq_cpu_get
);
void
cpufreq_cpu_put
(
struct
cpufreq_policy
*
data
)
void
cpufreq_cpu_put
(
struct
cpufreq_policy
*
data
)
{
{
kobject_put
(
&
data
->
kobj
);
kobject_put
(
&
data
->
kobj
);
...
@@ -229,44 +228,53 @@ static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci) {
...
@@ -229,44 +228,53 @@ static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci) {
/**
/**
* cpufreq_notify_transition - call notifier chain and adjust_jiffies on frequency transition
* cpufreq_notify_transition - call notifier chain and adjust_jiffies
* on frequency transition.
*
*
* This function calls the transition notifiers and the "adjust_jiffies" function. It is called
* This function calls the transition notifiers and the "adjust_jiffies"
* twice on all CPU frequency changes that have external effects.
* function. It is called twice on all CPU frequency changes that have
* external effects.
*/
*/
void
cpufreq_notify_transition
(
struct
cpufreq_freqs
*
freqs
,
unsigned
int
state
)
void
cpufreq_notify_transition
(
struct
cpufreq_freqs
*
freqs
,
unsigned
int
state
)
{
{
struct
cpufreq_policy
*
policy
;
BUG_ON
(
irqs_disabled
());
BUG_ON
(
irqs_disabled
());
freqs
->
flags
=
cpufreq_driver
->
flags
;
freqs
->
flags
=
cpufreq_driver
->
flags
;
dprintk
(
"notification %u of frequency transition to %u kHz
\n
"
,
state
,
freqs
->
new
);
dprintk
(
"notification %u of frequency transition to %u kHz
\n
"
,
state
,
freqs
->
new
);
down_read
(
&
cpufreq_notifier_rwsem
);
down_read
(
&
cpufreq_notifier_rwsem
);
policy
=
cpufreq_cpu_data
[
freqs
->
cpu
];
switch
(
state
)
{
switch
(
state
)
{
case
CPUFREQ_PRECHANGE
:
case
CPUFREQ_PRECHANGE
:
/* detect if the driver reported a value as "old frequency" which
/* detect if the driver reported a value as "old frequency"
* is not equal to what the cpufreq core thinks is "old frequency".
* which is not equal to what the cpufreq core thinks is
* "old frequency".
*/
*/
if
(
!
(
cpufreq_driver
->
flags
&
CPUFREQ_CONST_LOOPS
))
{
if
(
!
(
cpufreq_driver
->
flags
&
CPUFREQ_CONST_LOOPS
))
{
if
((
likely
(
cpufreq_cpu_data
[
freqs
->
cpu
]))
&&
if
((
policy
)
&&
(
policy
->
cpu
==
freqs
->
cpu
)
&&
(
likely
(
cpufreq_cpu_data
[
freqs
->
cpu
]
->
cpu
==
freqs
->
cpu
))
&&
(
policy
->
cur
)
&&
(
policy
->
cur
!=
freqs
->
old
))
{
(
likely
(
cpufreq_cpu_data
[
freqs
->
cpu
]
->
cur
))
&&
dprintk
(
KERN_WARNING
"Warning: CPU frequency is"
(
unlikely
(
freqs
->
old
!=
cpufreq_cpu_data
[
freqs
->
cpu
]
->
cur
)))
" %u, cpufreq assumed %u kHz.
\n
"
,
{
freqs
->
old
,
policy
->
cur
);
dprintk
(
KERN_WARNING
"Warning: CPU frequency is %u, "
freqs
->
old
=
policy
->
cur
;
"cpufreq assumed %u kHz.
\n
"
,
freqs
->
old
,
cpufreq_cpu_data
[
freqs
->
cpu
]
->
cur
);
freqs
->
old
=
cpufreq_cpu_data
[
freqs
->
cpu
]
->
cur
;
}
}
}
}
notifier_call_chain
(
&
cpufreq_transition_notifier_list
,
CPUFREQ_PRECHANGE
,
freqs
);
notifier_call_chain
(
&
cpufreq_transition_notifier_list
,
CPUFREQ_PRECHANGE
,
freqs
);
adjust_jiffies
(
CPUFREQ_PRECHANGE
,
freqs
);
adjust_jiffies
(
CPUFREQ_PRECHANGE
,
freqs
);
break
;
break
;
case
CPUFREQ_POSTCHANGE
:
case
CPUFREQ_POSTCHANGE
:
adjust_jiffies
(
CPUFREQ_POSTCHANGE
,
freqs
);
adjust_jiffies
(
CPUFREQ_POSTCHANGE
,
freqs
);
notifier_call_chain
(
&
cpufreq_transition_notifier_list
,
CPUFREQ_POSTCHANGE
,
freqs
);
notifier_call_chain
(
&
cpufreq_transition_notifier_list
,
if
((
likely
(
cpufreq_cpu_data
[
freqs
->
cpu
]))
&&
CPUFREQ_POSTCHANGE
,
freqs
);
(
likely
(
cpufreq_cpu_data
[
freqs
->
cpu
]
->
cpu
==
freqs
->
cpu
)
))
if
(
likely
(
policy
)
&&
likely
(
policy
->
cpu
==
freqs
->
cpu
))
cpufreq_cpu_data
[
freqs
->
cpu
]
->
cur
=
freqs
->
new
;
policy
->
cur
=
freqs
->
new
;
break
;
break
;
}
}
up_read
(
&
cpufreq_notifier_rwsem
);
up_read
(
&
cpufreq_notifier_rwsem
);
...
@@ -308,7 +316,7 @@ static int cpufreq_parse_governor (char *str_governor, unsigned int *policy,
...
@@ -308,7 +316,7 @@ static int cpufreq_parse_governor (char *str_governor, unsigned int *policy,
return
0
;
return
0
;
}
}
}
}
out:
out:
mutex_unlock
(
&
cpufreq_governor_mutex
);
mutex_unlock
(
&
cpufreq_governor_mutex
);
}
}
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -415,7 +423,6 @@ static ssize_t store_scaling_governor (struct cpufreq_policy * policy,
...
@@ -415,7 +423,6 @@ static ssize_t store_scaling_governor (struct cpufreq_policy * policy,
return
-
EINVAL
;
return
-
EINVAL
;
ret
=
cpufreq_set_policy
(
&
new_policy
);
ret
=
cpufreq_set_policy
(
&
new_policy
);
return
ret
?
ret
:
count
;
return
ret
?
ret
:
count
;
}
}
...
@@ -446,7 +453,7 @@ static ssize_t show_scaling_available_governors (struct cpufreq_policy * policy,
...
@@ -446,7 +453,7 @@ static ssize_t show_scaling_available_governors (struct cpufreq_policy * policy,
goto
out
;
goto
out
;
i
+=
scnprintf
(
&
buf
[
i
],
CPUFREQ_NAME_LEN
,
"%s "
,
t
->
name
);
i
+=
scnprintf
(
&
buf
[
i
],
CPUFREQ_NAME_LEN
,
"%s "
,
t
->
name
);
}
}
out:
out:
i
+=
sprintf
(
&
buf
[
i
],
"
\n
"
);
i
+=
sprintf
(
&
buf
[
i
],
"
\n
"
);
return
i
;
return
i
;
}
}
...
@@ -789,7 +796,6 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
...
@@ -789,7 +796,6 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
kfree
(
data
);
kfree
(
data
);
cpufreq_debug_enable_ratelimit
();
cpufreq_debug_enable_ratelimit
();
return
0
;
return
0
;
}
}
...
@@ -870,8 +876,7 @@ unsigned int cpufreq_get(unsigned int cpu)
...
@@ -870,8 +876,7 @@ unsigned int cpufreq_get(unsigned int cpu)
ret
=
cpufreq_driver
->
get
(
cpu
);
ret
=
cpufreq_driver
->
get
(
cpu
);
if
(
ret
&&
policy
->
cur
&&
!
(
cpufreq_driver
->
flags
&
CPUFREQ_CONST_LOOPS
))
if
(
ret
&&
policy
->
cur
&&
!
(
cpufreq_driver
->
flags
&
CPUFREQ_CONST_LOOPS
))
{
{
/* verify no discrepancy between actual and saved value exists */
/* verify no discrepancy between actual and saved value exists */
if
(
unlikely
(
ret
!=
policy
->
cur
))
{
if
(
unlikely
(
ret
!=
policy
->
cur
))
{
cpufreq_out_of_sync
(
cpu
,
policy
->
cur
,
ret
);
cpufreq_out_of_sync
(
cpu
,
policy
->
cur
,
ret
);
...
@@ -881,7 +886,7 @@ unsigned int cpufreq_get(unsigned int cpu)
...
@@ -881,7 +886,7 @@ unsigned int cpufreq_get(unsigned int cpu)
mutex_unlock
(
&
policy
->
lock
);
mutex_unlock
(
&
policy
->
lock
);
out:
out:
cpufreq_cpu_put
(
policy
);
cpufreq_cpu_put
(
policy
);
return
(
ret
);
return
(
ret
);
...
@@ -962,7 +967,7 @@ static int cpufreq_suspend(struct sys_device * sysdev, pm_message_t pmsg)
...
@@ -962,7 +967,7 @@ static int cpufreq_suspend(struct sys_device * sysdev, pm_message_t pmsg)
cpu_policy
->
cur
=
cur_freq
;
cpu_policy
->
cur
=
cur_freq
;
}
}
out:
out:
cpufreq_cpu_put
(
cpu_policy
);
cpufreq_cpu_put
(
cpu_policy
);
return
0
;
return
0
;
}
}
...
@@ -1169,7 +1174,6 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
...
@@ -1169,7 +1174,6 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
mutex_unlock
(
&
policy
->
lock
);
mutex_unlock
(
&
policy
->
lock
);
cpufreq_cpu_put
(
policy
);
cpufreq_cpu_put
(
policy
);
return
ret
;
return
ret
;
}
}
EXPORT_SYMBOL_GPL
(
cpufreq_driver_target
);
EXPORT_SYMBOL_GPL
(
cpufreq_driver_target
);
...
@@ -1208,7 +1212,6 @@ int cpufreq_governor(unsigned int cpu, unsigned int event)
...
@@ -1208,7 +1212,6 @@ int cpufreq_governor(unsigned int cpu, unsigned int event)
mutex_unlock
(
&
policy
->
lock
);
mutex_unlock
(
&
policy
->
lock
);
cpufreq_cpu_put
(
policy
);
cpufreq_cpu_put
(
policy
);
return
ret
;
return
ret
;
}
}
EXPORT_SYMBOL_GPL
(
cpufreq_governor
);
EXPORT_SYMBOL_GPL
(
cpufreq_governor
);
...
@@ -1232,7 +1235,6 @@ int cpufreq_register_governor(struct cpufreq_governor *governor)
...
@@ -1232,7 +1235,6 @@ int cpufreq_register_governor(struct cpufreq_governor *governor)
list_add
(
&
governor
->
governor_list
,
&
cpufreq_governor_list
);
list_add
(
&
governor
->
governor_list
,
&
cpufreq_governor_list
);
mutex_unlock
(
&
cpufreq_governor_mutex
);
mutex_unlock
(
&
cpufreq_governor_mutex
);
return
0
;
return
0
;
}
}
EXPORT_SYMBOL_GPL
(
cpufreq_register_governor
);
EXPORT_SYMBOL_GPL
(
cpufreq_register_governor
);
...
@@ -1277,7 +1279,6 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
...
@@ -1277,7 +1279,6 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
mutex_unlock
(
&
cpu_policy
->
lock
);
mutex_unlock
(
&
cpu_policy
->
lock
);
cpufreq_cpu_put
(
cpu_policy
);
cpufreq_cpu_put
(
cpu_policy
);
return
0
;
return
0
;
}
}
EXPORT_SYMBOL
(
cpufreq_get_policy
);
EXPORT_SYMBOL
(
cpufreq_get_policy
);
...
@@ -1291,9 +1292,7 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
...
@@ -1291,9 +1292,7 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
dprintk
(
"setting new policy for CPU %u: %u - %u kHz
\n
"
,
policy
->
cpu
,
dprintk
(
"setting new policy for CPU %u: %u - %u kHz
\n
"
,
policy
->
cpu
,
policy
->
min
,
policy
->
max
);
policy
->
min
,
policy
->
max
);
memcpy
(
&
policy
->
cpuinfo
,
memcpy
(
&
policy
->
cpuinfo
,
&
data
->
cpuinfo
,
sizeof
(
struct
cpufreq_cpuinfo
));
&
data
->
cpuinfo
,
sizeof
(
struct
cpufreq_cpuinfo
));
/* verify the cpu speed can be set within this limit */
/* verify the cpu speed can be set within this limit */
ret
=
cpufreq_driver
->
verify
(
policy
);
ret
=
cpufreq_driver
->
verify
(
policy
);
...
@@ -1324,8 +1323,8 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
...
@@ -1324,8 +1323,8 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
up_read
(
&
cpufreq_notifier_rwsem
);
up_read
(
&
cpufreq_notifier_rwsem
);
data
->
min
=
policy
->
min
;
data
->
min
=
policy
->
min
;
data
->
max
=
policy
->
max
;
data
->
max
=
policy
->
max
;
dprintk
(
"new min and max freqs are %u - %u kHz
\n
"
,
data
->
min
,
data
->
max
);
dprintk
(
"new min and max freqs are %u - %u kHz
\n
"
,
data
->
min
,
data
->
max
);
...
@@ -1362,7 +1361,7 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
...
@@ -1362,7 +1361,7 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
__cpufreq_governor
(
data
,
CPUFREQ_GOV_LIMITS
);
__cpufreq_governor
(
data
,
CPUFREQ_GOV_LIMITS
);
}
}
error_out:
error_out:
cpufreq_debug_enable_ratelimit
();
cpufreq_debug_enable_ratelimit
();
return
ret
;
return
ret
;
}
}
...
@@ -1421,9 +1420,7 @@ int cpufreq_update_policy(unsigned int cpu)
...
@@ -1421,9 +1420,7 @@ int cpufreq_update_policy(unsigned int cpu)
mutex_lock
(
&
data
->
lock
);
mutex_lock
(
&
data
->
lock
);
dprintk
(
"updating policy for CPU %u
\n
"
,
cpu
);
dprintk
(
"updating policy for CPU %u
\n
"
,
cpu
);
memcpy
(
&
policy
,
memcpy
(
&
policy
,
data
,
sizeof
(
struct
cpufreq_policy
));
data
,
sizeof
(
struct
cpufreq_policy
));
policy
.
min
=
data
->
user_policy
.
min
;
policy
.
min
=
data
->
user_policy
.
min
;
policy
.
max
=
data
->
user_policy
.
max
;
policy
.
max
=
data
->
user_policy
.
max
;
policy
.
policy
=
data
->
user_policy
.
policy
;
policy
.
policy
=
data
->
user_policy
.
policy
;
...
@@ -1433,8 +1430,13 @@ int cpufreq_update_policy(unsigned int cpu)
...
@@ -1433,8 +1430,13 @@ int cpufreq_update_policy(unsigned int cpu)
-> ask driver for current freq and notify governors about a change */
-> ask driver for current freq and notify governors about a change */
if
(
cpufreq_driver
->
get
)
{
if
(
cpufreq_driver
->
get
)
{
policy
.
cur
=
cpufreq_driver
->
get
(
cpu
);
policy
.
cur
=
cpufreq_driver
->
get
(
cpu
);
if
(
data
->
cur
!=
policy
.
cur
)
if
(
!
data
->
cur
)
{
cpufreq_out_of_sync
(
cpu
,
data
->
cur
,
policy
.
cur
);
dprintk
(
"Driver did not initialize current freq"
);
data
->
cur
=
policy
.
cur
;
}
else
{
if
(
data
->
cur
!=
policy
.
cur
)
cpufreq_out_of_sync
(
cpu
,
data
->
cur
,
policy
.
cur
);
}
}
}
ret
=
__cpufreq_set_policy
(
data
,
&
policy
);
ret
=
__cpufreq_set_policy
(
data
,
&
policy
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment