diff options
| author | Yoshinori Sato <ysato@users.sourceforge.jp> | 2007-05-06 17:50:35 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-07 15:12:58 -0400 |
| commit | c728d60455e8e8722ee08312a75f38dd7a866b5e (patch) | |
| tree | c848cbddc7557fa1cf00993245e562007465dadb | |
| parent | aeecf3142d82414d511135cc85f86caddfb58338 (diff) | |
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>
| -rw-r--r-- | arch/h8300/Kconfig | 4 | ||||
| -rw-r--r-- | arch/h8300/Makefile | 2 | ||||
| -rw-r--r-- | arch/h8300/kernel/Makefile | 6 | ||||
| -rw-r--r-- | arch/h8300/kernel/irq.c | 211 | ||||
| -rw-r--r-- | arch/h8300/kernel/setup.c | 3 | ||||
| -rw-r--r-- | arch/h8300/kernel/time.c | 2 | ||||
| -rw-r--r-- | arch/h8300/mm/kmap.c | 4 | ||||
| -rw-r--r-- | arch/h8300/platform/h8300h/Makefile | 2 | ||||
| -rw-r--r-- | arch/h8300/platform/h8300h/entry.S | 4 | ||||
| -rw-r--r-- | arch/h8300/platform/h8300h/generic/Makefile | 2 | ||||
| -rw-r--r-- | arch/h8300/platform/h8300h/ints_h8300h.c | 85 | ||||
| -rw-r--r-- | arch/h8300/platform/h8s/entry.S | 17 | ||||
| -rw-r--r-- | include/asm-h8300/irq.h | 1 | ||||
| -rw-r--r-- | include/asm-h8300/irq_regs.h | 1 | ||||
| -rw-r--r-- | include/asm-h8300/pgtable.h | 1 |
15 files changed, 237 insertions, 108 deletions
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index 86f6ca36363f..618dbad696f6 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig | |||
| @@ -49,6 +49,10 @@ config GENERIC_HWEIGHT | |||
| 49 | bool | 49 | bool |
| 50 | default y | 50 | default y |
| 51 | 51 | ||
| 52 | config GENERIC_HARDIRQS | ||
| 53 | bool | ||
| 54 | default y | ||
| 55 | |||
| 52 | config GENERIC_CALIBRATE_DELAY | 56 | config GENERIC_CALIBRATE_DELAY |
| 53 | bool | 57 | bool |
| 54 | default y | 58 | default y |
diff --git a/arch/h8300/Makefile b/arch/h8300/Makefile index 40b3f56f3666..b2d896a7e598 100644 --- a/arch/h8300/Makefile +++ b/arch/h8300/Makefile | |||
| @@ -41,7 +41,7 @@ LDFLAGS += $(ldflags-y) | |||
| 41 | CROSS_COMPILE = h8300-elf- | 41 | CROSS_COMPILE = h8300-elf- |
| 42 | LIBGCC := $(shell $(CROSS-COMPILE)$(CC) $(CFLAGS) -print-libgcc-file-name) | 42 | LIBGCC := $(shell $(CROSS-COMPILE)$(CC) $(CFLAGS) -print-libgcc-file-name) |
| 43 | 43 | ||
| 44 | head-y := arch/$(ARCH)/platform/$(platform-y)/$(board-y)/crt0_$(model-y).o | 44 | head-y := arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD)/crt0_$(MODEL).o |
| 45 | 45 | ||
| 46 | core-y += arch/$(ARCH)/kernel/ \ | 46 | core-y += arch/$(ARCH)/kernel/ \ |
| 47 | arch/$(ARCH)/mm/ | 47 | arch/$(ARCH)/mm/ |
diff --git a/arch/h8300/kernel/Makefile b/arch/h8300/kernel/Makefile index 4edbc2ef6ca2..ccc1a7fbf94b 100644 --- a/arch/h8300/kernel/Makefile +++ b/arch/h8300/kernel/Makefile | |||
| @@ -4,10 +4,8 @@ | |||
| 4 | 4 | ||
| 5 | extra-y := vmlinux.lds | 5 | extra-y := vmlinux.lds |
| 6 | 6 | ||
| 7 | obj-y := process.o traps.o ptrace.o ints.o \ | 7 | obj-y := process.o traps.o ptrace.o irq.o \ |
| 8 | sys_h8300.o time.o semaphore.o signal.o \ | 8 | sys_h8300.o time.o semaphore.o signal.o \ |
| 9 | setup.o gpio.o init_task.o syscalls.o devres.o | 9 | setup.o gpio.o init_task.o syscalls.o |
| 10 | |||
| 11 | devres-y = ../../../kernel/irq/devres.o | ||
| 12 | 10 | ||
| 13 | obj-$(CONFIG_MODULES) += module.o h8300_ksyms.o | 11 | obj-$(CONFIG_MODULES) += module.o h8300_ksyms.o |
diff --git a/arch/h8300/kernel/irq.c b/arch/h8300/kernel/irq.c new file mode 100644 index 000000000000..43d21e93f41f --- /dev/null +++ b/arch/h8300/kernel/irq.c | |||
| @@ -0,0 +1,211 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/h8300/kernel/irq.c | ||
| 3 | * | ||
| 4 | * Copyright 2007 Yoshinori Sato <ysato@users.sourceforge.jp> | ||
| 5 | */ | ||
| 6 | |||
| 7 | #include <linux/module.h> | ||
| 8 | #include <linux/types.h> | ||
| 9 | #include <linux/kernel.h> | ||
| 10 | #include <linux/sched.h> | ||
| 11 | #include <linux/kernel_stat.h> | ||
| 12 | #include <linux/seq_file.h> | ||
| 13 | #include <linux/init.h> | ||
| 14 | #include <linux/random.h> | ||
| 15 | #include <linux/bootmem.h> | ||
| 16 | #include <linux/irq.h> | ||
| 17 | |||
| 18 | #include <asm/system.h> | ||
| 19 | #include <asm/traps.h> | ||
| 20 | #include <asm/io.h> | ||
| 21 | #include <asm/setup.h> | ||
| 22 | #include <asm/errno.h> | ||
| 23 | |||
| 24 | /*#define DEBUG*/ | ||
| 25 | |||
| 26 | extern unsigned long *interrupt_redirect_table; | ||
| 27 | extern const int h8300_saved_vectors[]; | ||
| 28 | extern const unsigned long h8300_trap_table[]; | ||
| 29 | int h8300_enable_irq_pin(unsigned int irq); | ||
| 30 | void h8300_disable_irq_pin(unsigned int irq); | ||
| 31 | |||
| 32 | #define CPU_VECTOR ((unsigned long *)0x000000) | ||
| 33 | #define ADDR_MASK (0xffffff) | ||
| 34 | |||
| 35 | static inline int is_ext_irq(unsigned int irq) | ||
| 36 | { | ||
| 37 | return (irq >= EXT_IRQ0 && irq <= (EXT_IRQ0 + EXT_IRQS)); | ||
| 38 | } | ||
| 39 | |||
| 40 | static void h8300_enable_irq(unsigned int irq) | ||
| 41 | { | ||
| 42 | if (is_ext_irq(irq)) | ||
| 43 | IER_REGS |= 1 << (irq - EXT_IRQ0); | ||
| 44 | } | ||
| 45 | |||
| 46 | static void h8300_disable_irq(unsigned int irq) | ||
| 47 | { | ||
| 48 | if (is_ext_irq(irq)) | ||
| 49 | IER_REGS &= ~(1 << (irq - EXT_IRQ0)); | ||
| 50 | } | ||
| 51 | |||
| 52 | static void h8300_end_irq(unsigned int irq) | ||
| 53 | { | ||
| 54 | } | ||
| 55 | |||
| 56 | static unsigned int h8300_startup_irq(unsigned int irq) | ||
| 57 | { | ||
| 58 | if (is_ext_irq(irq)) | ||
| 59 | return h8300_enable_irq_pin(irq); | ||
| 60 | else | ||
| 61 | return 0; | ||
| 62 | } | ||
| 63 | |||
| 64 | static void h8300_shutdown_irq(unsigned int irq) | ||
| 65 | { | ||
| 66 | if (is_ext_irq(irq)) | ||
| 67 | h8300_disable_irq_pin(irq); | ||
| 68 | } | ||
| 69 | |||
| 70 | /* | ||
| 71 | * h8300 interrupt controler implementation | ||
| 72 | */ | ||
| 73 | struct irq_chip h8300irq_chip = { | ||
| 74 | .name = "H8300-INTC", | ||
| 75 | .startup = h8300_startup_irq, | ||
| 76 | .shutdown = h8300_shutdown_irq, | ||
| 77 | .enable = h8300_enable_irq, | ||
| 78 | .disable = h8300_disable_irq, | ||
| 79 | .ack = NULL, | ||
| 80 | .end = h8300_end_irq, | ||
| 81 | }; | ||
| 82 | |||
| 83 | void ack_bad_irq(unsigned int irq) | ||
| 84 | { | ||
| 85 | printk("unexpected IRQ trap at vector %02x\n", irq); | ||
| 86 | } | ||
| 87 | |||
| 88 | #if defined(CONFIG_RAMKERNEL) | ||
| 89 | static unsigned long __init *get_vector_address(void) | ||
| 90 | { | ||
| 91 | unsigned long *rom_vector = CPU_VECTOR; | ||
| 92 | unsigned long base,tmp; | ||
| 93 | int vec_no; | ||
| 94 | |||
| 95 | base = rom_vector[EXT_IRQ0] & ADDR_MASK; | ||
| 96 | |||
| 97 | /* check romvector format */ | ||
| 98 | for (vec_no = EXT_IRQ1; vec_no <= EXT_IRQ0+EXT_IRQS; vec_no++) { | ||
| 99 | if ((base+(vec_no - EXT_IRQ0)*4) != (rom_vector[vec_no] & ADDR_MASK)) | ||
| 100 | return NULL; | ||
| 101 | } | ||
| 102 | |||
| 103 | /* ramvector base address */ | ||
| 104 | base -= EXT_IRQ0*4; | ||
| 105 | |||
| 106 | /* writerble check */ | ||
| 107 | tmp = ~(*(volatile unsigned long *)base); | ||
| 108 | (*(volatile unsigned long *)base) = tmp; | ||
| 109 | if ((*(volatile unsigned long *)base) != tmp) | ||
| 110 | return NULL; | ||
| 111 | return (unsigned long *)base; | ||
| 112 | } | ||
| 113 | |||
| 114 | static void __init setup_vector(void) | ||
| 115 | { | ||
| 116 | int i; | ||
| 117 | unsigned long *ramvec,*ramvec_p; | ||
| 118 | const unsigned long *trap_entry; | ||
| 119 | const int *saved_vector; | ||
| 120 | |||
| 121 | ramvec = get_vector_address(); | ||
| 122 | if (ramvec == NULL) | ||
| 123 | panic("interrupt vector serup failed."); | ||
| 124 | else | ||
| 125 | printk(KERN_INFO "virtual vector at 0x%08lx\n",(unsigned long)ramvec); | ||
| 126 | |||
| 127 | /* create redirect table */ | ||
| 128 | ramvec_p = ramvec; | ||
| 129 | trap_entry = h8300_trap_table; | ||
| 130 | saved_vector = h8300_saved_vectors; | ||
| 131 | for ( i = 0; i < NR_IRQS; i++) { | ||
| 132 | if (i == *saved_vector) { | ||
| 133 | ramvec_p++; | ||
| 134 | saved_vector++; | ||
| 135 | } else { | ||
| 136 | if ( i < NR_TRAPS ) { | ||
| 137 | if (*trap_entry) | ||
| 138 | *ramvec_p = VECTOR(*trap_entry); | ||
| 139 | ramvec_p++; | ||
| 140 | trap_entry++; | ||
| 141 | } else | ||
| 142 | *ramvec_p++ = REDIRECT(interrupt_entry); | ||
| 143 | } | ||
| 144 | } | ||
| 145 | interrupt_redirect_table = ramvec; | ||
| 146 | #ifdef DEBUG | ||
| 147 | ramvec_p = ramvec; | ||
| 148 | for (i = 0; i < NR_IRQS; i++) { | ||
| 149 | if ((i % 8) == 0) | ||
| 150 | printk(KERN_DEBUG "\n%p: ",ramvec_p); | ||
| 151 | printk(KERN_DEBUG "%p ",*ramvec_p); | ||
| 152 | ramvec_p++; | ||
| 153 | } | ||
| 154 | printk(KERN_DEBUG "\n"); | ||
| 155 | #endif | ||
| 156 | } | ||
| 157 | #else | ||
| 158 | #define setup_vector() do { } while(0) | ||
| 159 | #endif | ||
| 160 | |||
| 161 | void __init init_IRQ(void) | ||
| 162 | { | ||
| 163 | int c; | ||
| 164 | |||
| 165 | setup_vector(); | ||
| 166 | |||
| 167 | for (c = 0; c < NR_IRQS; c++) { | ||
| 168 | irq_desc[c].status = IRQ_DISABLED; | ||
| 169 | irq_desc[c].action = NULL; | ||
| 170 | irq_desc[c].depth = 1; | ||
| 171 | irq_desc[c].chip = &h8300irq_chip; | ||
| 172 | } | ||
| 173 | } | ||
| 174 | |||
| 175 | asmlinkage void do_IRQ(int irq) | ||
| 176 | { | ||
| 177 | irq_enter(); | ||
| 178 | __do_IRQ(irq); | ||
| 179 | irq_exit(); | ||
| 180 | } | ||
| 181 | |||
| 182 | #if defined(CONFIG_PROC_FS) | ||
| 183 | int show_interrupts(struct seq_file *p, void *v) | ||
| 184 | { | ||
| 185 | int i = *(loff_t *) v, j; | ||
| 186 | struct irqaction * action; | ||
| 187 | unsigned long flags; | ||
| 188 | |||
| 189 | if (i == 0) | ||
| 190 | seq_puts(p, " CPU0"); | ||
| 191 | |||
| 192 | if (i < NR_IRQS) { | ||
| 193 | spin_lock_irqsave(&irq_desc[i].lock, flags); | ||
| 194 | action = irq_desc[i].action; | ||
| 195 | if (!action) | ||
| 196 | goto unlock; | ||
| 197 | seq_printf(p, "%3d: ",i); | ||
| 198 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | ||
| 199 | seq_printf(p, " %14s", irq_desc[i].chip->name); | ||
| 200 | seq_printf(p, "-%-8s", irq_desc[i].name); | ||
| 201 | seq_printf(p, " %s", action->name); | ||
| 202 | |||
| 203 | for (action=action->next; action; action = action->next) | ||
| 204 | seq_printf(p, ", %s", action->name); | ||
| 205 | seq_putc(p, '\n'); | ||
| 206 | unlock: | ||
| 207 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | ||
| 208 | } | ||
| 209 | return 0; | ||
| 210 | } | ||
| 211 | #endif | ||
diff --git a/arch/h8300/kernel/setup.c b/arch/h8300/kernel/setup.c index 313cd8081044..b2e86d0255e6 100644 --- a/arch/h8300/kernel/setup.c +++ b/arch/h8300/kernel/setup.c | |||
| @@ -33,10 +33,7 @@ | |||
| 33 | 33 | ||
| 34 | #include <asm/setup.h> | 34 | #include <asm/setup.h> |
| 35 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
| 36 | |||
| 37 | #ifdef CONFIG_BLK_DEV_INITRD | ||
| 38 | #include <asm/pgtable.h> | 36 | #include <asm/pgtable.h> |
| 39 | #endif | ||
| 40 | 37 | ||
| 41 | #if defined(__H8300H__) | 38 | #if defined(__H8300H__) |
| 42 | #define CPU "H8/300H" | 39 | #define CPU "H8/300H" |
diff --git a/arch/h8300/kernel/time.c b/arch/h8300/kernel/time.c index 91d3b56ddc68..330638220a2e 100644 --- a/arch/h8300/kernel/time.c +++ b/arch/h8300/kernel/time.c | |||
| @@ -44,7 +44,7 @@ static void timer_interrupt(int irq, void *dummy, struct pt_regs * regs) | |||
| 44 | #ifndef CONFIG_SMP | 44 | #ifndef CONFIG_SMP |
| 45 | update_process_times(user_mode(regs)); | 45 | update_process_times(user_mode(regs)); |
| 46 | #endif | 46 | #endif |
| 47 | profile_tick(CPU_PROFILING, regs); | 47 | profile_tick(CPU_PROFILING); |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | void time_init(void) | 50 | void time_init(void) |
diff --git a/arch/h8300/mm/kmap.c b/arch/h8300/mm/kmap.c index 26ab17286a53..5c7af09ae8d1 100644 --- a/arch/h8300/mm/kmap.c +++ b/arch/h8300/mm/kmap.c | |||
| @@ -24,12 +24,14 @@ | |||
| 24 | 24 | ||
| 25 | #undef DEBUG | 25 | #undef DEBUG |
| 26 | 26 | ||
| 27 | #define VIRT_OFFSET (0x01000000) | ||
| 28 | |||
| 27 | /* | 29 | /* |
| 28 | * Map some physical address range into the kernel address space. | 30 | * Map some physical address range into the kernel address space. |
| 29 | */ | 31 | */ |
| 30 | void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag) | 32 | void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag) |
| 31 | { | 33 | { |
| 32 | return (void *)physaddr; | 34 | return (void *)(physaddr + VIRT_OFFSET); |
| 33 | } | 35 | } |
| 34 | 36 | ||
| 35 | /* | 37 | /* |
diff --git a/arch/h8300/platform/h8300h/Makefile b/arch/h8300/platform/h8300h/Makefile index 5d42c772f75a..b24ea08aa0a7 100644 --- a/arch/h8300/platform/h8300h/Makefile +++ b/arch/h8300/platform/h8300h/Makefile | |||
| @@ -4,4 +4,4 @@ | |||
| 4 | # Reuse any files we can from the H8/300H | 4 | # Reuse any files we can from the H8/300H |
| 5 | # | 5 | # |
| 6 | 6 | ||
| 7 | obj-y := entry.o ints_h8300h.o ptrace_h8300h.o | 7 | obj-y := entry.o irq_pin.o ptrace_h8300h.o |
diff --git a/arch/h8300/platform/h8300h/entry.S b/arch/h8300/platform/h8300h/entry.S index d2dea2432fb2..f86ac3b5d4de 100644 --- a/arch/h8300/platform/h8300h/entry.S +++ b/arch/h8300/platform/h8300h/entry.S | |||
| @@ -30,12 +30,12 @@ | |||
| 30 | mov.l er0,@-sp | 30 | mov.l er0,@-sp |
| 31 | 31 | ||
| 32 | stc ccr,r0l /* check kernel mode */ | 32 | stc ccr,r0l /* check kernel mode */ |
| 33 | orc #0x10,ccr | ||
| 34 | btst #4,r0l | 33 | btst #4,r0l |
| 35 | bne 5f | 34 | bne 5f |
| 36 | 35 | ||
| 37 | mov.l sp,@SYMBOL_NAME(sw_usp) /* user mode */ | 36 | mov.l sp,@SYMBOL_NAME(sw_usp) /* user mode */ |
| 38 | mov.l @sp,er0 | 37 | mov.l @sp,er0 |
| 38 | orc #0x10,ccr | ||
| 39 | mov.l @SYMBOL_NAME(sw_ksp),sp | 39 | mov.l @SYMBOL_NAME(sw_ksp),sp |
| 40 | sub.l #(LRET-LORIG),sp /* allocate LORIG - LRET */ | 40 | sub.l #(LRET-LORIG),sp /* allocate LORIG - LRET */ |
| 41 | mov.l er0,@-sp | 41 | mov.l er0,@-sp |
| @@ -165,7 +165,7 @@ SYMBOL_NAME_LABEL(interrupt_entry) | |||
| 165 | dec.l #1,er0 | 165 | dec.l #1,er0 |
| 166 | mov.l sp,er1 | 166 | mov.l sp,er1 |
| 167 | subs #4,er1 /* adjust ret_pc */ | 167 | subs #4,er1 /* adjust ret_pc */ |
| 168 | jsr @SYMBOL_NAME(process_int) | 168 | jsr @SYMBOL_NAME(do_IRQ) |
| 169 | mov.l @SYMBOL_NAME(irq_stat)+CPUSTAT_SOFTIRQ_PENDING,er0 | 169 | mov.l @SYMBOL_NAME(irq_stat)+CPUSTAT_SOFTIRQ_PENDING,er0 |
| 170 | beq 1f | 170 | beq 1f |
| 171 | jsr @SYMBOL_NAME(do_softirq) | 171 | jsr @SYMBOL_NAME(do_softirq) |
diff --git a/arch/h8300/platform/h8300h/generic/Makefile b/arch/h8300/platform/h8300h/generic/Makefile index b6ea7688a616..32b964a9010e 100644 --- a/arch/h8300/platform/h8300h/generic/Makefile +++ b/arch/h8300/platform/h8300h/generic/Makefile | |||
| @@ -2,5 +2,5 @@ | |||
| 2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | extra-y := crt0_$(MODEL).o | ||
| 5 | obj-y := timer.o | 6 | obj-y := timer.o |
| 6 | extra-y = crt0_$(MODEL).o | ||
diff --git a/arch/h8300/platform/h8300h/ints_h8300h.c b/arch/h8300/platform/h8300h/ints_h8300h.c deleted file mode 100644 index f1777119b871..000000000000 --- a/arch/h8300/platform/h8300h/ints_h8300h.c +++ /dev/null | |||
| @@ -1,85 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/h8300/platform/h8300h/ints_h8300h.c | ||
| 3 | * Interrupt handling CPU variants | ||
| 4 | * | ||
| 5 | * Yoshinori Sato <ysato@users.sourceforge.jp> | ||
| 6 | * | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/init.h> | ||
| 10 | #include <linux/errno.h> | ||
| 11 | |||
| 12 | #include <asm/ptrace.h> | ||
| 13 | #include <asm/traps.h> | ||
| 14 | #include <asm/irq.h> | ||
| 15 | #include <asm/io.h> | ||
| 16 | #include <asm/gpio.h> | ||
| 17 | #include <asm/regs306x.h> | ||
| 18 | |||
| 19 | /* saved vector list */ | ||
| 20 | const int __initdata h8300_saved_vectors[]={ | ||
| 21 | #if defined(CONFIG_GDB_DEBUG) | ||
| 22 | TRAP3_VEC, | ||
| 23 | #endif | ||
| 24 | -1 | ||
| 25 | }; | ||
| 26 | |||
| 27 | /* trap entry table */ | ||
| 28 | const unsigned long __initdata h8300_trap_table[NR_TRAPS]={ | ||
| 29 | 0,0,0,0,0,0,0,0, | ||
| 30 | (unsigned long)system_call, /* TRAPA #0 */ | ||
| 31 | 0,0, | ||
| 32 | (unsigned long)trace_break, /* TRAPA #3 */ | ||
| 33 | }; | ||
| 34 | |||
| 35 | int h8300_enable_irq_pin(unsigned int irq) | ||
| 36 | { | ||
| 37 | int bitmask; | ||
| 38 | if (irq < EXT_IRQ0 || irq > EXT_IRQ5) | ||
| 39 | return 0; | ||
| 40 | |||
| 41 | /* initialize IRQ pin */ | ||
| 42 | bitmask = 1 << (irq - EXT_IRQ0); | ||
| 43 | switch(irq) { | ||
| 44 | case EXT_IRQ0: | ||
| 45 | case EXT_IRQ1: | ||
| 46 | case EXT_IRQ2: | ||
| 47 | case EXT_IRQ3: | ||
| 48 | if (H8300_GPIO_RESERVE(H8300_GPIO_P8, bitmask) == 0) | ||
| 49 | return -EBUSY; | ||
| 50 | H8300_GPIO_DDR(H8300_GPIO_P8, bitmask, H8300_GPIO_INPUT); | ||
| 51 | break; | ||
| 52 | case EXT_IRQ4: | ||
| 53 | case EXT_IRQ5: | ||
| 54 | if (H8300_GPIO_RESERVE(H8300_GPIO_P9, bitmask) == 0) | ||
| 55 | return -EBUSY; | ||
| 56 | H8300_GPIO_DDR(H8300_GPIO_P9, bitmask, H8300_GPIO_INPUT); | ||
| 57 | break; | ||
| 58 | } | ||
| 59 | |||
| 60 | return 0; | ||
| 61 | } | ||
| 62 | |||
| 63 | void h8300_disable_irq_pin(unsigned int irq) | ||
| 64 | { | ||
| 65 | int bitmask; | ||
| 66 | if (irq < EXT_IRQ0 || irq > EXT_IRQ5) | ||
| 67 | return; | ||
| 68 | |||
| 69 | /* disable interrupt & release IRQ pin */ | ||
| 70 | bitmask = 1 << (irq - EXT_IRQ0); | ||
| 71 | switch(irq) { | ||
| 72 | case EXT_IRQ0: | ||
| 73 | case EXT_IRQ1: | ||
| 74 | case EXT_IRQ2: | ||
| 75 | case EXT_IRQ3: | ||
| 76 | *(volatile unsigned char *)IER &= ~bitmask; | ||
| 77 | H8300_GPIO_FREE(H8300_GPIO_P8, bitmask); | ||
| 78 | break ; | ||
| 79 | case EXT_IRQ4: | ||
| 80 | case EXT_IRQ5: | ||
| 81 | *(volatile unsigned char *)IER &= ~bitmask; | ||
| 82 | H8300_GPIO_FREE(H8300_GPIO_P9, bitmask); | ||
| 83 | break; | ||
| 84 | } | ||
| 85 | } | ||
diff --git a/arch/h8300/platform/h8s/entry.S b/arch/h8300/platform/h8s/entry.S index aeb2e9faa9b2..f3d6b8e8f959 100644 --- a/arch/h8300/platform/h8s/entry.S +++ b/arch/h8300/platform/h8s/entry.S | |||
| @@ -31,12 +31,13 @@ | |||
| 31 | mov.l er0,@-sp | 31 | mov.l er0,@-sp |
| 32 | 32 | ||
| 33 | stc ccr,r0l /* check kernel mode */ | 33 | stc ccr,r0l /* check kernel mode */ |
| 34 | orc #0x10,ccr | ||
| 35 | btst #4,r0l | 34 | btst #4,r0l |
| 36 | bne 5f | 35 | bne 5f |
| 37 | 36 | ||
| 38 | mov.l sp,@SYMBOL_NAME(sw_usp) /* user mode */ | 37 | /* user mode */ |
| 39 | mov.l @sp,er0 | 38 | mov.l sp,@SYMBOL_NAME(sw_usp) |
| 39 | mov.l @sp,er0 /* restore saved er0 */ | ||
| 40 | orc #0x10,ccr /* switch kernel stack */ | ||
| 40 | mov.l @SYMBOL_NAME(sw_ksp),sp | 41 | mov.l @SYMBOL_NAME(sw_ksp),sp |
| 41 | sub.l #(LRET-LORIG),sp /* allocate LORIG - LRET */ | 42 | sub.l #(LRET-LORIG),sp /* allocate LORIG - LRET */ |
| 42 | stm.l er0-er3,@-sp | 43 | stm.l er0-er3,@-sp |
| @@ -55,8 +56,9 @@ | |||
| 55 | mov.l er0,@(LER0-LER3:16,sp) /* copy ER0 */ | 56 | mov.l er0,@(LER0-LER3:16,sp) /* copy ER0 */ |
| 56 | bra 6f | 57 | bra 6f |
| 57 | 5: | 58 | 5: |
| 58 | mov.l @sp,er0 /* kernel mode */ | 59 | /* kernel mode */ |
| 59 | subs #2,sp /* dummy ccr */ | 60 | mov.l @sp,er0 /* restore saved er0 */ |
| 61 | subs #2,sp /* set dummy ccr */ | ||
| 60 | stm.l er0-er3,@-sp | 62 | stm.l er0-er3,@-sp |
| 61 | mov.w @(LRET-LER3:16,sp),r1 /* copy old ccr */ | 63 | mov.w @(LRET-LER3:16,sp),r1 /* copy old ccr */ |
| 62 | mov.b r1h,r1l | 64 | mov.b r1h,r1l |
| @@ -94,6 +96,7 @@ | |||
| 94 | mov.l @sp+,er1 | 96 | mov.l @sp+,er1 |
| 95 | add.l #(LRET-LER1),sp /* remove LORIG - LRET */ | 97 | add.l #(LRET-LER1),sp /* remove LORIG - LRET */ |
| 96 | mov.l sp,@SYMBOL_NAME(sw_ksp) | 98 | mov.l sp,@SYMBOL_NAME(sw_ksp) |
| 99 | andc #0xef,ccr /* switch to user mode */ | ||
| 97 | mov.l er0,sp | 100 | mov.l er0,sp |
| 98 | bra 8f | 101 | bra 8f |
| 99 | 7: | 102 | 7: |
| @@ -173,9 +176,6 @@ SYMBOL_NAME_LABEL(interrupt_entry) | |||
| 173 | SYMBOL_NAME_LABEL(system_call) | 176 | SYMBOL_NAME_LABEL(system_call) |
| 174 | subs #4,sp /* dummy LVEC */ | 177 | subs #4,sp /* dummy LVEC */ |
| 175 | SAVE_ALL | 178 | SAVE_ALL |
| 176 | mov.w @(LCCR:16,sp),r1 | ||
| 177 | bset #4,r1l | ||
| 178 | ldc r1l,ccr /* restore ccr */ | ||
| 179 | mov.l er0,er4 | 179 | mov.l er0,er4 |
| 180 | mov.l #-ENOSYS,er0 | 180 | mov.l #-ENOSYS,er0 |
| 181 | mov.l er0,@(LER0:16,sp) | 181 | mov.l er0,@(LER0:16,sp) |
| @@ -198,6 +198,7 @@ SYMBOL_NAME_LABEL(system_call) | |||
| 198 | mov.l @(LER1:16,sp),er0 | 198 | mov.l @(LER1:16,sp),er0 |
| 199 | mov.l @(LER2:16,sp),er1 | 199 | mov.l @(LER2:16,sp),er1 |
| 200 | mov.l @(LER3:16,sp),er2 | 200 | mov.l @(LER3:16,sp),er2 |
| 201 | andc #0x7f,ccr | ||
| 201 | jsr @er4 | 202 | jsr @er4 |
| 202 | mov.l er0,@(LER0:16,sp) /* save the return value */ | 203 | mov.l er0,@(LER0:16,sp) /* save the return value */ |
| 203 | #if defined(CONFIG_SYSCALL_PRINT) | 204 | #if defined(CONFIG_SYSCALL_PRINT) |
diff --git a/include/asm-h8300/irq.h b/include/asm-h8300/irq.h index 42a3ac424a9e..41be646c3514 100644 --- a/include/asm-h8300/irq.h +++ b/include/asm-h8300/irq.h | |||
| @@ -61,6 +61,5 @@ static __inline__ int irq_canonicalize(int irq) | |||
| 61 | 61 | ||
| 62 | extern void enable_irq(unsigned int); | 62 | extern void enable_irq(unsigned int); |
| 63 | extern void disable_irq(unsigned int); | 63 | extern void disable_irq(unsigned int); |
| 64 | #define disable_irq_nosync(x) disable_irq(x) | ||
| 65 | 64 | ||
| 66 | #endif /* _H8300_IRQ_H_ */ | 65 | #endif /* _H8300_IRQ_H_ */ |
diff --git a/include/asm-h8300/irq_regs.h b/include/asm-h8300/irq_regs.h new file mode 100644 index 000000000000..3dd9c0b70270 --- /dev/null +++ b/include/asm-h8300/irq_regs.h | |||
| @@ -0,0 +1 @@ | |||
| #include <asm-generic/irq_regs.h> | |||
diff --git a/include/asm-h8300/pgtable.h b/include/asm-h8300/pgtable.h index 8b7c6857998b..ddd07f485dd8 100644 --- a/include/asm-h8300/pgtable.h +++ b/include/asm-h8300/pgtable.h | |||
| @@ -73,4 +73,5 @@ extern int is_in_rom(unsigned long); | |||
| 73 | #define VMALLOC_START 0 | 73 | #define VMALLOC_START 0 |
| 74 | #define VMALLOC_END 0xffffffff | 74 | #define VMALLOC_END 0xffffffff |
| 75 | 75 | ||
| 76 | #define arch_enter_lazy_cpu_mode() do {} while (0) | ||
| 76 | #endif /* _H8300_PGTABLE_H */ | 77 | #endif /* _H8300_PGTABLE_H */ |
