1013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
2013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * IO definitions for the Hexagon architecture
3013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo *
4013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
5013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo *
6013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * This program is free software; you can redistribute it and/or modify
7013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * it under the terms of the GNU General Public License version 2 and
8013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * only version 2 as published by the Free Software Foundation.
9013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo *
10013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * This program is distributed in the hope that it will be useful,
11013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * but WITHOUT ANY WARRANTY; without even the implied warranty of
12013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * GNU General Public License for more details.
14013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo *
15013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * You should have received a copy of the GNU General Public License
16013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * along with this program; if not, write to the Free Software
17013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * 02110-1301, USA.
19013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
20013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
21013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#ifndef _ASM_IO_H
22013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define _ASM_IO_H
23013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
24013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#ifdef __KERNEL__
25013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
26013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#include <linux/types.h>
27013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#include <linux/delay.h>
28013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#include <linux/vmalloc.h>
29013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#include <asm/string.h>
30013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#include <asm/mem-layout.h>
31013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#include <asm/iomap.h>
32013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#include <asm/page.h>
33013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#include <asm/cacheflush.h>
34013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#include <asm/tlbflush.h>
35013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
36013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
37013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * We don't have PCI yet.
38013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * _IO_BASE is pointing at what should be unused virtual space.
39013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
40013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define IO_SPACE_LIMIT 0xffff
41013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define _IO_BASE ((void __iomem *)0xfe000000)
42013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
43013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuoextern int remap_area_pages(unsigned long start, unsigned long phys_addr,
44013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo				unsigned long end, unsigned long flags);
45013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
46013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuoextern void __iounmap(const volatile void __iomem *addr);
47013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
48013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/* Defined in lib/io.c, needed for smc91x driver. */
49013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuoextern void __raw_readsw(const void __iomem *addr, void *data, int wordlen);
50013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuoextern void __raw_writesw(void __iomem *addr, const void *data, int wordlen);
51013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
52013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuoextern void __raw_readsl(const void __iomem *addr, void *data, int wordlen);
53013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuoextern void __raw_writesl(void __iomem *addr, const void *data, int wordlen);
54013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
55013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define readsw(p, d, l)	__raw_readsw(p, d, l)
56013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define writesw(p, d, l) __raw_writesw(p, d, l)
57013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
58013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define readsl(p, d, l)   __raw_readsl(p, d, l)
59013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define writesl(p, d, l)  __raw_writesl(p, d, l)
60013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
61013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
62013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * virt_to_phys - map virtual address to physical
63013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * @address:  address to map
64013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
65013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline unsigned long virt_to_phys(volatile void *address)
66013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
67013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	return __pa(address);
68013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
69013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
70013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
71013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * phys_to_virt - map physical address to virtual
72013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * @address: address to map
73013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
74013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void *phys_to_virt(unsigned long address)
75013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
76013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	return __va(address);
77013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
78013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
79013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
80013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * convert a physical pointer to a virtual kernel pointer for
81013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * /dev/mem access.
82013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
83013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define xlate_dev_kmem_ptr(p)    __va(p)
84013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define xlate_dev_mem_ptr(p)    __va(p)
85013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
86013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
87013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * IO port access primitives.  Hexagon doesn't have special IO access
88013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * instructions; all I/O is memory mapped.
89013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo *
90013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * in/out are used for "ports", but we don't have "port instructions",
91013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * so these are really just memory mapped too.
92013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
93013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
94013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
95013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * readb - read byte from memory mapped device
96013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * @addr:  pointer to memory
97013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo *
98013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * Operates on "I/O bus memory space"
99013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
100013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline u8 readb(const volatile void __iomem *addr)
101013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
102013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	u8 val;
103013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	asm volatile(
104013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		"%0 = memb(%1);"
105013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "=&r" (val)
106013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "r" (addr)
107013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	);
108013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	return val;
109013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
110013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
111013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline u16 readw(const volatile void __iomem *addr)
112013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
113013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	u16 val;
114013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	asm volatile(
115013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		"%0 = memh(%1);"
116013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "=&r" (val)
117013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "r" (addr)
118013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	);
119013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	return val;
120013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
121013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
122013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline u32 readl(const volatile void __iomem *addr)
123013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
124013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	u32 val;
125013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	asm volatile(
126013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		"%0 = memw(%1);"
127013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "=&r" (val)
128013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "r" (addr)
129013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	);
130013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	return val;
131013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
132013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
133013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
134013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * writeb - write a byte to a memory location
135013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * @data: data to write to
136013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * @addr:  pointer to memory
137013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo *
138013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
139013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void writeb(u8 data, volatile void __iomem *addr)
140013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
141013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	asm volatile(
142013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		"memb(%0) = %1;"
143013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		:
144013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "r" (addr), "r" (data)
145013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "memory"
146013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	);
147013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
148013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
149013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void writew(u16 data, volatile void __iomem *addr)
150013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
151013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	asm volatile(
152013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		"memh(%0) = %1;"
153013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		:
154013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "r" (addr), "r" (data)
155013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "memory"
156013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	);
157013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
158013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
159013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
160013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void writel(u32 data, volatile void __iomem *addr)
161013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
162013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	asm volatile(
163013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		"memw(%0) = %1;"
164013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		:
165013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "r" (addr), "r" (data)
166013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		: "memory"
167013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	);
168013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
169013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
170013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define __raw_writeb writeb
171013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define __raw_writew writew
172013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define __raw_writel writel
173013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
174013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define __raw_readb readb
175013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define __raw_readw readw
176013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define __raw_readl readl
177013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
178013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
179013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * Need an mtype somewhere in here, for cache type deals?
180013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * This is probably too long for an inline.
181013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
182013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuovoid __iomem *ioremap_nocache(unsigned long phys_addr, unsigned long size);
183013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
184013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
185013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
186013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	return ioremap_nocache(phys_addr, size);
187013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
188013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
189013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void iounmap(volatile void __iomem *addr)
190013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
191013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	__iounmap(addr);
192013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
193013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
194013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define __raw_writel writel
195013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
196013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void memcpy_fromio(void *dst, const volatile void __iomem *src,
197013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	int count)
198013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
199013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	memcpy(dst, (void *) src, count);
200013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
201013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
202013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void memcpy_toio(volatile void __iomem *dst, const void *src,
203013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	int count)
204013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
205013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	memcpy((void *) dst, src, count);
206013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
207013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
208013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define PCI_IO_ADDR	(volatile void __iomem *)
209013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
210013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
211013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * inb - read byte from I/O port or something
212013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * @port:  address in I/O space
213013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo *
214013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * Operates on "I/O bus I/O space"
215013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
216013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline u8 inb(unsigned long port)
217013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
218013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	return readb(_IO_BASE + (port & IO_SPACE_LIMIT));
219013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
220013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
221013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline u16 inw(unsigned long port)
222013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
223013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	return readw(_IO_BASE + (port & IO_SPACE_LIMIT));
224013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
225013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
226013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline u32 inl(unsigned long port)
227013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
228013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	return readl(_IO_BASE + (port & IO_SPACE_LIMIT));
229013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
230013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
231013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo/*
232013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * outb - write a byte to a memory location
233013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * @data: data to write to
234013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo * @addr:  address in I/O space
235013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo */
236013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void outb(u8 data, unsigned long port)
237013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
238013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	writeb(data, _IO_BASE + (port & IO_SPACE_LIMIT));
239013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
240013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
241013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void outw(u16 data, unsigned long port)
242013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
243013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	writew(data, _IO_BASE + (port & IO_SPACE_LIMIT));
244013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
245013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
246013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void outl(u32 data, unsigned long port)
247013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
248013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	writel(data, _IO_BASE + (port & IO_SPACE_LIMIT));
249013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
250013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
251013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define outb_p outb
252013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define outw_p outw
253013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define outl_p outl
254013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
255013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define inb_p inb
256013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define inw_p inw
257013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define inl_p inl
258013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
259013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void insb(unsigned long port, void *buffer, int count)
260013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
261013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	if (count) {
262013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		u8 *buf = buffer;
263013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		do {
264013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo			u8 x = inb(port);
265013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo			*buf++ = x;
266013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		} while (--count);
267013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	}
268013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
269013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
270013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void insw(unsigned long port, void *buffer, int count)
271013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
272013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	if (count) {
273013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		u16 *buf = buffer;
274013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		do {
275013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo			u16 x = inw(port);
276013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo			*buf++ = x;
277013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		} while (--count);
278013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	}
279013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
280013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
281013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void insl(unsigned long port, void *buffer, int count)
282013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
283013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	if (count) {
284013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		u32 *buf = buffer;
285013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		do {
286013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo			u32 x = inw(port);
287013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo			*buf++ = x;
288013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		} while (--count);
289013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	}
290013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
291013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
292013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void outsb(unsigned long port, const void *buffer, int count)
293013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
294013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	if (count) {
295013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		const u8 *buf = buffer;
296013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		do {
297013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo			outb(*buf++, port);
298013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		} while (--count);
299013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	}
300013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
301013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
302013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void outsw(unsigned long port, const void *buffer, int count)
303013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
304013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	if (count) {
305013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		const u16 *buf = buffer;
306013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		do {
307013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo			outw(*buf++, port);
308013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		} while (--count);
309013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	}
310013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
311013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
312013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuostatic inline void outsl(unsigned long port, const void *buffer, int count)
313013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo{
314013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	if (count) {
315013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		const u32 *buf = buffer;
316013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		do {
317013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo			outl(*buf++, port);
318013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo		} while (--count);
319013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo	}
320013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo}
321013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
322013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#define flush_write_buffers() do { } while (0)
323013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
324013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#endif /* __KERNEL__ */
325013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo
326013bf24c38293ca1142823d3c67a4aa4d90c6e66Richard Kuo#endif
327