blob: 01ccc074cc11c8db479e6efdd8fe2a7fc9ec4b0d [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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 <asm/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