Skip to content

Commit

Permalink
sh: support for platforms without PIO.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Paul Mundt committed Jun 2, 2010
1 parent 1c98347 commit 86e4dd5
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 34 deletions.
5 changes: 4 additions & 1 deletion arch/sh/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ config SUPERH
def_bool y
select EMBEDDED
select HAVE_CLK
select HAVE_IDE
select HAVE_IDE if HAS_IOPORT
select HAVE_LMB
select HAVE_OPROFILE
select HAVE_GENERIC_DMA_COHERENT
Expand Down Expand Up @@ -174,6 +174,9 @@ config ARCH_HAS_DEFAULT_IDLE
config ARCH_HAS_CPU_IDLE_WAIT
def_bool y

config NO_IOPORT
bool

config IO_TRAPPED
bool

Expand Down
8 changes: 8 additions & 0 deletions arch/sh/include/asm/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
#include <asm/io_generic.h>
#include <asm/io_trapped.h>

#ifdef CONFIG_HAS_IOPORT

#define inb(p) sh_mv.mv_inb((p))
#define inw(p) sh_mv.mv_inw((p))
#define inl(p) sh_mv.mv_inl((p))
Expand All @@ -60,6 +62,8 @@
#define outsw(p,b,c) sh_mv.mv_outsw((p), (b), (c))
#define outsl(p,b,c) sh_mv.mv_outsl((p), (b), (c))

#endif

#define __raw_writeb(v,a) (__chk_io_ptr(a), *(volatile u8 __force *)(a) = (v))
#define __raw_writew(v,a) (__chk_io_ptr(a), *(volatile u16 __force *)(a) = (v))
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile u32 __force *)(a) = (v))
Expand Down Expand Up @@ -240,6 +244,8 @@ __BUILD_MEMORY_STRING(q, u64)

#define IO_SPACE_LIMIT 0xffffffff

#ifdef CONFIG_HAS_IOPORT

/*
* This function provides a method for the generic case where a
* board-specific ioport_map simply needs to return the port + some
Expand All @@ -255,6 +261,8 @@ static inline void __set_io_port_base(unsigned long pbase)

#define __ioport_map(p, n) sh_mv.mv_ioport_map((p), (n))

#endif

/* We really want to try and get these to memcpy etc */
void memcpy_fromio(void *, const volatile void __iomem *, unsigned long);
void memcpy_toio(volatile void __iomem *, const void *, unsigned long);
Expand Down
9 changes: 5 additions & 4 deletions arch/sh/include/asm/machvec.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ struct sh_machine_vector {
const char *mv_name;
int mv_nr_irqs;

int (*mv_irq_demux)(int irq);
void (*mv_init_irq)(void);

#ifdef CONFIG_HAS_IOPORT
u8 (*mv_inb)(unsigned long);
u16 (*mv_inw)(unsigned long);
u32 (*mv_inl)(unsigned long);
Expand All @@ -40,12 +44,9 @@ struct sh_machine_vector {
void (*mv_outsw)(unsigned long, const void *src, unsigned long count);
void (*mv_outsl)(unsigned long, const void *src, unsigned long count);

int (*mv_irq_demux)(int irq);

void (*mv_init_irq)(void);

void __iomem *(*mv_ioport_map)(unsigned long port, unsigned int size);
void (*mv_ioport_unmap)(void __iomem *);
#endif

int (*mv_clk_init)(void);
int (*mv_mode_pins)(void);
Expand Down
3 changes: 2 additions & 1 deletion arch/sh/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ endif
CFLAGS_REMOVE_return_address.o = -pg

obj-y := clkdev.o debugtraps.o dma-nommu.o dumpstack.o \
idle.o io.o io_generic.o irq.o \
idle.o io.o irq.o \
irq_$(BITS).o machvec.o nmi_debug.o process.o \
process_$(BITS).o ptrace_$(BITS).o \
reboot.o return_address.o \
Expand All @@ -39,6 +39,7 @@ obj-$(CONFIG_DUMP_CODE) += disassemble.o
obj-$(CONFIG_HIBERNATION) += swsusp.o
obj-$(CONFIG_DWARF_UNWINDER) += dwarf.o
obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_callchain.o
obj-$(CONFIG_HAS_IOPORT) += io_generic.o

obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += localtimer.o
Expand Down
22 changes: 0 additions & 22 deletions arch/sh/kernel/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,25 +112,3 @@ void memset_io(volatile void __iomem *dst, int c, unsigned long count)
}
}
EXPORT_SYMBOL(memset_io);

#ifndef CONFIG_GENERIC_IOMAP

void __iomem *ioport_map(unsigned long port, unsigned int nr)
{
void __iomem *ret;

ret = __ioport_map_trapped(port, nr);
if (ret)
return ret;

return __ioport_map(port, nr);
}
EXPORT_SYMBOL(ioport_map);

void ioport_unmap(void __iomem *addr)
{
sh_mv.mv_ioport_unmap(addr);
}
EXPORT_SYMBOL(ioport_unmap);

#endif /* CONFIG_GENERIC_IOMAP */
20 changes: 20 additions & 0 deletions arch/sh/kernel/io_generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,3 +158,23 @@ void __iomem *generic_ioport_map(unsigned long addr, unsigned int size)
void generic_ioport_unmap(void __iomem *addr)
{
}

#ifndef CONFIG_GENERIC_IOMAP
void __iomem *ioport_map(unsigned long port, unsigned int nr)
{
void __iomem *ret;

ret = __ioport_map_trapped(port, nr);
if (ret)
return ret;

return __ioport_map(port, nr);
}
EXPORT_SYMBOL(ioport_map);

void ioport_unmap(void __iomem *addr)
{
sh_mv.mv_ioport_unmap(addr);
}
EXPORT_SYMBOL(ioport_unmap);
#endif /* CONFIG_GENERIC_IOMAP */
4 changes: 4 additions & 0 deletions arch/sh/kernel/io_trapped.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,14 @@ int register_trapped_io(struct trapped_io *tiop)
tiop->magic = IO_TRAPPED_MAGIC;
INIT_LIST_HEAD(&tiop->list);
spin_lock_irq(&trapped_lock);
#ifdef CONFIG_HAS_IOPORT
if (flags & IORESOURCE_IO)
list_add(&tiop->list, &trapped_io);
#endif
#ifdef CONFIG_HAS_IOMEM
if (flags & IORESOURCE_MEM)
list_add(&tiop->list, &trapped_mem);
#endif
spin_unlock_irq(&trapped_lock);

return 0;
Expand Down
17 changes: 11 additions & 6 deletions arch/sh/kernel/machvec.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,14 @@ void __init sh_mv_setup(void)
sh_mv.mv_##elem = generic_##elem; \
} while (0)

#ifdef CONFIG_HAS_IOPORT

#ifdef P2SEG
__set_io_port_base(P2SEG);
#else
__set_io_port_base(0);
#endif

mv_set(inb); mv_set(inw); mv_set(inl);
mv_set(outb); mv_set(outw); mv_set(outl);

Expand All @@ -129,16 +137,13 @@ void __init sh_mv_setup(void)

mv_set(ioport_map);
mv_set(ioport_unmap);

#endif

mv_set(irq_demux);
mv_set(mode_pins);
mv_set(mem_init);

if (!sh_mv.mv_nr_irqs)
sh_mv.mv_nr_irqs = NR_IRQS;

#ifdef P2SEG
__set_io_port_base(P2SEG);
#else
__set_io_port_base(0);
#endif
}

0 comments on commit 86e4dd5

Please sign in to comment.