1/* linux/drivers/spi/spi_s3c24xx_fiq.S 2 * 3 * Copyright 2009 Simtec Electronics 4 * Ben Dooks <ben@simtec.co.uk> 5 * 6 * S3C24XX SPI - FIQ pseudo-DMA transfer code 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11*/ 12 13#include <linux/linkage.h> 14#include <asm/assembler.h> 15 16#include <mach/map.h> 17#include <mach/regs-irq.h> 18#include <plat/regs-spi.h> 19 20#include "spi-s3c24xx-fiq.h" 21 22 .text 23 24 @ entry to these routines is as follows, with the register names 25 @ defined in fiq.h so that they can be shared with the C files which 26 @ setup the calling registers. 27 @ 28 @ fiq_rirq The base of the IRQ registers to find S3C2410_SRCPND 29 @ fiq_rtmp Temporary register to hold tx/rx data 30 @ fiq_rspi The base of the SPI register block 31 @ fiq_rtx The tx buffer pointer 32 @ fiq_rrx The rx buffer pointer 33 @ fiq_rcount The number of bytes to move 34 35 @ each entry starts with a word entry of how long it is 36 @ and an offset to the irq acknowledgment word 37 38ENTRY(s3c24xx_spi_fiq_rx) 39 .word fiq_rx_end - fiq_rx_start 40 .word fiq_rx_irq_ack - fiq_rx_start 41fiq_rx_start: 42 ldr fiq_rtmp, fiq_rx_irq_ack 43 str fiq_rtmp, [ fiq_rirq, # S3C2410_SRCPND - S3C24XX_VA_IRQ ] 44 45 ldrb fiq_rtmp, [ fiq_rspi, # S3C2410_SPRDAT ] 46 strb fiq_rtmp, [ fiq_rrx ], #1 47 48 mov fiq_rtmp, #0xff 49 strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ] 50 51 subs fiq_rcount, fiq_rcount, #1 52 subsne pc, lr, #4 @@ return, still have work to do 53 54 @@ set IRQ controller so that next op will trigger IRQ 55 mov fiq_rtmp, #0 56 str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ] 57 subs pc, lr, #4 58 59fiq_rx_irq_ack: 60 .word 0 61fiq_rx_end: 62 63ENTRY(s3c24xx_spi_fiq_txrx) 64 .word fiq_txrx_end - fiq_txrx_start 65 .word fiq_txrx_irq_ack - fiq_txrx_start 66fiq_txrx_start: 67 68 ldrb fiq_rtmp, [ fiq_rspi, # S3C2410_SPRDAT ] 69 strb fiq_rtmp, [ fiq_rrx ], #1 70 71 ldr fiq_rtmp, fiq_txrx_irq_ack 72 str fiq_rtmp, [ fiq_rirq, # S3C2410_SRCPND - S3C24XX_VA_IRQ ] 73 74 ldrb fiq_rtmp, [ fiq_rtx ], #1 75 strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ] 76 77 subs fiq_rcount, fiq_rcount, #1 78 subsne pc, lr, #4 @@ return, still have work to do 79 80 mov fiq_rtmp, #0 81 str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ] 82 subs pc, lr, #4 83 84fiq_txrx_irq_ack: 85 .word 0 86 87fiq_txrx_end: 88 89ENTRY(s3c24xx_spi_fiq_tx) 90 .word fiq_tx_end - fiq_tx_start 91 .word fiq_tx_irq_ack - fiq_tx_start 92fiq_tx_start: 93 ldrb fiq_rtmp, [ fiq_rspi, # S3C2410_SPRDAT ] 94 95 ldr fiq_rtmp, fiq_tx_irq_ack 96 str fiq_rtmp, [ fiq_rirq, # S3C2410_SRCPND - S3C24XX_VA_IRQ ] 97 98 ldrb fiq_rtmp, [ fiq_rtx ], #1 99 strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ] 100 101 subs fiq_rcount, fiq_rcount, #1 102 subsne pc, lr, #4 @@ return, still have work to do 103 104 mov fiq_rtmp, #0 105 str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ] 106 subs pc, lr, #4 107 108fiq_tx_irq_ack: 109 .word 0 110 111fiq_tx_end: 112 113 .end 114