1*013bf24cSRichard Kuo /* 2*013bf24cSRichard Kuo * I/O access functions for Hexagon 3*013bf24cSRichard Kuo * 4*013bf24cSRichard Kuo * Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. 5*013bf24cSRichard Kuo * 6*013bf24cSRichard Kuo * This program is free software; you can redistribute it and/or modify 7*013bf24cSRichard Kuo * it under the terms of the GNU General Public License version 2 and 8*013bf24cSRichard Kuo * only version 2 as published by the Free Software Foundation. 9*013bf24cSRichard Kuo * 10*013bf24cSRichard Kuo * This program is distributed in the hope that it will be useful, 11*013bf24cSRichard Kuo * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*013bf24cSRichard Kuo * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*013bf24cSRichard Kuo * GNU General Public License for more details. 14*013bf24cSRichard Kuo * 15*013bf24cSRichard Kuo * You should have received a copy of the GNU General Public License 16*013bf24cSRichard Kuo * along with this program; if not, write to the Free Software 17*013bf24cSRichard Kuo * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18*013bf24cSRichard Kuo * 02110-1301, USA. 19*013bf24cSRichard Kuo */ 20*013bf24cSRichard Kuo 21*013bf24cSRichard Kuo #include <asm/io.h> 22*013bf24cSRichard Kuo 23*013bf24cSRichard Kuo /* These are all FIFO routines! */ 24*013bf24cSRichard Kuo 25*013bf24cSRichard Kuo /* 26*013bf24cSRichard Kuo * __raw_readsw - read words a short at a time 27*013bf24cSRichard Kuo * @addr: source address 28*013bf24cSRichard Kuo * @data: data address 29*013bf24cSRichard Kuo * @len: number of shorts to read 30*013bf24cSRichard Kuo */ 31*013bf24cSRichard Kuo void __raw_readsw(const void __iomem *addr, void *data, int len) 32*013bf24cSRichard Kuo { 33*013bf24cSRichard Kuo const volatile short int *src = (short int *) addr; 34*013bf24cSRichard Kuo short int *dst = (short int *) data; 35*013bf24cSRichard Kuo 36*013bf24cSRichard Kuo if ((u32)data & 0x1) 37*013bf24cSRichard Kuo panic("unaligned pointer to readsw"); 38*013bf24cSRichard Kuo 39*013bf24cSRichard Kuo while (len-- > 0) 40*013bf24cSRichard Kuo *dst++ = *src; 41*013bf24cSRichard Kuo 42*013bf24cSRichard Kuo } 43*013bf24cSRichard Kuo 44*013bf24cSRichard Kuo /* 45*013bf24cSRichard Kuo * __raw_writesw - read words a short at a time 46*013bf24cSRichard Kuo * @addr: source address 47*013bf24cSRichard Kuo * @data: data address 48*013bf24cSRichard Kuo * @len: number of shorts to read 49*013bf24cSRichard Kuo */ 50*013bf24cSRichard Kuo void __raw_writesw(void __iomem *addr, const void *data, int len) 51*013bf24cSRichard Kuo { 52*013bf24cSRichard Kuo const short int *src = (short int *)data; 53*013bf24cSRichard Kuo volatile short int *dst = (short int *)addr; 54*013bf24cSRichard Kuo 55*013bf24cSRichard Kuo if ((u32)data & 0x1) 56*013bf24cSRichard Kuo panic("unaligned pointer to writesw"); 57*013bf24cSRichard Kuo 58*013bf24cSRichard Kuo while (len-- > 0) 59*013bf24cSRichard Kuo *dst = *src++; 60*013bf24cSRichard Kuo 61*013bf24cSRichard Kuo 62*013bf24cSRichard Kuo } 63*013bf24cSRichard Kuo 64*013bf24cSRichard Kuo /* Pretty sure len is pre-adjusted for the length of the access already */ 65*013bf24cSRichard Kuo void __raw_readsl(const void __iomem *addr, void *data, int len) 66*013bf24cSRichard Kuo { 67*013bf24cSRichard Kuo const volatile long *src = (long *) addr; 68*013bf24cSRichard Kuo long *dst = (long *) data; 69*013bf24cSRichard Kuo 70*013bf24cSRichard Kuo if ((u32)data & 0x3) 71*013bf24cSRichard Kuo panic("unaligned pointer to readsl"); 72*013bf24cSRichard Kuo 73*013bf24cSRichard Kuo while (len-- > 0) 74*013bf24cSRichard Kuo *dst++ = *src; 75*013bf24cSRichard Kuo 76*013bf24cSRichard Kuo 77*013bf24cSRichard Kuo } 78*013bf24cSRichard Kuo 79*013bf24cSRichard Kuo void __raw_writesl(void __iomem *addr, const void *data, int len) 80*013bf24cSRichard Kuo { 81*013bf24cSRichard Kuo const long *src = (long *)data; 82*013bf24cSRichard Kuo volatile long *dst = (long *)addr; 83*013bf24cSRichard Kuo 84*013bf24cSRichard Kuo if ((u32)data & 0x3) 85*013bf24cSRichard Kuo panic("unaligned pointer to writesl"); 86*013bf24cSRichard Kuo 87*013bf24cSRichard Kuo while (len-- > 0) 88*013bf24cSRichard Kuo *dst = *src++; 89*013bf24cSRichard Kuo 90*013bf24cSRichard Kuo 91*013bf24cSRichard Kuo } 92