1*e75a6b00SVladimir Moravcevic /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*e75a6b00SVladimir Moravcevic /* 3*e75a6b00SVladimir Moravcevic * Axiado SPI controller driver (Host mode only) 4*e75a6b00SVladimir Moravcevic * 5*e75a6b00SVladimir Moravcevic * Copyright (C) 2022-2025 Axiado Corporation (or its affiliates). 6*e75a6b00SVladimir Moravcevic */ 7*e75a6b00SVladimir Moravcevic 8*e75a6b00SVladimir Moravcevic #ifndef SPI_AXIADO_H 9*e75a6b00SVladimir Moravcevic #define SPI_AXIADO_H 10*e75a6b00SVladimir Moravcevic 11*e75a6b00SVladimir Moravcevic /* Name of this driver */ 12*e75a6b00SVladimir Moravcevic #define AX_SPI_NAME "axiado-db-spi" 13*e75a6b00SVladimir Moravcevic 14*e75a6b00SVladimir Moravcevic /* Axiado - SPI Digital Blocks IP design registers */ 15*e75a6b00SVladimir Moravcevic #define AX_SPI_TX_FAETR 0x18 // TX-FAETR 16*e75a6b00SVladimir Moravcevic #define ALMOST_EMPTY_TRESHOLD 0x00 // Programmed threshold value 17*e75a6b00SVladimir Moravcevic #define AX_SPI_RX_FAFTR 0x28 // RX-FAETR 18*e75a6b00SVladimir Moravcevic #define ALMOST_FULL_TRESHOLD 0x0c // Programmed threshold value 19*e75a6b00SVladimir Moravcevic #define FIFO_DEPTH 256 // 256 bytes 20*e75a6b00SVladimir Moravcevic 21*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1 0x00 // CR1 22*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_CLR 0x00 // CR1 - Clear 23*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_SCR 0x01 // CR1 - controller reset 24*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_SCE 0x02 // CR1 - Controller Enable/Disable 25*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_CPHA 0x08 // CR1 - CPH 26*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_CPOL 0x10 // CR1 - CPO 27*e75a6b00SVladimir Moravcevic 28*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2 0x04 // CR2 29*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2_SWD 0x04 // CR2 - Write Enabel/Disable 30*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2_SRD 0x08 // CR2 - Read Enable/Disable 31*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2_SRI 0x10 // CR2 - Read First Byte Ignore 32*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2_HTE 0x40 // CR2 - Host Transmit Enable 33*e75a6b00SVladimir Moravcevic #define AX_SPI_CR3 0x08 // CR3 34*e75a6b00SVladimir Moravcevic #define AX_SPI_CR3_SDL 0x00 // CR3 - Data lines 35*e75a6b00SVladimir Moravcevic #define AX_SPI_CR3_QUAD 0x02 // CR3 - Data lines 36*e75a6b00SVladimir Moravcevic 37*e75a6b00SVladimir Moravcevic /* As per Digital Blocks datasheet clock frequency range 38*e75a6b00SVladimir Moravcevic * Min - 244KHz 39*e75a6b00SVladimir Moravcevic * Max - 62.5MHz 40*e75a6b00SVladimir Moravcevic * SCK Clock Divider Register Values 41*e75a6b00SVladimir Moravcevic */ 42*e75a6b00SVladimir Moravcevic #define AX_SPI_RX_FBCAR 0x24 // RX_FBCAR 43*e75a6b00SVladimir Moravcevic #define AX_SPI_TX_FBCAR 0x14 // TX_FBCAR 44*e75a6b00SVladimir Moravcevic #define AX_SPI_SCDR 0x2c // SCDR 45*e75a6b00SVladimir Moravcevic #define AX_SPI_SCD_MIN 0x1fe // Valid SCD (SCK Clock Divider Register) 46*e75a6b00SVladimir Moravcevic #define AX_SPI_SCD_DEFAULT 0x06 // Default SCD (SCK Clock Divider Register) 47*e75a6b00SVladimir Moravcevic #define AX_SPI_SCD_MAX 0x00 // Valid SCD (SCK Clock Divider Register) 48*e75a6b00SVladimir Moravcevic #define AX_SPI_SCDR_SCS 0x0200 // SCDR - AMBA Bus Clock source 49*e75a6b00SVladimir Moravcevic 50*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR 0x34 // IMR 51*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_CLR 0x00 // IMR - Clear 52*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_TFOM 0x02 // IMR - TFO 53*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_MTCM 0x40 // IMR - MTC 54*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_TFEM 0x10 // IMR - TFE 55*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_RFFM 0x20 // IMR - RFFM 56*e75a6b00SVladimir Moravcevic 57*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR 0x30 // ISR 58*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR_CLR 0xff // ISR - Clear 59*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR_MTC 0x40 // ISR - MTC 60*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR_TFE 0x10 // ISR - TFE 61*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR_RFF 0x20 // ISR - RFF 62*e75a6b00SVladimir Moravcevic 63*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR 0x38 // IVR 64*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR_TFOV 0x02 // IVR - TFOV 65*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR_MTCV 0x40 // IVR - MTCV 66*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR_TFEV 0x10 // IVR - TFEV 67*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR_RFFV 0x20 // IVR - RFFV 68*e75a6b00SVladimir Moravcevic 69*e75a6b00SVladimir Moravcevic #define AX_SPI_TXFIFO 0x0c // TX_FIFO 70*e75a6b00SVladimir Moravcevic #define AX_SPI_TX_RX_FBCR 0x10 // TX_RX_FBCR 71*e75a6b00SVladimir Moravcevic #define AX_SPI_RXFIFO 0x1c // RX_FIFO 72*e75a6b00SVladimir Moravcevic 73*e75a6b00SVladimir Moravcevic #define AX_SPI_TS0 0x00 // Target select 0 74*e75a6b00SVladimir Moravcevic #define AX_SPI_TS1 0x01 // Target select 1 75*e75a6b00SVladimir Moravcevic #define AX_SPI_TS2 0x10 // Target select 2 76*e75a6b00SVladimir Moravcevic #define AX_SPI_TS3 0x11 // Target select 3 77*e75a6b00SVladimir Moravcevic 78*e75a6b00SVladimir Moravcevic #define SPI_AUTOSUSPEND_TIMEOUT 3000 79*e75a6b00SVladimir Moravcevic 80*e75a6b00SVladimir Moravcevic /* Default number of chip select lines also used as maximum number of chip select lines */ 81*e75a6b00SVladimir Moravcevic #define AX_SPI_DEFAULT_NUM_CS 4 82*e75a6b00SVladimir Moravcevic 83*e75a6b00SVladimir Moravcevic /* Default number of command buffer size */ 84*e75a6b00SVladimir Moravcevic #define AX_SPI_COMMAND_BUFFER_SIZE 16 //Command + address bytes 85*e75a6b00SVladimir Moravcevic 86*e75a6b00SVladimir Moravcevic /* Target select mask 87*e75a6b00SVladimir Moravcevic * 00 – TS0 88*e75a6b00SVladimir Moravcevic * 01 – TS1 89*e75a6b00SVladimir Moravcevic * 10 – TS2 90*e75a6b00SVladimir Moravcevic * 11 – TS3 91*e75a6b00SVladimir Moravcevic */ 92*e75a6b00SVladimir Moravcevic #define AX_SPI_DEFAULT_TS_MASK 0x03 93*e75a6b00SVladimir Moravcevic 94*e75a6b00SVladimir Moravcevic #define AX_SPI_RX_FIFO_DRAIN_LIMIT 24 95*e75a6b00SVladimir Moravcevic #define AX_SPI_TRX_FIFO_TIMEOUT 1000 96*e75a6b00SVladimir Moravcevic /** 97*e75a6b00SVladimir Moravcevic * struct ax_spi - This definition defines spi driver instance 98*e75a6b00SVladimir Moravcevic * @regs: Virtual address of the SPI controller registers 99*e75a6b00SVladimir Moravcevic * @ref_clk: Pointer to the peripheral clock 100*e75a6b00SVladimir Moravcevic * @pclk: Pointer to the APB clock 101*e75a6b00SVladimir Moravcevic * @speed_hz: Current SPI bus clock speed in Hz 102*e75a6b00SVladimir Moravcevic * @txbuf: Pointer to the TX buffer 103*e75a6b00SVladimir Moravcevic * @rxbuf: Pointer to the RX buffer 104*e75a6b00SVladimir Moravcevic * @tx_bytes: Number of bytes left to transfer 105*e75a6b00SVladimir Moravcevic * @rx_bytes: Number of bytes requested 106*e75a6b00SVladimir Moravcevic * @tx_fifo_depth: Depth of the TX FIFO 107*e75a6b00SVladimir Moravcevic * @current_rx_fifo_word: Buffers the 32-bit word read from RXFIFO 108*e75a6b00SVladimir Moravcevic * @bytes_left_in_current_rx_word: Bytes to be extracted from current 32-bit word 109*e75a6b00SVladimir Moravcevic * @current_rx_fifo_word_for_irq: Buffers the 32-bit word read from RXFIFO for IRQ 110*e75a6b00SVladimir Moravcevic * @bytes_left_in_current_rx_word_for_irq: IRQ bytes to be extracted from current 32-bit word 111*e75a6b00SVladimir Moravcevic * @rx_discard: Number of bytes to discard 112*e75a6b00SVladimir Moravcevic * @rx_copy_remaining: Number of bytes to copy 113*e75a6b00SVladimir Moravcevic */ 114*e75a6b00SVladimir Moravcevic struct ax_spi { 115*e75a6b00SVladimir Moravcevic void __iomem *regs; 116*e75a6b00SVladimir Moravcevic struct clk *ref_clk; 117*e75a6b00SVladimir Moravcevic struct clk *pclk; 118*e75a6b00SVladimir Moravcevic unsigned int clk_rate; 119*e75a6b00SVladimir Moravcevic u32 speed_hz; 120*e75a6b00SVladimir Moravcevic const u8 *tx_buf; 121*e75a6b00SVladimir Moravcevic u8 *rx_buf; 122*e75a6b00SVladimir Moravcevic int tx_bytes; 123*e75a6b00SVladimir Moravcevic int rx_bytes; 124*e75a6b00SVladimir Moravcevic unsigned int tx_fifo_depth; 125*e75a6b00SVladimir Moravcevic u32 current_rx_fifo_word; 126*e75a6b00SVladimir Moravcevic int bytes_left_in_current_rx_word; 127*e75a6b00SVladimir Moravcevic u32 current_rx_fifo_word_for_irq; 128*e75a6b00SVladimir Moravcevic int bytes_left_in_current_rx_word_for_irq; 129*e75a6b00SVladimir Moravcevic int rx_discard; 130*e75a6b00SVladimir Moravcevic int rx_copy_remaining; 131*e75a6b00SVladimir Moravcevic }; 132*e75a6b00SVladimir Moravcevic 133*e75a6b00SVladimir Moravcevic #endif /* SPI_AXIADO_H */ 134