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