xref: /openbmc/linux/arch/hexagon/lib/io.c (revision 013bf24c)
1013bf24cSRichard Kuo /*
2013bf24cSRichard Kuo  * I/O access functions for Hexagon
3013bf24cSRichard Kuo  *
4013bf24cSRichard Kuo  * Copyright (c) 2010-2011, Code Aurora Forum. 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