h8300 generic irq
h8300 using generic irq handler patch. Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Šī revīzija ir iekļauta:

revīziju iesūtīja
Linus Torvalds

vecāks
aeecf3142d
revīzija
c728d60455
@@ -4,4 +4,4 @@
|
||||
# Reuse any files we can from the H8/300H
|
||||
#
|
||||
|
||||
obj-y := entry.o ints_h8300h.o ptrace_h8300h.o
|
||||
obj-y := entry.o irq_pin.o ptrace_h8300h.o
|
||||
|
@@ -30,12 +30,12 @@
|
||||
mov.l er0,@-sp
|
||||
|
||||
stc ccr,r0l /* check kernel mode */
|
||||
orc #0x10,ccr
|
||||
btst #4,r0l
|
||||
bne 5f
|
||||
|
||||
mov.l sp,@SYMBOL_NAME(sw_usp) /* user mode */
|
||||
mov.l @sp,er0
|
||||
orc #0x10,ccr
|
||||
mov.l @SYMBOL_NAME(sw_ksp),sp
|
||||
sub.l #(LRET-LORIG),sp /* allocate LORIG - LRET */
|
||||
mov.l er0,@-sp
|
||||
@@ -165,7 +165,7 @@ SYMBOL_NAME_LABEL(interrupt_entry)
|
||||
dec.l #1,er0
|
||||
mov.l sp,er1
|
||||
subs #4,er1 /* adjust ret_pc */
|
||||
jsr @SYMBOL_NAME(process_int)
|
||||
jsr @SYMBOL_NAME(do_IRQ)
|
||||
mov.l @SYMBOL_NAME(irq_stat)+CPUSTAT_SOFTIRQ_PENDING,er0
|
||||
beq 1f
|
||||
jsr @SYMBOL_NAME(do_softirq)
|
||||
|
@@ -2,5 +2,5 @@
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
extra-y := crt0_$(MODEL).o
|
||||
obj-y := timer.o
|
||||
extra-y = crt0_$(MODEL).o
|
||||
|
@@ -1,85 +0,0 @@
|
||||
/*
|
||||
* linux/arch/h8300/platform/h8300h/ints_h8300h.c
|
||||
* Interrupt handling CPU variants
|
||||
*
|
||||
* Yoshinori Sato <ysato@users.sourceforge.jp>
|
||||
*
|
||||
*/
|
||||
|
||||
#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;
|
||||
}
|
||||
}
|
@@ -31,12 +31,13 @@
|
||||
mov.l er0,@-sp
|
||||
|
||||
stc ccr,r0l /* check kernel mode */
|
||||
orc #0x10,ccr
|
||||
btst #4,r0l
|
||||
bne 5f
|
||||
|
||||
mov.l sp,@SYMBOL_NAME(sw_usp) /* user mode */
|
||||
mov.l @sp,er0
|
||||
/* user mode */
|
||||
mov.l sp,@SYMBOL_NAME(sw_usp)
|
||||
mov.l @sp,er0 /* restore saved er0 */
|
||||
orc #0x10,ccr /* switch kernel stack */
|
||||
mov.l @SYMBOL_NAME(sw_ksp),sp
|
||||
sub.l #(LRET-LORIG),sp /* allocate LORIG - LRET */
|
||||
stm.l er0-er3,@-sp
|
||||
@@ -55,8 +56,9 @@
|
||||
mov.l er0,@(LER0-LER3:16,sp) /* copy ER0 */
|
||||
bra 6f
|
||||
5:
|
||||
mov.l @sp,er0 /* kernel mode */
|
||||
subs #2,sp /* dummy ccr */
|
||||
/* kernel mode */
|
||||
mov.l @sp,er0 /* restore saved er0 */
|
||||
subs #2,sp /* set dummy ccr */
|
||||
stm.l er0-er3,@-sp
|
||||
mov.w @(LRET-LER3:16,sp),r1 /* copy old ccr */
|
||||
mov.b r1h,r1l
|
||||
@@ -94,6 +96,7 @@
|
||||
mov.l @sp+,er1
|
||||
add.l #(LRET-LER1),sp /* remove LORIG - LRET */
|
||||
mov.l sp,@SYMBOL_NAME(sw_ksp)
|
||||
andc #0xef,ccr /* switch to user mode */
|
||||
mov.l er0,sp
|
||||
bra 8f
|
||||
7:
|
||||
@@ -173,9 +176,6 @@ SYMBOL_NAME_LABEL(interrupt_entry)
|
||||
SYMBOL_NAME_LABEL(system_call)
|
||||
subs #4,sp /* dummy LVEC */
|
||||
SAVE_ALL
|
||||
mov.w @(LCCR:16,sp),r1
|
||||
bset #4,r1l
|
||||
ldc r1l,ccr /* restore ccr */
|
||||
mov.l er0,er4
|
||||
mov.l #-ENOSYS,er0
|
||||
mov.l er0,@(LER0:16,sp)
|
||||
@@ -198,6 +198,7 @@ SYMBOL_NAME_LABEL(system_call)
|
||||
mov.l @(LER1:16,sp),er0
|
||||
mov.l @(LER2:16,sp),er1
|
||||
mov.l @(LER3:16,sp),er2
|
||||
andc #0x7f,ccr
|
||||
jsr @er4
|
||||
mov.l er0,@(LER0:16,sp) /* save the return value */
|
||||
#if defined(CONFIG_SYSCALL_PRINT)
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user