blob: 75244a0731d9b741aab9528e19d9fc9b32a8d5d3 [file] [log] [blame]
Wolfgang Denk97caf672006-03-12 02:12:27 +01001/*
2 * U-boot - io.h IO routines
3 *
Mike Frysingere59bac52009-11-30 13:51:24 -05004 * Copyright 2004-2009 Analog Devices Inc.
Wolfgang Denk97caf672006-03-12 02:12:27 +01005 *
Mike Frysingere59bac52009-11-30 13:51:24 -05006 * Licensed under the GPL-2 or later.
Wolfgang Denk97caf672006-03-12 02:12:27 +01007 */
8
9#ifndef _BLACKFIN_IO_H
10#define _BLACKFIN_IO_H
11
Wolfgang Denk97caf672006-03-12 02:12:27 +010012#ifdef __KERNEL__
13
Mike Frysinger66c4cf42008-02-04 19:26:55 -050014#include <asm/blackfin.h>
15
Mike Frysingere59bac52009-11-30 13:51:24 -050016#define __iomem
17
Mike Frysinger66c4cf42008-02-04 19:26:55 -050018static inline void sync(void)
19{
20 SSYNC();
21}
Wolfgang Denk97caf672006-03-12 02:12:27 +010022
Wolfgang Denk97caf672006-03-12 02:12:27 +010023/*
Haavard Skinnemoenf9855512007-12-13 12:56:33 +010024 * Given a physical address and a length, return a virtual address
25 * that can be used to access the memory range with the caching
26 * properties specified by "flags".
27 */
Haavard Skinnemoenf9855512007-12-13 12:56:33 +010028#define MAP_NOCACHE (0)
29#define MAP_WRCOMBINE (0)
30#define MAP_WRBACK (0)
31#define MAP_WRTHROUGH (0)
32
33static inline void *
34map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
35{
36 return (void *)paddr;
37}
38
39/*
40 * Take down a mapping set up by map_physmem().
41 */
42static inline void unmap_physmem(void *vaddr, unsigned long flags)
43{
44
45}
46
Kumar Gala9364a672008-12-13 17:20:27 -060047static inline phys_addr_t virt_to_phys(void * vaddr)
48{
49 return (phys_addr_t)(vaddr);
50}
51
Haavard Skinnemoenf9855512007-12-13 12:56:33 +010052/*
Wolfgang Denk97caf672006-03-12 02:12:27 +010053 * These are for ISA/PCI shared memory _only_ and should never be used
54 * on any other type of memory, including Zorro memory. They are meant to
55 * access the bus in the bus byte order which is little-endian!.
56 *
57 * readX/writeX() are used to access memory mapped devices. On some
58 * architectures the memory mapped IO stuff needs to be accessed
Mike Frysingere59bac52009-11-30 13:51:24 -050059 * differently. On the bfin architecture, we just read/write the
Wolfgang Denk97caf672006-03-12 02:12:27 +010060 * memory location directly.
61 */
Mike Frysinger66c4cf42008-02-04 19:26:55 -050062#ifndef __ASSEMBLY__
63
Mike Frysingere59bac52009-11-30 13:51:24 -050064static inline unsigned char readb(const volatile void __iomem *addr)
Mike Frysinger66c4cf42008-02-04 19:26:55 -050065{
66 unsigned int val;
67 int tmp;
68
Mike Frysingere59bac52009-11-30 13:51:24 -050069 __asm__ __volatile__ (
70 "cli %1;"
71 "NOP; NOP; SSYNC;"
72 "%0 = b [%2] (z);"
73 "sti %1;"
74 : "=d"(val), "=d"(tmp)
75 : "a"(addr)
76 );
Mike Frysinger66c4cf42008-02-04 19:26:55 -050077
78 return (unsigned char) val;
79}
80
Mike Frysingere59bac52009-11-30 13:51:24 -050081static inline unsigned short readw(const volatile void __iomem *addr)
Mike Frysinger66c4cf42008-02-04 19:26:55 -050082{
83 unsigned int val;
84 int tmp;
85
Mike Frysingere59bac52009-11-30 13:51:24 -050086 __asm__ __volatile__ (
87 "cli %1;"
88 "NOP; NOP; SSYNC;"
89 "%0 = w [%2] (z);"
90 "sti %1;"
91 : "=d"(val), "=d"(tmp)
92 : "a"(addr)
93 );
Mike Frysinger66c4cf42008-02-04 19:26:55 -050094
95 return (unsigned short) val;
96}
97
Mike Frysingere59bac52009-11-30 13:51:24 -050098static inline unsigned int readl(const volatile void __iomem *addr)
Mike Frysinger66c4cf42008-02-04 19:26:55 -050099{
100 unsigned int val;
101 int tmp;
102
Mike Frysingere59bac52009-11-30 13:51:24 -0500103 __asm__ __volatile__ (
104 "cli %1;"
105 "NOP; NOP; SSYNC;"
106 "%0 = [%2];"
107 "sti %1;"
108 : "=d"(val), "=d"(tmp)
109 : "a"(addr)
110 );
111
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500112 return val;
113}
114
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500115#endif /* __ASSEMBLY__ */
116
117#define writeb(b, addr) (void)((*(volatile unsigned char *) (addr)) = (b))
118#define writew(b, addr) (void)((*(volatile unsigned short *) (addr)) = (b))
119#define writel(b, addr) (void)((*(volatile unsigned int *) (addr)) = (b))
Mike Frysingere59bac52009-11-30 13:51:24 -0500120
121#define __raw_readb readb
122#define __raw_readw readw
123#define __raw_readl readl
Mike Frysingere9e1aa92008-02-04 19:26:54 -0500124#define __raw_writeb writeb
125#define __raw_writew writew
126#define __raw_writel writel
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500127#define memset_io(a, b, c) memset((void *)(a), (b), (c))
128#define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c))
129#define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c))
Wolfgang Denk97caf672006-03-12 02:12:27 +0100130
Mike Frysingere59bac52009-11-30 13:51:24 -0500131/* Convert "I/O port addresses" to actual addresses. i.e. ugly casts. */
132#define __io(port) ((void *)(unsigned long)(port))
133
134#define inb(port) readb(__io(port))
135#define inw(port) readw(__io(port))
136#define inl(port) readl(__io(port))
137#define outb(x, port) writeb(x, __io(port))
138#define outw(x, port) writew(x, __io(port))
139#define outl(x, port) writel(x, __io(port))
140
141#define inb_p(port) inb(__io(port))
142#define inw_p(port) inw(__io(port))
143#define inl_p(port) inl(__io(port))
144#define outb_p(x, port) outb(x, __io(port))
145#define outw_p(x, port) outw(x, __io(port))
146#define outl_p(x, port) outl(x, __io(port))
147
148#define ioread8_rep(a, d, c) readsb(a, d, c)
149#define ioread16_rep(a, d, c) readsw(a, d, c)
150#define ioread32_rep(a, d, c) readsl(a, d, c)
151#define iowrite8_rep(a, s, c) writesb(a, s, c)
152#define iowrite16_rep(a, s, c) writesw(a, s, c)
153#define iowrite32_rep(a, s, c) writesl(a, s, c)
154
155#define ioread8(x) readb(x)
156#define ioread16(x) readw(x)
157#define ioread32(x) readl(x)
158#define iowrite8(val, x) writeb(val, x)
159#define iowrite16(val, x) writew(val, x)
160#define iowrite32(val, x) writel(val, x)
161
162#define mmiowb() wmb()
163
164#ifndef __ASSEMBLY__
165
166extern void outsb(unsigned long port, const void *addr, unsigned long count);
167extern void outsw(unsigned long port, const void *addr, unsigned long count);
168extern void outsw_8(unsigned long port, const void *addr, unsigned long count);
169extern void outsl(unsigned long port, const void *addr, unsigned long count);
170
171extern void insb(unsigned long port, void *addr, unsigned long count);
172extern void insw(unsigned long port, void *addr, unsigned long count);
173extern void insw_8(unsigned long port, void *addr, unsigned long count);
174extern void insl(unsigned long port, void *addr, unsigned long count);
175extern void insl_16(unsigned long port, void *addr, unsigned long count);
176
177static inline void readsl(const void __iomem *addr, void *buf, int len)
178{
179 insl((unsigned long)addr, buf, len);
180}
181
182static inline void readsw(const void __iomem *addr, void *buf, int len)
183{
184 insw((unsigned long)addr, buf, len);
185}
186
187static inline void readsb(const void __iomem *addr, void *buf, int len)
188{
189 insb((unsigned long)addr, buf, len);
190}
191
192static inline void writesl(const void __iomem *addr, const void *buf, int len)
193{
194 outsl((unsigned long)addr, buf, len);
195}
196
197static inline void writesw(const void __iomem *addr, const void *buf, int len)
198{
199 outsw((unsigned long)addr, buf, len);
200}
201
202static inline void writesb(const void __iomem *addr, const void *buf, int len)
203{
204 outsb((unsigned long)addr, buf, len);
205}
206
Mike Frysinger99c42642009-11-30 13:34:07 -0500207#if defined(CONFIG_STAMP_CF) || defined(CONFIG_BFIN_IDE)
208/* This hack for CF/IDE needs to be addressed at some point */
209extern void cf_outsw(unsigned short *addr, unsigned short *sect_buf, int words);
210extern void cf_insw(unsigned short *sect_buf, unsigned short *addr, int words);
211extern unsigned char cf_inb(volatile unsigned char *addr);
212extern void cf_outb(unsigned char val, volatile unsigned char *addr);
213#undef inb
214#undef outb
215#undef insw
216#undef outsw
217#define inb(addr) cf_inb((void *)(addr))
218#define outb(x, addr) cf_outb((unsigned char)(x), (void *)(addr))
219#define insw(port, addr, cnt) cf_insw((void *)(addr), (void *)(port), cnt)
220#define outsw(port, addr, cnt) cf_outsw((void *)(port), (void *)(addr), cnt)
221#endif
Wolfgang Denk97caf672006-03-12 02:12:27 +0100222
Wolfgang Denk97caf672006-03-12 02:12:27 +0100223#endif
Mike Frysingere59bac52009-11-30 13:51:24 -0500224
225#endif /* __KERNEL__ */
226
Wolfgang Denk97caf672006-03-12 02:12:27 +0100227#endif