diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/sh/Kconfig | 5 | ||||
| -rw-r--r-- | arch/sh/include/asm/io.h | 8 | ||||
| -rw-r--r-- | arch/sh/include/asm/machvec.h | 9 | ||||
| -rw-r--r-- | arch/sh/kernel/Makefile | 3 | ||||
| -rw-r--r-- | arch/sh/kernel/io.c | 22 | ||||
| -rw-r--r-- | arch/sh/kernel/io_generic.c | 20 | ||||
| -rw-r--r-- | arch/sh/kernel/io_trapped.c | 4 | ||||
| -rw-r--r-- | arch/sh/kernel/machvec.c | 17 |
8 files changed, 54 insertions, 34 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 0e318c905ee..1eef24d04bb 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
| @@ -9,7 +9,7 @@ config SUPERH | |||
| 9 | def_bool y | 9 | def_bool y |
| 10 | select EMBEDDED | 10 | select EMBEDDED |
| 11 | select HAVE_CLK | 11 | select HAVE_CLK |
| 12 | select HAVE_IDE | 12 | select HAVE_IDE if HAS_IOPORT |
| 13 | select HAVE_LMB | 13 | select HAVE_LMB |
| 14 | select HAVE_OPROFILE | 14 | select HAVE_OPROFILE |
| 15 | select HAVE_GENERIC_DMA_COHERENT | 15 | select HAVE_GENERIC_DMA_COHERENT |
| @@ -174,6 +174,9 @@ config ARCH_HAS_DEFAULT_IDLE | |||
| 174 | config ARCH_HAS_CPU_IDLE_WAIT | 174 | config ARCH_HAS_CPU_IDLE_WAIT |
| 175 | def_bool y | 175 | def_bool y |
| 176 | 176 | ||
| 177 | config NO_IOPORT | ||
| 178 | bool | ||
| 179 | |||
| 177 | config IO_TRAPPED | 180 | config IO_TRAPPED |
| 178 | bool | 181 | bool |
| 179 | 182 | ||
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h index f689554e17c..b237d525d59 100644 --- a/arch/sh/include/asm/io.h +++ b/arch/sh/include/asm/io.h | |||
| @@ -39,6 +39,8 @@ | |||
| 39 | #include <asm/io_generic.h> | 39 | #include <asm/io_generic.h> |
| 40 | #include <asm/io_trapped.h> | 40 | #include <asm/io_trapped.h> |
| 41 | 41 | ||
| 42 | #ifdef CONFIG_HAS_IOPORT | ||
| 43 | |||
| 42 | #define inb(p) sh_mv.mv_inb((p)) | 44 | #define inb(p) sh_mv.mv_inb((p)) |
| 43 | #define inw(p) sh_mv.mv_inw((p)) | 45 | #define inw(p) sh_mv.mv_inw((p)) |
| 44 | #define inl(p) sh_mv.mv_inl((p)) | 46 | #define inl(p) sh_mv.mv_inl((p)) |
| @@ -60,6 +62,8 @@ | |||
| 60 | #define outsw(p,b,c) sh_mv.mv_outsw((p), (b), (c)) | 62 | #define outsw(p,b,c) sh_mv.mv_outsw((p), (b), (c)) |
| 61 | #define outsl(p,b,c) sh_mv.mv_outsl((p), (b), (c)) | 63 | #define outsl(p,b,c) sh_mv.mv_outsl((p), (b), (c)) |
| 62 | 64 | ||
| 65 | #endif | ||
| 66 | |||
| 63 | #define __raw_writeb(v,a) (__chk_io_ptr(a), *(volatile u8 __force *)(a) = (v)) | 67 | #define __raw_writeb(v,a) (__chk_io_ptr(a), *(volatile u8 __force *)(a) = (v)) |
| 64 | #define __raw_writew(v,a) (__chk_io_ptr(a), *(volatile u16 __force *)(a) = (v)) | 68 | #define __raw_writew(v,a) (__chk_io_ptr(a), *(volatile u16 __force *)(a) = (v)) |
| 65 | #define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile u32 __force *)(a) = (v)) | 69 | #define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile u32 __force *)(a) = (v)) |
| @@ -240,6 +244,8 @@ __BUILD_MEMORY_STRING(q, u64) | |||
| 240 | 244 | ||
| 241 | #define IO_SPACE_LIMIT 0xffffffff | 245 | #define IO_SPACE_LIMIT 0xffffffff |
| 242 | 246 | ||
| 247 | #ifdef CONFIG_HAS_IOPORT | ||
| 248 | |||
| 243 | /* | 249 | /* |
| 244 | * This function provides a method for the generic case where a | 250 | * This function provides a method for the generic case where a |
| 245 | * board-specific ioport_map simply needs to return the port + some | 251 | * board-specific ioport_map simply needs to return the port + some |
| @@ -255,6 +261,8 @@ static inline void __set_io_port_base(unsigned long pbase) | |||
| 255 | 261 | ||
| 256 | #define __ioport_map(p, n) sh_mv.mv_ioport_map((p), (n)) | 262 | #define __ioport_map(p, n) sh_mv.mv_ioport_map((p), (n)) |
| 257 | 263 | ||
| 264 | #endif | ||
| 265 | |||
| 258 | /* We really want to try and get these to memcpy etc */ | 266 | /* We really want to try and get these to memcpy etc */ |
| 259 | void memcpy_fromio(void *, const volatile void __iomem *, unsigned long); | 267 | void memcpy_fromio(void *, const volatile void __iomem *, unsigned long); |
| 260 | void memcpy_toio(volatile void __iomem *, const void *, unsigned long); | 268 | void memcpy_toio(volatile void __iomem *, const void *, unsigned long); |
diff --git a/arch/sh/include/asm/machvec.h b/arch/sh/include/asm/machvec.h index bc0218cb72e..a0b0cf79cf8 100644 --- a/arch/sh/include/asm/machvec.h +++ b/arch/sh/include/asm/machvec.h | |||
| @@ -19,6 +19,10 @@ struct sh_machine_vector { | |||
| 19 | const char *mv_name; | 19 | const char *mv_name; |
| 20 | int mv_nr_irqs; | 20 | int mv_nr_irqs; |
| 21 | 21 | ||
| 22 | int (*mv_irq_demux)(int irq); | ||
| 23 | void (*mv_init_irq)(void); | ||
| 24 | |||
| 25 | #ifdef CONFIG_HAS_IOPORT | ||
| 22 | u8 (*mv_inb)(unsigned long); | 26 | u8 (*mv_inb)(unsigned long); |
| 23 | u16 (*mv_inw)(unsigned long); | 27 | u16 (*mv_inw)(unsigned long); |
| 24 | u32 (*mv_inl)(unsigned long); | 28 | u32 (*mv_inl)(unsigned long); |
| @@ -40,12 +44,9 @@ struct sh_machine_vector { | |||
| 40 | void (*mv_outsw)(unsigned long, const void *src, unsigned long count); | 44 | void (*mv_outsw)(unsigned long, const void *src, unsigned long count); |
| 41 | void (*mv_outsl)(unsigned long, const void *src, unsigned long count); | 45 | void (*mv_outsl)(unsigned long, const void *src, unsigned long count); |
| 42 | 46 | ||
| 43 | int (*mv_irq_demux)(int irq); | ||
| 44 | |||
| 45 | void (*mv_init_irq)(void); | ||
| 46 | |||
| 47 | void __iomem *(*mv_ioport_map)(unsigned long port, unsigned int size); | 47 | void __iomem *(*mv_ioport_map)(unsigned long port, unsigned int size); |
| 48 | void (*mv_ioport_unmap)(void __iomem *); | 48 | void (*mv_ioport_unmap)(void __iomem *); |
| 49 | #endif | ||
| 49 | 50 | ||
| 50 | int (*mv_clk_init)(void); | 51 | int (*mv_clk_init)(void); |
| 51 | int (*mv_mode_pins)(void); | 52 | int (*mv_mode_pins)(void); |
diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile index 650b92f00ee..e25f3c69525 100644 --- a/arch/sh/kernel/Makefile +++ b/arch/sh/kernel/Makefile | |||
| @@ -12,7 +12,7 @@ endif | |||
| 12 | CFLAGS_REMOVE_return_address.o = -pg | 12 | CFLAGS_REMOVE_return_address.o = -pg |
| 13 | 13 | ||
| 14 | obj-y := clkdev.o debugtraps.o dma-nommu.o dumpstack.o \ | 14 | obj-y := clkdev.o debugtraps.o dma-nommu.o dumpstack.o \ |
| 15 | idle.o io.o io_generic.o irq.o \ | 15 | idle.o io.o irq.o \ |
| 16 | irq_$(BITS).o machvec.o nmi_debug.o process.o \ | 16 | irq_$(BITS).o machvec.o nmi_debug.o process.o \ |
| 17 | process_$(BITS).o ptrace_$(BITS).o \ | 17 | process_$(BITS).o ptrace_$(BITS).o \ |
| 18 | reboot.o return_address.o \ | 18 | reboot.o return_address.o \ |
| @@ -39,6 +39,7 @@ obj-$(CONFIG_DUMP_CODE) += disassemble.o | |||
| 39 | obj-$(CONFIG_HIBERNATION) += swsusp.o | 39 | obj-$(CONFIG_HIBERNATION) += swsusp.o |
| 40 | obj-$(CONFIG_DWARF_UNWINDER) += dwarf.o | 40 | obj-$(CONFIG_DWARF_UNWINDER) += dwarf.o |
| 41 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_callchain.o | 41 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_callchain.o |
| 42 | obj-$(CONFIG_HAS_IOPORT) += io_generic.o | ||
| 42 | 43 | ||
| 43 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o | 44 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o |
| 44 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += localtimer.o | 45 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += localtimer.o |
diff --git a/arch/sh/kernel/io.c b/arch/sh/kernel/io.c index 4770c241c67..5c51b794ba2 100644 --- a/arch/sh/kernel/io.c +++ b/arch/sh/kernel/io.c | |||
| @@ -112,25 +112,3 @@ void memset_io(volatile void __iomem *dst, int c, unsigned long count) | |||
| 112 | } | 112 | } |
| 113 | } | 113 | } |
| 114 | EXPORT_SYMBOL(memset_io); | 114 | EXPORT_SYMBOL(memset_io); |
| 115 | |||
| 116 | #ifndef CONFIG_GENERIC_IOMAP | ||
| 117 | |||
| 118 | void __iomem *ioport_map(unsigned long port, unsigned int nr) | ||
| 119 | { | ||
| 120 | void __iomem *ret; | ||
| 121 | |||
| 122 | ret = __ioport_map_trapped(port, nr); | ||
| 123 | if (ret) | ||
| 124 | return ret; | ||
| 125 | |||
| 126 | return __ioport_map(port, nr); | ||
| 127 | } | ||
| 128 | EXPORT_SYMBOL(ioport_map); | ||
| 129 | |||
| 130 | void ioport_unmap(void __iomem *addr) | ||
| 131 | { | ||
| 132 | sh_mv.mv_ioport_unmap(addr); | ||
| 133 | } | ||
| 134 | EXPORT_SYMBOL(ioport_unmap); | ||
| 135 | |||
| 136 | #endif /* CONFIG_GENERIC_IOMAP */ | ||
diff --git a/arch/sh/kernel/io_generic.c b/arch/sh/kernel/io_generic.c index e1e1dbd1955..447d78f666f 100644 --- a/arch/sh/kernel/io_generic.c +++ b/arch/sh/kernel/io_generic.c | |||
| @@ -158,3 +158,23 @@ void __iomem *generic_ioport_map(unsigned long addr, unsigned int size) | |||
| 158 | void generic_ioport_unmap(void __iomem *addr) | 158 | void generic_ioport_unmap(void __iomem *addr) |
| 159 | { | 159 | { |
| 160 | } | 160 | } |
| 161 | |||
| 162 | #ifndef CONFIG_GENERIC_IOMAP | ||
| 163 | void __iomem *ioport_map(unsigned long port, unsigned int nr) | ||
| 164 | { | ||
| 165 | void __iomem *ret; | ||
| 166 | |||
| 167 | ret = __ioport_map_trapped(port, nr); | ||
| 168 | if (ret) | ||
| 169 | return ret; | ||
| 170 | |||
| 171 | return __ioport_map(port, nr); | ||
| 172 | } | ||
| 173 | EXPORT_SYMBOL(ioport_map); | ||
| 174 | |||
| 175 | void ioport_unmap(void __iomem *addr) | ||
| 176 | { | ||
| 177 | sh_mv.mv_ioport_unmap(addr); | ||
| 178 | } | ||
| 179 | EXPORT_SYMBOL(ioport_unmap); | ||
| 180 | #endif /* CONFIG_GENERIC_IOMAP */ | ||
diff --git a/arch/sh/kernel/io_trapped.c b/arch/sh/kernel/io_trapped.c index 4a8bb4eeb8a..2947d2bd129 100644 --- a/arch/sh/kernel/io_trapped.c +++ b/arch/sh/kernel/io_trapped.c | |||
| @@ -91,10 +91,14 @@ int register_trapped_io(struct trapped_io *tiop) | |||
| 91 | tiop->magic = IO_TRAPPED_MAGIC; | 91 | tiop->magic = IO_TRAPPED_MAGIC; |
| 92 | INIT_LIST_HEAD(&tiop->list); | 92 | INIT_LIST_HEAD(&tiop->list); |
| 93 | spin_lock_irq(&trapped_lock); | 93 | spin_lock_irq(&trapped_lock); |
| 94 | #ifdef CONFIG_HAS_IOPORT | ||
| 94 | if (flags & IORESOURCE_IO) | 95 | if (flags & IORESOURCE_IO) |
| 95 | list_add(&tiop->list, &trapped_io); | 96 | list_add(&tiop->list, &trapped_io); |
| 97 | #endif | ||
| 98 | #ifdef CONFIG_HAS_IOMEM | ||
| 96 | if (flags & IORESOURCE_MEM) | 99 | if (flags & IORESOURCE_MEM) |
| 97 | list_add(&tiop->list, &trapped_mem); | 100 | list_add(&tiop->list, &trapped_mem); |
| 101 | #endif | ||
| 98 | spin_unlock_irq(&trapped_lock); | 102 | spin_unlock_irq(&trapped_lock); |
| 99 | 103 | ||
| 100 | return 0; | 104 | return 0; |
diff --git a/arch/sh/kernel/machvec.c b/arch/sh/kernel/machvec.c index 85cfaf916fd..9f9bb63616a 100644 --- a/arch/sh/kernel/machvec.c +++ b/arch/sh/kernel/machvec.c | |||
| @@ -118,6 +118,14 @@ void __init sh_mv_setup(void) | |||
| 118 | sh_mv.mv_##elem = generic_##elem; \ | 118 | sh_mv.mv_##elem = generic_##elem; \ |
| 119 | } while (0) | 119 | } while (0) |
| 120 | 120 | ||
| 121 | #ifdef CONFIG_HAS_IOPORT | ||
| 122 | |||
| 123 | #ifdef P2SEG | ||
| 124 | __set_io_port_base(P2SEG); | ||
| 125 | #else | ||
| 126 | __set_io_port_base(0); | ||
| 127 | #endif | ||
| 128 | |||
| 121 | mv_set(inb); mv_set(inw); mv_set(inl); | 129 | mv_set(inb); mv_set(inw); mv_set(inl); |
| 122 | mv_set(outb); mv_set(outw); mv_set(outl); | 130 | mv_set(outb); mv_set(outw); mv_set(outl); |
| 123 | 131 | ||
| @@ -129,16 +137,13 @@ void __init sh_mv_setup(void) | |||
| 129 | 137 | ||
| 130 | mv_set(ioport_map); | 138 | mv_set(ioport_map); |
| 131 | mv_set(ioport_unmap); | 139 | mv_set(ioport_unmap); |
| 140 | |||
| 141 | #endif | ||
| 142 | |||
| 132 | mv_set(irq_demux); | 143 | mv_set(irq_demux); |
| 133 | mv_set(mode_pins); | 144 | mv_set(mode_pins); |
| 134 | mv_set(mem_init); | 145 | mv_set(mem_init); |
| 135 | 146 | ||
| 136 | if (!sh_mv.mv_nr_irqs) | 147 | if (!sh_mv.mv_nr_irqs) |
| 137 | sh_mv.mv_nr_irqs = NR_IRQS; | 148 | sh_mv.mv_nr_irqs = NR_IRQS; |
| 138 | |||
| 139 | #ifdef P2SEG | ||
| 140 | __set_io_port_base(P2SEG); | ||
| 141 | #else | ||
| 142 | __set_io_port_base(0); | ||
| 143 | #endif | ||
| 144 | } | 149 | } |
