Root/drivers/spi/spi-s3c24xx-fiq.S

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)
39s3c24xx_spi_fix_rx:
40    .word fiq_rx_end - fiq_rx_start
41    .word fiq_rx_irq_ack - fiq_rx_start
42fiq_rx_start:
43    ldr fiq_rtmp, fiq_rx_irq_ack
44    str fiq_rtmp, [ fiq_rirq, # S3C2410_SRCPND - S3C24XX_VA_IRQ ]
45
46    ldrb fiq_rtmp, [ fiq_rspi, # S3C2410_SPRDAT ]
47    strb fiq_rtmp, [ fiq_rrx ], #1
48
49    mov fiq_rtmp, #0xff
50    strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ]
51
52    subs fiq_rcount, fiq_rcount, #1
53    subnes pc, lr, #4 @@ return, still have work to do
54
55    @@ set IRQ controller so that next op will trigger IRQ
56    mov fiq_rtmp, #0
57    str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ]
58    subs pc, lr, #4
59
60fiq_rx_irq_ack:
61    .word 0
62fiq_rx_end:
63
64ENTRY(s3c24xx_spi_fiq_txrx)
65s3c24xx_spi_fiq_txrx:
66    .word fiq_txrx_end - fiq_txrx_start
67    .word fiq_txrx_irq_ack - fiq_txrx_start
68fiq_txrx_start:
69
70    ldrb fiq_rtmp, [ fiq_rspi, # S3C2410_SPRDAT ]
71    strb fiq_rtmp, [ fiq_rrx ], #1
72
73    ldr fiq_rtmp, fiq_txrx_irq_ack
74    str fiq_rtmp, [ fiq_rirq, # S3C2410_SRCPND - S3C24XX_VA_IRQ ]
75
76    ldrb fiq_rtmp, [ fiq_rtx ], #1
77    strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ]
78
79    subs fiq_rcount, fiq_rcount, #1
80    subnes pc, lr, #4 @@ return, still have work to do
81
82    mov fiq_rtmp, #0
83    str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ]
84    subs pc, lr, #4
85
86fiq_txrx_irq_ack:
87    .word 0
88
89fiq_txrx_end:
90
91ENTRY(s3c24xx_spi_fiq_tx)
92s3c24xx_spi_fix_tx:
93    .word fiq_tx_end - fiq_tx_start
94    .word fiq_tx_irq_ack - fiq_tx_start
95fiq_tx_start:
96    ldrb fiq_rtmp, [ fiq_rspi, # S3C2410_SPRDAT ]
97
98    ldr fiq_rtmp, fiq_tx_irq_ack
99    str fiq_rtmp, [ fiq_rirq, # S3C2410_SRCPND - S3C24XX_VA_IRQ ]
100
101    ldrb fiq_rtmp, [ fiq_rtx ], #1
102    strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ]
103
104    subs fiq_rcount, fiq_rcount, #1
105    subnes pc, lr, #4 @@ return, still have work to do
106
107    mov fiq_rtmp, #0
108    str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ]
109    subs pc, lr, #4
110
111fiq_tx_irq_ack:
112    .word 0
113
114fiq_tx_end:
115
116    .end
117

Archive Download this file



interactive