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

Archive Download this file



interactive