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