2 * linux/drivers/sound/vidc_fill.S
4 * Copyright (C) 1997 Russell King
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.
10 * Filler routines for DMA buffers
13 #include <linux/linkage.h>
14 #include <asm/assembler.h>
15 #include <asm/hardware.h>
16 #include <asm/hardware/iomd.h>
20 ENTRY(vidc_fill_1x8_u)
23 bge SYMBOL_NAME(vidc_clear)
26 and r4, ip, r4, lsl #8
27 orr r4, r4, r4, lsl #16
33 ENTRY(vidc_fill_2x8_u)
36 bge SYMBOL_NAME(vidc_clear)
39 and r4, ip, r4, lsl #8
40 orr r4, r4, r5, lsl #16
41 orr r4, r4, r4, lsr #8
47 ENTRY(vidc_fill_1x8_s)
50 bge SYMBOL_NAME(vidc_clear)
52 and r4, ip, r4, lsl #8
53 orr r4, r4, r4, lsl #16
59 ENTRY(vidc_fill_2x8_s)
62 bge SYMBOL_NAME(vidc_clear)
65 and r4, ip, r4, lsl #8
66 orr r4, r4, r5, lsl #16
67 orr r4, r4, r4, lsr #8
73 ENTRY(vidc_fill_1x16_s)
75 orr ip, ip, ip, lsr #8
77 bge SYMBOL_NAME(vidc_clear)
80 orr r4, r4, r4, lsl #16
84 andlt r4, r5, ip, lsl #16
85 orrlt r4, r4, r4, lsr #16
91 ENTRY(vidc_fill_2x16_s)
93 orr ip, ip, ip, lsr #8
95 bge SYMBOL_NAME(vidc_clear)
105 ENTRY(vidc_fill_noaudio)
111 stmltia r2!, {r0, r1, r4, r5}
125 * Call filler routines with:
130 * r0 = new buffer address
131 * r2 = new buffer finish
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}
142 adreq r4, SYMBOL_NAME(vidc_fill_noaudio)
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
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
155 mov pc, r4 @ Call fill routine (uses r4, ip)
156 sub r1, r1, r0 @ Remaining length
159 tst r2, #4 @ Round buffer up to 4 words
167 orreq r2, r2, #1 << 30 @ Set L bit
169 ldmdb r8, {r3, r4, r5}
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]
181 strne r4, [ip, #IOMD_SD0CURB]
182 streq r5, [ip, #IOMD_SD0CURA]
183 strne r2, [ip, #IOMD_SD0ENDB]
184 streq r2, [ip, #IOMD_SD0ENDA]
187 strneb r0, [ip, #IOMD_SD0CR]
188 ldmfd sp!, {r4 - r8, lr}
189 teq r1, #0 @ If we have no more
192 movne pc, r3 @ Call interrupt routine
196 .globl SYMBOL_NAME(dma_interrupt)
197 SYMBOL_NAME(dma_interrupt):
199 .globl SYMBOL_NAME(dma_pbuf)
200 SYMBOL_NAME(dma_pbuf):
203 .globl SYMBOL_NAME(dma_start)
204 SYMBOL_NAME(dma_start):
206 .globl SYMBOL_NAME(dma_count)
207 SYMBOL_NAME(dma_count):
209 .globl SYMBOL_NAME(dma_buf)
210 SYMBOL_NAME(dma_buf):
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):