Blame view

arch/cris/include/asm/io.h 4.74 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  #ifndef _ASM_CRIS_IO_H
  #define _ASM_CRIS_IO_H
  
  #include <asm/page.h>   /* for __va, __pa */
556dcee7b   Jesper Nilsson   [CRIS] Move heade...
5
  #include <arch/io.h>
59c61138a   Mikael Starvik   [PATCH] CRIS upda...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  #include <linux/kernel.h>
  
  struct cris_io_operations
  {
  	u32 (*read_mem)(void *addr, int size);
  	void (*write_mem)(u32 val, int size, void *addr);
  	u32 (*read_io)(u32 port, void *addr, int size, int count);
  	void (*write_io)(u32 port, void *addr, int size, int count);
  };
  
  #ifdef CONFIG_PCI
  extern struct cris_io_operations *cris_iops;
  #else
  #define cris_iops ((struct cris_io_operations*)NULL)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
24
  
  /*
   * Change virtual addresses to physical addresses and vv.
   */
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
25
  static inline unsigned long virt_to_phys(volatile void * address)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
  {
  	return __pa(address);
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
29
  static inline void * phys_to_virt(unsigned long address)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
  {
  	return __va(address);
  }
59c61138a   Mikael Starvik   [PATCH] CRIS upda...
33
34
  extern void __iomem * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
  extern void __iomem * __ioremap_prot(unsigned long phys_addr, unsigned long size, pgprot_t prot);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35

d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
36
  static inline void __iomem * ioremap (unsigned long offset, unsigned long size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
  {
  	return __ioremap(offset, size, 0);
  }
59c61138a   Mikael Starvik   [PATCH] CRIS upda...
40
41
42
  extern void iounmap(volatile void * __iomem addr);
  
  extern void __iomem * ioremap_nocache(unsigned long offset, unsigned long size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
45
46
47
48
49
50
51
52
53
54
55
  
  /*
   * IO bus memory addresses are also 1:1 with the physical address
   */
  #define virt_to_bus virt_to_phys
  #define bus_to_virt phys_to_virt
  
  /*
   * readX/writeX() are used to access memory mapped devices. On some
   * architectures the memory mapped IO stuff needs to be accessed
   * differently. On the CRIS architecture, we just read/write the
   * memory location directly.
   */
59c61138a   Mikael Starvik   [PATCH] CRIS upda...
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  #ifdef CONFIG_PCI
  #define PCI_SPACE(x) ((((unsigned)(x)) & 0x10000000) == 0x10000000)
  #else
  #define PCI_SPACE(x) 0
  #endif
  static inline unsigned char readb(const volatile void __iomem *addr)
  {
  	if (PCI_SPACE(addr) && cris_iops)
  		return cris_iops->read_mem((void*)addr, 1);
  	else
  		return *(volatile unsigned char __force *) addr;
  }
  static inline unsigned short readw(const volatile void __iomem *addr)
  {
  	if (PCI_SPACE(addr) && cris_iops)
  		return cris_iops->read_mem((void*)addr, 2);
  	else
  		return *(volatile unsigned short __force *) addr;
  }
  static inline unsigned int readl(const volatile void __iomem *addr)
  {
  	if (PCI_SPACE(addr) && cris_iops)
  		return cris_iops->read_mem((void*)addr, 4);
  	else
  		return *(volatile unsigned int __force *) addr;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
83
84
85
86
87
  #define readb_relaxed(addr) readb(addr)
  #define readw_relaxed(addr) readw(addr)
  #define readl_relaxed(addr) readl(addr)
  #define __raw_readb readb
  #define __raw_readw readw
  #define __raw_readl readl
59c61138a   Mikael Starvik   [PATCH] CRIS upda...
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  static inline void writeb(unsigned char b, volatile void __iomem *addr)
  {
  	if (PCI_SPACE(addr) && cris_iops)
  		cris_iops->write_mem(b, 1, (void*)addr);
  	else
  		*(volatile unsigned char __force *) addr = b;
  }
  static inline void writew(unsigned short b, volatile void __iomem *addr)
  {
  	if (PCI_SPACE(addr) && cris_iops)
  		cris_iops->write_mem(b, 2, (void*)addr);
  	else
  		*(volatile unsigned short __force *) addr = b;
  }
  static inline void writel(unsigned int b, volatile void __iomem *addr)
  {
  	if (PCI_SPACE(addr) && cris_iops)
  		cris_iops->write_mem(b, 4, (void*)addr);
  	else
  		*(volatile unsigned int __force *) addr = b;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
111
112
113
114
115
116
117
  #define __raw_writeb writeb
  #define __raw_writew writew
  #define __raw_writel writel
  
  #define mmiowb()
  
  #define memset_io(a,b,c)	memset((void *)(a),(b),(c))
  #define memcpy_fromio(a,b,c)	memcpy((a),(void *)(b),(c))
  #define memcpy_toio(a,b,c)	memcpy((void *)(a),(b),(c))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118

058f5fdfd   Jesper Nilsson   CRIS: Correct com...
119
120
  /* I/O port access. Normally there is no I/O space on CRIS but when
   * Cardbus/PCI is enabled the request is passed through the bridge.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
123
   */
  
  #define IO_SPACE_LIMIT 0xffff
59c61138a   Mikael Starvik   [PATCH] CRIS upda...
124
125
126
127
128
129
130
131
132
133
134
135
  #define inb(port) (cris_iops ? cris_iops->read_io(port,NULL,1,1) : 0)
  #define inw(port) (cris_iops ? cris_iops->read_io(port,NULL,2,1) : 0)
  #define inl(port) (cris_iops ? cris_iops->read_io(port,NULL,4,1) : 0)
  #define insb(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,1,count) : 0)
  #define insw(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,2,count) : 0)
  #define insl(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,4,count) : 0)
  #define outb(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,1,1)
  #define outw(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,2,1)
  #define outl(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,4,1)
  #define outsb(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,1,count)
  #define outsw(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,2,count)
  #define outsl(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,3,count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
137
138
139
140
141
142
143
144
145
146
147
148
  
  /*
   * Convert a physical pointer to a virtual kernel pointer for /dev/mem
   * access
   */
  #define xlate_dev_mem_ptr(p)	__va(p)
  
  /*
   * Convert a virtual cached pointer to an uncached pointer
   */
  #define xlate_dev_kmem_ptr(p)	p
  
  #endif