Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
fb1b646a
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看板
提交
fb1b646a
编写于
6月 01, 2011
作者:
G
Geert Uytterhoeven
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
m68k/amiga: Optimize interrupts using chain handlers
Signed-off-by:
N
Geert Uytterhoeven
<
geert@linux-m68k.org
>
上级
978ef7e6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
104 addition
and
0 deletion
+104
-0
arch/m68k/amiga/amiints.c
arch/m68k/amiga/amiints.c
+104
-0
未找到文件。
arch/m68k/amiga/amiints.c
浏览文件 @
fb1b646a
...
...
@@ -48,6 +48,99 @@ static struct irq_chip amiga_irq_chip = {
* The builtin Amiga hardware interrupt handlers.
*/
#ifdef CONFIG_GENERIC_HARDIRQS
static
void
ami_int1
(
unsigned
int
irq
,
struct
irq_desc
*
desc
)
{
unsigned
short
ints
=
amiga_custom
.
intreqr
&
amiga_custom
.
intenar
;
/* if serial transmit buffer empty, interrupt */
if
(
ints
&
IF_TBE
)
{
amiga_custom
.
intreq
=
IF_TBE
;
generic_handle_irq
(
IRQ_AMIGA_TBE
);
}
/* if floppy disk transfer complete, interrupt */
if
(
ints
&
IF_DSKBLK
)
{
amiga_custom
.
intreq
=
IF_DSKBLK
;
generic_handle_irq
(
IRQ_AMIGA_DSKBLK
);
}
/* if software interrupt set, interrupt */
if
(
ints
&
IF_SOFT
)
{
amiga_custom
.
intreq
=
IF_SOFT
;
generic_handle_irq
(
IRQ_AMIGA_SOFT
);
}
}
static
void
ami_int3
(
unsigned
int
irq
,
struct
irq_desc
*
desc
)
{
unsigned
short
ints
=
amiga_custom
.
intreqr
&
amiga_custom
.
intenar
;
/* if a blitter interrupt */
if
(
ints
&
IF_BLIT
)
{
amiga_custom
.
intreq
=
IF_BLIT
;
generic_handle_irq
(
IRQ_AMIGA_BLIT
);
}
/* if a copper interrupt */
if
(
ints
&
IF_COPER
)
{
amiga_custom
.
intreq
=
IF_COPER
;
generic_handle_irq
(
IRQ_AMIGA_COPPER
);
}
/* if a vertical blank interrupt */
if
(
ints
&
IF_VERTB
)
{
amiga_custom
.
intreq
=
IF_VERTB
;
generic_handle_irq
(
IRQ_AMIGA_VERTB
);
}
}
static
void
ami_int4
(
unsigned
int
irq
,
struct
irq_desc
*
desc
)
{
unsigned
short
ints
=
amiga_custom
.
intreqr
&
amiga_custom
.
intenar
;
/* if audio 0 interrupt */
if
(
ints
&
IF_AUD0
)
{
amiga_custom
.
intreq
=
IF_AUD0
;
generic_handle_irq
(
IRQ_AMIGA_AUD0
);
}
/* if audio 1 interrupt */
if
(
ints
&
IF_AUD1
)
{
amiga_custom
.
intreq
=
IF_AUD1
;
generic_handle_irq
(
IRQ_AMIGA_AUD1
);
}
/* if audio 2 interrupt */
if
(
ints
&
IF_AUD2
)
{
amiga_custom
.
intreq
=
IF_AUD2
;
generic_handle_irq
(
IRQ_AMIGA_AUD2
);
}
/* if audio 3 interrupt */
if
(
ints
&
IF_AUD3
)
{
amiga_custom
.
intreq
=
IF_AUD3
;
generic_handle_irq
(
IRQ_AMIGA_AUD3
);
}
}
static
void
ami_int5
(
unsigned
int
irq
,
struct
irq_desc
*
desc
)
{
unsigned
short
ints
=
amiga_custom
.
intreqr
&
amiga_custom
.
intenar
;
/* if serial receive buffer full interrupt */
if
(
ints
&
IF_RBF
)
{
/* acknowledge of IF_RBF must be done by the serial interrupt */
generic_handle_irq
(
IRQ_AMIGA_RBF
);
}
/* if a disk sync interrupt */
if
(
ints
&
IF_DSKSYN
)
{
amiga_custom
.
intreq
=
IF_DSKSYN
;
generic_handle_irq
(
IRQ_AMIGA_DSKSYN
);
}
}
#else
/* !CONFIG_GENERIC_HARDIRQS */
static
irqreturn_t
ami_int1
(
int
irq
,
void
*
dev_id
)
{
unsigned
short
ints
=
amiga_custom
.
intreqr
&
amiga_custom
.
intenar
;
...
...
@@ -143,6 +236,7 @@ static irqreturn_t ami_int5(int irq, void *dev_id)
}
return
IRQ_HANDLED
;
}
#endif
/* !CONFIG_GENERIC_HARDIRQS */
/*
...
...
@@ -158,6 +252,15 @@ static irqreturn_t ami_int5(int irq, void *dev_id)
void
__init
amiga_init_IRQ
(
void
)
{
#ifdef CONFIG_GENERIC_HARDIRQS
m68k_setup_irq_controller
(
&
amiga_irq_chip
,
handle_simple_irq
,
IRQ_USER
,
AMI_STD_IRQS
);
irq_set_chained_handler
(
IRQ_AUTO_1
,
ami_int1
);
irq_set_chained_handler
(
IRQ_AUTO_3
,
ami_int3
);
irq_set_chained_handler
(
IRQ_AUTO_4
,
ami_int4
);
irq_set_chained_handler
(
IRQ_AUTO_5
,
ami_int5
);
#else
/* !CONFIG_GENERIC_HARDIRQS */
if
(
request_irq
(
IRQ_AUTO_1
,
ami_int1
,
0
,
"int1"
,
NULL
))
pr_err
(
"Couldn't register int%d
\n
"
,
1
);
if
(
request_irq
(
IRQ_AUTO_3
,
ami_int3
,
0
,
"int3"
,
NULL
))
...
...
@@ -169,6 +272,7 @@ void __init amiga_init_IRQ(void)
m68k_setup_irq_controller
(
&
amiga_irq_chip
,
handle_simple_irq
,
IRQ_USER
,
AMI_STD_IRQS
);
#endif
/* !CONFIG_GENERIC_HARDIRQS */
/* turn off PCMCIA interrupts */
if
(
AMIGAHW_PRESENT
(
PCMCIA
))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录