blob: c3e81dbfffb4144f23ee25b6436e71510019ed5f [file] [log] [blame]
#ifndef _SPIFC_H_
#define _SPIFC_H_
#define SYS_SPI_NAND_BASE 0x01407000
struct spifc_nor_reg_t
{
uint32_t VER_REG; //0x00
uint32_t SFC_START; //0x04
uint32_t SFC_EN; //0x08
uint32_t SFC_CTRL0; //0x0c
uint32_t SFC_CTRL1; //0x10
uint32_t SFC_CTRL2; //0x14
uint32_t SFC_BYTE_NUM; //0x18
uint32_t SFC_ADDR; //0x1c
uint32_t SFC_INS; //0x20
uint32_t SFC_TIMING; //0x24
uint32_t SFC_INT_EN; //0x28
uint32_t SFC_INT_RAW; //0x2c
uint32_t SFC_INT_SW_CLR; //0x30
uint32_t SFC_SW; //0x34
uint32_t SFC_DATA; //0x38
};
/*spifc start 0x4*/
#define FC_START (1<<0)
#define FC_BUSY (1<<0)
/*spifc enable 0x8*/
#define FC_EN_BACK (1)
#define FC_EN (0)
/*spifc main ctr0 0xc*/
#define FC_SCLK_PAUSE_CLR_ALLOW (17)
#define FC_SCLK_PAUSE_EN (16)
#define FC_TXFIFO_CLR (15)
#define FC_RXFIFO_CLR (14)
#define FC_TXFIFO_THRES (10)
#define FC_RXFIFO_THRES (6)
#define FC_TX_DMA_EN (5)
#define FC_RX_DMA_EN (4)
#define FC_WDOG_EN (3)
#define FC_SPI_MODE (1)
#define FC_WR_PROTECT (0)
/*spifc ctrl1 0x10 in the condition : SFC_EN = 1 SFC_BUSY = 0*/
#define FC_ADDR_TX_EN (4)
#define FC_DUMMY_TX_EN (2)
#define FC_READ_DAT_EN (1)
#define FC_WRITE_DAT_EN (0)
/*spifc ctrl2 0x14*/
#define FC_DUMMY_BYTE_NUM (12) /* [12:15} */
#define FC_DUMMY_BIT_NUM (8) /* [8:10] */
#define FC_ADDR_BYTE_NUM (5) /* [5:6] */
#define FC_ADDR_MULTI_LINE_EN (4)
#define FC_DAT_MULTI_LINE_EN (2)
#define FC_TRANS_MOD (0)
#define FC_ADDR_BYTE_NUM_8 (0)
#define FC_ADDR_BYTE_NUM_16 (1)
#define FC_ADDR_BYTE_NUM_24 (2)
#define FC_ADDR_BYTE_NUM_32 (3)
/*spifc timing 0x24*/
#define FC_READ_DELAY (1<<16) /* [17:16} */
#define FC_T_CS_SETUP (1<<11) /* [11:13} */
#define FC_T_CS_HOLD (1<<6) /* [8:6} */
#define FC_T_CS_DESEL (1<<0) /* [0:3} */
/*spifc int enable 0x28*/
#define FC_INT_EN_TX_BYD_THES (1<<7)
#define FC_INT_EN_RX_BYD_THES (1<<6)
#define FC_INT_EN_TX_UNDERRUN (1<<5)
#define FC_INT_EN_RX_OVERRUN (1<<4)
#define FC_INT_EN_WDOG_OVERRUN (1<<2)
#define FC_INT_EN_FMT_ERR (1<<1)
#define FC_INT_EN_CMD_END (1<<0)
/*spifc raw interrupt 0x2c*/
#define FC_INT_RAW_TX_BYD_THES (1<<7)
#define FC_INT_RAW_RX_BYD_THES (1<<6)
#define FC_INT_RAW_TX_UNDERRUN (1<<5)
#define FC_INT_RAW_RX_OVERRUN (1<<4)
#define FC_INT_RAW_WDOG_OVERRUN (1<<2)
#define FC_INT_RAW_FMT_ERR (1<<1)
#define FC_INT_RAW_CMD_END (1<<0)
#define FC_INT_RAW_MASK (FC_INT_RAW_TX_UNDERRUN| \
FC_INT_RAW_RX_OVERRUN| \
FC_INT_RAW_WDOG_OVERRUN| \
FC_INT_RAW_FMT_ERR| \
FC_INT_RAW_CMD_END)
/*spifc int startus and clr 0x30*/
#define FC_INT_CLR_TX_BYD_THES (1<<7)
#define FC_INT_CLR_RX_BYD_THES (1<<6)
#define FC_INT_CLR_TX_UNDERRUN (1<<5)
#define FC_INT_CLR_RX_OVERRUN (1<<4)
#define FC_INT_CLR_WDOG_OVERRUN (1<<2)
#define FC_INT_CLR_FMT_ERR (1<<1)
#define FC_INT_CLR_CMD_END (1<<0)
/*spifc sw 0x34*/
#define FC_TX_FIFO_CNT (16) /* [16:20} */
#define FC_TX_FIFO_CNT_MASK (0x1F) /* [8:12} */
#define FC_RX_FIFO_CNT (8) /* [8:12} */
#define FC_RX_FIFO_CNT_MASK (0x1F) /* [8:12} */
#define FC_TX_BYD_THRES (1<<5)
#define FC_RX_BYD_THRES (1<<4)
#define FC_SCLK_PAUSE_FLAG (1<<3)
#define FC_WAIT_FLAG (1<<2)
#define FC_FORMAT_ERR (1<<1)
#define FC_DMA_NONE 0
#define FC_DMA_TX 1
#define FC_DMA_RX 2
#define TX_DMA_EN 1
#define TX_DMA_DIS 0
#define RX_DMA_EN 1
#define RX_DMA_DIS 0
#define ADDR_TX_EN 1
#define ADDR_TX_DIS 0
#define DATA_TX_EN 1
#define DATA_TX_DIS 0
#define DATA_RX_EN 1
#define DATA_RX_DIS 0
#define DUMY_TX_EN 1
#define DUMY_TX_DIS 0
#define ADDR_MULTI_LINE_EN 1
#define ADDR_MULTI_LINE_DIS 0
#define DATA_MULTI_LINE_EN 1
#define DATA_MULTI_LINE_DIS 0
#define TRANS_MOD_QUAD 1
#define TRANS_MOD_DUAL 0
#define TRANS_MOD_SINGLE 2
#define ADDR_WIDTH_8 0
#define ADDR_WIDTH_16 1
#define ADDR_WIDTH_24 2
#define ADDR_WIDTH_32 3
typedef struct spinor_cmd
{
u8 cmd;
u8 tx_dma_en;
u8 rx_dma_en;
u8 addr_tx_en;
u8 addr_byte_num;
u8 data_tx_en;
u8 data_rx_en;
u8 dumy_tx_en;
u8 dumy_byte_num;
u8 dumy_bit_num;
u8 addr_multi_line_en;
u8 data_multi_line_en;
u8 trans_mod;
u8 reserved[3];
u8 *info;
}spinor_cmd_t;
#define CMD_RDFT 0x0B
#define CMD_RDID 0x9F
#define SPI_NOR_MAX_ID_LEN 8
struct nor_info {
char *name;
u8 id[SPI_NOR_MAX_ID_LEN];
u8 id_len;
unsigned sector_size;
u16 n_sectors;
u16 page_size;
u16 addr_width;
u16 flags;
#define SECT_4K 0x01
#define SPI_NOR_NO_ERASE 0x02
#define SST_WRITE 0x04
#define SPI_NOR_NO_FR 0x08
#define SECT_4K_PMC 0x10
#define SPI_NOR_DUAL_READ 0x20
#define SPI_NOR_QUAD_READ 0x40
#define USE_FSR 0x80
};
extern struct nor_info *spi_nor_flash;
#endif /* _SPIFC_H_ */