Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
c409eee8
Commit
c409eee8
authored
Jun 29, 2005
by
Tony Lindgren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ARM: OMAP: Synced ARM generic dyntick with mainline
Switched to use ARM generic dyntick.
parent
89748e09
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
83 additions
and
52 deletions
+83
-52
arch/arm/kernel/time.c
arch/arm/kernel/time.c
+83
-52
No files found.
arch/arm/kernel/time.c
View file @
c409eee8
...
...
@@ -28,7 +28,6 @@
#include <linux/profile.h>
#include <linux/sysdev.h>
#include <linux/timer.h>
#include <linux/pm.h>
#include <asm/hardware.h>
#include <asm/io.h>
...
...
@@ -351,49 +350,6 @@ void timer_tick(struct pt_regs *regs)
#endif
}
#ifdef CONFIG_NO_IDLE_HZ
int
timer_dyn_tick_enable
(
void
)
{
unsigned
long
flags
;
int
ret
=
-
ENODEV
;
write_seqlock_irqsave
(
&
xtime_lock
,
flags
);
if
(
!
system_timer
->
dyn_tick
||
!
system_timer
->
dyn_tick
->
enable
)
goto
out_err
;
ret
=
system_timer
->
dyn_tick
->
enable
();
if
(
ret
!=
0
)
goto
out_err
;
if
(
system_timer
->
dyn_tick
->
handler
)
system_timer
->
dyn_tick
->
state
|=
DYN_TICK_ENABLED
;
write_sequnlock_irqrestore
(
&
xtime_lock
,
flags
);
return
ret
;
out_err:
system_timer
->
dyn_tick
->
state
&=
~
DYN_TICK_ENABLED
;
write_sequnlock_irqrestore
(
&
xtime_lock
,
flags
);
return
ret
;
}
int
timer_dyn_tick_disable
(
void
)
{
unsigned
long
flags
;
int
ret
=
0
;
write_seqlock_irqsave
(
&
xtime_lock
,
flags
);
if
(
system_timer
->
dyn_tick
&&
system_timer
->
dyn_tick
->
disable
)
ret
=
system_timer
->
dyn_tick
->
disable
();
system_timer
->
dyn_tick
->
state
&=
~
DYN_TICK_ENABLED
;
write_sequnlock_irqrestore
(
&
xtime_lock
,
flags
);
return
ret
;
}
#endif
#ifdef CONFIG_PM
static
int
timer_suspend
(
struct
sys_device
*
dev
,
pm_message_t
state
)
{
...
...
@@ -426,6 +382,63 @@ static struct sysdev_class timer_sysclass = {
};
#ifdef CONFIG_NO_IDLE_HZ
static
int
timer_dyn_tick_enable
(
void
)
{
struct
dyn_tick_timer
*
dyn_tick
=
system_timer
->
dyn_tick
;
unsigned
long
flags
;
int
ret
=
-
ENODEV
;
if
(
dyn_tick
)
{
write_seqlock_irqsave
(
&
xtime_lock
,
flags
);
ret
=
0
;
if
(
!
(
dyn_tick
->
state
&
DYN_TICK_ENABLED
))
{
ret
=
dyn_tick
->
enable
();
if
(
ret
==
0
)
dyn_tick
->
state
|=
DYN_TICK_ENABLED
;
}
write_sequnlock_irqrestore
(
&
xtime_lock
,
flags
);
}
return
ret
;
}
static
int
timer_dyn_tick_disable
(
void
)
{
struct
dyn_tick_timer
*
dyn_tick
=
system_timer
->
dyn_tick
;
unsigned
long
flags
;
int
ret
=
-
ENODEV
;
if
(
dyn_tick
)
{
write_seqlock_irqsave
(
&
xtime_lock
,
flags
);
ret
=
0
;
if
(
dyn_tick
->
state
&
DYN_TICK_ENABLED
)
{
ret
=
dyn_tick
->
disable
();
if
(
ret
==
0
)
dyn_tick
->
state
&=
~
DYN_TICK_ENABLED
;
}
write_sequnlock_irqrestore
(
&
xtime_lock
,
flags
);
}
return
ret
;
}
/*
* Reprogram the system timer for at least the calculated time interval.
* This function should be called from the idle thread with IRQs disabled,
* immediately before sleeping.
*/
void
timer_dyn_reprogram
(
void
)
{
struct
dyn_tick_timer
*
dyn_tick
=
system_timer
->
dyn_tick
;
write_seqlock
(
&
xtime_lock
);
if
(
dyn_tick
->
state
&
DYN_TICK_ENABLED
)
dyn_tick
->
reprogram
(
next_timer_interrupt
()
-
jiffies
);
write_sequnlock
(
&
xtime_lock
);
}
static
ssize_t
timer_show_dyn_tick
(
struct
sys_device
*
dev
,
char
*
buf
)
{
return
sprintf
(
buf
,
"%i
\n
"
,
...
...
@@ -435,17 +448,30 @@ static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf)
static
ssize_t
timer_set_dyn_tick
(
struct
sys_device
*
dev
,
const
char
*
buf
,
size_t
count
)
{
int
ret
=
0
;
unsigned
int
enable
=
simple_strtoul
(
buf
,
NULL
,
2
);
if
(
enable
)
ret
=
timer_dyn_tick_enable
();
timer_dyn_tick_enable
();
else
ret
=
timer_dyn_tick_disable
();
timer_dyn_tick_disable
();
return
count
;
}
static
SYSDEV_ATTR
(
dyn_tick
,
0644
,
timer_show_dyn_tick
,
timer_set_dyn_tick
);
/*
* dyntick=enable|disable
*/
static
char
dyntick_str
[
4
]
__initdata
=
""
;
static
int
__init
dyntick_setup
(
char
*
str
)
{
if
(
str
)
strlcpy
(
dyntick_str
,
str
,
sizeof
(
dyntick_str
));
return
1
;
}
__setup
(
"dyntick="
,
dyntick_setup
);
#endif
static
int
__init
timer_init_sysfs
(
void
)
...
...
@@ -457,11 +483,16 @@ static int __init timer_init_sysfs(void)
}
#ifdef CONFIG_NO_IDLE_HZ
ret
=
sysdev_create_file
(
&
system_timer
->
dev
,
&
attr_dyn_tick
);
#if defined(CONFIG_NO_IDLE_HZ_ENABLED)
/* Turn on dynamic tick after calibrate delay for correct bogomips */
ret
=
timer_dyn_tick_enable
();
#endif
if
(
ret
==
0
&&
system_timer
->
dyn_tick
)
{
ret
=
sysdev_create_file
(
&
system_timer
->
dev
,
&
attr_dyn_tick
);
/*
* Turn on dynamic tick after calibrate delay
* for correct bogomips
*/
if
(
ret
==
0
&&
dyntick_str
[
0
]
==
'e'
)
ret
=
timer_dyn_tick_enable
();
}
#endif
return
ret
;
...
...
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