blob: 7d11979da030a7dccd70e54235ba4b2baf65f887 [file] [log] [blame]
Russell Kinga09e64f2008-08-05 16:14:15 +01001/*
2 * arch/arm/mach-ixp4xx/include/mach/io.h
3 *
4 * Author: Deepak Saxena <dsaxena@plexity.net>
5 *
6 * Copyright (C) 2002-2005 MontaVista Software, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#ifndef __ASM_ARM_ARCH_IO_H
14#define __ASM_ARM_ARCH_IO_H
15
16#include <linux/bitops.h>
17
18#include <mach/hardware.h>
19
Russell Kinga09e64f2008-08-05 16:14:15 +010020extern int (*ixp4xx_pci_read)(u32 addr, u32 cmd, u32* data);
21extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data);
22
23
24/*
25 * IXP4xx provides two methods of accessing PCI memory space:
26 *
Krzysztof Hałasaed5b9fa2009-11-15 18:02:10 +010027 * 1) A direct mapped window from 0x48000000 to 0x4BFFFFFF (64MB).
Russell Kinga09e64f2008-08-05 16:14:15 +010028 * To access PCI via this space, we simply ioremap() the BAR
29 * into the kernel and we can use the standard read[bwl]/write[bwl]
30 * macros. This is the preffered method due to speed but it
Krzysztof Hałasaed5b9fa2009-11-15 18:02:10 +010031 * limits the system to just 64MB of PCI memory. This can be
32 * problematic if using video cards and other memory-heavy targets.
Russell Kinga09e64f2008-08-05 16:14:15 +010033 *
Krzysztof Hałasaed5b9fa2009-11-15 18:02:10 +010034 * 2) If > 64MB of memory space is required, the IXP4xx can use indirect
35 * registers to access the whole 4 GB of PCI memory space (as we do below
36 * for I/O transactions). This allows currently for up to 1 GB (0x10000000
37 * to 0x4FFFFFFF) of memory on the bus. The disadvantage of this is that
38 * every PCI access requires three local register accesses plus a spinlock,
39 * but in some cases the performance hit is acceptable. In addition, you
40 * cannot mmap() PCI devices in this case.
Russell Kinga09e64f2008-08-05 16:14:15 +010041 */
Rob Herring5621caa2012-02-10 20:04:56 -060042#ifdef CONFIG_IXP4XX_INDIRECT_PCI
Russell Kinga09e64f2008-08-05 16:14:15 +010043
Russell Kinga09e64f2008-08-05 16:14:15 +010044/*
45 * In the case of using indirect PCI, we simply return the actual PCI
46 * address and our read/write implementation use that to drive the
47 * access registers. If something outside of PCI is ioremap'd, we
48 * fallback to the default.
49 */
Krzysztof Hałasacba36222009-11-15 01:25:06 +010050
Arnd Bergmann926aabd2014-03-16 20:23:18 +010051extern unsigned long pcibios_min_mem;
Krzysztof Hałasacba36222009-11-15 01:25:06 +010052static inline int is_pci_memory(u32 addr)
53{
Arnd Bergmann926aabd2014-03-16 20:23:18 +010054 return (addr >= pcibios_min_mem) && (addr <= 0x4FFFFFFF);
Krzysztof Hałasacba36222009-11-15 01:25:06 +010055}
56
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +010057#define writeb(v, p) __indirect_writeb(v, p)
58#define writew(v, p) __indirect_writew(v, p)
59#define writel(v, p) __indirect_writel(v, p)
Russell Kinga09e64f2008-08-05 16:14:15 +010060
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +010061#define writesb(p, v, l) __indirect_writesb(p, v, l)
62#define writesw(p, v, l) __indirect_writesw(p, v, l)
63#define writesl(p, v, l) __indirect_writesl(p, v, l)
Russell Kinga09e64f2008-08-05 16:14:15 +010064
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +010065#define readb(p) __indirect_readb(p)
66#define readw(p) __indirect_readw(p)
67#define readl(p) __indirect_readl(p)
68
69#define readsb(p, v, l) __indirect_readsb(p, v, l)
70#define readsw(p, v, l) __indirect_readsw(p, v, l)
71#define readsl(p, v, l) __indirect_readsl(p, v, l)
72
73static inline void __indirect_writeb(u8 value, volatile void __iomem *p)
Russell Kinga09e64f2008-08-05 16:14:15 +010074{
75 u32 addr = (u32)p;
76 u32 n, byte_enables, data;
77
Krzysztof Hałasacba36222009-11-15 01:25:06 +010078 if (!is_pci_memory(addr)) {
Stefan Hengeleinf267ea02014-10-19 19:49:45 +020079 __raw_writeb(value, p);
Russell Kinga09e64f2008-08-05 16:14:15 +010080 return;
81 }
82
83 n = addr % 4;
84 byte_enables = (0xf & ~BIT(n)) << IXP4XX_PCI_NP_CBE_BESL;
85 data = value << (8*n);
86 ixp4xx_pci_write(addr, byte_enables | NP_CMD_MEMWRITE, data);
87}
88
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +010089static inline void __indirect_writesb(volatile void __iomem *bus_addr,
90 const u8 *vaddr, int count)
Russell Kinga09e64f2008-08-05 16:14:15 +010091{
92 while (count--)
93 writeb(*vaddr++, bus_addr);
94}
95
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +010096static inline void __indirect_writew(u16 value, volatile void __iomem *p)
Russell Kinga09e64f2008-08-05 16:14:15 +010097{
98 u32 addr = (u32)p;
99 u32 n, byte_enables, data;
100
Krzysztof Hałasacba36222009-11-15 01:25:06 +0100101 if (!is_pci_memory(addr)) {
Russell Kinga09e64f2008-08-05 16:14:15 +0100102 __raw_writew(value, addr);
103 return;
104 }
105
106 n = addr % 4;
107 byte_enables = (0xf & ~(BIT(n) | BIT(n+1))) << IXP4XX_PCI_NP_CBE_BESL;
108 data = value << (8*n);
109 ixp4xx_pci_write(addr, byte_enables | NP_CMD_MEMWRITE, data);
110}
111
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100112static inline void __indirect_writesw(volatile void __iomem *bus_addr,
113 const u16 *vaddr, int count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100114{
115 while (count--)
116 writew(*vaddr++, bus_addr);
117}
118
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100119static inline void __indirect_writel(u32 value, volatile void __iomem *p)
Russell Kinga09e64f2008-08-05 16:14:15 +0100120{
121 u32 addr = (__force u32)p;
Krzysztof Hałasacba36222009-11-15 01:25:06 +0100122
123 if (!is_pci_memory(addr)) {
Russell Kinga09e64f2008-08-05 16:14:15 +0100124 __raw_writel(value, p);
125 return;
126 }
127
128 ixp4xx_pci_write(addr, NP_CMD_MEMWRITE, value);
129}
130
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100131static inline void __indirect_writesl(volatile void __iomem *bus_addr,
132 const u32 *vaddr, int count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100133{
134 while (count--)
135 writel(*vaddr++, bus_addr);
136}
137
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100138static inline unsigned char __indirect_readb(const volatile void __iomem *p)
Russell Kinga09e64f2008-08-05 16:14:15 +0100139{
140 u32 addr = (u32)p;
141 u32 n, byte_enables, data;
142
Krzysztof Hałasacba36222009-11-15 01:25:06 +0100143 if (!is_pci_memory(addr))
Stefan Hengeleinf267ea02014-10-19 19:49:45 +0200144 return __raw_readb(p);
Russell Kinga09e64f2008-08-05 16:14:15 +0100145
146 n = addr % 4;
147 byte_enables = (0xf & ~BIT(n)) << IXP4XX_PCI_NP_CBE_BESL;
148 if (ixp4xx_pci_read(addr, byte_enables | NP_CMD_MEMREAD, &data))
149 return 0xff;
150
151 return data >> (8*n);
152}
153
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100154static inline void __indirect_readsb(const volatile void __iomem *bus_addr,
155 u8 *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100156{
157 while (count--)
158 *vaddr++ = readb(bus_addr);
159}
160
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100161static inline unsigned short __indirect_readw(const volatile void __iomem *p)
Russell Kinga09e64f2008-08-05 16:14:15 +0100162{
163 u32 addr = (u32)p;
164 u32 n, byte_enables, data;
165
Krzysztof Hałasacba36222009-11-15 01:25:06 +0100166 if (!is_pci_memory(addr))
Russell Kinga09e64f2008-08-05 16:14:15 +0100167 return __raw_readw(addr);
168
169 n = addr % 4;
170 byte_enables = (0xf & ~(BIT(n) | BIT(n+1))) << IXP4XX_PCI_NP_CBE_BESL;
171 if (ixp4xx_pci_read(addr, byte_enables | NP_CMD_MEMREAD, &data))
172 return 0xffff;
173
174 return data>>(8*n);
175}
176
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100177static inline void __indirect_readsw(const volatile void __iomem *bus_addr,
178 u16 *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100179{
180 while (count--)
181 *vaddr++ = readw(bus_addr);
182}
183
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100184static inline unsigned long __indirect_readl(const volatile void __iomem *p)
Russell Kinga09e64f2008-08-05 16:14:15 +0100185{
186 u32 addr = (__force u32)p;
187 u32 data;
188
Krzysztof Hałasacba36222009-11-15 01:25:06 +0100189 if (!is_pci_memory(addr))
Russell Kinga09e64f2008-08-05 16:14:15 +0100190 return __raw_readl(p);
191
192 if (ixp4xx_pci_read(addr, NP_CMD_MEMREAD, &data))
193 return 0xffffffff;
194
195 return data;
196}
197
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100198static inline void __indirect_readsl(const volatile void __iomem *bus_addr,
199 u32 *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100200{
201 while (count--)
202 *vaddr++ = readl(bus_addr);
203}
204
205
206/*
207 * We can use the built-in functions b/c they end up calling writeb/readb
208 */
209#define memset_io(c,v,l) _memset_io((c),(v),(l))
210#define memcpy_fromio(a,c,l) _memcpy_fromio((a),(c),(l))
211#define memcpy_toio(c,a,l) _memcpy_toio((c),(a),(l))
212
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100213#endif /* CONFIG_IXP4XX_INDIRECT_PCI */
Russell Kinga09e64f2008-08-05 16:14:15 +0100214
215#ifndef CONFIG_PCI
216
Russell King0560cf52008-11-30 11:45:54 +0000217#define __io(v) __typesafe_io(v)
Russell Kinga09e64f2008-08-05 16:14:15 +0100218
219#else
220
221/*
222 * IXP4xx does not have a transparent cpu -> PCI I/O translation
223 * window. Instead, it has a set of registers that must be tweaked
224 * with the proper byte lanes, command types, and address for the
225 * transaction. This means that we need to override the default
226 * I/O functions.
227 */
Russell Kinga09e64f2008-08-05 16:14:15 +0100228
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100229static inline void outb(u8 value, u32 addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100230{
231 u32 n, byte_enables, data;
232 n = addr % 4;
233 byte_enables = (0xf & ~BIT(n)) << IXP4XX_PCI_NP_CBE_BESL;
234 data = value << (8*n);
235 ixp4xx_pci_write(addr, byte_enables | NP_CMD_IOWRITE, data);
236}
237
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100238static inline void outsb(u32 io_addr, const u8 *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100239{
240 while (count--)
241 outb(*vaddr++, io_addr);
242}
243
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100244static inline void outw(u16 value, u32 addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100245{
246 u32 n, byte_enables, data;
247 n = addr % 4;
248 byte_enables = (0xf & ~(BIT(n) | BIT(n+1))) << IXP4XX_PCI_NP_CBE_BESL;
249 data = value << (8*n);
250 ixp4xx_pci_write(addr, byte_enables | NP_CMD_IOWRITE, data);
251}
252
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100253static inline void outsw(u32 io_addr, const u16 *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100254{
255 while (count--)
256 outw(cpu_to_le16(*vaddr++), io_addr);
257}
258
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100259static inline void outl(u32 value, u32 addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100260{
261 ixp4xx_pci_write(addr, NP_CMD_IOWRITE, value);
262}
263
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100264static inline void outsl(u32 io_addr, const u32 *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100265{
266 while (count--)
Krzysztof Hałasa9f2c9492009-11-11 00:21:48 +0100267 outl(cpu_to_le32(*vaddr++), io_addr);
Russell Kinga09e64f2008-08-05 16:14:15 +0100268}
269
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100270static inline u8 inb(u32 addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100271{
272 u32 n, byte_enables, data;
273 n = addr % 4;
274 byte_enables = (0xf & ~BIT(n)) << IXP4XX_PCI_NP_CBE_BESL;
275 if (ixp4xx_pci_read(addr, byte_enables | NP_CMD_IOREAD, &data))
276 return 0xff;
277
278 return data >> (8*n);
279}
280
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100281static inline void insb(u32 io_addr, u8 *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100282{
283 while (count--)
284 *vaddr++ = inb(io_addr);
285}
286
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100287static inline u16 inw(u32 addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100288{
289 u32 n, byte_enables, data;
290 n = addr % 4;
291 byte_enables = (0xf & ~(BIT(n) | BIT(n+1))) << IXP4XX_PCI_NP_CBE_BESL;
292 if (ixp4xx_pci_read(addr, byte_enables | NP_CMD_IOREAD, &data))
293 return 0xffff;
294
295 return data>>(8*n);
296}
297
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100298static inline void insw(u32 io_addr, u16 *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100299{
300 while (count--)
301 *vaddr++ = le16_to_cpu(inw(io_addr));
302}
303
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100304static inline u32 inl(u32 addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100305{
306 u32 data;
307 if (ixp4xx_pci_read(addr, NP_CMD_IOREAD, &data))
308 return 0xffffffff;
309
310 return data;
311}
312
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100313static inline void insl(u32 io_addr, u32 *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100314{
315 while (count--)
Krzysztof Hałasa9f2c9492009-11-11 00:21:48 +0100316 *vaddr++ = le32_to_cpu(inl(io_addr));
Russell Kinga09e64f2008-08-05 16:14:15 +0100317}
318
319#define PIO_OFFSET 0x10000UL
320#define PIO_MASK 0x0ffffUL
321
322#define __is_io_address(p) (((unsigned long)p >= PIO_OFFSET) && \
323 ((unsigned long)p <= (PIO_MASK + PIO_OFFSET)))
Krzysztof Hałasa9f2c9492009-11-11 00:21:48 +0100324
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100325#define ioread8(p) ioread8(p)
326static inline unsigned int ioread8(const void __iomem *addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100327{
328 unsigned long port = (unsigned long __force)addr;
329 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100330 return (unsigned int)inb(port & PIO_MASK);
Russell Kinga09e64f2008-08-05 16:14:15 +0100331 else
332#ifndef CONFIG_IXP4XX_INDIRECT_PCI
Krzysztof Hałasa59c29012010-01-10 13:55:11 +0100333 return (unsigned int)__raw_readb(addr);
Russell Kinga09e64f2008-08-05 16:14:15 +0100334#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100335 return (unsigned int)__indirect_readb(addr);
Russell Kinga09e64f2008-08-05 16:14:15 +0100336#endif
337}
338
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100339#define ioread8_rep(p, v, c) ioread8_rep(p, v, c)
340static inline void ioread8_rep(const void __iomem *addr, void *vaddr, u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100341{
342 unsigned long port = (unsigned long __force)addr;
343 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100344 insb(port & PIO_MASK, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100345 else
346#ifndef CONFIG_IXP4XX_INDIRECT_PCI
347 __raw_readsb(addr, vaddr, count);
348#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100349 __indirect_readsb(addr, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100350#endif
351}
352
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100353#define ioread16(p) ioread16(p)
354static inline unsigned int ioread16(const void __iomem *addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100355{
356 unsigned long port = (unsigned long __force)addr;
357 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100358 return (unsigned int)inw(port & PIO_MASK);
Russell Kinga09e64f2008-08-05 16:14:15 +0100359 else
360#ifndef CONFIG_IXP4XX_INDIRECT_PCI
Krzysztof Hałasa59c29012010-01-10 13:55:11 +0100361 return le16_to_cpu((__force __le16)__raw_readw(addr));
Russell Kinga09e64f2008-08-05 16:14:15 +0100362#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100363 return (unsigned int)__indirect_readw(addr);
Russell Kinga09e64f2008-08-05 16:14:15 +0100364#endif
365}
366
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100367#define ioread16_rep(p, v, c) ioread16_rep(p, v, c)
368static inline void ioread16_rep(const void __iomem *addr, void *vaddr,
369 u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100370{
371 unsigned long port = (unsigned long __force)addr;
372 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100373 insw(port & PIO_MASK, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100374 else
375#ifndef CONFIG_IXP4XX_INDIRECT_PCI
376 __raw_readsw(addr, vaddr, count);
377#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100378 __indirect_readsw(addr, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100379#endif
380}
381
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100382#define ioread32(p) ioread32(p)
383static inline unsigned int ioread32(const void __iomem *addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100384{
385 unsigned long port = (unsigned long __force)addr;
386 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100387 return (unsigned int)inl(port & PIO_MASK);
Russell Kinga09e64f2008-08-05 16:14:15 +0100388 else {
389#ifndef CONFIG_IXP4XX_INDIRECT_PCI
390 return le32_to_cpu((__force __le32)__raw_readl(addr));
391#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100392 return (unsigned int)__indirect_readl(addr);
Russell Kinga09e64f2008-08-05 16:14:15 +0100393#endif
394 }
395}
396
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100397#define ioread32_rep(p, v, c) ioread32_rep(p, v, c)
398static inline void ioread32_rep(const void __iomem *addr, void *vaddr,
399 u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100400{
401 unsigned long port = (unsigned long __force)addr;
402 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100403 insl(port & PIO_MASK, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100404 else
405#ifndef CONFIG_IXP4XX_INDIRECT_PCI
406 __raw_readsl(addr, vaddr, count);
407#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100408 __indirect_readsl(addr, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100409#endif
410}
411
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100412#define iowrite8(v, p) iowrite8(v, p)
413static inline void iowrite8(u8 value, void __iomem *addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100414{
415 unsigned long port = (unsigned long __force)addr;
416 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100417 outb(value, port & PIO_MASK);
Russell Kinga09e64f2008-08-05 16:14:15 +0100418 else
419#ifndef CONFIG_IXP4XX_INDIRECT_PCI
Krzysztof Hałasa59c29012010-01-10 13:55:11 +0100420 __raw_writeb(value, addr);
Russell Kinga09e64f2008-08-05 16:14:15 +0100421#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100422 __indirect_writeb(value, addr);
Russell Kinga09e64f2008-08-05 16:14:15 +0100423#endif
424}
425
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100426#define iowrite8_rep(p, v, c) iowrite8_rep(p, v, c)
427static inline void iowrite8_rep(void __iomem *addr, const void *vaddr,
428 u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100429{
430 unsigned long port = (unsigned long __force)addr;
431 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100432 outsb(port & PIO_MASK, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100433 else
434#ifndef CONFIG_IXP4XX_INDIRECT_PCI
435 __raw_writesb(addr, vaddr, count);
436#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100437 __indirect_writesb(addr, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100438#endif
439}
440
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100441#define iowrite16(v, p) iowrite16(v, p)
442static inline void iowrite16(u16 value, void __iomem *addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100443{
444 unsigned long port = (unsigned long __force)addr;
445 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100446 outw(value, port & PIO_MASK);
Russell Kinga09e64f2008-08-05 16:14:15 +0100447 else
448#ifndef CONFIG_IXP4XX_INDIRECT_PCI
449 __raw_writew(cpu_to_le16(value), addr);
450#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100451 __indirect_writew(value, addr);
Russell Kinga09e64f2008-08-05 16:14:15 +0100452#endif
453}
454
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100455#define iowrite16_rep(p, v, c) iowrite16_rep(p, v, c)
456static inline void iowrite16_rep(void __iomem *addr, const void *vaddr,
457 u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100458{
459 unsigned long port = (unsigned long __force)addr;
460 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100461 outsw(port & PIO_MASK, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100462 else
463#ifndef CONFIG_IXP4XX_INDIRECT_PCI
464 __raw_writesw(addr, vaddr, count);
465#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100466 __indirect_writesw(addr, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100467#endif
468}
469
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100470#define iowrite32(v, p) iowrite32(v, p)
471static inline void iowrite32(u32 value, void __iomem *addr)
Russell Kinga09e64f2008-08-05 16:14:15 +0100472{
473 unsigned long port = (unsigned long __force)addr;
474 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100475 outl(value, port & PIO_MASK);
Russell Kinga09e64f2008-08-05 16:14:15 +0100476 else
477#ifndef CONFIG_IXP4XX_INDIRECT_PCI
478 __raw_writel((u32 __force)cpu_to_le32(value), addr);
479#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100480 __indirect_writel(value, addr);
Russell Kinga09e64f2008-08-05 16:14:15 +0100481#endif
482}
483
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100484#define iowrite32_rep(p, v, c) iowrite32_rep(p, v, c)
485static inline void iowrite32_rep(void __iomem *addr, const void *vaddr,
486 u32 count)
Russell Kinga09e64f2008-08-05 16:14:15 +0100487{
488 unsigned long port = (unsigned long __force)addr;
489 if (__is_io_address(port))
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100490 outsl(port & PIO_MASK, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100491 else
492#ifndef CONFIG_IXP4XX_INDIRECT_PCI
493 __raw_writesl(addr, vaddr, count);
494#else
Krzysztof Hałasa28f85cd2009-11-14 19:44:44 +0100495 __indirect_writesl(addr, vaddr, count);
Russell Kinga09e64f2008-08-05 16:14:15 +0100496#endif
497}
498
Russell Kinga09e64f2008-08-05 16:14:15 +0100499#define ioport_map(port, nr) ((void __iomem*)(port + PIO_OFFSET))
500#define ioport_unmap(addr)
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100501#endif /* CONFIG_PCI */
Russell Kinga09e64f2008-08-05 16:14:15 +0100502
Krzysztof Hałasa58e570d2009-11-14 22:55:42 +0100503#endif /* __ASM_ARM_ARCH_IO_H */