Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
26599a94
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
26599a94
编写于
10月 27, 2010
作者:
P
Paul Mundt
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
sh: intc: irq_data conversion.
Signed-off-by:
N
Paul Mundt
<
lethal@linux-sh.org
>
上级
815db147
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
68 addition
and
40 deletion
+68
-40
drivers/sh/intc/chip.c
drivers/sh/intc/chip.c
+30
-23
drivers/sh/intc/core.c
drivers/sh/intc/core.c
+29
-10
drivers/sh/intc/internals.h
drivers/sh/intc/internals.h
+1
-1
drivers/sh/intc/virq.c
drivers/sh/intc/virq.c
+8
-6
未找到文件。
drivers/sh/intc/chip.c
浏览文件 @
26599a94
...
...
@@ -12,15 +12,16 @@
#include <linux/io.h>
#include "internals.h"
void
_intc_enable
(
unsigned
int
irq
,
unsigned
long
handle
)
void
_intc_enable
(
struct
irq_data
*
data
,
unsigned
long
handle
)
{
unsigned
int
irq
=
data
->
irq
;
struct
intc_desc_int
*
d
=
get_intc_desc
(
irq
);
unsigned
long
addr
;
unsigned
int
cpu
;
for
(
cpu
=
0
;
cpu
<
SMP_NR
(
d
,
_INTC_ADDR_E
(
handle
));
cpu
++
)
{
#ifdef CONFIG_SMP
if
(
!
cpumask_test_cpu
(
cpu
,
irq_to_desc
(
irq
)
->
affinity
))
if
(
!
cpumask_test_cpu
(
cpu
,
data
->
affinity
))
continue
;
#endif
addr
=
INTC_REG
(
d
,
_INTC_ADDR_E
(
handle
),
cpu
);
...
...
@@ -31,15 +32,16 @@ void _intc_enable(unsigned int irq, unsigned long handle)
intc_balancing_enable
(
irq
);
}
static
void
intc_enable
(
unsigned
int
irq
)
static
void
intc_enable
(
struct
irq_data
*
data
)
{
_intc_enable
(
irq
,
(
unsigned
long
)
get_irq_chip_data
(
irq
));
_intc_enable
(
data
,
(
unsigned
long
)
irq_data_get_irq_chip_data
(
data
));
}
static
void
intc_disable
(
unsigned
int
irq
)
static
void
intc_disable
(
struct
irq_data
*
data
)
{
unsigned
int
irq
=
data
->
irq
;
struct
intc_desc_int
*
d
=
get_intc_desc
(
irq
);
unsigned
long
handle
=
(
unsigned
long
)
get_irq_chip_data
(
irq
);
unsigned
long
handle
=
(
unsigned
long
)
irq_data_get_irq_chip_data
(
data
);
unsigned
long
addr
;
unsigned
int
cpu
;
...
...
@@ -47,7 +49,7 @@ static void intc_disable(unsigned int irq)
for
(
cpu
=
0
;
cpu
<
SMP_NR
(
d
,
_INTC_ADDR_D
(
handle
));
cpu
++
)
{
#ifdef CONFIG_SMP
if
(
!
cpumask_test_cpu
(
cpu
,
irq_to_desc
(
irq
)
->
affinity
))
if
(
!
cpumask_test_cpu
(
cpu
,
data
->
affinity
))
continue
;
#endif
addr
=
INTC_REG
(
d
,
_INTC_ADDR_D
(
handle
),
cpu
);
...
...
@@ -56,7 +58,7 @@ static void intc_disable(unsigned int irq)
}
}
static
int
intc_set_wake
(
unsigned
int
irq
,
unsigned
int
on
)
static
int
intc_set_wake
(
struct
irq_data
*
data
,
unsigned
int
on
)
{
return
0
;
/* allow wakeup, but setup hardware in intc_suspend() */
}
...
...
@@ -67,24 +69,27 @@ static int intc_set_wake(unsigned int irq, unsigned int on)
* additional locking here at the intc desc level. The affinity mask is
* later tested in the enable/disable paths.
*/
static
int
intc_set_affinity
(
unsigned
int
irq
,
const
struct
cpumask
*
cpumask
)
static
int
intc_set_affinity
(
struct
irq_data
*
data
,
const
struct
cpumask
*
cpumask
,
bool
force
)
{
if
(
!
cpumask_intersects
(
cpumask
,
cpu_online_mask
))
return
-
1
;
cpumask_copy
(
irq_to_desc
(
irq
)
->
affinity
,
cpumask
);
cpumask_copy
(
data
->
affinity
,
cpumask
);
return
0
;
}
#endif
static
void
intc_mask_ack
(
unsigned
int
irq
)
static
void
intc_mask_ack
(
struct
irq_data
*
data
)
{
unsigned
int
irq
=
data
->
irq
;
struct
intc_desc_int
*
d
=
get_intc_desc
(
irq
);
unsigned
long
handle
=
intc_get_ack_handle
(
irq
);
unsigned
long
addr
;
intc_disable
(
irq
);
intc_disable
(
data
);
/* read register and write zero only to the associated bit */
if
(
handle
)
{
...
...
@@ -144,6 +149,7 @@ static struct intc_handle_int *intc_find_irq(struct intc_handle_int *hp,
int
intc_set_priority
(
unsigned
int
irq
,
unsigned
int
prio
)
{
struct
intc_desc_int
*
d
=
get_intc_desc
(
irq
);
struct
irq_data
*
data
=
irq_get_irq_data
(
irq
);
struct
intc_handle_int
*
ihp
;
if
(
!
intc_get_prio_level
(
irq
)
||
prio
<=
1
)
...
...
@@ -162,7 +168,7 @@ int intc_set_priority(unsigned int irq, unsigned int prio)
* priority level will be set during next enable()
*/
if
(
_INTC_FN
(
ihp
->
handle
)
!=
REG_FN_ERR
)
_intc_enable
(
irq
,
ihp
->
handle
);
_intc_enable
(
data
,
ihp
->
handle
);
}
return
0
;
}
...
...
@@ -181,8 +187,9 @@ static unsigned char intc_irq_sense_table[IRQ_TYPE_SENSE_MASK + 1] = {
#endif
};
static
int
intc_set_type
(
unsigned
int
irq
,
unsigned
int
type
)
static
int
intc_set_type
(
struct
irq_data
*
data
,
unsigned
int
type
)
{
unsigned
int
irq
=
data
->
irq
;
struct
intc_desc_int
*
d
=
get_intc_desc
(
irq
);
unsigned
char
value
=
intc_irq_sense_table
[
type
&
IRQ_TYPE_SENSE_MASK
];
struct
intc_handle_int
*
ihp
;
...
...
@@ -201,15 +208,15 @@ static int intc_set_type(unsigned int irq, unsigned int type)
}
struct
irq_chip
intc_irq_chip
=
{
.
mask
=
intc_disable
,
.
unmask
=
intc_enable
,
.
mask_ack
=
intc_mask_ack
,
.
enable
=
intc_enable
,
.
disable
=
intc_disable
,
.
shutdown
=
intc_disable
,
.
set_type
=
intc_set_type
,
.
set_wake
=
intc_set_wake
,
.
irq_
mask
=
intc_disable
,
.
irq_
unmask
=
intc_enable
,
.
irq_mask_ack
=
intc_mask_ack
,
.
irq_
enable
=
intc_enable
,
.
irq_disable
=
intc_disable
,
.
irq_shutdown
=
intc_disable
,
.
irq_set_type
=
intc_set_type
,
.
irq_set_wake
=
intc_set_wake
,
#ifdef CONFIG_SMP
.
set_affinity
=
intc_set_affinity
,
.
irq_
set_affinity
=
intc_set_affinity
,
#endif
};
drivers/sh/intc/core.c
浏览文件 @
26599a94
...
...
@@ -71,6 +71,7 @@ static void __init intc_register_irq(struct intc_desc *desc,
unsigned
int
irq
)
{
struct
intc_handle_int
*
hp
;
struct
irq_data
*
irq_data
;
unsigned
int
data
[
2
],
primary
;
unsigned
long
flags
;
...
...
@@ -111,6 +112,8 @@ static void __init intc_register_irq(struct intc_desc *desc,
BUG_ON
(
!
data
[
primary
]);
/* must have primary masking method */
irq_data
=
irq_get_irq_data
(
irq
);
disable_irq_nosync
(
irq
);
set_irq_chip_and_handler_name
(
irq
,
&
d
->
chip
,
handle_level_irq
,
"level"
);
...
...
@@ -123,7 +126,7 @@ static void __init intc_register_irq(struct intc_desc *desc,
/* enable secondary masking method if present */
if
(
data
[
!
primary
])
_intc_enable
(
irq
,
data
[
!
primary
]);
_intc_enable
(
irq
_data
,
data
[
!
primary
]);
/* add irq to d->prio list if priority is available */
if
(
data
[
1
])
{
...
...
@@ -151,7 +154,7 @@ static void __init intc_register_irq(struct intc_desc *desc,
}
/* irq should be disabled by default */
d
->
chip
.
mask
(
irq
);
d
->
chip
.
irq_mask
(
irq_data
);
intc_set_ack_handle
(
irq
,
desc
,
d
,
enum_id
);
intc_set_dist_handle
(
irq
,
desc
,
d
,
enum_id
);
...
...
@@ -284,7 +287,7 @@ int __init register_intc_controller(struct intc_desc *desc)
for
(
i
=
0
;
i
<
hw
->
nr_ack_regs
;
i
++
)
k
+=
save_reg
(
d
,
k
,
hw
->
ack_regs
[
i
].
set_reg
,
0
);
else
d
->
chip
.
mask_ack
=
d
->
chip
.
disable
;
d
->
chip
.
irq_mask_ack
=
d
->
chip
.
irq_
disable
;
/* disable bits matching force_disable before registering irqs */
if
(
desc
->
force_disable
)
...
...
@@ -387,7 +390,9 @@ static SYSDEV_ATTR(name, S_IRUGO, show_intc_name, NULL);
static
int
intc_suspend
(
struct
sys_device
*
dev
,
pm_message_t
state
)
{
struct
intc_desc_int
*
d
;
struct
irq_data
*
data
;
struct
irq_desc
*
desc
;
struct
irq_chip
*
chip
;
int
irq
;
/* get intc controller associated with this sysdev */
...
...
@@ -398,17 +403,24 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state)
if
(
d
->
state
.
event
!=
PM_EVENT_FREEZE
)
break
;
for_each_irq_desc
(
irq
,
desc
)
{
for_each_irq_nr
(
irq
)
{
desc
=
irq_to_desc
(
irq
);
if
(
!
desc
)
continue
;
data
=
irq_get_irq_data
(
irq
);
chip
=
irq_data_get_irq_chip
(
data
);
/*
* This will catch the redirect and VIRQ cases
* due to the dummy_irq_chip being inserted.
*/
if
(
desc
->
chip
!=
&
d
->
chip
)
if
(
chip
!=
&
d
->
chip
)
continue
;
if
(
desc
->
status
&
IRQ_DISABLED
)
desc
->
chip
->
disable
(
irq
);
chip
->
irq_disable
(
data
);
else
desc
->
chip
->
enable
(
irq
);
chip
->
irq_enable
(
data
);
}
break
;
case
PM_EVENT_FREEZE
:
...
...
@@ -416,11 +428,18 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state)
break
;
case
PM_EVENT_SUSPEND
:
/* enable wakeup irqs belonging to this intc controller */
for_each_irq_desc
(
irq
,
desc
)
{
if
(
desc
->
chip
!=
&
d
->
chip
)
for_each_irq_nr
(
irq
)
{
desc
=
irq_to_desc
(
irq
);
if
(
!
desc
)
continue
;
data
=
irq_get_irq_data
(
irq
);
chip
=
irq_data_get_irq_chip
(
data
);
if
(
chip
!=
&
d
->
chip
)
continue
;
if
((
desc
->
status
&
IRQ_WAKEUP
))
desc
->
chip
->
enable
(
irq
);
chip
->
irq_enable
(
data
);
}
break
;
}
...
...
drivers/sh/intc/internals.h
浏览文件 @
26599a94
...
...
@@ -152,7 +152,7 @@ intc_set_dist_handle(unsigned int irq, struct intc_desc *desc,
/* chip.c */
extern
struct
irq_chip
intc_irq_chip
;
void
_intc_enable
(
unsigned
int
irq
,
unsigned
long
handle
);
void
_intc_enable
(
struct
irq_data
*
data
,
unsigned
long
handle
);
/* core.c */
extern
struct
list_head
intc_list
;
...
...
drivers/sh/intc/virq.c
浏览文件 @
26599a94
...
...
@@ -83,11 +83,11 @@ EXPORT_SYMBOL_GPL(intc_irq_lookup);
static
int
add_virq_to_pirq
(
unsigned
int
irq
,
unsigned
int
virq
)
{
struct
intc_virq_list
**
last
,
*
entry
;
struct
irq_d
esc
*
desc
=
irq_to_desc
(
irq
);
struct
irq_d
ata
*
data
=
irq_get_irq_data
(
irq
);
/* scan for duplicates */
last
=
(
struct
intc_virq_list
**
)
&
d
esc
->
handler_data
;
for_each_virq
(
entry
,
d
esc
->
handler_data
)
{
last
=
(
struct
intc_virq_list
**
)
&
d
ata
->
handler_data
;
for_each_virq
(
entry
,
d
ata
->
handler_data
)
{
if
(
entry
->
irq
==
virq
)
return
0
;
last
=
&
entry
->
next
;
...
...
@@ -108,10 +108,12 @@ static int add_virq_to_pirq(unsigned int irq, unsigned int virq)
static
void
intc_virq_handler
(
unsigned
int
irq
,
struct
irq_desc
*
desc
)
{
struct
intc_virq_list
*
entry
,
*
vlist
=
get_irq_data
(
irq
);
struct
irq_data
*
data
=
irq_get_irq_data
(
irq
);
struct
irq_chip
*
chip
=
irq_data_get_irq_chip
(
data
);
struct
intc_virq_list
*
entry
,
*
vlist
=
irq_data_get_irq_data
(
data
);
struct
intc_desc_int
*
d
=
get_intc_desc
(
irq
);
desc
->
chip
->
mask_ack
(
irq
);
chip
->
irq_mask_ack
(
data
);
for_each_virq
(
entry
,
vlist
)
{
unsigned
long
addr
,
handle
;
...
...
@@ -123,7 +125,7 @@ static void intc_virq_handler(unsigned int irq, struct irq_desc *desc)
generic_handle_irq
(
entry
->
irq
);
}
desc
->
chip
->
unmask
(
irq
);
chip
->
irq_unmask
(
data
);
}
static
unsigned
long
__init
intc_subgroup_data
(
struct
intc_subgroup
*
subgroup
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录