15f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#ifndef __ASM_AVR32_IO_H
25f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define __ASM_AVR32_IO_H
35f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
4187f1882b5b0748b3c4c22274663fdb372ac0452Paul Gortmaker#include <linux/bug.h>
5e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#include <linux/kernel.h>
65f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/string.h>
7e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#include <linux/types.h>
85f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
95f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/addrspace.h>
105f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/byteorder.h>
115f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
123663b736a5083b3bce74520b637f630f01f66a7fHaavard Skinnemoen#include <mach/io.h>
13e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
145f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/* virt_to_phys will only work when address is in P1 or P2 */
155f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic __inline__ unsigned long virt_to_phys(volatile void *address)
165f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	return PHYSADDR(address);
185f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
195f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
205f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic __inline__ void * phys_to_virt(unsigned long address)
215f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
225f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	return (void *)P1SEGADDR(address);
235f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
245f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
255f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define cached_to_phys(addr)	((unsigned long)PHYSADDR(addr))
265f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define uncached_to_phys(addr)	((unsigned long)PHYSADDR(addr))
275f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define phys_to_cached(addr)	((void *)P1SEGADDR(addr))
285f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define phys_to_uncached(addr)	((void *)P2SEGADDR(addr))
295f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
305f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
315f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Generic IO read/write.  These perform native-endian accesses.  Note
325f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * that some architectures will want to re-define __raw_{read,write}w.
335f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
34b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_writesb(void __iomem *addr, const void *data, int bytelen);
35b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_writesw(void __iomem *addr, const void *data, int wordlen);
36b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_writesl(void __iomem *addr, const void *data, int longlen);
375f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
38b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_readsb(const void __iomem *addr, void *data, int bytelen);
39b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_readsw(const void __iomem *addr, void *data, int wordlen);
40b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_readsl(const void __iomem *addr, void *data, int longlen);
415f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
42e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void __raw_writeb(u8 v, volatile void __iomem *addr)
435f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
44e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	*(volatile u8 __force *)addr = v;
455f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
46e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void __raw_writew(u16 v, volatile void __iomem *addr)
475f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
48e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	*(volatile u16 __force *)addr = v;
495f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
50e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void __raw_writel(u32 v, volatile void __iomem *addr)
515f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
52e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	*(volatile u32 __force *)addr = v;
535f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
545f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
55e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline u8 __raw_readb(const volatile void __iomem *addr)
565f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
57e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	return *(const volatile u8 __force *)addr;
585f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
59e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline u16 __raw_readw(const volatile void __iomem *addr)
605f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
61e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	return *(const volatile u16 __force *)addr;
625f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
63e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline u32 __raw_readl(const volatile void __iomem *addr)
645f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
65e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	return *(const volatile u32 __force *)addr;
66e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen}
67e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
68e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen/* Convert I/O port address to virtual address */
69e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#ifndef __io
70e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen# define __io(p)	((void *)phys_to_uncached(p))
71e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#endif
72e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
73e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen/*
74e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen * Not really sure about the best way to slow down I/O on
75e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen * AVR32. Defining it as a no-op until we have an actual test case.
76e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen */
77e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define SLOW_DOWN_IO	do { } while (0)
78e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
79e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_MEMORY_SINGLE(pfx, bwl, type)				\
80e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void							\
81e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenpfx##write##bwl(type val, volatile void __iomem *addr)			\
82e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{									\
83e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	volatile type *__addr;						\
84e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	type __val;							\
85e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
86e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__addr = (void *)__swizzle_addr_##bwl((unsigned long)(addr));	\
87e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__val = pfx##ioswab##bwl(__addr, val);				\
88e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
89e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long));		\
90e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
91e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	*__addr = __val;						\
92e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen}									\
93e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
94e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline type pfx##read##bwl(const volatile void __iomem *addr)	\
95e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{									\
96e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	volatile type *__addr;						\
97e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	type __val;							\
98e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
99e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__addr = (void *)__swizzle_addr_##bwl((unsigned long)(addr));	\
100e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
101e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long));		\
102e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
103e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__val = *__addr;						\
104e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	return pfx##ioswab##bwl(__addr, __val);				\
105e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen}
106e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
107e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_IOPORT_SINGLE(pfx, bwl, type, p, slow)			\
108e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void pfx##out##bwl##p(type val, unsigned long port)	\
109e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{									\
110e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	volatile type *__addr;						\
111e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	type __val;							\
112e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
113e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__addr = __io(__swizzle_addr_##bwl(port));			\
114e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__val = pfx##ioswab##bwl(__addr, val);				\
115e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
116e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long));		\
117e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
118e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	*__addr = __val;						\
119e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	slow;								\
120e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen}									\
121e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
122e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline type pfx##in##bwl##p(unsigned long port)			\
123e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{									\
124e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	volatile type *__addr;						\
125e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	type __val;							\
126e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
127e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__addr = __io(__swizzle_addr_##bwl(port));			\
128e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
129e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long));		\
130e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
131e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__val = *__addr;						\
132e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	slow;								\
133e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
134e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	return pfx##ioswab##bwl(__addr, __val);				\
1355f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
1365f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
137e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_MEMORY_PFX(bus, bwl, type)				\
138e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__BUILD_MEMORY_SINGLE(bus, bwl, type)
139e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
140e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define BUILDIO_MEM(bwl, type)						\
141e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__BUILD_MEMORY_PFX(, bwl, type)					\
142e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__BUILD_MEMORY_PFX(__mem_, bwl, type)
143e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
144e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_IOPORT_PFX(bus, bwl, type)				\
145e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__BUILD_IOPORT_SINGLE(bus, bwl, type, ,)			\
146e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__BUILD_IOPORT_SINGLE(bus, bwl, type, _p, SLOW_DOWN_IO)
147e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
148e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define BUILDIO_IOPORT(bwl, type)					\
149e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__BUILD_IOPORT_PFX(, bwl, type)					\
150e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__BUILD_IOPORT_PFX(__mem_, bwl, type)
151e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
152e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_MEM(b, u8)
153e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_MEM(w, u16)
154e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_MEM(l, u32)
155e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
156e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_IOPORT(b, u8)
157e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_IOPORT(w, u16)
158e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_IOPORT(l, u32)
159e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
160e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define readb_relaxed			readb
161e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define readw_relaxed			readw
162e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define readl_relaxed			readl
163e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
164520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define readb_be			__raw_readb
165520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define readw_be			__raw_readw
166520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define readl_be			__raw_readl
167472d326677db37625903265428582694394d2df7Josh Wu
168472d326677db37625903265428582694394d2df7Josh Wu#define writeb_relaxed			writeb
169472d326677db37625903265428582694394d2df7Josh Wu#define writew_relaxed			writew
170472d326677db37625903265428582694394d2df7Josh Wu#define writel_relaxed			writel
171520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen
172520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define writeb_be			__raw_writeb
173520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define writew_be			__raw_writew
174520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define writel_be			__raw_writel
175520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen
176e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_MEMORY_STRING(bwl, type)				\
177e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void writes##bwl(volatile void __iomem *addr,		\
178e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen			       const void *data, unsigned int count)	\
179e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{									\
180e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	const type *__data = data;					\
181e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
182e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	while (count--)							\
183e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen		__mem_write##bwl(*__data++, addr);			\
184e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen}									\
185e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
186e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void reads##bwl(const volatile void __iomem *addr,	\
187e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen			      void *data, unsigned int count)		\
188e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{									\
189e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	type *__data = data;						\
190e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
191e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	while (count--)							\
192e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen		*__data++ = __mem_read##bwl(addr);			\
193e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen}
194e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen
195e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_IOPORT_STRING(bwl, type)				\
196e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void outs##bwl(unsigned long port, const void *data,	\
197e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen			     unsigned int count)			\
198e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{									\
199e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	const type *__data = data;					\
200e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
201e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	while (count--)							\
202e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen		__mem_out##bwl(*__data++, port);			\
203e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen}									\
204e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
205e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void ins##bwl(unsigned long port, void *data,		\
206e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen			   unsigned int count)				\
207e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{									\
208e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	type *__data = data;						\
209e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen									\
210e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	while (count--)							\
211e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen		*__data++ = __mem_in##bwl(port);			\
212e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen}
2135f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
214e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define BUILDSTRING(bwl, type)						\
215e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__BUILD_MEMORY_STRING(bwl, type)				\
216e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen	__BUILD_IOPORT_STRING(bwl, type)
2175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
218e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDSTRING(b, u8)
219e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDSTRING(w, u16)
220e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDSTRING(l, u32)
221065834ab3988fece5608088e83724891c8190a2fBen Nizette
222065834ab3988fece5608088e83724891c8190a2fBen Nizette/*
223065834ab3988fece5608088e83724891c8190a2fBen Nizette * io{read,write}{8,16,32} macros in both le (for PCI style consumers) and native be
224065834ab3988fece5608088e83724891c8190a2fBen Nizette */
225065834ab3988fece5608088e83724891c8190a2fBen Nizette#ifndef ioread8
226065834ab3988fece5608088e83724891c8190a2fBen Nizette
227e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread8(p)		((unsigned int)readb(p))
228065834ab3988fece5608088e83724891c8190a2fBen Nizette
229e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread16(p)		((unsigned int)readw(p))
230e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread16be(p)		((unsigned int)__raw_readw(p))
231065834ab3988fece5608088e83724891c8190a2fBen Nizette
232e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread32(p)		((unsigned int)readl(p))
233e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread32be(p)		((unsigned int)__raw_readl(p))
234065834ab3988fece5608088e83724891c8190a2fBen Nizette
235e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite8(v,p)		writeb(v, p)
236065834ab3988fece5608088e83724891c8190a2fBen Nizette
237e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite16(v,p)		writew(v, p)
238e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite16be(v,p)	__raw_writew(v, p)
239065834ab3988fece5608088e83724891c8190a2fBen Nizette
240e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite32(v,p)		writel(v, p)
241e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite32be(v,p)	__raw_writel(v, p)
242065834ab3988fece5608088e83724891c8190a2fBen Nizette
243e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread8_rep(p,d,c)	readsb(p,d,c)
244e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread16_rep(p,d,c)	readsw(p,d,c)
245e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread32_rep(p,d,c)	readsl(p,d,c)
246065834ab3988fece5608088e83724891c8190a2fBen Nizette
247e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite8_rep(p,s,c)	writesb(p,s,c)
248e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite16_rep(p,s,c)	writesw(p,s,c)
249e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite32_rep(p,s,c)	writesl(p,s,c)
250065834ab3988fece5608088e83724891c8190a2fBen Nizette
251065834ab3988fece5608088e83724891c8190a2fBen Nizette#endif
252065834ab3988fece5608088e83724891c8190a2fBen Nizette
2535f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic inline void memcpy_fromio(void * to, const volatile void __iomem *from,
2545f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen				 unsigned long count)
2555f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
2562c1a2a3441a754a9b5a8e7184071154f8a9bd61bHaavard Skinnemoen	memcpy(to, (const void __force *)from, count);
2575f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
2585f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
2595f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic inline void  memcpy_toio(volatile void __iomem *to, const void * from,
2605f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen				unsigned long count)
2615f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
2622c1a2a3441a754a9b5a8e7184071154f8a9bd61bHaavard Skinnemoen	memcpy((void __force *)to, from, count);
2635f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
2645f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
2655f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic inline void memset_io(volatile void __iomem *addr, unsigned char val,
2665f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen			     unsigned long count)
2675f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
2682c1a2a3441a754a9b5a8e7184071154f8a9bd61bHaavard Skinnemoen	memset((void __force *)addr, val, count);
2695f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
2705f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
271cca67164bbdb083df9adb6480822518b0f4b358fHaavard Skinnemoen#define mmiowb()
272cca67164bbdb083df9adb6480822518b0f4b358fHaavard Skinnemoen
273e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define IO_SPACE_LIMIT	0xffffffff
2745f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
2755f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenextern void __iomem *__ioremap(unsigned long offset, size_t size,
2765f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen			       unsigned long flags);
2775f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenextern void __iounmap(void __iomem *addr);
2785f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
2795f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
2805f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * ioremap	-   map bus memory into CPU space
2815f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * @offset	bus address of the memory
2825f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * @size	size of the resource to map
2835f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen *
2845f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * ioremap performs a platform specific sequence of operations to make
2855f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * bus memory CPU accessible via the readb/.../writel functions and
2865f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * the other mmio helpers. The returned address is not guaranteed to
2875f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * be usable directly as a virtual address.
2885f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
2895f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define ioremap(offset, size)			\
2905f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	__ioremap((offset), (size), 0)
2915f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
2922201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen#define ioremap_nocache(offset, size)		\
2932201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen	__ioremap((offset), (size), 0)
2942201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen
2955f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define iounmap(addr)				\
2965f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	__iounmap(addr)
2975f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
2981bbce4f3d11a6bfac0c51800f6337766f82b42daChen Gang#define ioremap_wc ioremap_nocache
2991bbce4f3d11a6bfac0c51800f6337766f82b42daChen Gang
3005f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define cached(addr) P1SEGADDR(addr)
3015f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define uncached(addr) P2SEGADDR(addr)
3025f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
3035f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define virt_to_bus virt_to_phys
3045f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define bus_to_virt phys_to_virt
3055f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define page_to_bus page_to_phys
3065f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define bus_to_page phys_to_page
3075f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
3082201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen/*
3092201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen * Create a virtual mapping cookie for an IO port range.  There exists
3102201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen * no such thing as port-based I/O on AVR32, so a regular ioremap()
3112201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen * should do what we need.
3122201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen */
3132201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen#define ioport_map(port, nr)	ioremap(port, nr)
3142201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen#define ioport_unmap(port)	iounmap(port)
3152201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen
3165f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
3175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Convert a physical pointer to a virtual kernel pointer for /dev/mem
3185f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * access
3195f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
3205f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define xlate_dev_mem_ptr(p)    __va(p)
3215f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
3225f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
3235f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Convert a virtual cached pointer to an uncached pointer
3245f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
3255f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define xlate_dev_kmem_ptr(p)   p
3265f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
3275f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#endif /* __ASM_AVR32_IO_H */
328