1 /* 2 * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd 3 * 4 * SPDX-License-Identifier: GPL-2.0 5 */ 6 7 #ifndef _SFC_H 8 #define _SFC_H 9 10 #define SFC_VER_3 0x3 /* ver 3, else ver 1 */ 11 12 #define SFC_MAX_IOSIZE (1024 * 8) /* 8K byte */ 13 #define SFC_EN_INT (0) /* enable interrupt */ 14 #define SFC_EN_DMA (1) /* enable dma */ 15 #define SFC_FIFO_DEPTH (0x10) /* 16 words */ 16 17 /* FIFO watermark */ 18 #define SFC_RX_WMARK (SFC_FIFO_DEPTH) /* RX watermark level */ 19 #define SFC_TX_WMARK (SFC_FIFO_DEPTH) /* TX watermark level */ 20 #define SFC_RX_WMARK_SHIFT (8) 21 #define SFC_TX_WMARK_SHIFT (0) 22 23 /* return value */ 24 #define SFC_OK (0) 25 #define SFC_ERROR (-1) 26 #define SFC_PARAM_ERR (-2) 27 #define SFC_TX_TIMEOUT (-3) 28 #define SFC_RX_TIMEOUT (-4) 29 #define SFC_WAIT_TIMEOUT (-5) 30 #define SFC_BUSY_TIMEOUT (-6) 31 #define SFC_ECC_FAIL (-7) 32 #define SFC_PROG_FAIL (-8) 33 #define SFC_ERASE_FAIL (-9) 34 35 /* SFC_CMD Register */ 36 #define SFC_ADDR_0BITS (0) 37 #define SFC_ADDR_24BITS (1) 38 #define SFC_ADDR_32BITS (2) 39 #define SFC_ADDR_XBITS (3) 40 41 #define SFC_WRITE (1) 42 #define SFC_READ (0) 43 44 /* SFC_CTRL Register */ 45 #define SFC_1BITS_LINE (0) 46 #define SFC_2BITS_LINE (1) 47 #define SFC_4BITS_LINE (2) 48 49 #define SFC_ENABLE_DMA BIT(14) 50 #define sfc_delay(us) udelay(us) 51 52 #define DMA_INT BIT(7) /* dma interrupt */ 53 #define NSPIERR_INT BIT(6) /* Nspi error interrupt */ 54 #define AHBERR_INT BIT(5) /* Ahb bus error interrupt */ 55 #define FINISH_INT BIT(4) /* Transfer finish interrupt */ 56 #define TXEMPTY_INT BIT(3) /* Tx fifo empty interrupt */ 57 #define TXOF_INT BIT(2) /* Tx fifo overflow interrupt */ 58 #define RXUF_INT BIT(1) /* Rx fifo underflow interrupt */ 59 #define RXFULL_INT BIT(0) /* Rx fifo full interrupt */ 60 61 /* SFC_FSR Register*/ 62 #define SFC_RXFULL BIT(3) /* rx fifo full */ 63 #define SFC_RXEMPTY BIT(2) /* rx fifo empty */ 64 #define SFC_TXEMPTY BIT(1) /* tx fifo empty */ 65 #define SFC_TXFULL BIT(0) /* tx fifo full */ 66 67 /* SFC_RCVR Register */ 68 #define SFC_RESET BIT(0) /* controller reset */ 69 70 /* SFC_SR Register */ 71 /* sfc busy flag. When busy, don't try to set the control register */ 72 #define SFC_BUSY BIT(0) 73 74 /* SFC_DMA_TRIGGER Register */ 75 /* Dma start trigger signal. Auto cleared after write */ 76 #define SFC_DMA_START BIT(0) 77 78 #define SFC_CTRL 0x00 79 #define SFC_IMR 0x04 80 #define SFC_ICLR 0x08 81 #define SFC_FTLR 0x0C 82 #define SFC_RCVR 0x10 83 #define SFC_AX 0x14 84 #define SFC_ABIT 0x18 85 #define SFC_MASKISR 0x1C 86 #define SFC_FSR 0x20 87 #define SFC_SR 0x24 88 #define SFC_RAWISR 0x28 89 #define SFC_VER 0x2C 90 #define SFC_QOP 0x30 91 #define SFC_DMA_TRIGGER 0x80 92 #define SFC_DMA_ADDR 0x84 93 #define SFC_CMD 0x100 94 #define SFC_ADDR 0x104 95 #define SFC_DATA 0x108 96 97 union SFCFSR_DATA { 98 u32 d32; 99 struct { 100 unsigned txempty : 1; 101 unsigned txfull : 1; 102 unsigned rxempty : 1; 103 unsigned rxfull : 1; 104 unsigned reserved7_4 : 4; 105 unsigned txlevel : 5; 106 unsigned reserved15_13 : 3; 107 unsigned rxlevel : 5; 108 unsigned reserved31_21 : 11; 109 } b; 110 }; 111 112 /* Manufactory ID */ 113 #define MID_WINBOND 0xEF 114 #define MID_GIGADEV 0xC8 115 #define MID_MICRON 0x2C 116 #define MID_MACRONIX 0xC2 117 #define MID_SPANSION 0x01 118 #define MID_EON 0x1C 119 #define MID_ST 0x20 120 #define MID_XTX 0x0B 121 #define MID_PUYA 0x85 122 #define MID_XMC 0x20 123 #define MID_DOSILICON 0xF8 124 #define MID_ZBIT 0x5E 125 126 /*------------------------------ Global Typedefs -----------------------------*/ 127 enum SFC_DATA_LINES { 128 DATA_LINES_X1 = 0, 129 DATA_LINES_X2, 130 DATA_LINES_X4 131 }; 132 133 union SFCCTRL_DATA { 134 /* raw register data */ 135 u32 d32; 136 /* register bits */ 137 struct { 138 /* spi mode select */ 139 unsigned mode : 1; 140 /* 141 * Shift in phase selection 142 * 0: shift in the flash data at posedge sclk_out 143 * 1: shift in the flash data at negedge sclk_out 144 */ 145 unsigned sps : 1; 146 unsigned reserved3_2 : 2; 147 /* sclk_idle_level_cycles */ 148 unsigned scic : 4; 149 /* Cmd bits number */ 150 unsigned cmdlines : 2; 151 /* Address bits number */ 152 unsigned addrlines : 2; 153 /* Data bits number */ 154 unsigned datalines : 2; 155 /* this bit is not exit in regiseter, just use for code param */ 156 unsigned enbledma : 1; 157 unsigned reserved15 : 1; 158 unsigned addrbits : 5; 159 unsigned reserved31_21 : 11; 160 } b; 161 }; 162 163 union SFCCMD_DATA { 164 /* raw register data */ 165 u32 d32; 166 /* register bits */ 167 struct { 168 /* Command that will send to Serial Flash */ 169 unsigned cmd : 8; 170 /* Dummy bits number */ 171 unsigned dummybits : 4; 172 /* 0: read, 1: write */ 173 unsigned rw : 1; 174 /* Continuous read mode */ 175 unsigned readmode : 1; 176 /* Address bits number */ 177 unsigned addrbits : 2; 178 /* Transferred bytes number */ 179 unsigned datasize : 14; 180 /* Chip select */ 181 unsigned cs : 2; 182 } b; 183 }; 184 185 int sfc_init(void __iomem *reg_addr); 186 int sfc_request(u32 sfcmd, u32 sfctrl, u32 addr, void *data); 187 u16 sfc_get_version(void); 188 void sfc_clean_irq(void); 189 int rksfc_get_reg_addr(unsigned long *p_sfc_addr); 190 191 #endif 192