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