diff options
author | Paul Mundt <lethal@linux-sh.org> | 2010-05-25 07:06:13 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2010-06-02 03:31:42 -0400 |
commit | 86e4dd5add77ab809f5427391dfabb8f78cbcb58 (patch) | |
tree | 43d2c40951df78d5404a72da214f8c8a788d3de3 /arch/sh | |
parent | 1c98347e613bf17ea2f18c9766ce0ab77f65a96d (diff) |
sh: support for platforms without PIO.
This extends some of the existing special casing for HAS_IOPORT
platforms and gets it to the point where platforms can begin to
conditionally select it.
The major changes here are that the PIO routines themselves go away
completely, including all of the machvec port mapping wrappers. With this
in place it's possible for any non-machvec abusing platform to disable
PIO completely. At present this is left as an opt-in until the abusers
are the odd ones out instead of the majority.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh')
-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 0e318c905eea..1eef24d04bbf 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 f689554e17c1..b237d525d592 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 bc0218cb72e1..a0b0cf79cf8a 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 650b92f00ee5..e25f3c69525d 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 4770c241c679..5c51b794ba2a 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 e1e1dbd19557..447d78f666f9 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 4a8bb4eeb8ad..2947d2bd1291 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 85cfaf916fdc..9f9bb63616ad 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 | } |