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