xref: /openbmc/u-boot/drivers/spi/rk_spi.h (revision e8f80a5a)
1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
21b2fd5bfSSimon Glass /*
31b2fd5bfSSimon Glass  * SPI driver for rockchip
41b2fd5bfSSimon Glass  *
51b2fd5bfSSimon Glass  * (C) Copyright 2015 Google, Inc
61b2fd5bfSSimon Glass  *
71b2fd5bfSSimon Glass  * (C) Copyright 2008-2013 Rockchip Electronics
81b2fd5bfSSimon Glass  * Peter, Software Engineering, <superpeter.cai@gmail.com>.
91b2fd5bfSSimon Glass  */
101b2fd5bfSSimon Glass 
111b2fd5bfSSimon Glass #ifndef __RK_SPI_H
121b2fd5bfSSimon Glass #define __RK_SPI_H
131b2fd5bfSSimon Glass 
141b2fd5bfSSimon Glass struct rockchip_spi {
151b2fd5bfSSimon Glass 	u32 ctrlr0;
161b2fd5bfSSimon Glass 	u32 ctrlr1;
171b2fd5bfSSimon Glass 	u32 enr;
181b2fd5bfSSimon Glass 	u32 ser;
191b2fd5bfSSimon Glass 	u32 baudr;
201b2fd5bfSSimon Glass 	u32 txftlr;
211b2fd5bfSSimon Glass 	u32 rxftlr;
221b2fd5bfSSimon Glass 	u32 txflr;
231b2fd5bfSSimon Glass 	u32 rxflr;
241b2fd5bfSSimon Glass 	u32 sr;
251b2fd5bfSSimon Glass 	u32 ipr;
261b2fd5bfSSimon Glass 	u32 imr;
271b2fd5bfSSimon Glass 	u32 isr;
281b2fd5bfSSimon Glass 	u32 risr;
291b2fd5bfSSimon Glass 	u32 icr;
301b2fd5bfSSimon Glass 	u32 dmacr;
311b2fd5bfSSimon Glass 	u32 dmatdlr;
321b2fd5bfSSimon Glass 	u32 dmardlr;		/* 0x44 */
331b2fd5bfSSimon Glass 	u32 reserved[0xef];
341b2fd5bfSSimon Glass 	u32 txdr[0x100];	/* 0x400 */
351b2fd5bfSSimon Glass 	u32 rxdr[0x100];	/* 0x800 */
361b2fd5bfSSimon Glass };
371b2fd5bfSSimon Glass 
381b2fd5bfSSimon Glass /* CTRLR0 */
391b2fd5bfSSimon Glass enum {
401b2fd5bfSSimon Glass 	DFS_SHIFT	= 0,	/* Data Frame Size */
411b2fd5bfSSimon Glass 	DFS_MASK	= 3,
421b2fd5bfSSimon Glass 	DFS_4BIT	= 0,
431b2fd5bfSSimon Glass 	DFS_8BIT,
441b2fd5bfSSimon Glass 	DFS_16BIT,
451b2fd5bfSSimon Glass 	DFS_RESV,
461b2fd5bfSSimon Glass 
471b2fd5bfSSimon Glass 	CFS_SHIFT	= 2,	/* Control Frame Size */
481b2fd5bfSSimon Glass 	CFS_MASK	= 0xf,
491b2fd5bfSSimon Glass 
501b2fd5bfSSimon Glass 	SCPH_SHIFT	= 6,	/* Serial Clock Phase */
511b2fd5bfSSimon Glass 	SCPH_MASK	= 1,
521b2fd5bfSSimon Glass 	SCPH_TOGMID	= 0,	/* SCLK toggles in middle of first data bit */
531b2fd5bfSSimon Glass 	SCPH_TOGSTA,		/* SCLK toggles at start of first data bit */
541b2fd5bfSSimon Glass 
551b2fd5bfSSimon Glass 	SCOL_SHIFT	= 7,	/* Serial Clock Polarity */
561b2fd5bfSSimon Glass 	SCOL_MASK	= 1,
571b2fd5bfSSimon Glass 	SCOL_LOW	= 0,	/* Inactive state of serial clock is low */
581b2fd5bfSSimon Glass 	SCOL_HIGH,		/* Inactive state of serial clock is high */
591b2fd5bfSSimon Glass 
601b2fd5bfSSimon Glass 	CSM_SHIFT	= 8,	/* Chip Select Mode */
611b2fd5bfSSimon Glass 	CSM_MASK	= 0x3,
621b2fd5bfSSimon Glass 	CSM_KEEP	= 0,	/* ss_n stays low after each frame  */
631b2fd5bfSSimon Glass 	CSM_HALF,		/* ss_n high for half sclk_out cycles */
641b2fd5bfSSimon Glass 	CSM_ONE,		/* ss_n high for one sclk_out cycle */
651b2fd5bfSSimon Glass 	CSM_RESV,
661b2fd5bfSSimon Glass 
671b2fd5bfSSimon Glass 	SSN_DELAY_SHIFT	= 10,	/* SSN to Sclk_out delay */
681b2fd5bfSSimon Glass 	SSN_DELAY_MASK	= 1,
691b2fd5bfSSimon Glass 	SSN_DELAY_HALF	= 0,	/* 1/2 sclk_out cycle */
701b2fd5bfSSimon Glass 	SSN_DELAY_ONE	= 1,	/* 1 sclk_out cycle */
711b2fd5bfSSimon Glass 
721b2fd5bfSSimon Glass 	SEM_SHIFT	= 11,	/* Serial Endian Mode */
731b2fd5bfSSimon Glass 	SEM_MASK	= 1,
741b2fd5bfSSimon Glass 	SEM_LITTLE	= 0,	/* little endian */
751b2fd5bfSSimon Glass 	SEM_BIG,		/* big endian */
761b2fd5bfSSimon Glass 
771b2fd5bfSSimon Glass 	FBM_SHIFT	= 12,	/* First Bit Mode */
781b2fd5bfSSimon Glass 	FBM_MASK	= 1,
791b2fd5bfSSimon Glass 	FBM_MSB		= 0,	/* first bit is MSB */
801b2fd5bfSSimon Glass 	FBM_LSB,		/* first bit in LSB */
811b2fd5bfSSimon Glass 
821b2fd5bfSSimon Glass 	HALF_WORD_TX_SHIFT = 13,	/* Byte and Halfword Transform */
831b2fd5bfSSimon Glass 	HALF_WORD_MASK	= 1,
841b2fd5bfSSimon Glass 	HALF_WORD_ON	= 0,	/* apb 16bit write/read, spi 8bit write/read */
851b2fd5bfSSimon Glass 	HALF_WORD_OFF,		/* apb 8bit write/read, spi 8bit write/read */
861b2fd5bfSSimon Glass 
871b2fd5bfSSimon Glass 	RXDSD_SHIFT	= 14,	/* Rxd Sample Delay, in cycles */
881b2fd5bfSSimon Glass 	RXDSD_MASK	= 3,
891b2fd5bfSSimon Glass 
901b2fd5bfSSimon Glass 	FRF_SHIFT	= 16,	/* Frame Format */
911b2fd5bfSSimon Glass 	FRF_MASK	= 3,
921b2fd5bfSSimon Glass 	FRF_SPI		= 0,	/* Motorola SPI */
931b2fd5bfSSimon Glass 	FRF_SSP,			/* Texas Instruments SSP*/
941b2fd5bfSSimon Glass 	FRF_MICROWIRE,		/* National Semiconductors Microwire */
951b2fd5bfSSimon Glass 	FRF_RESV,
961b2fd5bfSSimon Glass 
971b2fd5bfSSimon Glass 	TMOD_SHIFT	= 18,	/* Transfer Mode */
981b2fd5bfSSimon Glass 	TMOD_MASK	= 3,
991b2fd5bfSSimon Glass 	TMOD_TR		= 0,	/* xmit & recv */
1001b2fd5bfSSimon Glass 	TMOD_TO,		/* xmit only */
1011b2fd5bfSSimon Glass 	TMOD_RO,		/* recv only */
1021b2fd5bfSSimon Glass 	TMOD_RESV,
1031b2fd5bfSSimon Glass 
1041b2fd5bfSSimon Glass 	OMOD_SHIFT	= 20,	/* Operation Mode */
1051b2fd5bfSSimon Glass 	OMOD_MASK	= 1,
1061b2fd5bfSSimon Glass 	OMOD_MASTER	= 0,	/* Master Mode */
1071b2fd5bfSSimon Glass 	OMOD_SLAVE,		/* Slave Mode */
1081b2fd5bfSSimon Glass };
1091b2fd5bfSSimon Glass 
1101b2fd5bfSSimon Glass /* SR */
1111b2fd5bfSSimon Glass enum {
1121b2fd5bfSSimon Glass 	SR_MASK		= 0x7f,
1131b2fd5bfSSimon Glass 	SR_BUSY		= 1 << 0,
1141b2fd5bfSSimon Glass 	SR_TF_FULL	= 1 << 1,
1151b2fd5bfSSimon Glass 	SR_TF_EMPT	= 1 << 2,
1161b2fd5bfSSimon Glass 	SR_RF_EMPT	= 1 << 3,
1171b2fd5bfSSimon Glass 	SR_RF_FULL	= 1 << 4,
1181b2fd5bfSSimon Glass };
1191b2fd5bfSSimon Glass 
1201b2fd5bfSSimon Glass #define ROCKCHIP_SPI_TIMEOUT_MS		1000
121bd376714SPhilipp Tomsich 
122bd376714SPhilipp Tomsich /*
123bd376714SPhilipp Tomsich  * We limit the maximum bitrate to 50MBit/s (50MHz) due to an assumed
124bd376714SPhilipp Tomsich  * hardware limitation...  the Linux kernel source has the following
125bd376714SPhilipp Tomsich  * comment:
126bd376714SPhilipp Tomsich  *   "sclk_out: spi master internal logic in rk3x can support 50Mhz"
127bd376714SPhilipp Tomsich  */
128bd376714SPhilipp Tomsich #define ROCKCHIP_SPI_MAX_RATE		50000000
1291b2fd5bfSSimon Glass 
1301b2fd5bfSSimon Glass #endif /* __RK_SPI_H */
131