blob: 69f08bc7efb526a85f3edeab3a184944d178cb72 [file] [log] [blame]
Wolfgang Denk6cb142f2006-03-12 02:12:27 +01001/*
2 * U-boot - io.h IO routines
3 *
Mike Frysingera52ad4f2009-11-30 13:51:24 -05004 * Copyright 2004-2009 Analog Devices Inc.
Wolfgang Denk6cb142f2006-03-12 02:12:27 +01005 *
Mike Frysingera52ad4f2009-11-30 13:51:24 -05006 * Licensed under the GPL-2 or later.
Wolfgang Denk6cb142f2006-03-12 02:12:27 +01007 */
8
9#ifndef _BLACKFIN_IO_H
10#define _BLACKFIN_IO_H
11
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010012#ifdef __KERNEL__
13
Mike Frysingerd4d77302008-02-04 19:26:55 -050014#include <asm/blackfin.h>
15
Mike Frysingera52ad4f2009-11-30 13:51:24 -050016#define __iomem
17
Mike Frysingerd4d77302008-02-04 19:26:55 -050018static inline void sync(void)
19{
20 SSYNC();
21}
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010022
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010023/*
Haavard Skinnemoen4d7d6932007-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 Skinnemoen4d7d6932007-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 Gala65e43a12008-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 Skinnemoen4d7d6932007-12-13 12:56:33 +010052/*
Wolfgang Denk6cb142f2006-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 Frysingera52ad4f2009-11-30 13:51:24 -050059 * differently. On the bfin architecture, we just read/write the
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010060 * memory location directly.
61 */
Mike Frysingerd4d77302008-02-04 19:26:55 -050062#ifndef __ASSEMBLY__
63
Mike Frysingera52ad4f2009-11-30 13:51:24 -050064static inline unsigned char readb(const volatile void __iomem *addr)
Mike Frysingerd4d77302008-02-04 19:26:55 -050065{
66 unsigned int val;
67 int tmp;
68
Mike Frysingera52ad4f2009-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 Frysingerd4d77302008-02-04 19:26:55 -050077
78 return (unsigned char) val;
79}
80
Mike Frysingera52ad4f2009-11-30 13:51:24 -050081static inline unsigned short readw(const volatile void __iomem *addr)
Mike Frysingerd4d77302008-02-04 19:26:55 -050082{
83 unsigned int val;
84 int tmp;
85
Mike Frysingera52ad4f2009-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 Frysingerd4d77302008-02-04 19:26:55 -050094
95 return (unsigned short) val;
96}
97
Mike Frysingera52ad4f2009-11-30 13:51:24 -050098static inline unsigned int readl(const volatile void __iomem *addr)
Mike Frysingerd4d77302008-02-04 19:26:55 -050099{
100 unsigned int val;
101 int tmp;
102
Mike Frysingera52ad4f2009-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 Frysingerd4d77302008-02-04 19:26:55 -0500112 return val;
113}
114
Mike Frysingerd4d77302008-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 Frysingera52ad4f2009-11-30 13:51:24 -0500120
121#define __raw_readb readb
122#define __raw_readw readw
123#define __raw_readl readl
Mike Frysingerbf539742008-02-04 19:26:54 -0500124#define __raw_writeb writeb
125#define __raw_writew writew
126#define __raw_writel writel
Mike Frysingerd4d77302008-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 Denk6cb142f2006-03-12 02:12:27 +0100130
Mike Frysingera52ad4f2009-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))
Mike Frysingerdae22422011-11-25 15:57:42 -0500137#define in_le32(port) inl(port)
Mike Frysingera52ad4f2009-11-30 13:51:24 -0500138#define outb(x, port) writeb(x, __io(port))
139#define outw(x, port) writew(x, __io(port))
140#define outl(x, port) writel(x, __io(port))
Mike Frysingerdae22422011-11-25 15:57:42 -0500141#define out_le32(x, port) outl(x, port)
Mike Frysingera52ad4f2009-11-30 13:51:24 -0500142
143#define inb_p(port) inb(__io(port))
144#define inw_p(port) inw(__io(port))
145#define inl_p(port) inl(__io(port))
146#define outb_p(x, port) outb(x, __io(port))
147#define outw_p(x, port) outw(x, __io(port))
148#define outl_p(x, port) outl(x, __io(port))
149
150#define ioread8_rep(a, d, c) readsb(a, d, c)
151#define ioread16_rep(a, d, c) readsw(a, d, c)
152#define ioread32_rep(a, d, c) readsl(a, d, c)
153#define iowrite8_rep(a, s, c) writesb(a, s, c)
154#define iowrite16_rep(a, s, c) writesw(a, s, c)
155#define iowrite32_rep(a, s, c) writesl(a, s, c)
156
157#define ioread8(x) readb(x)
158#define ioread16(x) readw(x)
159#define ioread32(x) readl(x)
160#define iowrite8(val, x) writeb(val, x)
161#define iowrite16(val, x) writew(val, x)
162#define iowrite32(val, x) writel(val, x)
163
164#define mmiowb() wmb()
165
166#ifndef __ASSEMBLY__
167
168extern void outsb(unsigned long port, const void *addr, unsigned long count);
169extern void outsw(unsigned long port, const void *addr, unsigned long count);
170extern void outsw_8(unsigned long port, const void *addr, unsigned long count);
171extern void outsl(unsigned long port, const void *addr, unsigned long count);
172
173extern void insb(unsigned long port, void *addr, unsigned long count);
174extern void insw(unsigned long port, void *addr, unsigned long count);
175extern void insw_8(unsigned long port, void *addr, unsigned long count);
176extern void insl(unsigned long port, void *addr, unsigned long count);
177extern void insl_16(unsigned long port, void *addr, unsigned long count);
178
179static inline void readsl(const void __iomem *addr, void *buf, int len)
180{
181 insl((unsigned long)addr, buf, len);
182}
183
184static inline void readsw(const void __iomem *addr, void *buf, int len)
185{
186 insw((unsigned long)addr, buf, len);
187}
188
189static inline void readsb(const void __iomem *addr, void *buf, int len)
190{
191 insb((unsigned long)addr, buf, len);
192}
193
194static inline void writesl(const void __iomem *addr, const void *buf, int len)
195{
196 outsl((unsigned long)addr, buf, len);
197}
198
199static inline void writesw(const void __iomem *addr, const void *buf, int len)
200{
201 outsw((unsigned long)addr, buf, len);
202}
203
204static inline void writesb(const void __iomem *addr, const void *buf, int len)
205{
206 outsb((unsigned long)addr, buf, len);
207}
208
Mike Frysinger5eefe7e2009-11-30 13:34:07 -0500209#if defined(CONFIG_STAMP_CF) || defined(CONFIG_BFIN_IDE)
210/* This hack for CF/IDE needs to be addressed at some point */
211extern void cf_outsw(unsigned short *addr, unsigned short *sect_buf, int words);
212extern void cf_insw(unsigned short *sect_buf, unsigned short *addr, int words);
213extern unsigned char cf_inb(volatile unsigned char *addr);
214extern void cf_outb(unsigned char val, volatile unsigned char *addr);
215#undef inb
216#undef outb
217#undef insw
218#undef outsw
219#define inb(addr) cf_inb((void *)(addr))
220#define outb(x, addr) cf_outb((unsigned char)(x), (void *)(addr))
221#define insw(port, addr, cnt) cf_insw((void *)(addr), (void *)(port), cnt)
222#define outsw(port, addr, cnt) cf_outsw((void *)(port), (void *)(addr), cnt)
223#endif
Wolfgang Denk6cb142f2006-03-12 02:12:27 +0100224
Wolfgang Denk6cb142f2006-03-12 02:12:27 +0100225#endif
Mike Frysingera52ad4f2009-11-30 13:51:24 -0500226
227#endif /* __KERNEL__ */
228
Wolfgang Denk6cb142f2006-03-12 02:12:27 +0100229#endif