linux/sound/oss/vidc_fill.S
<<
>>
Prefs
   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