]>
Commit | Line | Data |
---|---|---|
013bf24c RK |
1 | /* |
2 | * I/O access functions for Hexagon | |
3 | * | |
e1858b2a | 4 | * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. |
013bf24c RK |
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 | } |