Revert last change. Bug noticed by Linus.
[linux-2.6/linux-mips.git] / drivers / acorn / scsi / acornscsi-io.S
blobf1e5e6119e38cf583188132a255564a04722f78b
1 @  linux/arch/arm/drivers/scsi/acornscsi-io.S: Acorn SCSI card IO
2 #include <linux/linkage.h>
4 #include <asm/assembler.h>
5 #include <asm/hardware.h>
7 #if (IO_BASE == (PCIO_BASE & 0xff000000))
8 #define ADDR(off,reg)                                           \
9                 tst     off, $0x80000000                        ;\
10                 mov     reg, $IO_BASE                           ;\
11                 orreq   reg, reg, $(PCIO_BASE & 0x00ff0000)
12 #else
13 #define ADDR(off,reg)                                           \
14                 tst     off, $0x80000000                        ;\
15                 movne   reg, $IO_BASE                           ;\
16                 moveq   reg, $(PCIO_BASE & 0xff000000)          ;\
17                 orreq   reg, reg, $(PCIO_BASE & 0x00ff0000)
18 #endif
20 @ Purpose: transfer a block of data from the acorn scsi card to memory
21 @ Proto  : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
22 @ Returns: nothing
24                 .align
25 ENTRY(__acornscsi_in)
26                 stmfd   sp!, {r4 - r7, lr}
27                 bic     r0, r0, #3
28                 mov     lr, #0xff
29                 orr     lr, lr, #0xff00
30 acornscsi_in16lp:
31                 subs    r2, r2, #16
32                 bmi     acornscsi_in8
33                 ldmia   r0!, {r3, r4, r5, r6}
34                 and     r3, r3, lr
35                 orr     r3, r3, r4, lsl #16
36                 and     r4, r5, lr
37                 orr     r4, r4, r6, lsl #16
38                 ldmia   r0!, {r5, r6, r7, ip}
39                 and     r5, r5, lr
40                 orr     r5, r5, r6, lsl #16
41                 and     r6, r7, lr
42                 orr     r6, r6, ip, lsl #16
43                 stmia   r1!, {r3 - r6}
44                 bne     acornscsi_in16lp
45                 LOADREGS(fd, sp!, {r4 - r7, pc})
47 acornscsi_in8:  adds    r2, r2, #8
48                 bmi     acornscsi_in4
49                 ldmia   r0!, {r3, r4, r5, r6}
50                 and     r3, r3, lr
51                 orr     r3, r3, r4, lsl #16
52                 and     r4, r5, lr
53                 orr     r4, r4, r6, lsl #16
54                 stmia   r1!, {r3 - r4}
55                 LOADREGS(eqfd, sp!, {r4 - r7, pc})
56                 sub     r2, r2, #8
58 acornscsi_in4:  adds    r2, r2, #4
59                 bmi     acornscsi_in2
60                 ldmia   r0!, {r3, r4}
61                 and     r3, r3, lr
62                 orr     r3, r3, r4, lsl #16
63                 str     r3, [r1], #4
64                 LOADREGS(eqfd, sp!, {r4 - r7, pc})
65                 sub     r2, r2, #4
67 acornscsi_in2:  adds    r2, r2, #2
68                 ldr     r3, [r0], #4
69                 and     r3, r3, lr
70                 strb    r3, [r1], #1
71                 mov     r3, r3, lsr #8
72                 strplb  r3, [r1], #1
73                 LOADREGS(fd, sp!, {r4 - r7, pc})
75 @ Purpose: transfer a block of data from memory to the acorn scsi card
76 @ Proto  : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
77 @ Returns: nothing
79 ENTRY(__acornscsi_out)
80                 stmfd   sp!, {r4 - r6, lr}
81                 bic     r0, r0, #3
82 acornscsi_out16lp:
83                 subs    r2, r2, #16
84                 bmi     acornscsi_out8
85                 ldmia   r1!, {r4, r6, ip, lr}
86                 mov     r3, r4, lsl #16
87                 orr     r3, r3, r3, lsr #16
88                 mov     r4, r4, lsr #16
89                 orr     r4, r4, r4, lsl #16
90                 mov     r5, r6, lsl #16
91                 orr     r5, r5, r5, lsr #16
92                 mov     r6, r6, lsr #16
93                 orr     r6, r6, r6, lsl #16
94                 stmia   r0!, {r3, r4, r5, r6}
95                 mov     r3, ip, lsl #16
96                 orr     r3, r3, r3, lsr #16
97                 mov     r4, ip, lsr #16
98                 orr     r4, r4, r4, lsl #16
99                 mov     ip, lr, lsl #16
100                 orr     ip, ip, ip, lsr #16
101                 mov     lr, lr, lsr #16
102                 orr     lr, lr, lr, lsl #16
103                 stmia   r0!, {r3, r4, ip, lr}
104                 bne     acornscsi_out16lp
105                 LOADREGS(fd, sp!, {r4 - r6, pc})
107 acornscsi_out8: adds    r2, r2, #8
108                 bmi     acornscsi_out4
109                 ldmia   r1!, {r4, r6}
110                 mov     r3, r4, lsl #16
111                 orr     r3, r3, r3, lsr #16
112                 mov     r4, r4, lsr #16
113                 orr     r4, r4, r4, lsl #16
114                 mov     r5, r6, lsl #16
115                 orr     r5, r5, r5, lsr #16
116                 mov     r6, r6, lsr #16
117                 orr     r6, r6, r6, lsl #16
118                 stmia   r0!, {r3, r4, r5, r6}
119                 LOADREGS(eqfd, sp!, {r4 - r6, pc})
121                 sub     r2, r2, #8
122 acornscsi_out4: adds    r2, r2, #4
123                 bmi     acornscsi_out2
124                 ldr     r4, [r1], #4
125                 mov     r3, r4, lsl #16
126                 orr     r3, r3, r3, lsr #16
127                 mov     r4, r4, lsr #16
128                 orr     r4, r4, r4, lsl #16
129                 stmia   r0!, {r3, r4}
130                 LOADREGS(eqfd, sp!, {r4 - r6, pc})
132                 sub     r2, r2, #4
133 acornscsi_out2: adds    r2, r2, #2
134                 ldr     r3, [r1], #2
135                 strb    r3, [r0], #1
136                 mov     r3, r3, lsr #8
137                 strplb  r3, [r0], #1
138                 LOADREGS(fd, sp!, {r4 - r6, pc})