xref: /openbmc/linux/arch/hexagon/lib/io.c (revision 013bf24c38293ca1142823d3c67a4aa4d90c6e66)
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