Linux Audio

Check our new training course

Yocto / OpenEmbedded training

Feb 10-13, 2025
Register
Loading...
v4.6
  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
v3.15
  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