xref: /rk3399_rockchip-uboot/drivers/spi/ich.h (revision 9eb4339ba45fc7147b013c8e8d579ebc6d8d1bdb)
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 
9*9eb4339bSBin Meng #ifndef _ICH_H_
10*9eb4339bSBin Meng #define _ICH_H_
11*9eb4339bSBin 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 	SPI_OPCODE_TYPE_READ_NO_ADDRESS =	0,
1061853030eSSimon Glass 	SPI_OPCODE_TYPE_WRITE_NO_ADDRESS =	1,
1071853030eSSimon Glass 	SPI_OPCODE_TYPE_READ_WITH_ADDRESS =	2,
1081853030eSSimon Glass 	SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS =	3
1091853030eSSimon Glass };
1101853030eSSimon Glass 
1111853030eSSimon Glass enum {
1121853030eSSimon Glass 	ICH_MAX_CMD_LEN		= 5,
1131853030eSSimon Glass };
1141853030eSSimon Glass 
1151853030eSSimon Glass struct spi_trans {
1161853030eSSimon Glass 	uint8_t cmd[ICH_MAX_CMD_LEN];
1171853030eSSimon Glass 	int cmd_len;
1181853030eSSimon Glass 	const uint8_t *out;
1191853030eSSimon Glass 	uint32_t bytesout;
1201853030eSSimon Glass 	uint8_t *in;
1211853030eSSimon Glass 	uint32_t bytesin;
1221853030eSSimon Glass 	uint8_t type;
1231853030eSSimon Glass 	uint8_t opcode;
1241853030eSSimon Glass 	uint32_t offset;
1251853030eSSimon Glass };
1261853030eSSimon Glass 
127*9eb4339bSBin Meng #define SPI_OPCODE_WREN		0x06
128*9eb4339bSBin Meng #define SPI_OPCODE_FAST_READ	0x0b
129*9eb4339bSBin Meng 
130*9eb4339bSBin Meng struct ich_spi_platdata {
131*9eb4339bSBin Meng 	enum pch_version ich_version;	/* Controller version, 7 or 9 */
1321853030eSSimon Glass };
133*9eb4339bSBin Meng 
134*9eb4339bSBin Meng struct ich_spi_priv {
135*9eb4339bSBin Meng 	int ichspi_lock;
136*9eb4339bSBin Meng 	int locked;
137*9eb4339bSBin Meng 	int opmenu;
138*9eb4339bSBin Meng 	int menubytes;
139*9eb4339bSBin Meng 	void *base;		/* Base of register set */
140*9eb4339bSBin Meng 	int preop;
141*9eb4339bSBin Meng 	int optype;
142*9eb4339bSBin Meng 	int addr;
143*9eb4339bSBin Meng 	int data;
144*9eb4339bSBin Meng 	unsigned databytes;
145*9eb4339bSBin Meng 	int status;
146*9eb4339bSBin Meng 	int control;
147*9eb4339bSBin Meng 	int bbar;
148*9eb4339bSBin Meng 	int bcr;
149*9eb4339bSBin Meng 	uint32_t *pr;		/* only for ich9 */
150*9eb4339bSBin Meng 	int speed;		/* pointer to speed control */
151*9eb4339bSBin Meng 	ulong max_speed;	/* Maximum bus speed in MHz */
152*9eb4339bSBin Meng 	ulong cur_speed;	/* Current bus speed */
153*9eb4339bSBin Meng 	struct spi_trans trans;	/* current transaction in progress */
154*9eb4339bSBin Meng };
155*9eb4339bSBin Meng 
156*9eb4339bSBin Meng #endif /* _ICH_H_ */
157