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