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 11 #define SFC_VER_4 0x4 12 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_LEN_CTRL 0x88 94 #define SFC_LEN_EXT 0x8C 95 #define SFC_CMD 0x100 96 #define SFC_ADDR 0x104 97 #define SFC_DATA 0x108 98 99 union SFCFSR_DATA { 100 u32 d32; 101 struct { 102 unsigned txempty : 1; 103 unsigned txfull : 1; 104 unsigned rxempty : 1; 105 unsigned rxfull : 1; 106 unsigned reserved7_4 : 4; 107 unsigned txlevel : 5; 108 unsigned reserved15_13 : 3; 109 unsigned rxlevel : 5; 110 unsigned reserved31_21 : 11; 111 } b; 112 }; 113 114 /* Manufactory ID */ 115 #define MID_WINBOND 0xEF 116 #define MID_GIGADEV 0xC8 117 #define MID_MICRON 0x2C 118 #define MID_MACRONIX 0xC2 119 #define MID_SPANSION 0x01 120 #define MID_EON 0x1C 121 #define MID_ST 0x20 122 #define MID_XTX 0x0B 123 #define MID_PUYA 0x85 124 #define MID_XMC 0x20 125 #define MID_DOSILICON 0xF8 126 #define MID_ZBIT 0x5E 127 128 /*------------------------------ Global Typedefs -----------------------------*/ 129 enum SFC_DATA_LINES { 130 DATA_LINES_X1 = 0, 131 DATA_LINES_X2, 132 DATA_LINES_X4 133 }; 134 135 union SFCCTRL_DATA { 136 /* raw register data */ 137 u32 d32; 138 /* register bits */ 139 struct { 140 /* spi mode select */ 141 unsigned mode : 1; 142 /* 143 * Shift in phase selection 144 * 0: shift in the flash data at posedge sclk_out 145 * 1: shift in the flash data at negedge sclk_out 146 */ 147 unsigned sps : 1; 148 unsigned reserved3_2 : 2; 149 /* sclk_idle_level_cycles */ 150 unsigned scic : 4; 151 /* Cmd bits number */ 152 unsigned cmdlines : 2; 153 /* Address bits number */ 154 unsigned addrlines : 2; 155 /* Data bits number */ 156 unsigned datalines : 2; 157 /* this bit is not exit in regiseter, just use for code param */ 158 unsigned enbledma : 1; 159 unsigned reserved15 : 1; 160 unsigned addrbits : 5; 161 unsigned reserved31_21 : 11; 162 } b; 163 }; 164 165 union SFCCMD_DATA { 166 /* raw register data */ 167 u32 d32; 168 /* register bits */ 169 struct { 170 /* Command that will send to Serial Flash */ 171 unsigned cmd : 8; 172 /* Dummy bits number */ 173 unsigned dummybits : 4; 174 /* 0: read, 1: write */ 175 unsigned rw : 1; 176 /* Continuous read mode */ 177 unsigned readmode : 1; 178 /* Address bits number */ 179 unsigned addrbits : 2; 180 /* Transferred bytes number */ 181 unsigned datasize : 14; 182 /* Chip select */ 183 unsigned cs : 2; 184 } b; 185 }; 186 187 struct rk_sfc_op { 188 union SFCCMD_DATA sfcmd; 189 union SFCCTRL_DATA sfctrl; 190 }; 191 192 int sfc_init(void __iomem *reg_addr); 193 int sfc_request(struct rk_sfc_op *op, u32 addr, void *data, u32 size); 194 u16 sfc_get_version(void); 195 void sfc_clean_irq(void); 196 u32 sfc_get_max_iosize(void); 197 int rksfc_get_reg_addr(unsigned long *p_sfc_addr); 198 199 #endif 200