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