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