added mtd driver
[linux-2.4.git] / drivers / sound / vidc_fill.S
1 /*
2  *  linux/drivers/sound/vidc_fill.S
3  *
4  *  Copyright (C) 1997 Russell King
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 as
8  * published by the Free Software Foundation.
9  *
10  *  Filler routines for DMA buffers
11  */
12 #define __ASSEMBLY__
13 #include <linux/linkage.h>
14 #include <asm/assembler.h>
15 #include <asm/hardware.h>
16 #include <asm/hardware/iomd.h>
17
18                 .text
19
20 ENTRY(vidc_fill_1x8_u)
21                 mov     ip, #0xff00
22 1:              cmp     r0, r1
23                 bge     SYMBOL_NAME(vidc_clear)
24                 ldrb    r4, [r0], #1
25                 eor     r4, r4, #0x80
26                 and     r4, ip, r4, lsl #8
27                 orr     r4, r4, r4, lsl #16
28                 str     r4, [r2], #4
29                 cmp     r2, r3
30                 blt     1b
31                 mov     pc, lr
32
33 ENTRY(vidc_fill_2x8_u)
34                 mov     ip, #0xff00
35 1:              cmp     r0, r1
36                 bge     SYMBOL_NAME(vidc_clear)
37                 ldr     r4, [r0], #2
38                 and     r5, r4, ip
39                 and     r4, ip, r4, lsl #8
40                 orr     r4, r4, r5, lsl #16
41                 orr     r4, r4, r4, lsr #8
42                 str     r4, [r2], #4
43                 cmp     r2, r3
44                 blt     1b
45                 mov     pc, lr
46
47 ENTRY(vidc_fill_1x8_s)
48                 mov     ip, #0xff00
49 1:              cmp     r0, r1
50                 bge     SYMBOL_NAME(vidc_clear)
51                 ldrb    r4, [r0], #1
52                 and     r4, ip, r4, lsl #8
53                 orr     r4, r4, r4, lsl #16
54                 str     r4, [r2], #4
55                 cmp     r2, r3
56                 blt     1b
57                 mov     pc, lr
58
59 ENTRY(vidc_fill_2x8_s)
60                 mov     ip, #0xff00
61 1:              cmp     r0, r1
62                 bge     SYMBOL_NAME(vidc_clear)
63                 ldr     r4, [r0], #2
64                 and     r5, r4, ip
65                 and     r4, ip, r4, lsl #8
66                 orr     r4, r4, r5, lsl #16
67                 orr     r4, r4, r4, lsr #8
68                 str     r4, [r2], #4
69                 cmp     r2, r3
70                 blt     1b
71                 mov     pc, lr
72
73 ENTRY(vidc_fill_1x16_s)
74                 mov     ip, #0xff00
75                 orr     ip, ip, ip, lsr #8
76 1:              cmp     r0, r1
77                 bge     SYMBOL_NAME(vidc_clear)
78                 ldr     r5, [r0], #2
79                 and     r4, r5, ip
80                 orr     r4, r4, r4, lsl #16
81                 str     r4, [r2], #4
82                 cmp     r0, r1
83                 addlt   r0, r0, #2
84                 andlt   r4, r5, ip, lsl #16
85                 orrlt   r4, r4, r4, lsr #16
86                 strlt   r4, [r2], #4
87                 cmp     r2, r3
88                 blt     1b
89                 mov     pc, lr
90
91 ENTRY(vidc_fill_2x16_s)
92                 mov     ip, #0xff00
93                 orr     ip, ip, ip, lsr #8
94 1:              cmp     r0, r1
95                 bge     SYMBOL_NAME(vidc_clear)
96                 ldr     r4, [r0], #4
97                 str     r4, [r2], #4
98                 cmp     r0, r1
99                 ldrlt   r4, [r0], #4
100                 strlt   r4, [r2], #4
101                 cmp     r2, r3
102                 blt     1b
103                 mov     pc, lr
104
105 ENTRY(vidc_fill_noaudio)
106                 mov     r0, #0
107                 mov     r1, #0
108 2:              mov     r4, #0
109                 mov     r5, #0
110 1:              cmp     r2, r3
111                 stmltia r2!, {r0, r1, r4, r5}
112                 blt     1b
113                 mov     pc, lr
114
115 ENTRY(vidc_clear)
116                 mov     r0, #0
117                 mov     r1, #0
118                 tst     r2, #4
119                 str     r0, [r2], #4
120                 tst     r2, #8
121                 stmia   r2!, {r0, r1}
122                 b       2b
123
124 /*
125  * Call filler routines with:
126  *  r0 = phys address
127  *  r1 = phys end
128  *  r2 = buffer
129  * Returns:
130  *  r0 = new buffer address
131  *  r2 = new buffer finish
132  *  r4 = corrupted
133  *  r5 = corrupted
134  *  ip = corrupted
135  */
136
137 ENTRY(vidc_sound_dma_irq)
138                 stmfd   sp!, {r4 - r8, lr}
139                 ldr     r8, =SYMBOL_NAME(dma_start)
140                 ldmia   r8, {r0, r1, r2, r3, r4, r5}
141                 teq     r1, #0
142                 adreq   r4, SYMBOL_NAME(vidc_fill_noaudio)
143                 moveq   r7, #1 << 31
144                 movne   r7, #0
145                 mov     ip, #IOMD_BASE & 0xff000000
146                 orr     ip, ip, #IOMD_BASE & 0x00ff0000
147                 ldrb    r6, [ip, #IOMD_SD0ST]
148                 tst     r6, #DMA_ST_OFL                 @ Check for overrun
149                 eorne   r6, r6, #DMA_ST_AB
150                 tst     r6, #DMA_ST_AB
151                 moveq   r2, r3                          @ DMAing A, update B
152                 add     r3, r2, r5                      @ End of DMA buffer
153                 add     r1, r1, r0                      @ End of virtual DMA buffer
154                 mov     lr, pc
155                 mov     pc, r4                          @ Call fill routine (uses r4, ip)
156                 sub     r1, r1, r0                      @ Remaining length
157                 stmia   r8, {r0, r1}
158                 mov     r0, #0
159                 tst     r2, #4                          @ Round buffer up to 4 words
160                 strne   r0, [r2], #4
161                 tst     r2, #8
162                 strne   r0, [r2], #4
163                 strne   r0, [r2], #4
164                 sub     r2, r2, #16
165                 mov     r2, r2, lsl #20
166                 movs    r2, r2, lsr #20
167                 orreq   r2, r2, #1 << 30                @ Set L bit
168                 orr     r2, r2, r7
169                 ldmdb   r8, {r3, r4, r5}
170                 tst     r6, #DMA_ST_AB
171                 mov     ip, #IOMD_BASE & 0xff000000
172                 orr     ip, ip, #IOMD_BASE & 0x00ff0000
173                 streq   r4, [ip, #IOMD_SD0CURB]
174                 strne   r5, [ip, #IOMD_SD0CURA]
175                 streq   r2, [ip, #IOMD_SD0ENDB]
176                 strne   r2, [ip, #IOMD_SD0ENDA]
177                 ldr     lr, [ip, #IOMD_SD0ST]
178                 tst     lr, #DMA_ST_OFL
179                 bne     1f
180                 tst     r6, #DMA_ST_AB
181                 strne   r4, [ip, #IOMD_SD0CURB]
182                 streq   r5, [ip, #IOMD_SD0CURA]
183                 strne   r2, [ip, #IOMD_SD0ENDB]
184                 streq   r2, [ip, #IOMD_SD0ENDA]
185 1:              teq     r7, #0
186                 mov     r0, #0x10
187                 strneb  r0, [ip, #IOMD_SD0CR]
188                 ldmfd   sp!, {r4 - r8, lr}
189                 teq     r1, #0                          @ If we have no more
190                 movne   pc, lr
191                 teq     r3, #0
192                 movne   pc, r3                          @ Call interrupt routine
193                 mov     pc, lr
194
195                 .data
196                 .globl  SYMBOL_NAME(dma_interrupt)
197 SYMBOL_NAME(dma_interrupt):
198                 .long   0                               @ r3
199                 .globl  SYMBOL_NAME(dma_pbuf)
200 SYMBOL_NAME(dma_pbuf):
201                 .long   0                               @ r4
202                 .long   0                               @ r5
203                 .globl  SYMBOL_NAME(dma_start)
204 SYMBOL_NAME(dma_start):
205                 .long   0                               @ r0
206                 .globl  SYMBOL_NAME(dma_count)
207 SYMBOL_NAME(dma_count):
208                 .long   0                               @ r1
209                 .globl  SYMBOL_NAME(dma_buf)
210 SYMBOL_NAME(dma_buf):
211                 .long   0                               @ r2
212                 .long   0                               @ r3
213                 .globl  SYMBOL_NAME(vidc_filler)
214 SYMBOL_NAME(vidc_filler):
215                 .long   SYMBOL_NAME(vidc_fill_noaudio)  @ r4
216                 .globl  SYMBOL_NAME(dma_bufsize)
217 SYMBOL_NAME(dma_bufsize):
218                 .long   0x1000                          @ r5