Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
13edd86d
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
13edd86d
编写于
1月 15, 2010
作者:
R
Russell King
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ARM: Integrator: convert to generic clockevent support
Signed-off-by:
N
Russell King
<
rmk+kernel@arm.linux.org.uk
>
上级
b9cedda2
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
74 addition
and
34 deletion
+74
-34
arch/arm/Kconfig
arch/arm/Kconfig
+1
-0
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/core.c
+73
-34
未找到文件。
arch/arm/Kconfig
浏览文件 @
13edd86d
...
@@ -242,6 +242,7 @@ config ARCH_INTEGRATOR
...
@@ -242,6 +242,7 @@ config ARCH_INTEGRATOR
select COMMON_CLKDEV
select COMMON_CLKDEV
select ICST525
select ICST525
select GENERIC_TIME
select GENERIC_TIME
select GENERIC_CLOCKEVENTS
help
help
Support for ARM's Integrator platform.
Support for ARM's Integrator platform.
...
...
arch/arm/mach-integrator/core.c
浏览文件 @
13edd86d
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
#include <linux/amba/bus.h>
#include <linux/amba/bus.h>
#include <linux/amba/serial.h>
#include <linux/amba/serial.h>
#include <linux/clocksource.h>
#include <linux/clocksource.h>
#include <linux/clockchips.h>
#include <linux/io.h>
#include <linux/io.h>
#include <asm/clkdev.h>
#include <asm/clkdev.h>
...
@@ -275,61 +276,99 @@ static void integrator_clocksource_init(u32 khz)
...
@@ -275,61 +276,99 @@ static void integrator_clocksource_init(u32 khz)
clocksource_register
(
cs
);
clocksource_register
(
cs
);
}
}
static
void
__iomem
*
const
clkevt_base
=
(
void
__iomem
*
)
TIMER1_VA_BASE
;
/*
/*
* IRQ handler for the timer
* IRQ handler for the timer
*/
*/
static
irqreturn_t
static
irqreturn_t
integrator_timer_interrupt
(
int
irq
,
void
*
dev_id
)
integrator_timer_interrupt
(
int
irq
,
void
*
dev_id
)
{
{
/*
struct
clock_event_device
*
evt
=
dev_id
;
* clear the interrupt
*/
/* clear the interrupt
*/
writel
(
1
,
TIMER1_VA_BASE
+
TIMER_INTCLR
);
writel
(
1
,
clkevt_base
+
TIMER_INTCLR
);
timer_tick
(
);
evt
->
event_handler
(
evt
);
return
IRQ_HANDLED
;
return
IRQ_HANDLED
;
}
}
static
void
clkevt_set_mode
(
enum
clock_event_mode
mode
,
struct
clock_event_device
*
evt
)
{
u32
ctrl
=
readl
(
clkevt_base
+
TIMER_CTRL
)
&
~
TIMER_CTRL_ENABLE
;
BUG_ON
(
mode
==
CLOCK_EVT_MODE_ONESHOT
);
if
(
mode
==
CLOCK_EVT_MODE_PERIODIC
)
{
writel
(
ctrl
,
clkevt_base
+
TIMER_CTRL
);
writel
(
timer_reload
,
clkevt_base
+
TIMER_LOAD
);
ctrl
|=
TIMER_CTRL_PERIODIC
|
TIMER_CTRL_ENABLE
;
}
writel
(
ctrl
,
clkevt_base
+
TIMER_CTRL
);
}
static
int
clkevt_set_next_event
(
unsigned
long
next
,
struct
clock_event_device
*
evt
)
{
unsigned
long
ctrl
=
readl
(
clkevt_base
+
TIMER_CTRL
);
writel
(
ctrl
&
~
TIMER_CTRL_ENABLE
,
clkevt_base
+
TIMER_CTRL
);
writel
(
next
,
clkevt_base
+
TIMER_LOAD
);
writel
(
ctrl
|
TIMER_CTRL_ENABLE
,
clkevt_base
+
TIMER_CTRL
);
return
0
;
}
static
struct
clock_event_device
integrator_clockevent
=
{
.
name
=
"timer1"
,
.
shift
=
34
,
.
features
=
CLOCK_EVT_FEAT_PERIODIC
,
.
set_mode
=
clkevt_set_mode
,
.
set_next_event
=
clkevt_set_next_event
,
.
rating
=
300
,
.
cpumask
=
cpu_all_mask
,
};
static
struct
irqaction
integrator_timer_irq
=
{
static
struct
irqaction
integrator_timer_irq
=
{
.
name
=
"
Integrator Timer Tick
"
,
.
name
=
"
timer
"
,
.
flags
=
IRQF_DISABLED
|
IRQF_TIMER
|
IRQF_IRQPOLL
,
.
flags
=
IRQF_DISABLED
|
IRQF_TIMER
|
IRQF_IRQPOLL
,
.
handler
=
integrator_timer_interrupt
,
.
handler
=
integrator_timer_interrupt
,
.
dev_id
=
&
integrator_clockevent
,
};
};
/*
static
void
integrator_clockevent_init
(
u32
khz
,
unsigned
int
ctrl
)
* Set up timer interrupt, and return the current time in seconds.
*/
void
__init
integrator_time_init
(
unsigned
long
reload
,
unsigned
int
ctrl
)
{
{
unsigned
int
timer_ctrl
=
TIMER_CTRL_ENABLE
|
TIMER_CTRL_PERIODIC
;
struct
clock_event_device
*
evt
=
&
integrator_clockevent
;
integrator_clocksource_init
(
reload
*
HZ
/
1000
);
if
(
khz
*
1000
>
0x100000
*
HZ
)
{
khz
/=
256
;
ctrl
|=
TIMER_CTRL_DIV256
;
}
else
if
(
khz
*
1000
>
0x10000
*
HZ
)
{
khz
/=
16
;
ctrl
|=
TIMER_CTRL_DIV16
;
}
timer_reload
=
reload
;
timer_reload
=
khz
*
1000
/
HZ
;
timer_ctrl
|=
ctrl
;
writel
(
ctrl
,
clkevt_base
+
TIMER_CTRL
)
;
if
(
timer_reload
>
0x100000
)
{
evt
->
irq
=
IRQ_TIMERINT1
;
timer_reload
>>=
8
;
evt
->
mult
=
div_sc
(
khz
,
NSEC_PER_MSEC
,
evt
->
shift
);
timer_ctrl
|=
TIMER_CTRL_DIV256
;
evt
->
max_delta_ns
=
clockevent_delta2ns
(
0xffff
,
evt
);
}
else
if
(
timer_reload
>
0x010000
)
{
evt
->
min_delta_ns
=
clockevent_delta2ns
(
0xf
,
evt
);
timer_reload
>>=
4
;
timer_ctrl
|=
TIMER_CTRL_DIV16
;
}
/*
setup_irq
(
IRQ_TIMERINT1
,
&
integrator_timer_irq
);
* Initialise to a known state (all timers off)
clockevents_register_device
(
evt
);
*/
}
/*
* Set up timer(s).
*/
void
__init
integrator_time_init
(
unsigned
long
reload
,
unsigned
int
ctrl
)
{
writel
(
0
,
TIMER0_VA_BASE
+
TIMER_CTRL
);
writel
(
0
,
TIMER0_VA_BASE
+
TIMER_CTRL
);
writel
(
0
,
TIMER1_VA_BASE
+
TIMER_CTRL
);
writel
(
0
,
TIMER1_VA_BASE
+
TIMER_CTRL
);
writel
(
0
,
TIMER2_VA_BASE
+
TIMER_CTRL
);
writel
(
0
,
TIMER2_VA_BASE
+
TIMER_CTRL
);
writel
(
timer_reload
,
TIMER1_VA_BASE
+
TIMER_LOAD
);
integrator_clocksource_init
(
reload
*
HZ
/
1000
);
writel
(
timer_reload
,
TIMER1_VA_BASE
+
TIMER_VALUE
);
integrator_clockevent_init
(
reload
*
HZ
/
1000
,
ctrl
);
writel
(
timer_ctrl
,
TIMER1_VA_BASE
+
TIMER_CTRL
);
/*
* Make irqs happen for the system timer
*/
setup_irq
(
IRQ_TIMERINT1
,
&
integrator_timer_irq
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录