Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
sh
lib
io.c
Go to the documentation of this file.
1
/*
2
* arch/sh/lib/io.c - SH32 optimized I/O routines
3
*
4
* Copyright (C) 2000 Stuart Menefy
5
* Copyright (C) 2005 Paul Mundt
6
*
7
* Provide real functions which expand to whatever the header file defined.
8
* Also definitions of machine independent IO functions.
9
*
10
* This file is subject to the terms and conditions of the GNU General Public
11
* License. See the file "COPYING" in the main directory of this archive
12
* for more details.
13
*/
14
#include <linux/module.h>
15
#include <
linux/io.h
>
16
17
void
__raw_readsl
(
const
void
__iomem
*
addr
,
void
*datap,
int
len)
18
{
19
u32
*
data
;
20
21
for
(data = datap; (len != 0) && (((
u32
)data & 0x1f) != 0); len--)
22
*data++ =
__raw_readl
(addr);
23
24
if
(
likely
(len >= (0x20 >> 2))) {
25
int
tmp2, tmp3, tmp4, tmp5, tmp6;
26
27
__asm__
__volatile__(
28
"1: \n\t"
29
"mov.l @%7, r0 \n\t"
30
"mov.l @%7, %2 \n\t"
31
#ifdef CONFIG_CPU_SH4
32
"movca.l r0, @%0 \n\t"
33
#
else
34
"mov.l r0, @%0 \n\t"
35
#
endif
36
"mov.l @%7, %3 \n\t"
37
"mov.l @%7, %4 \n\t"
38
"mov.l @%7, %5 \n\t"
39
"mov.l @%7, %6 \n\t"
40
"mov.l @%7, r7 \n\t"
41
"mov.l @%7, r0 \n\t"
42
"mov.l %2, @(0x04,%0) \n\t"
43
"mov #0x20>>2, %2 \n\t"
44
"mov.l %3, @(0x08,%0) \n\t"
45
"sub %2, %1 \n\t"
46
"mov.l %4, @(0x0c,%0) \n\t"
47
"cmp/hi %1, %2 ! T if 32 > len \n\t"
48
"mov.l %5, @(0x10,%0) \n\t"
49
"mov.l %6, @(0x14,%0) \n\t"
50
"mov.l r7, @(0x18,%0) \n\t"
51
"mov.l r0, @(0x1c,%0) \n\t"
52
"bf.s 1b \n\t"
53
" add #0x20, %0 \n\t"
54
:
"=&r"
(data),
"=&r"
(len),
55
"=&r"
(tmp2),
"=&r"
(tmp3),
"=&r"
(tmp4),
56
"=&r"
(tmp5),
"=&r"
(tmp6)
57
:
"r"
(addr),
"0"
(data),
"1"
(len)
58
:
"r0"
,
"r7"
,
"t"
,
"memory"
);
59
}
60
61
for
(; len != 0; len--)
62
*data++ =
__raw_readl
(addr);
63
}
64
EXPORT_SYMBOL
(
__raw_readsl
);
65
66
void
__raw_writesl
(
void
__iomem
*
addr
,
const
void
*
data
,
int
len)
67
{
68
if
(
likely
(len != 0)) {
69
int
tmp1
;
70
71
__asm__
__volatile__ (
72
"1: \n\t"
73
"mov.l @%0+, %1 \n\t"
74
"dt %3 \n\t"
75
"bf.s 1b \n\t"
76
" mov.l %1, @%4 \n\t"
77
:
"=&r"
(data),
"=&r"
(tmp1)
78
:
"0"
(data),
"r"
(len),
"r"
(addr)
79
:
"t"
,
"memory"
);
80
}
81
}
82
EXPORT_SYMBOL
(
__raw_writesl
);
Generated on Thu Jan 10 2013 12:51:17 for Linux Kernel by
1.8.2