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
nexedi
linux
Commits
92072452
Commit
92072452
authored
Mar 28, 2012
by
Paul Mundt
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'common/intc-extension' into sh-latest
parents
d1000edd
b59f9f97
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
25 additions
and
32 deletions
+25
-32
drivers/sh/intc/chip.c
drivers/sh/intc/chip.c
+8
-29
drivers/sh/intc/core.c
drivers/sh/intc/core.c
+9
-2
drivers/sh/intc/internals.h
drivers/sh/intc/internals.h
+8
-1
No files found.
drivers/sh/intc/chip.c
View file @
92072452
...
@@ -2,13 +2,14 @@
...
@@ -2,13 +2,14 @@
* IRQ chip definitions for INTC IRQs.
* IRQ chip definitions for INTC IRQs.
*
*
* Copyright (C) 2007, 2008 Magnus Damm
* Copyright (C) 2007, 2008 Magnus Damm
* Copyright (C) 2009
, 2010
Paul Mundt
* Copyright (C) 2009
- 2012
Paul Mundt
*
*
* This file is subject to the terms and conditions of the GNU General Public
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* License. See the file "COPYING" in the main directory of this archive
* for more details.
* for more details.
*/
*/
#include <linux/cpumask.h>
#include <linux/cpumask.h>
#include <linux/bsearch.h>
#include <linux/io.h>
#include <linux/io.h>
#include "internals.h"
#include "internals.h"
...
@@ -58,11 +59,6 @@ static void intc_disable(struct irq_data *data)
...
@@ -58,11 +59,6 @@ static void intc_disable(struct irq_data *data)
}
}
}
}
static
int
intc_set_wake
(
struct
irq_data
*
data
,
unsigned
int
on
)
{
return
0
;
/* allow wakeup, but setup hardware in intc_suspend() */
}
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
/*
/*
* This is held with the irq desc lock held, so we don't require any
* This is held with the irq desc lock held, so we don't require any
...
@@ -78,7 +74,7 @@ static int intc_set_affinity(struct irq_data *data,
...
@@ -78,7 +74,7 @@ static int intc_set_affinity(struct irq_data *data,
cpumask_copy
(
data
->
affinity
,
cpumask
);
cpumask_copy
(
data
->
affinity
,
cpumask
);
return
0
;
return
IRQ_SET_MASK_OK_NOCOPY
;
}
}
#endif
#endif
...
@@ -122,28 +118,12 @@ static struct intc_handle_int *intc_find_irq(struct intc_handle_int *hp,
...
@@ -122,28 +118,12 @@ static struct intc_handle_int *intc_find_irq(struct intc_handle_int *hp,
unsigned
int
nr_hp
,
unsigned
int
nr_hp
,
unsigned
int
irq
)
unsigned
int
irq
)
{
{
int
i
;
struct
intc_handle_int
key
;
/*
* this doesn't scale well, but...
*
* this function should only be used for cerain uncommon
* operations such as intc_set_priority() and intc_set_type()
* and in those rare cases performance doesn't matter that much.
* keeping the memory footprint low is more important.
*
* one rather simple way to speed this up and still keep the
* memory footprint down is to make sure the array is sorted
* and then perform a bisect to lookup the irq.
*/
for
(
i
=
0
;
i
<
nr_hp
;
i
++
)
{
if
((
hp
+
i
)
->
irq
!=
irq
)
continue
;
return
hp
+
i
;
key
.
irq
=
irq
;
}
key
.
handle
=
0
;
return
NULL
;
return
bsearch
(
&
key
,
hp
,
nr_hp
,
sizeof
(
*
hp
),
intc_handle_int_cmp
)
;
}
}
int
intc_set_priority
(
unsigned
int
irq
,
unsigned
int
prio
)
int
intc_set_priority
(
unsigned
int
irq
,
unsigned
int
prio
)
...
@@ -223,10 +203,9 @@ struct irq_chip intc_irq_chip = {
...
@@ -223,10 +203,9 @@ struct irq_chip intc_irq_chip = {
.
irq_mask_ack
=
intc_mask_ack
,
.
irq_mask_ack
=
intc_mask_ack
,
.
irq_enable
=
intc_enable
,
.
irq_enable
=
intc_enable
,
.
irq_disable
=
intc_disable
,
.
irq_disable
=
intc_disable
,
.
irq_shutdown
=
intc_disable
,
.
irq_set_type
=
intc_set_type
,
.
irq_set_type
=
intc_set_type
,
.
irq_set_wake
=
intc_set_wake
,
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
.
irq_set_affinity
=
intc_set_affinity
,
.
irq_set_affinity
=
intc_set_affinity
,
#endif
#endif
.
flags
=
IRQCHIP_SKIP_SET_WAKE
,
};
};
drivers/sh/intc/core.c
View file @
92072452
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* Shared interrupt handling code for IPR and INTC2 types of IRQs.
* Shared interrupt handling code for IPR and INTC2 types of IRQs.
*
*
* Copyright (C) 2007, 2008 Magnus Damm
* Copyright (C) 2007, 2008 Magnus Damm
* Copyright (C) 2009
, 2010
Paul Mundt
* Copyright (C) 2009
- 2012
Paul Mundt
*
*
* Based on intc2.c and ipr.c
* Based on intc2.c and ipr.c
*
*
...
@@ -31,11 +31,12 @@
...
@@ -31,11 +31,12 @@
#include <linux/spinlock.h>
#include <linux/spinlock.h>
#include <linux/radix-tree.h>
#include <linux/radix-tree.h>
#include <linux/export.h>
#include <linux/export.h>
#include <linux/sort.h>
#include "internals.h"
#include "internals.h"
LIST_HEAD
(
intc_list
);
LIST_HEAD
(
intc_list
);
DEFINE_RAW_SPINLOCK
(
intc_big_lock
);
DEFINE_RAW_SPINLOCK
(
intc_big_lock
);
unsigned
int
nr_intc_controllers
;
static
unsigned
int
nr_intc_controllers
;
/*
/*
* Default priority level
* Default priority level
...
@@ -267,6 +268,9 @@ int __init register_intc_controller(struct intc_desc *desc)
...
@@ -267,6 +268,9 @@ int __init register_intc_controller(struct intc_desc *desc)
k
+=
save_reg
(
d
,
k
,
hw
->
prio_regs
[
i
].
set_reg
,
smp
);
k
+=
save_reg
(
d
,
k
,
hw
->
prio_regs
[
i
].
set_reg
,
smp
);
k
+=
save_reg
(
d
,
k
,
hw
->
prio_regs
[
i
].
clr_reg
,
smp
);
k
+=
save_reg
(
d
,
k
,
hw
->
prio_regs
[
i
].
clr_reg
,
smp
);
}
}
sort
(
d
->
prio
,
hw
->
nr_prio_regs
,
sizeof
(
*
d
->
prio
),
intc_handle_int_cmp
,
NULL
);
}
}
if
(
hw
->
sense_regs
)
{
if
(
hw
->
sense_regs
)
{
...
@@ -277,6 +281,9 @@ int __init register_intc_controller(struct intc_desc *desc)
...
@@ -277,6 +281,9 @@ int __init register_intc_controller(struct intc_desc *desc)
for
(
i
=
0
;
i
<
hw
->
nr_sense_regs
;
i
++
)
for
(
i
=
0
;
i
<
hw
->
nr_sense_regs
;
i
++
)
k
+=
save_reg
(
d
,
k
,
hw
->
sense_regs
[
i
].
reg
,
0
);
k
+=
save_reg
(
d
,
k
,
hw
->
sense_regs
[
i
].
reg
,
0
);
sort
(
d
->
sense
,
hw
->
nr_sense_regs
,
sizeof
(
*
d
->
sense
),
intc_handle_int_cmp
,
NULL
);
}
}
if
(
hw
->
subgroups
)
if
(
hw
->
subgroups
)
...
...
drivers/sh/intc/internals.h
View file @
92072452
...
@@ -108,6 +108,14 @@ static inline void activate_irq(int irq)
...
@@ -108,6 +108,14 @@ static inline void activate_irq(int irq)
#endif
#endif
}
}
static
inline
int
intc_handle_int_cmp
(
const
void
*
a
,
const
void
*
b
)
{
const
struct
intc_handle_int
*
_a
=
a
;
const
struct
intc_handle_int
*
_b
=
b
;
return
_a
->
irq
-
_b
->
irq
;
}
/* access.c */
/* access.c */
extern
unsigned
long
extern
unsigned
long
(
*
intc_reg_fns
[])(
unsigned
long
addr
,
unsigned
long
h
,
unsigned
long
data
);
(
*
intc_reg_fns
[])(
unsigned
long
addr
,
unsigned
long
h
,
unsigned
long
data
);
...
@@ -157,7 +165,6 @@ void _intc_enable(struct irq_data *data, unsigned long handle);
...
@@ -157,7 +165,6 @@ void _intc_enable(struct irq_data *data, unsigned long handle);
/* core.c */
/* core.c */
extern
struct
list_head
intc_list
;
extern
struct
list_head
intc_list
;
extern
raw_spinlock_t
intc_big_lock
;
extern
raw_spinlock_t
intc_big_lock
;
extern
unsigned
int
nr_intc_controllers
;
extern
struct
bus_type
intc_subsys
;
extern
struct
bus_type
intc_subsys
;
unsigned
int
intc_get_dfl_prio_level
(
void
);
unsigned
int
intc_get_dfl_prio_level
(
void
);
...
...
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