xref: /openbmc/linux/arch/hexagon/lib/io.c (revision 08dbd0f8)
108dbd0f8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2013bf24cSRichard Kuo /*
3013bf24cSRichard Kuo  * I/O access functions for Hexagon
4013bf24cSRichard Kuo  *
5e1858b2aSRichard Kuo  * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
6013bf24cSRichard Kuo  */
7013bf24cSRichard Kuo 
8013bf24cSRichard Kuo #include <asm/io.h>
9013bf24cSRichard Kuo 
10013bf24cSRichard Kuo /*  These are all FIFO routines!  */
11013bf24cSRichard Kuo 
12013bf24cSRichard Kuo /*
13013bf24cSRichard Kuo  * __raw_readsw - read words a short at a time
14013bf24cSRichard Kuo  * @addr:  source address
15013bf24cSRichard Kuo  * @data:  data address
16013bf24cSRichard Kuo  * @len: number of shorts to read
17013bf24cSRichard Kuo  */
18013bf24cSRichard Kuo void __raw_readsw(const void __iomem *addr, void *data, int len)
19013bf24cSRichard Kuo {
20013bf24cSRichard Kuo 	const volatile short int *src = (short int *) addr;
21013bf24cSRichard Kuo 	short int *dst = (short int *) data;
22013bf24cSRichard Kuo 
23013bf24cSRichard Kuo 	if ((u32)data & 0x1)
24013bf24cSRichard Kuo 		panic("unaligned pointer to readsw");
25013bf24cSRichard Kuo 
26013bf24cSRichard Kuo 	while (len-- > 0)
27013bf24cSRichard Kuo 		*dst++ = *src;
28013bf24cSRichard Kuo 
29013bf24cSRichard Kuo }
30013bf24cSRichard Kuo 
31013bf24cSRichard Kuo /*
32013bf24cSRichard Kuo  * __raw_writesw - read words a short at a time
33013bf24cSRichard Kuo  * @addr:  source address
34013bf24cSRichard Kuo  * @data:  data address
35013bf24cSRichard Kuo  * @len: number of shorts to read
36013bf24cSRichard Kuo  */
37013bf24cSRichard Kuo void __raw_writesw(void __iomem *addr, const void *data, int len)
38013bf24cSRichard Kuo {
39013bf24cSRichard Kuo 	const short int *src = (short int *)data;
40013bf24cSRichard Kuo 	volatile short int *dst = (short int *)addr;
41013bf24cSRichard Kuo 
42013bf24cSRichard Kuo 	if ((u32)data & 0x1)
43013bf24cSRichard Kuo 		panic("unaligned pointer to writesw");
44013bf24cSRichard Kuo 
45013bf24cSRichard Kuo 	while (len-- > 0)
46013bf24cSRichard Kuo 		*dst = *src++;
47013bf24cSRichard Kuo 
48013bf24cSRichard Kuo 
49013bf24cSRichard Kuo }
50013bf24cSRichard Kuo 
51013bf24cSRichard Kuo /*  Pretty sure len is pre-adjusted for the length of the access already */
52013bf24cSRichard Kuo void __raw_readsl(const void __iomem *addr, void *data, int len)
53013bf24cSRichard Kuo {
54013bf24cSRichard Kuo 	const volatile long *src = (long *) addr;
55013bf24cSRichard Kuo 	long *dst = (long *) data;
56013bf24cSRichard Kuo 
57013bf24cSRichard Kuo 	if ((u32)data & 0x3)
58013bf24cSRichard Kuo 		panic("unaligned pointer to readsl");
59013bf24cSRichard Kuo 
60013bf24cSRichard Kuo 	while (len-- > 0)
61013bf24cSRichard Kuo 		*dst++ = *src;
62013bf24cSRichard Kuo 
63013bf24cSRichard Kuo 
64013bf24cSRichard Kuo }
65013bf24cSRichard Kuo 
66013bf24cSRichard Kuo void __raw_writesl(void __iomem *addr, const void *data, int len)
67013bf24cSRichard Kuo {
68013bf24cSRichard Kuo 	const long *src = (long *)data;
69013bf24cSRichard Kuo 	volatile long *dst = (long *)addr;
70013bf24cSRichard Kuo 
71013bf24cSRichard Kuo 	if ((u32)data & 0x3)
72013bf24cSRichard Kuo 		panic("unaligned pointer to writesl");
73013bf24cSRichard Kuo 
74013bf24cSRichard Kuo 	while (len-- > 0)
75013bf24cSRichard Kuo 		*dst = *src++;
76013bf24cSRichard Kuo 
77013bf24cSRichard Kuo 
78013bf24cSRichard Kuo }
79