4 * Filler routines for DMA buffers
6 * Copyright (C) 1997 Russell King
9 #include <linux/linkage.h>
10 #include <asm/assembler.h>
11 #include <asm/hardware.h>
16 ENTRY(vidc_fill_1x8_u)
19 bge SYMBOL_NAME(vidc_clear)
22 and r4, ip, r4, lsl #8
23 orr r4, r4, r4, lsl #16
29 ENTRY(vidc_fill_2x8_u)
32 bge SYMBOL_NAME(vidc_clear)
35 and r4, ip, r4, lsl #8
36 orr r4, r4, r5, lsl #16
37 orr r4, r4, r4, lsr #8
43 ENTRY(vidc_fill_1x8_s)
46 bge SYMBOL_NAME(vidc_clear)
48 and r4, ip, r4, lsl #8
49 orr r4, r4, r4, lsl #16
55 ENTRY(vidc_fill_2x8_s)
58 bge SYMBOL_NAME(vidc_clear)
61 and r4, ip, r4, lsl #8
62 orr r4, r4, r5, lsl #16
63 orr r4, r4, r4, lsr #8
69 ENTRY(vidc_fill_1x16_s)
71 orr ip, ip, ip, lsr #8
73 bge SYMBOL_NAME(vidc_clear)
76 orr r4, r4, r4, lsl #16
80 andlt r4, r5, ip, lsl #16
81 orrlt r4, r4, r4, lsr #16
87 ENTRY(vidc_fill_2x16_s)
89 orr ip, ip, ip, lsr #8
91 bge SYMBOL_NAME(vidc_clear)
101 ENTRY(vidc_fill_noaudio)
107 stmltia r2!, {r0, r1, r4, r5}
121 * Call filler routines with:
126 * r0 = new buffer address
127 * r2 = new buffer finish
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}
138 adreq r4, SYMBOL_NAME(vidc_fill_noaudio)
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
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
151 mov pc, r4 @ Call fill routine (uses r4, ip)
152 sub r1, r1, r0 @ Remaining length
155 tst r2, #4 @ Round buffer up to 4 words
163 orreq r2, r2, #1 << 30 @ Set L bit
165 ldmdb r8, {r3, r4, r5}
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]
177 strne r4, [ip, #IOMD_SD0CURB]
178 streq r5, [ip, #IOMD_SD0CURA]
179 strne r2, [ip, #IOMD_SD0ENDB]
180 streq r2, [ip, #IOMD_SD0ENDA]
183 strneb r0, [ip, #IOMD_SD0CR]
184 ldmfd sp!, {r4 - r8, lr}
185 teq r1, #0 @ If we have no more
188 movne pc, r3 @ Call interrupt routine
192 .globl SYMBOL_NAME(dma_interrupt)
193 SYMBOL_NAME(dma_interrupt):
195 .globl SYMBOL_NAME(dma_pbuf)
196 SYMBOL_NAME(dma_pbuf):
199 .globl SYMBOL_NAME(dma_start)
200 SYMBOL_NAME(dma_start):
202 .globl SYMBOL_NAME(dma_count)
203 SYMBOL_NAME(dma_count):
205 .globl SYMBOL_NAME(dma_buf)
206 SYMBOL_NAME(dma_buf):
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):