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
Kirill Smelkov
linux
Commits
e52a177e
Commit
e52a177e
authored
Mar 14, 2004
by
Yoshinori Sato
Committed by
Linus Torvalds
Mar 14, 2004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] H8/300: Interrupt handling cleanup
- merge common routine - runtime vector setup update
parent
f46ce958
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
263 additions
and
70 deletions
+263
-70
arch/h8300/kernel/Makefile
arch/h8300/kernel/Makefile
+1
-1
arch/h8300/kernel/ints.c
arch/h8300/kernel/ints.c
+43
-46
arch/h8300/platform/h8300h/Makefile
arch/h8300/platform/h8300h/Makefile
+1
-11
arch/h8300/platform/h8300h/ints_h8300h.c
arch/h8300/platform/h8300h/ints_h8300h.c
+86
-0
arch/h8300/platform/h8s/Makefile
arch/h8300/platform/h8s/Makefile
+1
-12
arch/h8300/platform/h8s/ints_h8s.c
arch/h8300/platform/h8s/ints_h8s.c
+102
-0
include/asm-h8300/irq.h
include/asm-h8300/irq.h
+20
-0
include/asm-h8300/traps.h
include/asm-h8300/traps.h
+9
-0
No files found.
arch/h8300/kernel/Makefile
View file @
e52a177e
...
...
@@ -4,7 +4,7 @@
extra-y
:=
vmlinux.lds.s
obj-y
:=
process.o traps.o ptrace.o
\
obj-y
:=
process.o traps.o ptrace.o
ints.o
\
sys_h8300.o time.o semaphore.o signal.o
\
setup.o h8300_ksyms.o gpio.o init_task.o
\
syscalls.o
arch/h8300/
platform/h8300h
/ints.c
→
arch/h8300/
kernel
/ints.c
View file @
e52a177e
...
...
@@ -28,9 +28,7 @@
#include <asm/traps.h>
#include <asm/io.h>
#include <asm/setup.h>
#include <asm/gpio.h>
#include <asm/hardirq.h>
#include <asm/regs306x.h>
#include <asm/errno.h>
/*
...
...
@@ -48,11 +46,16 @@ static irq_handler_t *irq_list[NR_IRQS];
static
int
use_kmalloc
;
extern
unsigned
long
*
interrupt_redirect_table
;
extern
const
int
h8300_saved_vectors
[];
extern
const
unsigned
long
h8300_trap_table
[];
int
h8300_enable_irq_pin
(
unsigned
int
irq
);
void
h8300_disable_irq_pin
(
unsigned
int
irq
);
#define CPU_VECTOR ((unsigned long *)0x000000)
#define ADDR_MASK (0xffffff)
static
inline
unsigned
long
*
get_vector_address
(
void
)
#if defined(CONFIG_RAMKERNEL)
static
unsigned
long
__init
*
get_vector_address
(
void
)
{
unsigned
long
*
rom_vector
=
CPU_VECTOR
;
unsigned
long
base
,
tmp
;
...
...
@@ -61,7 +64,7 @@ static inline unsigned long *get_vector_address(void)
base
=
rom_vector
[
EXT_IRQ0
]
&
ADDR_MASK
;
/* check romvector format */
for
(
vec_no
=
EXT_IRQ1
;
vec_no
<=
EXT_IRQ
5
;
vec_no
++
)
{
for
(
vec_no
=
EXT_IRQ1
;
vec_no
<=
EXT_IRQ
0
+
EXT_IRQS
;
vec_no
++
)
{
if
((
base
+
(
vec_no
-
EXT_IRQ0
)
*
4
)
!=
(
rom_vector
[
vec_no
]
&
ADDR_MASK
))
return
NULL
;
}
...
...
@@ -76,19 +79,15 @@ static inline unsigned long *get_vector_address(void)
return
NULL
;
return
(
unsigned
long
*
)
base
;
}
#endif
void
__init
init_IRQ
(
void
)
{
#if defined(CONFIG_RAMKERNEL)
int
i
;
unsigned
long
*
ramvec
,
*
ramvec_p
;
unsigned
long
break_vec
;
#if defined(CONFIG_GDB_DEBUG)
break_vec
=
ramvec
[
TRAP3_VEC
];
#else
break_vec
=
VECTOR
(
trace_break
);
#endif
const
unsigned
long
*
trap_entry
;
const
int
*
saved_vector
;
ramvec
=
get_vector_address
();
if
(
ramvec
==
NULL
)
...
...
@@ -96,14 +95,27 @@ void __init init_IRQ(void)
else
printk
(
"virtual vector at 0x%08lx
\n
"
,(
unsigned
long
)
ramvec
);
for
(
ramvec_p
=
ramvec
,
i
=
0
;
i
<
NR_IRQS
;
i
++
)
*
ramvec_p
++
=
REDIRECT
(
interrupt_entry
);
ramvec
[
TRAP0_VEC
]
=
VECTOR
(
system_call
);
ramvec
[
TRAP3_VEC
]
=
break_vec
;
/* create redirect table */
ramvec_p
=
ramvec
;
trap_entry
=
h8300_trap_table
;
saved_vector
=
h8300_saved_vectors
;
for
(
i
=
0
;
i
<
NR_IRQS
;
i
++
)
{
if
(
i
==
*
saved_vector
)
{
ramvec_p
++
;
saved_vector
++
;
}
else
{
if
(
i
<
NR_TRAPS
)
{
if
(
*
trap_entry
)
*
ramvec_p
=
VECTOR
(
*
trap_entry
);
ramvec_p
++
;
trap_entry
++
;
}
else
*
ramvec_p
++
=
REDIRECT
(
interrupt_entry
);
}
}
interrupt_redirect_table
=
ramvec
;
#ifdef DUMP_VECTOR
ramvec_p
=
interrupt_redirect_table
;
ramvec_p
=
ramvec
;
for
(
i
=
0
;
i
<
NR_IRQS
;
i
++
)
{
if
((
i
%
8
)
==
0
)
printk
(
"
\n
%p: "
,
ramvec_p
);
...
...
@@ -124,18 +136,8 @@ int request_irq(unsigned int irq,
printk
(
"Incorrect IRQ %d from %s
\n
"
,
irq
,
devname
);
return
-
EINVAL
;
}
if
(
irq_list
[
irq
])
if
(
irq_list
[
irq
]
||
(
h8300_enable_irq_pin
(
irq
)
==
-
EBUSY
)
)
return
-
EBUSY
;
if
(
irq
>=
EXT_IRQ0
&&
irq
<=
EXT_IRQ3
)
{
if
(
H8300_GPIO_RESERVE
(
H8300_GPIO_P8
,
1
<<
(
irq
-
EXT_IRQ0
))
==
0
)
return
-
EBUSY
;
H8300_GPIO_DDR
(
H8300_GPIO_P8
,
(
irq
-
EXT_IRQ0
),
0
);
}
if
(
irq
>=
EXT_IRQ4
&&
irq
<=
EXT_IRQ5
)
{
if
(
H8300_GPIO_RESERVE
(
H8300_GPIO_P9
,
1
<<
(
irq
-
EXT_IRQ0
))
==
0
)
return
-
EBUSY
;
H8300_GPIO_DDR
(
H8300_GPIO_P9
,
(
irq
-
EXT_IRQ0
),
0
);
}
if
(
use_kmalloc
)
irq_handle
=
(
irq_handler_t
*
)
kmalloc
(
sizeof
(
irq_handler_t
),
GFP_ATOMIC
);
...
...
@@ -167,8 +169,7 @@ void free_irq(unsigned int irq, void *dev_id)
if
(
!
irq_list
[
irq
]
||
irq_list
[
irq
]
->
dev_id
!=
dev_id
)
printk
(
"Removing probably wrong IRQ %d from %s
\n
"
,
irq
,
irq_list
[
irq
]
->
devname
);
if
(
irq
>=
EXT_IRQ0
&&
irq
<=
EXT_IRQ5
)
*
(
volatile
unsigned
char
*
)
IER
&=
~
(
1
<<
(
irq
-
EXT_IRQ0
));
h8300_disable_irq_pin
(
irq
);
if
(((
unsigned
long
)
irq_list
[
irq
]
&
0x80000000
)
==
0
)
{
kfree
(
irq_list
[
irq
]);
irq_list
[
irq
]
=
NULL
;
...
...
@@ -196,30 +197,26 @@ EXPORT_SYMBOL(probe_irq_off);
void
enable_irq
(
unsigned
int
irq
)
{
if
(
irq
>=
EXT_IRQ0
&&
irq
<=
EXT_IRQ5
)
{
*
(
volatile
unsigned
char
*
)
IER
|=
(
1
<<
(
irq
-
EXT_IRQ0
));
*
(
volatile
unsigned
char
*
)
ISR
&=
~
(
1
<<
(
irq
-
EXT_IRQ0
));
}
if
(
irq
>=
EXT_IRQ0
&&
irq
<=
(
EXT_IRQ0
+
EXT_IRQS
))
IER_REGS
|=
1
<<
(
irq
-
EXT_IRQ0
);
}
void
disable_irq
(
unsigned
int
irq
)
{
if
(
irq
>=
EXT_IRQ0
&&
irq
<=
EXT_IRQ5
)
{
*
(
volatile
unsigned
char
*
)
IER
&=
~
(
1
<<
(
irq
-
EXT_IRQ0
));
}
if
(
irq
>=
EXT_IRQ0
&&
irq
<=
(
EXT_IRQ0
+
EXT_IRQS
))
IER_REGS
&=
~
(
1
<<
(
irq
-
EXT_IRQ0
));
}
asmlinkage
void
process_int
(
int
vec
,
struct
pt_regs
*
fp
)
asmlinkage
void
process_int
(
int
irq
,
struct
pt_regs
*
fp
)
{
irq_enter
();
if
(
vec
>=
EXT_IRQ0
&&
vec
<=
EXT_IRQ5
)
*
(
volatile
unsigned
char
*
)
ISR
&=
~
(
1
<<
(
vec
-
EXT_IRQ0
));
if
(
vec
<
NR_IRQS
)
{
if
(
irq_list
[
vec
])
{
irq_list
[
vec
]
->
handler
(
vec
,
irq_list
[
vec
]
->
dev_id
,
fp
);
irq_list
[
vec
]
->
count
++
;
if
(
irq_list
[
vec
]
->
flags
&
SA_SAMPLE_RANDOM
)
add_interrupt_randomness
(
vec
);
h8300_clear_isr
(
irq
);
if
(
irq
>=
NR_TRAPS
&&
irq
<
NR_IRQS
)
{
if
(
irq_list
[
irq
])
{
irq_list
[
irq
]
->
handler
(
irq
,
irq_list
[
irq
]
->
dev_id
,
fp
);
irq_list
[
irq
]
->
count
++
;
if
(
irq_list
[
irq
]
->
flags
&
SA_SAMPLE_RANDOM
)
add_interrupt_randomness
(
irq
);
}
}
else
{
BUG
();
...
...
arch/h8300/platform/h8300h/Makefile
View file @
e52a177e
...
...
@@ -4,15 +4,5 @@
# Reuse any files we can from the H8/300H
#
#VPATH := $(VPATH):$(BOARD)
obj-y
:=
entry.o ints_h8300h.o
.S.o
:
$(CC)
-D__ASSEMBLY__
$(AFLAGS)
-I
.
-c
$<
-o
$*
.o
obj-y
:=
entry.o ints.o
$(BOARD)/crt0_$(MODEL).o
:
$(BOARD)/crt0_$(MODEL).S
entry.o
:
entry.S
ints.o
:
ints.c
arch/h8300/platform/h8300h/ints_h8300h.c
0 → 100644
View file @
e52a177e
/*
* linux/arch/h8300/platform/h8300h/ints_h8300h.c
* Interrupt handling CPU variants
*
* Yoshinori Sato <ysato@users.sourceforge.jp>
*
*/
#include <linux/config.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <asm/ptrace.h>
#include <asm/traps.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/gpio.h>
#include <asm/regs306x.h>
/* saved vector list */
const
int
__initdata
h8300_saved_vectors
[]
=
{
#if defined(CONFIG_GDB_DEBUG)
TRAP3_VEC
,
#endif
-
1
};
/* trap entry table */
const
unsigned
long
__initdata
h8300_trap_table
[
NR_TRAPS
]
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
(
unsigned
long
)
system_call
,
/* TRAPA #0 */
0
,
0
,
(
unsigned
long
)
trace_break
,
/* TRAPA #3 */
};
int
h8300_enable_irq_pin
(
unsigned
int
irq
)
{
int
bitmask
;
if
(
irq
<
EXT_IRQ0
||
irq
>
EXT_IRQ5
)
return
0
;
/* initialize IRQ pin */
bitmask
=
1
<<
(
irq
-
EXT_IRQ0
);
switch
(
irq
)
{
case
EXT_IRQ0
:
case
EXT_IRQ1
:
case
EXT_IRQ2
:
case
EXT_IRQ3
:
if
(
H8300_GPIO_RESERVE
(
H8300_GPIO_P8
,
bitmask
)
==
0
)
return
-
EBUSY
;
H8300_GPIO_DDR
(
H8300_GPIO_P8
,
bitmask
,
H8300_GPIO_INPUT
);
break
;
case
EXT_IRQ4
:
case
EXT_IRQ5
:
if
(
H8300_GPIO_RESERVE
(
H8300_GPIO_P9
,
bitmask
)
==
0
)
return
-
EBUSY
;
H8300_GPIO_DDR
(
H8300_GPIO_P9
,
bitmask
,
H8300_GPIO_INPUT
);
break
;
}
return
0
;
}
void
h8300_disable_irq_pin
(
unsigned
int
irq
)
{
int
bitmask
;
if
(
irq
<
EXT_IRQ0
||
irq
>
EXT_IRQ5
)
return
;
/* disable interrupt & release IRQ pin */
bitmask
=
1
<<
(
irq
-
EXT_IRQ0
);
switch
(
irq
)
{
case
EXT_IRQ0
:
case
EXT_IRQ1
:
case
EXT_IRQ2
:
case
EXT_IRQ3
:
*
(
volatile
unsigned
char
*
)
IER
&=
~
bitmask
;
H8300_GPIO_FREE
(
H8300_GPIO_P8
,
bitmask
);
break
;
case
EXT_IRQ4
:
case
EXT_IRQ5
:
*
(
volatile
unsigned
char
*
)
IER
&=
~
bitmask
;
H8300_GPIO_FREE
(
H8300_GPIO_P9
,
bitmask
);
break
;
}
}
arch/h8300/platform/h8s/Makefile
View file @
e52a177e
...
...
@@ -4,15 +4,4 @@
# Reuse any files we can from the H8S
#
#VPATH := $(VPATH):$(BOARD)
.S.o
:
$(CC)
-D__ASSEMBLY__
$(AFLAGS)
-I
.
-c
$<
-o
$*
.o
obj-y
:=
entry.o ints.o
$(BOARD)/crt0_$(MODEL).o
:
$(BOARD)/crt0_$(MODEL).S
entry.o
:
entry.S
ints.o
:
ints.c
obj-y
:=
entry.o ints_h8s.o
arch/h8300/platform/h8s/ints_h8s.c
0 → 100644
View file @
e52a177e
/*
* linux/arch/h8300/platform/h8s/ints_h8s.c
* Interrupt handling CPU variants
*
* Yoshinori Sato <ysato@users.sourceforge.jp>
*
*/
#include <linux/config.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <asm/ptrace.h>
#include <asm/traps.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/gpio.h>
#include <asm/regs267x.h>
/* saved vector list */
const
int
__initdata
h8300_saved_vectors
[]
=
{
#if defined(CONFIG_GDB_DEBUG)
TRACE_VEC
,
TRAP3_VEC
,
#endif
-
1
};
/* trap entry table */
const
unsigned
long
__initdata
h8300_trap_table
[
NR_TRAPS
]
=
{
0
,
0
,
0
,
0
,
0
,
(
unsigned
long
)
trace_break
,
/* TRACE */
0
,
0
,
(
unsigned
long
)
system_call
,
/* TRAPA #0 */
0
,
0
,
0
,
0
,
0
,
0
,
0
};
/* IRQ pin assignment */
struct
irq_pins
{
unsigned
char
port_no
;
unsigned
char
bit_no
;
}
__attribute__
((
aligned
(
1
),
packed
));
/* ISTR = 0 */
const
static
struct
irq_pins
irq_assign_table0
[
16
]
=
{
{
H8300_GPIO_P5
,
H8300_GPIO_B0
},{
H8300_GPIO_P5
,
H8300_GPIO_B1
},
{
H8300_GPIO_P5
,
H8300_GPIO_B2
},{
H8300_GPIO_P5
,
H8300_GPIO_B3
},
{
H8300_GPIO_P5
,
H8300_GPIO_B4
},{
H8300_GPIO_P5
,
H8300_GPIO_B5
},
{
H8300_GPIO_P5
,
H8300_GPIO_B6
},{
H8300_GPIO_P5
,
H8300_GPIO_B7
},
{
H8300_GPIO_P6
,
H8300_GPIO_B0
},{
H8300_GPIO_P6
,
H8300_GPIO_B1
},
{
H8300_GPIO_P6
,
H8300_GPIO_B2
},{
H8300_GPIO_P6
,
H8300_GPIO_B3
},
{
H8300_GPIO_P6
,
H8300_GPIO_B4
},{
H8300_GPIO_P6
,
H8300_GPIO_B5
},
{
H8300_GPIO_PF
,
H8300_GPIO_B1
},{
H8300_GPIO_PF
,
H8300_GPIO_B2
},
};
/* ISTR = 1 */
const
static
struct
irq_pins
irq_assign_table1
[
16
]
=
{
{
H8300_GPIO_P8
,
H8300_GPIO_B0
},{
H8300_GPIO_P8
,
H8300_GPIO_B1
},
{
H8300_GPIO_P8
,
H8300_GPIO_B2
},{
H8300_GPIO_P8
,
H8300_GPIO_B3
},
{
H8300_GPIO_P8
,
H8300_GPIO_B4
},{
H8300_GPIO_P8
,
H8300_GPIO_B5
},
{
H8300_GPIO_PH
,
H8300_GPIO_B2
},{
H8300_GPIO_PH
,
H8300_GPIO_B3
},
{
H8300_GPIO_P2
,
H8300_GPIO_B0
},{
H8300_GPIO_P2
,
H8300_GPIO_B1
},
{
H8300_GPIO_P2
,
H8300_GPIO_B2
},{
H8300_GPIO_P2
,
H8300_GPIO_B3
},
{
H8300_GPIO_P2
,
H8300_GPIO_B4
},{
H8300_GPIO_P2
,
H8300_GPIO_B5
},
{
H8300_GPIO_P2
,
H8300_GPIO_B6
},{
H8300_GPIO_P2
,
H8300_GPIO_B7
},
};
#define IRQ_GPIO_MAP(irqbit,port,bit) \
do { \
if (*(volatile unsigned short *)ITSR & irqbit) { \
port = irq_assign_table1[irq - EXT_IRQ0].port_no; \
bit = irq_assign_table1[irq - EXT_IRQ0].bit_no; \
} else { \
port = irq_assign_table0[irq - EXT_IRQ0].port_no; \
bit = irq_assign_table0[irq - EXT_IRQ0].bit_no; \
} \
} while(0)
int
h8300_enable_irq_pin
(
unsigned
int
irq
)
{
if
(
irq
>=
EXT_IRQ0
&&
irq
<=
EXT_IRQ15
)
{
unsigned
short
ptn
=
1
<<
(
irq
-
EXT_IRQ0
);
unsigned
int
port_no
,
bit_no
;
IRQ_GPIO_MAP
(
ptn
,
port_no
,
bit_no
);
if
(
H8300_GPIO_RESERVE
(
port_no
,
bit_no
)
==
0
)
return
-
EBUSY
;
/* pin already use */
H8300_GPIO_DDR
(
port_no
,
bit_no
,
H8300_GPIO_INPUT
);
*
(
volatile
unsigned
short
*
)
ISR
&=
~
ptn
;
/* ISR clear */
}
return
0
;
}
void
h8300_disable_irq_pin
(
unsigned
int
irq
)
{
if
(
irq
>=
EXT_IRQ0
&&
irq
<=
EXT_IRQ15
)
{
/* disable interrupt & release IRQ pin */
unsigned
short
ptn
=
1
<<
(
irq
-
EXT_IRQ0
);
unsigned
short
port_no
,
bit_no
;
*
(
volatile
unsigned
short
*
)
ISR
&=
~
ptn
;
*
(
volatile
unsigned
short
*
)
IER
&=
~
ptn
;
IRQ_GPIO_MAP
(
ptn
,
port_no
,
bit_no
);
H8300_GPIO_FREE
(
port_no
,
bit_no
);
}
}
include/asm-h8300/irq.h
View file @
e52a177e
...
...
@@ -13,6 +13,16 @@
#define EXT_IRQ5 17
#define EXT_IRQ6 18
#define EXT_IRQ7 19
#define EXT_IRQS 5
#include <asm/regs306x.h>
#define h8300_clear_isr(irq) \
do { \
if (irq >= EXT_IRQ0 && irq <= EXT_IRQ5) \
*(volatile unsigned char *)ISR &= ~(1 << (irq - EXT_IRQ0)); \
} while(0)
#define IER_REGS *(volatile unsigned char *)IER
#endif
#if defined(CONFIG_CPU_H8S)
#define NR_IRQS 128
...
...
@@ -32,6 +42,16 @@
#define EXT_IRQ13 29
#define EXT_IRQ14 30
#define EXT_IRQ15 31
#define EXT_IRQS 15
#include <asm/regs267x.h>
#define h8300_clear_isr(irq) \
do { \
if (irq >= EXT_IRQ0 && irq <= EXT_IRQ15) \
*(volatile unsigned short *)ISR &= ~(1 << (irq - EXT_IRQ0)); \
} while(0)
#define IER_REGS *(volatile unsigned short *)IER
#endif
static
__inline__
int
irq_canonicalize
(
int
irq
)
...
...
include/asm-h8300/traps.h
View file @
e52a177e
...
...
@@ -20,9 +20,18 @@ extern void trace_break(void);
#define VECTOR(address) ((JMP_OP)|((unsigned long)address))
#define REDIRECT(address) ((JSR_OP)|((unsigned long)address))
#define TRACE_VEC 5
#define TRAP0_VEC 8
#define TRAP1_VEC 9
#define TRAP2_VEC 10
#define TRAP3_VEC 11
#if defined(__H8300H__)
#define NR_TRAPS 12
#endif
#if defined(__H8300S__)
#define NR_TRAPS 16
#endif
#endif
/* _H8300_TRAPS_H */
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