xref: /rk3399_rockchip-uboot/drivers/spi/ich.h (revision a117f09b28bbbb3e4accdf6d5b68ebc683e8934e)
11853030eSSimon Glass /*
21853030eSSimon Glass  * Copyright (c) 2011 The Chromium OS Authors.
31853030eSSimon Glass  *
41a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
51853030eSSimon Glass  *
61853030eSSimon Glass  * This file is derived from the flashrom project.
71853030eSSimon Glass  */
81853030eSSimon Glass 
99eb4339bSBin Meng #ifndef _ICH_H_
109eb4339bSBin Meng #define _ICH_H_
119eb4339bSBin Meng 
121853030eSSimon Glass struct ich7_spi_regs {
131853030eSSimon Glass 	uint16_t spis;
141853030eSSimon Glass 	uint16_t spic;
151853030eSSimon Glass 	uint32_t spia;
161853030eSSimon Glass 	uint64_t spid[8];
171853030eSSimon Glass 	uint64_t _pad;
181853030eSSimon Glass 	uint32_t bbar;
191853030eSSimon Glass 	uint16_t preop;
201853030eSSimon Glass 	uint16_t optype;
211853030eSSimon Glass 	uint8_t opmenu[8];
221853030eSSimon Glass } __packed;
231853030eSSimon Glass 
241853030eSSimon Glass struct ich9_spi_regs {
251853030eSSimon Glass 	uint32_t bfpr;		/* 0x00 */
261853030eSSimon Glass 	uint16_t hsfs;
271853030eSSimon Glass 	uint16_t hsfc;
281853030eSSimon Glass 	uint32_t faddr;
291853030eSSimon Glass 	uint32_t _reserved0;
301853030eSSimon Glass 	uint32_t fdata[16];	/* 0x10 */
311853030eSSimon Glass 	uint32_t frap;		/* 0x50 */
321853030eSSimon Glass 	uint32_t freg[5];
331853030eSSimon Glass 	uint32_t _reserved1[3];
341853030eSSimon Glass 	uint32_t pr[5];		/* 0x74 */
351853030eSSimon Glass 	uint32_t _reserved2[2];
361853030eSSimon Glass 	uint8_t ssfs;		/* 0x90 */
371853030eSSimon Glass 	uint8_t ssfc[3];
381853030eSSimon Glass 	uint16_t preop;		/* 0x94 */
391853030eSSimon Glass 	uint16_t optype;
401853030eSSimon Glass 	uint8_t opmenu[8];	/* 0x98 */
411853030eSSimon Glass 	uint32_t bbar;
421853030eSSimon Glass 	uint8_t _reserved3[12];
435093badbSSimon Glass 	uint32_t fdoc;		/* 0xb0 */
441853030eSSimon Glass 	uint32_t fdod;
451853030eSSimon Glass 	uint8_t _reserved4[8];
465093badbSSimon Glass 	uint32_t afc;		/* 0xc0 */
471853030eSSimon Glass 	uint32_t lvscc;
481853030eSSimon Glass 	uint32_t uvscc;
491853030eSSimon Glass 	uint8_t _reserved5[4];
505093badbSSimon Glass 	uint32_t fpb;		/* 0xd0 */
511853030eSSimon Glass 	uint8_t _reserved6[28];
525093badbSSimon Glass 	uint32_t srdl;		/* 0xf0 */
531853030eSSimon Glass 	uint32_t srdc;
545093badbSSimon Glass 	uint32_t scs;
555093badbSSimon Glass 	uint32_t bcr;
561853030eSSimon Glass } __packed;
571853030eSSimon Glass 
581853030eSSimon Glass enum {
591853030eSSimon Glass 	SPIS_SCIP =		0x0001,
601853030eSSimon Glass 	SPIS_GRANT =		0x0002,
611853030eSSimon Glass 	SPIS_CDS =		0x0004,
621853030eSSimon Glass 	SPIS_FCERR =		0x0008,
631853030eSSimon Glass 	SSFS_AEL =		0x0010,
641853030eSSimon Glass 	SPIS_LOCK =		0x8000,
651853030eSSimon Glass 	SPIS_RESERVED_MASK =	0x7ff0,
661853030eSSimon Glass 	SSFS_RESERVED_MASK =	0x7fe2
671853030eSSimon Glass };
681853030eSSimon Glass 
691853030eSSimon Glass enum {
701853030eSSimon Glass 	SPIC_SCGO =		0x000002,
711853030eSSimon Glass 	SPIC_ACS =		0x000004,
721853030eSSimon Glass 	SPIC_SPOP =		0x000008,
731853030eSSimon Glass 	SPIC_DBC =		0x003f00,
741853030eSSimon Glass 	SPIC_DS =		0x004000,
751853030eSSimon Glass 	SPIC_SME =		0x008000,
761853030eSSimon Glass 	SSFC_SCF_MASK =		0x070000,
771853030eSSimon Glass 	SSFC_RESERVED =		0xf80000,
781853030eSSimon Glass 
791853030eSSimon Glass 	/* Mask for speed byte, biuts 23:16 of SSFC */
801853030eSSimon Glass 	SSFC_SCF_33MHZ	=	0x01,
811853030eSSimon Glass };
821853030eSSimon Glass 
831853030eSSimon Glass enum {
841853030eSSimon Glass 	HSFS_FDONE =		0x0001,
851853030eSSimon Glass 	HSFS_FCERR =		0x0002,
861853030eSSimon Glass 	HSFS_AEL =		0x0004,
871853030eSSimon Glass 	HSFS_BERASE_MASK =	0x0018,
881853030eSSimon Glass 	HSFS_BERASE_SHIFT =	3,
891853030eSSimon Glass 	HSFS_SCIP =		0x0020,
901853030eSSimon Glass 	HSFS_FDOPSS =		0x2000,
911853030eSSimon Glass 	HSFS_FDV =		0x4000,
921853030eSSimon Glass 	HSFS_FLOCKDN =		0x8000
931853030eSSimon Glass };
941853030eSSimon Glass 
951853030eSSimon Glass enum {
961853030eSSimon Glass 	HSFC_FGO =		0x0001,
971853030eSSimon Glass 	HSFC_FCYCLE_MASK =	0x0006,
981853030eSSimon Glass 	HSFC_FCYCLE_SHIFT =	1,
991853030eSSimon Glass 	HSFC_FDBC_MASK =	0x3f00,
1001853030eSSimon Glass 	HSFC_FDBC_SHIFT =	8,
1011853030eSSimon Glass 	HSFC_FSMIE =		0x8000
1021853030eSSimon Glass };
1031853030eSSimon Glass 
1041853030eSSimon Glass enum {
1051853030eSSimon Glass 	ICH_MAX_CMD_LEN		= 5,
1061853030eSSimon Glass };
1071853030eSSimon Glass 
1081853030eSSimon Glass struct spi_trans {
1091853030eSSimon Glass 	uint8_t cmd[ICH_MAX_CMD_LEN];
1101853030eSSimon Glass 	int cmd_len;
1111853030eSSimon Glass 	const uint8_t *out;
1121853030eSSimon Glass 	uint32_t bytesout;
1131853030eSSimon Glass 	uint8_t *in;
1141853030eSSimon Glass 	uint32_t bytesin;
1151853030eSSimon Glass 	uint8_t type;
1161853030eSSimon Glass 	uint8_t opcode;
1171853030eSSimon Glass 	uint32_t offset;
1181853030eSSimon Glass };
1191853030eSSimon Glass 
1204759dffeSStefan Roese #define SPI_OPCODE_WRSR		0x01
1214759dffeSStefan Roese #define SPI_OPCODE_PAGE_PROGRAM	0x02
1224759dffeSStefan Roese #define SPI_OPCODE_READ		0x03
1234759dffeSStefan Roese #define SPI_OPCODE_WRDIS	0x04
1244759dffeSStefan Roese #define SPI_OPCODE_RDSR		0x05
1259eb4339bSBin Meng #define SPI_OPCODE_WREN		0x06
1269eb4339bSBin Meng #define SPI_OPCODE_FAST_READ	0x0b
1274759dffeSStefan Roese #define SPI_OPCODE_ERASE_SECT	0x20
1284759dffeSStefan Roese #define SPI_OPCODE_READ_ID	0x9f
1294759dffeSStefan Roese #define SPI_OPCODE_ERASE_BLOCK	0xd8
1304759dffeSStefan Roese 
1314759dffeSStefan Roese #define SPI_OPCODE_TYPE_READ_NO_ADDRESS		0
1324759dffeSStefan Roese #define SPI_OPCODE_TYPE_WRITE_NO_ADDRESS	1
1334759dffeSStefan Roese #define SPI_OPCODE_TYPE_READ_WITH_ADDRESS	2
1344759dffeSStefan Roese #define SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS	3
1354759dffeSStefan Roese 
1364759dffeSStefan Roese #define SPI_OPMENU_0	SPI_OPCODE_WRSR
1374759dffeSStefan Roese #define SPI_OPTYPE_0	SPI_OPCODE_TYPE_WRITE_NO_ADDRESS
1384759dffeSStefan Roese 
1394759dffeSStefan Roese #define SPI_OPMENU_1	SPI_OPCODE_PAGE_PROGRAM
1404759dffeSStefan Roese #define SPI_OPTYPE_1	SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
1414759dffeSStefan Roese 
1424759dffeSStefan Roese #define SPI_OPMENU_2	SPI_OPCODE_READ
1434759dffeSStefan Roese #define SPI_OPTYPE_2	SPI_OPCODE_TYPE_READ_WITH_ADDRESS
1444759dffeSStefan Roese 
1454759dffeSStefan Roese #define SPI_OPMENU_3	SPI_OPCODE_RDSR
1464759dffeSStefan Roese #define SPI_OPTYPE_3	SPI_OPCODE_TYPE_READ_NO_ADDRESS
1474759dffeSStefan Roese 
1484759dffeSStefan Roese #define SPI_OPMENU_4	SPI_OPCODE_ERASE_SECT
1494759dffeSStefan Roese #define SPI_OPTYPE_4	SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
1504759dffeSStefan Roese 
1514759dffeSStefan Roese #define SPI_OPMENU_5	SPI_OPCODE_READ_ID
1524759dffeSStefan Roese #define SPI_OPTYPE_5	SPI_OPCODE_TYPE_READ_NO_ADDRESS
1534759dffeSStefan Roese 
1544759dffeSStefan Roese #define SPI_OPMENU_6	SPI_OPCODE_ERASE_BLOCK
1554759dffeSStefan Roese #define SPI_OPTYPE_6	SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
1564759dffeSStefan Roese 
1574759dffeSStefan Roese #define SPI_OPMENU_7	SPI_OPCODE_FAST_READ
1584759dffeSStefan Roese #define SPI_OPTYPE_7	SPI_OPCODE_TYPE_READ_WITH_ADDRESS
1594759dffeSStefan Roese 
1604759dffeSStefan Roese #define SPI_OPPREFIX	((SPI_OPCODE_WREN << 8) | SPI_OPCODE_WREN)
1614759dffeSStefan Roese #define SPI_OPTYPE	((SPI_OPTYPE_7 << 14) | (SPI_OPTYPE_6 << 12) | \
1624759dffeSStefan Roese 			 (SPI_OPTYPE_5 << 10) | (SPI_OPTYPE_4 <<  8) | \
1634759dffeSStefan Roese 			 (SPI_OPTYPE_3 <<  6) | (SPI_OPTYPE_2 <<  4) | \
1644759dffeSStefan Roese 			 (SPI_OPTYPE_1 <<  2) | (SPI_OPTYPE_0 <<  0))
1654759dffeSStefan Roese #define SPI_OPMENU_UPPER ((SPI_OPMENU_7 << 24) | (SPI_OPMENU_6 << 16) | \
1664759dffeSStefan Roese 			  (SPI_OPMENU_5 <<  8) | (SPI_OPMENU_4 <<  0))
1674759dffeSStefan Roese #define SPI_OPMENU_LOWER ((SPI_OPMENU_3 << 24) | (SPI_OPMENU_2 << 16) | \
1684759dffeSStefan Roese 			  (SPI_OPMENU_1 <<  8) | (SPI_OPMENU_0 <<  0))
1699eb4339bSBin Meng 
1706e670b5cSBin Meng enum ich_version {
1716e670b5cSBin Meng 	ICHV_7,
1726e670b5cSBin Meng 	ICHV_9,
1736e670b5cSBin Meng };
1746e670b5cSBin Meng 
1759eb4339bSBin Meng struct ich_spi_platdata {
1766e670b5cSBin Meng 	enum ich_version ich_version;	/* Controller version, 7 or 9 */
177*a117f09bSBin Meng 	bool lockdown;			/* lock down controller settings? */
1781853030eSSimon Glass };
1799eb4339bSBin Meng 
1809eb4339bSBin Meng struct ich_spi_priv {
1819eb4339bSBin Meng 	int opmenu;
1829eb4339bSBin Meng 	int menubytes;
1839eb4339bSBin Meng 	void *base;		/* Base of register set */
1849eb4339bSBin Meng 	int preop;
1859eb4339bSBin Meng 	int optype;
1869eb4339bSBin Meng 	int addr;
1879eb4339bSBin Meng 	int data;
1889eb4339bSBin Meng 	unsigned databytes;
1899eb4339bSBin Meng 	int status;
1909eb4339bSBin Meng 	int control;
1919eb4339bSBin Meng 	int bbar;
1929eb4339bSBin Meng 	int bcr;
1939eb4339bSBin Meng 	uint32_t *pr;		/* only for ich9 */
1949eb4339bSBin Meng 	int speed;		/* pointer to speed control */
1959eb4339bSBin Meng 	ulong max_speed;	/* Maximum bus speed in MHz */
1969eb4339bSBin Meng 	ulong cur_speed;	/* Current bus speed */
1979eb4339bSBin Meng 	struct spi_trans trans;	/* current transaction in progress */
1989eb4339bSBin Meng };
1999eb4339bSBin Meng 
2009eb4339bSBin Meng #endif /* _ICH_H_ */
201