Commit da06b8d0 authored by Paul Mundt's avatar Paul Mundt

sh: Add SH-5 support to io.h.

Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 3b9e7886
...@@ -243,12 +243,20 @@ static inline void ctrl_outl(unsigned int b, unsigned long addr) ...@@ -243,12 +243,20 @@ static inline void ctrl_outl(unsigned int b, unsigned long addr)
static inline void ctrl_delay(void) static inline void ctrl_delay(void)
{ {
#ifdef P2SEG
ctrl_inw(P2SEG); ctrl_inw(P2SEG);
#endif
} }
#define IO_SPACE_LIMIT 0xffffffff #define IO_SPACE_LIMIT 0xffffffff
#ifdef CONFIG_MMU #if !defined(CONFIG_MMU)
#define virt_to_phys(address) ((unsigned long)(address))
#define phys_to_virt(address) ((void *)(address))
#elif defined(CONFIG_SUPERH64)
#define virt_to_phys(address) (__pa(address))
#define phys_to_virt(address) (__va(address))
#else
/* /*
* Change virtual addresses to physical addresses and vv. * Change virtual addresses to physical addresses and vv.
* These are trivial on the 1:1 Linux/SuperH mapping * These are trivial on the 1:1 Linux/SuperH mapping
...@@ -262,28 +270,24 @@ static inline void *phys_to_virt(unsigned long address) ...@@ -262,28 +270,24 @@ static inline void *phys_to_virt(unsigned long address)
{ {
return (void *)P1SEGADDR(address); return (void *)P1SEGADDR(address);
} }
#else
#define phys_to_virt(address) ((void *)(address))
#define virt_to_phys(address) ((unsigned long)(address))
#endif #endif
/* /*
* readX/writeX() are used to access memory mapped devices. On some * On 32-bit SH, we traditionally have the whole physical address space
* architectures the memory mapped IO stuff needs to be accessed * mapped at all times (as MIPS does), so "ioremap()" and "iounmap()" do
* differently. On the x86 architecture, we just read/write the * not need to do anything but place the address in the proper segment.
* memory location directly. * This is true for P1 and P2 addresses, as well as some P3 ones.
* However, most of the P3 addresses and newer cores using extended
* addressing need to map through page tables, so the ioremap()
* implementation becomes a bit more complicated.
* *
* On SH, we traditionally have the whole physical address space mapped * See arch/sh/mm/ioremap.c for additional notes on this.
* at all times (as MIPS does), so "ioremap()" and "iounmap()" do not
* need to do anything but place the address in the proper segment. This
* is true for P1 and P2 addresses, as well as some P3 ones. However,
* most of the P3 addresses and newer cores using extended addressing
* need to map through page tables, so the ioremap() implementation
* becomes a bit more complicated. See arch/sh/mm/ioremap.c for
* additional notes on this.
* *
* We cheat a bit and always return uncachable areas until we've fixed * We cheat a bit and always return uncachable areas until we've fixed
* the drivers to handle caching properly. * the drivers to handle caching properly.
*
* On the SH-5 the concept of segmentation in the 1:1 PXSEG sense simply
* doesn't exist, so everything must go through page tables.
*/ */
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
void __iomem *__ioremap(unsigned long offset, unsigned long size, void __iomem *__ioremap(unsigned long offset, unsigned long size,
...@@ -297,6 +301,7 @@ void __iounmap(void __iomem *addr); ...@@ -297,6 +301,7 @@ void __iounmap(void __iomem *addr);
static inline void __iomem * static inline void __iomem *
__ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags)
{ {
#ifdef CONFIG_SUPERH32
unsigned long last_addr = offset + size - 1; unsigned long last_addr = offset + size - 1;
/* /*
...@@ -311,6 +316,7 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) ...@@ -311,6 +316,7 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags)
return (void __iomem *)P2SEGADDR(offset); return (void __iomem *)P2SEGADDR(offset);
} }
#endif
return __ioremap(offset, size, flags); return __ioremap(offset, size, flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment