^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2009 Sascha Hauer <s.hauer@pengutronix.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <asm/assembler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * r8 = bit 0-15: tx offset, bit 16-31: tx buffer size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * r9 = bit 0-15: rx offset, bit 16-31: rx buffer size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define SSI_STX0 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define SSI_SRX0 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define SSI_SISR 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define SSI_SIER 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define SSI_SACNT 0x38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define SSI_SACNT_AC97EN (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define SSI_SIER_TFE0_EN (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define SSI_SISR_TFE0 (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define SSI_SISR_RFF0 (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define SSI_SIER_RFF0_EN (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .global imx_ssi_fiq_start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .global imx_ssi_fiq_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .global imx_ssi_fiq_base
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) .global imx_ssi_fiq_rx_buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) .global imx_ssi_fiq_tx_buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * imx_ssi_fiq_start is _intentionally_ not marked as a function symbol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * using ENDPROC(). imx_ssi_fiq_start and imx_ssi_fiq_end are used to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * mark the function body so that it can be copied to the FIQ vector in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * the vectors page. imx_ssi_fiq_start should only be called as the result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * of an FIQ: calling it directly will not work.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) imx_ssi_fiq_start:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ldr r12, .L_imx_ssi_fiq_base
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /* TX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ldr r13, .L_imx_ssi_fiq_tx_buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /* shall we send? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ldr r11, [r12, #SSI_SIER]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) tst r11, #SSI_SIER_TFE0_EN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) beq 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /* TX FIFO empty? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ldr r11, [r12, #SSI_SISR]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) tst r11, #SSI_SISR_TFE0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) beq 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) mov r10, #0x10000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) sub r10, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) and r10, r10, r8 /* r10: current buffer offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) add r13, r13, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ldrh r11, [r13]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) strh r11, [r12, #SSI_STX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ldrh r11, [r13, #2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) strh r11, [r12, #SSI_STX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) ldrh r11, [r13, #4]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) strh r11, [r12, #SSI_STX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ldrh r11, [r13, #6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) strh r11, [r12, #SSI_STX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) add r10, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) lsr r11, r8, #16 /* r11: buffer size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) cmp r10, r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) lslgt r8, r11, #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) addle r8, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* RX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* shall we receive? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ldr r11, [r12, #SSI_SIER]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) tst r11, #SSI_SIER_RFF0_EN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) beq 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* RX FIFO full? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) ldr r11, [r12, #SSI_SISR]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) tst r11, #SSI_SISR_RFF0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) beq 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) ldr r13, .L_imx_ssi_fiq_rx_buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) mov r10, #0x10000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) sub r10, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) and r10, r10, r9 /* r10: current buffer offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) add r13, r13, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) ldr r11, [r12, #SSI_SACNT]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) tst r11, #SSI_SACNT_AC97EN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) ldr r11, [r12, #SSI_SRX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) strh r11, [r13]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ldr r11, [r12, #SSI_SRX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) strh r11, [r13, #2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) /* dummy read to skip slot 12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ldrne r11, [r12, #SSI_SRX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) ldr r11, [r12, #SSI_SRX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) strh r11, [r13, #4]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) ldr r11, [r12, #SSI_SRX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) strh r11, [r13, #6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* dummy read to skip slot 12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) ldrne r11, [r12, #SSI_SRX0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) add r10, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) lsr r11, r9, #16 /* r11: buffer size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) cmp r10, r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) lslgt r9, r11, #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) addle r9, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) @ return from FIQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) subs pc, lr, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) .align
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) .L_imx_ssi_fiq_base:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) imx_ssi_fiq_base:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .word 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .L_imx_ssi_fiq_rx_buffer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) imx_ssi_fiq_rx_buffer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .word 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) .L_imx_ssi_fiq_tx_buffer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) imx_ssi_fiq_tx_buffer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) .word 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .L_imx_ssi_fiq_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) imx_ssi_fiq_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)