asm-generic: don't provide ioremap for CONFIG_MMU
All MMU-enabled ports have a non-trivial ioremap and should thus provide the prototype for their implementation instead of providing a generic one unless a different symbol is not defined. Note that this only affects sparc32 nds32 as all others do provide their own version. Also update the kerneldoc comments in asm-generic/io.h to explain the situation around the default ioremap* implementations correctly. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
void __iomem *ioremap(phys_addr_t phys_addr, size_t size);
|
||||||
extern void iounmap(volatile void __iomem *addr);
|
extern void iounmap(volatile void __iomem *addr);
|
||||||
#define __raw_writeb __raw_writeb
|
#define __raw_writeb __raw_writeb
|
||||||
static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
|
static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
|
||||||
@@ -80,4 +81,5 @@ static inline u32 __raw_readl(const volatile void __iomem *addr)
|
|||||||
#define writew(v,c) ({ __iowmb(); writew_relaxed((v),(c)); })
|
#define writew(v,c) ({ __iowmb(); writew_relaxed((v),(c)); })
|
||||||
#define writel(v,c) ({ __iowmb(); writel_relaxed((v),(c)); })
|
#define writel(v,c) ({ __iowmb(); writel_relaxed((v),(c)); })
|
||||||
#include <asm-generic/io.h>
|
#include <asm-generic/io.h>
|
||||||
|
|
||||||
#endif /* __ASM_NDS32_IO_H */
|
#endif /* __ASM_NDS32_IO_H */
|
||||||
|
@@ -127,6 +127,7 @@ static inline void sbus_memcpy_toio(volatile void __iomem *dst,
|
|||||||
* Bus number may be embedded in the higher bits of the physical address.
|
* Bus number may be embedded in the higher bits of the physical address.
|
||||||
* This is why we have no bus number argument to ioremap().
|
* This is why we have no bus number argument to ioremap().
|
||||||
*/
|
*/
|
||||||
|
void __iomem *ioremap(phys_addr_t offset, size_t size);
|
||||||
void iounmap(volatile void __iomem *addr);
|
void iounmap(volatile void __iomem *addr);
|
||||||
/* Create a virtual mapping cookie for an IO port range */
|
/* Create a virtual mapping cookie for an IO port range */
|
||||||
void __iomem *ioport_map(unsigned long port, unsigned int nr);
|
void __iomem *ioport_map(unsigned long port, unsigned int nr);
|
||||||
|
@@ -922,28 +922,16 @@ static inline void *phys_to_virt(unsigned long address)
|
|||||||
/**
|
/**
|
||||||
* DOC: ioremap() and ioremap_*() variants
|
* DOC: ioremap() and ioremap_*() variants
|
||||||
*
|
*
|
||||||
* If you have an IOMMU your architecture is expected to have both ioremap()
|
* Architectures with an MMU are expected to provide ioremap() and iounmap()
|
||||||
* and iounmap() implemented otherwise the asm-generic helpers will provide a
|
* themselves. For NOMMU architectures we provide a default nop-op
|
||||||
* direct mapping.
|
* implementation that expect that the physical address used for MMIO are
|
||||||
|
* already marked as uncached, and can be used as kernel virtual addresses.
|
||||||
*
|
*
|
||||||
* There are ioremap_*() call variants, if you have no IOMMU we naturally will
|
* ioremap_wc() and ioremap_wt() can provide more relaxed caching attributes
|
||||||
* default to direct mapping for all of them, you can override these defaults.
|
* for specific drivers if the architecture choses to implement them. If they
|
||||||
* If you have an IOMMU you are highly encouraged to provide your own
|
* are not implemented we fall back to plain ioremap.
|
||||||
* ioremap variant implementation as there currently is no safe architecture
|
|
||||||
* agnostic default. To avoid possible improper behaviour default asm-generic
|
|
||||||
* ioremap_*() variants all return NULL when an IOMMU is available. If you've
|
|
||||||
* defined your own ioremap_*() variant you must then declare your own
|
|
||||||
* ioremap_*() variant as defined to itself to avoid the default NULL return.
|
|
||||||
*/
|
*/
|
||||||
#ifndef CONFIG_MMU
|
#ifndef CONFIG_MMU
|
||||||
|
|
||||||
/*
|
|
||||||
* Change "struct page" to physical address.
|
|
||||||
*
|
|
||||||
* This implementation is for the no-MMU case only... if you have an MMU
|
|
||||||
* you'll need to provide your own definitions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ioremap
|
#ifndef ioremap
|
||||||
#define ioremap ioremap
|
#define ioremap ioremap
|
||||||
static inline void __iomem *ioremap(phys_addr_t offset, size_t size)
|
static inline void __iomem *ioremap(phys_addr_t offset, size_t size)
|
||||||
@@ -954,14 +942,13 @@ static inline void __iomem *ioremap(phys_addr_t offset, size_t size)
|
|||||||
|
|
||||||
#ifndef iounmap
|
#ifndef iounmap
|
||||||
#define iounmap iounmap
|
#define iounmap iounmap
|
||||||
|
|
||||||
static inline void iounmap(void __iomem *addr)
|
static inline void iounmap(void __iomem *addr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* CONFIG_MMU */
|
#endif /* CONFIG_MMU */
|
||||||
|
|
||||||
#ifndef ioremap_nocache
|
#ifndef ioremap_nocache
|
||||||
void __iomem *ioremap(phys_addr_t phys_addr, size_t size);
|
|
||||||
#define ioremap_nocache ioremap_nocache
|
#define ioremap_nocache ioremap_nocache
|
||||||
static inline void __iomem *ioremap_nocache(phys_addr_t offset, size_t size)
|
static inline void __iomem *ioremap_nocache(phys_addr_t offset, size_t size)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user