Commit 86e4dd5add77ab809f5427391dfabb8f78cbcb58

Authored by Paul Mundt
1 parent 1c98347e61

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>

Showing 8 changed files with 54 additions and 34 deletions Side-by-side Diff

... ... @@ -9,7 +9,7 @@
9 9 def_bool y
10 10 select EMBEDDED
11 11 select HAVE_CLK
12   - select HAVE_IDE
  12 + select HAVE_IDE if HAS_IOPORT
13 13 select HAVE_LMB
14 14 select HAVE_OPROFILE
15 15 select HAVE_GENERIC_DMA_COHERENT
... ... @@ -173,6 +173,9 @@
173 173  
174 174 config ARCH_HAS_CPU_IDLE_WAIT
175 175 def_bool y
  176 +
  177 +config NO_IOPORT
  178 + bool
176 179  
177 180 config IO_TRAPPED
178 181 bool
arch/sh/include/asm/io.h
... ... @@ -39,6 +39,8 @@
39 39 #include <asm/io_generic.h>
40 40 #include <asm/io_trapped.h>
41 41  
  42 +#ifdef CONFIG_HAS_IOPORT
  43 +
42 44 #define inb(p) sh_mv.mv_inb((p))
43 45 #define inw(p) sh_mv.mv_inw((p))
44 46 #define inl(p) sh_mv.mv_inl((p))
... ... @@ -60,6 +62,8 @@
60 62 #define outsw(p,b,c) sh_mv.mv_outsw((p), (b), (c))
61 63 #define outsl(p,b,c) sh_mv.mv_outsl((p), (b), (c))
62 64  
  65 +#endif
  66 +
63 67 #define __raw_writeb(v,a) (__chk_io_ptr(a), *(volatile u8 __force *)(a) = (v))
64 68 #define __raw_writew(v,a) (__chk_io_ptr(a), *(volatile u16 __force *)(a) = (v))
65 69 #define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile u32 __force *)(a) = (v))
... ... @@ -240,6 +244,8 @@
240 244  
241 245 #define IO_SPACE_LIMIT 0xffffffff
242 246  
  247 +#ifdef CONFIG_HAS_IOPORT
  248 +
243 249 /*
244 250 * This function provides a method for the generic case where a
245 251 * board-specific ioport_map simply needs to return the port + some
... ... @@ -254,6 +260,8 @@
254 260 }
255 261  
256 262 #define __ioport_map(p, n) sh_mv.mv_ioport_map((p), (n))
  263 +
  264 +#endif
257 265  
258 266 /* We really want to try and get these to memcpy etc */
259 267 void memcpy_fromio(void *, const volatile void __iomem *, unsigned long);
arch/sh/include/asm/machvec.h
... ... @@ -19,6 +19,10 @@
19 19 const char *mv_name;
20 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 26 u8 (*mv_inb)(unsigned long);
23 27 u16 (*mv_inw)(unsigned long);
24 28 u32 (*mv_inl)(unsigned long);
25 29  
... ... @@ -40,12 +44,9 @@
40 44 void (*mv_outsw)(unsigned long, const void *src, unsigned long count);
41 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 47 void __iomem *(*mv_ioport_map)(unsigned long port, unsigned int size);
48 48 void (*mv_ioport_unmap)(void __iomem *);
  49 +#endif
49 50  
50 51 int (*mv_clk_init)(void);
51 52 int (*mv_mode_pins)(void);
arch/sh/kernel/Makefile
... ... @@ -12,7 +12,7 @@
12 12 CFLAGS_REMOVE_return_address.o = -pg
13 13  
14 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 16 irq_$(BITS).o machvec.o nmi_debug.o process.o \
17 17 process_$(BITS).o ptrace_$(BITS).o \
18 18 reboot.o return_address.o \
... ... @@ -39,6 +39,7 @@
39 39 obj-$(CONFIG_HIBERNATION) += swsusp.o
40 40 obj-$(CONFIG_DWARF_UNWINDER) += dwarf.o
41 41 obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_callchain.o
  42 +obj-$(CONFIG_HAS_IOPORT) += io_generic.o
42 43  
43 44 obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
44 45 obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += localtimer.o
... ... @@ -112,26 +112,4 @@
112 112 }
113 113 }
114 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 */
arch/sh/kernel/io_generic.c
... ... @@ -158,4 +158,24 @@
158 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 */
arch/sh/kernel/io_trapped.c
... ... @@ -91,10 +91,14 @@
91 91 tiop->magic = IO_TRAPPED_MAGIC;
92 92 INIT_LIST_HEAD(&tiop->list);
93 93 spin_lock_irq(&trapped_lock);
  94 +#ifdef CONFIG_HAS_IOPORT
94 95 if (flags & IORESOURCE_IO)
95 96 list_add(&tiop->list, &trapped_io);
  97 +#endif
  98 +#ifdef CONFIG_HAS_IOMEM
96 99 if (flags & IORESOURCE_MEM)
97 100 list_add(&tiop->list, &trapped_mem);
  101 +#endif
98 102 spin_unlock_irq(&trapped_lock);
99 103  
100 104 return 0;
arch/sh/kernel/machvec.c
... ... @@ -118,6 +118,14 @@
118 118 sh_mv.mv_##elem = generic_##elem; \
119 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 129 mv_set(inb); mv_set(inw); mv_set(inl);
122 130 mv_set(outb); mv_set(outw); mv_set(outl);
123 131  
124 132  
... ... @@ -129,17 +137,14 @@
129 137  
130 138 mv_set(ioport_map);
131 139 mv_set(ioport_unmap);
  140 +
  141 +#endif
  142 +
132 143 mv_set(irq_demux);
133 144 mv_set(mode_pins);
134 145 mv_set(mem_init);
135 146  
136 147 if (!sh_mv.mv_nr_irqs)
137 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 }