1013bf24cSRichard Kuo /* 2013bf24cSRichard Kuo * I/O access functions for Hexagon 3013bf24cSRichard Kuo * 4*e1858b2aSRichard Kuo * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. 5013bf24cSRichard Kuo * 6013bf24cSRichard Kuo * This program is free software; you can redistribute it and/or modify 7013bf24cSRichard Kuo * it under the terms of the GNU General Public License version 2 and 8013bf24cSRichard Kuo * only version 2 as published by the Free Software Foundation. 9013bf24cSRichard Kuo * 10013bf24cSRichard Kuo * This program is distributed in the hope that it will be useful, 11013bf24cSRichard Kuo * but WITHOUT ANY WARRANTY; without even the implied warranty of 12013bf24cSRichard Kuo * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13013bf24cSRichard Kuo * GNU General Public License for more details. 14013bf24cSRichard Kuo * 15013bf24cSRichard Kuo * You should have received a copy of the GNU General Public License 16013bf24cSRichard Kuo * along with this program; if not, write to the Free Software 17013bf24cSRichard Kuo * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18013bf24cSRichard Kuo * 02110-1301, USA. 19013bf24cSRichard Kuo */ 20013bf24cSRichard Kuo 21013bf24cSRichard Kuo #include <asm/io.h> 22013bf24cSRichard Kuo 23013bf24cSRichard Kuo /* These are all FIFO routines! */ 24013bf24cSRichard Kuo 25013bf24cSRichard Kuo /* 26013bf24cSRichard Kuo * __raw_readsw - read words a short at a time 27013bf24cSRichard Kuo * @addr: source address 28013bf24cSRichard Kuo * @data: data address 29013bf24cSRichard Kuo * @len: number of shorts to read 30013bf24cSRichard Kuo */ 31013bf24cSRichard Kuo void __raw_readsw(const void __iomem *addr, void *data, int len) 32013bf24cSRichard Kuo { 33013bf24cSRichard Kuo const volatile short int *src = (short int *) addr; 34013bf24cSRichard Kuo short int *dst = (short int *) data; 35013bf24cSRichard Kuo 36013bf24cSRichard Kuo if ((u32)data & 0x1) 37013bf24cSRichard Kuo panic("unaligned pointer to readsw"); 38013bf24cSRichard Kuo 39013bf24cSRichard Kuo while (len-- > 0) 40013bf24cSRichard Kuo *dst++ = *src; 41013bf24cSRichard Kuo 42013bf24cSRichard Kuo } 43013bf24cSRichard Kuo 44013bf24cSRichard Kuo /* 45013bf24cSRichard Kuo * __raw_writesw - read words a short at a time 46013bf24cSRichard Kuo * @addr: source address 47013bf24cSRichard Kuo * @data: data address 48013bf24cSRichard Kuo * @len: number of shorts to read 49013bf24cSRichard Kuo */ 50013bf24cSRichard Kuo void __raw_writesw(void __iomem *addr, const void *data, int len) 51013bf24cSRichard Kuo { 52013bf24cSRichard Kuo const short int *src = (short int *)data; 53013bf24cSRichard Kuo volatile short int *dst = (short int *)addr; 54013bf24cSRichard Kuo 55013bf24cSRichard Kuo if ((u32)data & 0x1) 56013bf24cSRichard Kuo panic("unaligned pointer to writesw"); 57013bf24cSRichard Kuo 58013bf24cSRichard Kuo while (len-- > 0) 59013bf24cSRichard Kuo *dst = *src++; 60013bf24cSRichard Kuo 61013bf24cSRichard Kuo 62013bf24cSRichard Kuo } 63013bf24cSRichard Kuo 64013bf24cSRichard Kuo /* Pretty sure len is pre-adjusted for the length of the access already */ 65013bf24cSRichard Kuo void __raw_readsl(const void __iomem *addr, void *data, int len) 66013bf24cSRichard Kuo { 67013bf24cSRichard Kuo const volatile long *src = (long *) addr; 68013bf24cSRichard Kuo long *dst = (long *) data; 69013bf24cSRichard Kuo 70013bf24cSRichard Kuo if ((u32)data & 0x3) 71013bf24cSRichard Kuo panic("unaligned pointer to readsl"); 72013bf24cSRichard Kuo 73013bf24cSRichard Kuo while (len-- > 0) 74013bf24cSRichard Kuo *dst++ = *src; 75013bf24cSRichard Kuo 76013bf24cSRichard Kuo 77013bf24cSRichard Kuo } 78013bf24cSRichard Kuo 79013bf24cSRichard Kuo void __raw_writesl(void __iomem *addr, const void *data, int len) 80013bf24cSRichard Kuo { 81013bf24cSRichard Kuo const long *src = (long *)data; 82013bf24cSRichard Kuo volatile long *dst = (long *)addr; 83013bf24cSRichard Kuo 84013bf24cSRichard Kuo if ((u32)data & 0x3) 85013bf24cSRichard Kuo panic("unaligned pointer to writesl"); 86013bf24cSRichard Kuo 87013bf24cSRichard Kuo while (len-- > 0) 88013bf24cSRichard Kuo *dst = *src++; 89013bf24cSRichard Kuo 90013bf24cSRichard Kuo 91013bf24cSRichard Kuo } 92