xref: /OK3568_Linux_fs/external/rkwifibt/drivers/infineon/include/sdio.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * SDIO spec header file
3*4882a593Smuzhiyun  * Protocol and standard (common) device definitions
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (C) 1999-2017, Broadcom Corporation
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
10*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
11*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
12*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
13*4882a593Smuzhiyun  * following added to such license:
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
16*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
17*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
18*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
19*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
20*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
21*4882a593Smuzhiyun  * modifications of the software.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  *      Notwithstanding the above, under no circumstances may you combine this
24*4882a593Smuzhiyun  * software in any way with any other Broadcom software provided under a license
25*4882a593Smuzhiyun  * other than the GPL, without Broadcom's express prior written consent.
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Open:>>
29*4882a593Smuzhiyun  *
30*4882a593Smuzhiyun  * $Id: sdio.h 689948 2017-03-14 05:21:03Z $
31*4882a593Smuzhiyun  */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #ifndef	_SDIO_H
34*4882a593Smuzhiyun #define	_SDIO_H
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #ifdef BCMSDIO
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* CCCR structure for function 0 */
39*4882a593Smuzhiyun typedef volatile struct {
40*4882a593Smuzhiyun 	uint8	cccr_sdio_rev;		/* RO, cccr and sdio revision */
41*4882a593Smuzhiyun 	uint8	sd_rev;			/* RO, sd spec revision */
42*4882a593Smuzhiyun 	uint8	io_en;			/* I/O enable */
43*4882a593Smuzhiyun 	uint8	io_rdy;			/* I/O ready reg */
44*4882a593Smuzhiyun 	uint8	intr_ctl;		/* Master and per function interrupt enable control */
45*4882a593Smuzhiyun 	uint8	intr_status;		/* RO, interrupt pending status */
46*4882a593Smuzhiyun 	uint8	io_abort;		/* read/write abort or reset all functions */
47*4882a593Smuzhiyun 	uint8	bus_inter;		/* bus interface control */
48*4882a593Smuzhiyun 	uint8	capability;		/* RO, card capability */
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	uint8	cis_base_low;		/* 0x9 RO, common CIS base address, LSB */
51*4882a593Smuzhiyun 	uint8	cis_base_mid;
52*4882a593Smuzhiyun 	uint8	cis_base_high;		/* 0xB RO, common CIS base address, MSB */
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	/* suspend/resume registers */
55*4882a593Smuzhiyun 	uint8	bus_suspend;		/* 0xC */
56*4882a593Smuzhiyun 	uint8	func_select;		/* 0xD */
57*4882a593Smuzhiyun 	uint8	exec_flag;		/* 0xE */
58*4882a593Smuzhiyun 	uint8	ready_flag;		/* 0xF */
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	uint8	fn0_blk_size[2];	/* 0x10(LSB), 0x11(MSB) */
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	uint8	power_control;		/* 0x12 (SDIO version 1.10) */
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	uint8	speed_control;		/* 0x13 */
65*4882a593Smuzhiyun } sdio_regs_t;
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun /* SDIO Device CCCR offsets */
68*4882a593Smuzhiyun #define SDIOD_CCCR_REV			0x00
69*4882a593Smuzhiyun #define SDIOD_CCCR_SDREV		0x01
70*4882a593Smuzhiyun #define SDIOD_CCCR_IOEN			0x02
71*4882a593Smuzhiyun #define SDIOD_CCCR_IORDY		0x03
72*4882a593Smuzhiyun #define SDIOD_CCCR_INTEN		0x04
73*4882a593Smuzhiyun #define SDIOD_CCCR_INTPEND		0x05
74*4882a593Smuzhiyun #define SDIOD_CCCR_IOABORT		0x06
75*4882a593Smuzhiyun #define SDIOD_CCCR_BICTRL		0x07
76*4882a593Smuzhiyun #define SDIOD_CCCR_CAPABLITIES		0x08
77*4882a593Smuzhiyun #define SDIOD_CCCR_CISPTR_0		0x09
78*4882a593Smuzhiyun #define SDIOD_CCCR_CISPTR_1		0x0A
79*4882a593Smuzhiyun #define SDIOD_CCCR_CISPTR_2		0x0B
80*4882a593Smuzhiyun #define SDIOD_CCCR_BUSSUSP		0x0C
81*4882a593Smuzhiyun #define SDIOD_CCCR_FUNCSEL		0x0D
82*4882a593Smuzhiyun #define SDIOD_CCCR_EXECFLAGS		0x0E
83*4882a593Smuzhiyun #define SDIOD_CCCR_RDYFLAGS		0x0F
84*4882a593Smuzhiyun #define SDIOD_CCCR_BLKSIZE_0		0x10
85*4882a593Smuzhiyun #define SDIOD_CCCR_BLKSIZE_1		0x11
86*4882a593Smuzhiyun #define SDIOD_CCCR_POWER_CONTROL	0x12
87*4882a593Smuzhiyun #define SDIOD_CCCR_SPEED_CONTROL	0x13
88*4882a593Smuzhiyun #define SDIOD_CCCR_UHSI_SUPPORT		0x14
89*4882a593Smuzhiyun #define SDIOD_CCCR_DRIVER_STRENGTH	0x15
90*4882a593Smuzhiyun #define SDIOD_CCCR_INTR_EXTN		0x16
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun /* Broadcom extensions (corerev >= 1) */
93*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP					0xf0
94*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP_CMD14_SUPPORT	0x02
95*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP_CMD14_EXT		0x04
96*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP_CMD_NODEC		0x08
97*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP_CHIPID_PRESENT	0x40
98*4882a593Smuzhiyun #define	SDIOD_CCCR_BRCM_CARDCAP_SECURE_MODE		0x80
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCTL				0xf1
101*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CISLOADED			0x1
102*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_WLANRST_ONF0ABORT	0x2
103*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_SDIORST_ONWLANRST	0x20
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_SEPINT			0xf2
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun /* cccr_sdio_rev */
108*4882a593Smuzhiyun #define SDIO_REV_SDIOID_MASK	0xf0	/* SDIO spec revision number */
109*4882a593Smuzhiyun #define SDIO_REV_CCCRID_MASK	0x0f	/* CCCR format version number */
110*4882a593Smuzhiyun #define SDIO_SPEC_VERSION_3_0	0x40	/* SDIO spec version 3.0 */
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /* sd_rev */
113*4882a593Smuzhiyun #define SD_REV_PHY_MASK		0x0f	/* SD format version number */
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun /* io_en */
116*4882a593Smuzhiyun #define SDIO_FUNC_ENABLE_1	0x02	/* function 1 I/O enable */
117*4882a593Smuzhiyun #define SDIO_FUNC_ENABLE_2	0x04	/* function 2 I/O enable */
118*4882a593Smuzhiyun #if defined(BT_OVER_SDIO)
119*4882a593Smuzhiyun #define SDIO_FUNC_ENABLE_3	0x08	/* function 2 I/O enable */
120*4882a593Smuzhiyun #define SDIO_FUNC_DISABLE_3	0xF0	/* function 2 I/O enable */
121*4882a593Smuzhiyun #endif /* defined (BT_OVER_SDIO) */
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* io_rdys */
124*4882a593Smuzhiyun #define SDIO_FUNC_READY_1	0x02	/* function 1 I/O ready */
125*4882a593Smuzhiyun #define SDIO_FUNC_READY_2	0x04	/* function 2 I/O ready */
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /* intr_ctl */
128*4882a593Smuzhiyun #define INTR_CTL_MASTER_EN	0x1	/* interrupt enable master */
129*4882a593Smuzhiyun #define INTR_CTL_FUNC1_EN	0x2	/* interrupt enable for function 1 */
130*4882a593Smuzhiyun #define INTR_CTL_FUNC2_EN	0x4	/* interrupt enable for function 2 */
131*4882a593Smuzhiyun #if defined(BT_OVER_SDIO)
132*4882a593Smuzhiyun #define INTR_CTL_FUNC3_EN	0x8	/* interrupt enable for function 3 */
133*4882a593Smuzhiyun #endif /* defined (BT_OVER_SDIO) */
134*4882a593Smuzhiyun /* intr_status */
135*4882a593Smuzhiyun #define INTR_STATUS_FUNC1	0x2	/* interrupt pending for function 1 */
136*4882a593Smuzhiyun #define INTR_STATUS_FUNC2	0x4	/* interrupt pending for function 2 */
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /* io_abort */
139*4882a593Smuzhiyun #define IO_ABORT_RESET_ALL	0x08	/* I/O card reset */
140*4882a593Smuzhiyun #define IO_ABORT_FUNC_MASK	0x07	/* abort selction: function x */
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun /* bus_inter */
143*4882a593Smuzhiyun #define BUS_CARD_DETECT_DIS	0x80	/* Card Detect disable */
144*4882a593Smuzhiyun #define BUS_SPI_CONT_INTR_CAP	0x40	/* support continuous SPI interrupt */
145*4882a593Smuzhiyun #define BUS_SPI_CONT_INTR_EN	0x20	/* continuous SPI interrupt enable */
146*4882a593Smuzhiyun #define BUS_SD_DATA_WIDTH_MASK	0x03	/* bus width mask */
147*4882a593Smuzhiyun #define BUS_SD_DATA_WIDTH_4BIT	0x02	/* bus width 4-bit mode */
148*4882a593Smuzhiyun #define BUS_SD_DATA_WIDTH_1BIT	0x00	/* bus width 1-bit mode */
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /* capability */
151*4882a593Smuzhiyun #define SDIO_CAP_4BLS		0x80	/* 4-bit support for low speed card */
152*4882a593Smuzhiyun #define SDIO_CAP_LSC		0x40	/* low speed card */
153*4882a593Smuzhiyun #define SDIO_CAP_E4MI		0x20	/* enable interrupt between block of data in 4-bit mode */
154*4882a593Smuzhiyun #define SDIO_CAP_S4MI		0x10	/* support interrupt between block of data in 4-bit mode */
155*4882a593Smuzhiyun #define SDIO_CAP_SBS		0x08	/* support suspend/resume */
156*4882a593Smuzhiyun #define SDIO_CAP_SRW		0x04	/* support read wait */
157*4882a593Smuzhiyun #define SDIO_CAP_SMB		0x02	/* support multi-block transfer */
158*4882a593Smuzhiyun #define SDIO_CAP_SDC		0x01	/* Support Direct commands during multi-byte transfer */
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /* power_control */
161*4882a593Smuzhiyun #define SDIO_POWER_SMPC		0x01	/* supports master power control (RO) */
162*4882a593Smuzhiyun #define SDIO_POWER_EMPC		0x02	/* enable master power control (allow > 200mA) (RW) */
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun /* speed_control (control device entry into high-speed clocking mode) */
165*4882a593Smuzhiyun #define SDIO_SPEED_SHS		0x01	/* supports high-speed [clocking] mode (RO) */
166*4882a593Smuzhiyun #define SDIO_SPEED_EHS		0x02	/* enable high-speed [clocking] mode (RW) */
167*4882a593Smuzhiyun #define SDIO_SPEED_UHSI_DDR50	   0x08
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun /* for setting bus speed in card: 0x13h */
170*4882a593Smuzhiyun #define SDIO_BUS_SPEED_UHSISEL_M	BITFIELD_MASK(3)
171*4882a593Smuzhiyun #define SDIO_BUS_SPEED_UHSISEL_S	1
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun /* for getting bus speed cap in card: 0x14h */
174*4882a593Smuzhiyun #define SDIO_BUS_SPEED_UHSICAP_M	BITFIELD_MASK(3)
175*4882a593Smuzhiyun #define SDIO_BUS_SPEED_UHSICAP_S	0
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /* for getting driver type CAP in card: 0x15h */
178*4882a593Smuzhiyun #define SDIO_BUS_DRVR_TYPE_CAP_M	BITFIELD_MASK(3)
179*4882a593Smuzhiyun #define SDIO_BUS_DRVR_TYPE_CAP_S	0
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun /* for setting driver type selection in card: 0x15h */
182*4882a593Smuzhiyun #define SDIO_BUS_DRVR_TYPE_SEL_M	BITFIELD_MASK(2)
183*4882a593Smuzhiyun #define SDIO_BUS_DRVR_TYPE_SEL_S	4
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun /* for getting async int support in card: 0x16h */
186*4882a593Smuzhiyun #define SDIO_BUS_ASYNCINT_CAP_M	BITFIELD_MASK(1)
187*4882a593Smuzhiyun #define SDIO_BUS_ASYNCINT_CAP_S	0
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun /* for setting async int selection in card: 0x16h */
190*4882a593Smuzhiyun #define SDIO_BUS_ASYNCINT_SEL_M	BITFIELD_MASK(1)
191*4882a593Smuzhiyun #define SDIO_BUS_ASYNCINT_SEL_S	1
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun /* brcm sepint */
194*4882a593Smuzhiyun #define SDIO_SEPINT_MASK	0x01	/* route sdpcmdev intr onto separate pad (chip-specific) */
195*4882a593Smuzhiyun #define SDIO_SEPINT_OE		0x02	/* 1 asserts output enable for above pad */
196*4882a593Smuzhiyun #define SDIO_SEPINT_ACT_HI	0x04	/* use active high interrupt level instead of active low */
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun /* FBR structure for function 1-7, FBR addresses and register offsets */
199*4882a593Smuzhiyun typedef volatile struct {
200*4882a593Smuzhiyun 	uint8	devctr;			/* device interface, CSA control */
201*4882a593Smuzhiyun 	uint8	ext_dev;		/* extended standard I/O device type code */
202*4882a593Smuzhiyun 	uint8	pwr_sel;		/* power selection support */
203*4882a593Smuzhiyun 	uint8	PAD[6];			/* reserved */
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	uint8	cis_low;		/* CIS LSB */
206*4882a593Smuzhiyun 	uint8	cis_mid;
207*4882a593Smuzhiyun 	uint8	cis_high;		/* CIS MSB */
208*4882a593Smuzhiyun 	uint8	csa_low;		/* code storage area, LSB */
209*4882a593Smuzhiyun 	uint8	csa_mid;
210*4882a593Smuzhiyun 	uint8	csa_high;		/* code storage area, MSB */
211*4882a593Smuzhiyun 	uint8	csa_dat_win;		/* data access window to function */
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	uint8	fnx_blk_size[2];	/* block size, little endian */
214*4882a593Smuzhiyun } sdio_fbr_t;
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun /* Maximum number of I/O funcs */
217*4882a593Smuzhiyun #define SDIOD_MAX_FUNCS			8
218*4882a593Smuzhiyun #define SDIOD_MAX_IOFUNCS		7
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun /* SDIO Device FBR Start Address  */
221*4882a593Smuzhiyun #define SDIOD_FBR_STARTADDR		0x100
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /* SDIO Device FBR Size */
224*4882a593Smuzhiyun #define SDIOD_FBR_SIZE			0x100
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun /* Macro to calculate FBR register base */
227*4882a593Smuzhiyun #define SDIOD_FBR_BASE(n)		((n) * 0x100)
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun /* Function register offsets */
230*4882a593Smuzhiyun #define SDIOD_FBR_DEVCTR		0x00	/* basic info for function */
231*4882a593Smuzhiyun #define SDIOD_FBR_EXT_DEV		0x01	/* extended I/O device code */
232*4882a593Smuzhiyun #define SDIOD_FBR_PWR_SEL		0x02	/* power selection bits */
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun /* SDIO Function CIS ptr offset */
235*4882a593Smuzhiyun #define SDIOD_FBR_CISPTR_0		0x09
236*4882a593Smuzhiyun #define SDIOD_FBR_CISPTR_1		0x0A
237*4882a593Smuzhiyun #define SDIOD_FBR_CISPTR_2		0x0B
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun /* Code Storage Area pointer */
240*4882a593Smuzhiyun #define SDIOD_FBR_CSA_ADDR_0		0x0C
241*4882a593Smuzhiyun #define SDIOD_FBR_CSA_ADDR_1		0x0D
242*4882a593Smuzhiyun #define SDIOD_FBR_CSA_ADDR_2		0x0E
243*4882a593Smuzhiyun #define SDIOD_FBR_CSA_DATA		0x0F
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /* SDIO Function I/O Block Size */
246*4882a593Smuzhiyun #define SDIOD_FBR_BLKSIZE_0		0x10
247*4882a593Smuzhiyun #define SDIOD_FBR_BLKSIZE_1		0x11
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun /* devctr */
250*4882a593Smuzhiyun #define SDIOD_FBR_DEVCTR_DIC	0x0f	/* device interface code */
251*4882a593Smuzhiyun #define SDIOD_FBR_DECVTR_CSA	0x40	/* CSA support flag */
252*4882a593Smuzhiyun #define SDIOD_FBR_DEVCTR_CSA_EN	0x80	/* CSA enabled */
253*4882a593Smuzhiyun /* interface codes */
254*4882a593Smuzhiyun #define SDIOD_DIC_NONE		0	/* SDIO standard interface is not supported */
255*4882a593Smuzhiyun #define SDIOD_DIC_UART		1
256*4882a593Smuzhiyun #define SDIOD_DIC_BLUETOOTH_A	2
257*4882a593Smuzhiyun #define SDIOD_DIC_BLUETOOTH_B	3
258*4882a593Smuzhiyun #define SDIOD_DIC_GPS		4
259*4882a593Smuzhiyun #define SDIOD_DIC_CAMERA	5
260*4882a593Smuzhiyun #define SDIOD_DIC_PHS		6
261*4882a593Smuzhiyun #define SDIOD_DIC_WLAN		7
262*4882a593Smuzhiyun #define SDIOD_DIC_EXT		0xf	/* extended device interface, read ext_dev register */
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun /* pwr_sel */
265*4882a593Smuzhiyun #define SDIOD_PWR_SEL_SPS	0x01	/* supports power selection */
266*4882a593Smuzhiyun #define SDIOD_PWR_SEL_EPS	0x02	/* enable power selection (low-current mode) */
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun /* misc defines */
269*4882a593Smuzhiyun #define SDIO_FUNC_0		0
270*4882a593Smuzhiyun #define SDIO_FUNC_1		1
271*4882a593Smuzhiyun #define SDIO_FUNC_2		2
272*4882a593Smuzhiyun #define SDIO_FUNC_4		4
273*4882a593Smuzhiyun #define SDIO_FUNC_5		5
274*4882a593Smuzhiyun #define SDIO_FUNC_6		6
275*4882a593Smuzhiyun #define SDIO_FUNC_7		7
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun #define SD_CARD_TYPE_UNKNOWN	0	/* bad type or unrecognized */
278*4882a593Smuzhiyun #define SD_CARD_TYPE_IO		1	/* IO only card */
279*4882a593Smuzhiyun #define SD_CARD_TYPE_MEMORY	2	/* memory only card */
280*4882a593Smuzhiyun #define SD_CARD_TYPE_COMBO	3	/* IO and memory combo card */
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun #define SDIO_MAX_BLOCK_SIZE	2048	/* maximum block size for block mode operation */
283*4882a593Smuzhiyun #define SDIO_MIN_BLOCK_SIZE	1	/* minimum block size for block mode operation */
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun /* Card registers: status bit position */
286*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_OUTOFRANGE		31
287*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_COMCRCERROR		23
288*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_ILLEGALCOMMAND	22
289*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_ERROR		19
290*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_IOCURRENTSTATE3	12
291*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_IOCURRENTSTATE2	11
292*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_IOCURRENTSTATE1	10
293*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_IOCURRENTSTATE0	9
294*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_FUN_NUM_ERROR	4
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun #define SD_CMD_GO_IDLE_STATE		0	/* mandatory for SDIO */
297*4882a593Smuzhiyun #define SD_CMD_SEND_OPCOND		1
298*4882a593Smuzhiyun #define SD_CMD_MMC_SET_RCA		3
299*4882a593Smuzhiyun #define SD_CMD_IO_SEND_OP_COND		5	/* mandatory for SDIO */
300*4882a593Smuzhiyun #define SD_CMD_SELECT_DESELECT_CARD	7
301*4882a593Smuzhiyun #define SD_CMD_SEND_CSD			9
302*4882a593Smuzhiyun #define SD_CMD_SEND_CID			10
303*4882a593Smuzhiyun #define SD_CMD_STOP_TRANSMISSION	12
304*4882a593Smuzhiyun #define SD_CMD_SEND_STATUS		13
305*4882a593Smuzhiyun #define SD_CMD_GO_INACTIVE_STATE	15
306*4882a593Smuzhiyun #define SD_CMD_SET_BLOCKLEN		16
307*4882a593Smuzhiyun #define SD_CMD_READ_SINGLE_BLOCK	17
308*4882a593Smuzhiyun #define SD_CMD_READ_MULTIPLE_BLOCK	18
309*4882a593Smuzhiyun #define SD_CMD_WRITE_BLOCK		24
310*4882a593Smuzhiyun #define SD_CMD_WRITE_MULTIPLE_BLOCK	25
311*4882a593Smuzhiyun #define SD_CMD_PROGRAM_CSD		27
312*4882a593Smuzhiyun #define SD_CMD_SET_WRITE_PROT		28
313*4882a593Smuzhiyun #define SD_CMD_CLR_WRITE_PROT		29
314*4882a593Smuzhiyun #define SD_CMD_SEND_WRITE_PROT		30
315*4882a593Smuzhiyun #define SD_CMD_ERASE_WR_BLK_START	32
316*4882a593Smuzhiyun #define SD_CMD_ERASE_WR_BLK_END		33
317*4882a593Smuzhiyun #define SD_CMD_ERASE			38
318*4882a593Smuzhiyun #define SD_CMD_LOCK_UNLOCK		42
319*4882a593Smuzhiyun #define SD_CMD_IO_RW_DIRECT		52	/* mandatory for SDIO */
320*4882a593Smuzhiyun #define SD_CMD_IO_RW_EXTENDED		53	/* mandatory for SDIO */
321*4882a593Smuzhiyun #define SD_CMD_APP_CMD			55
322*4882a593Smuzhiyun #define SD_CMD_GEN_CMD			56
323*4882a593Smuzhiyun #define SD_CMD_READ_OCR			58
324*4882a593Smuzhiyun #define SD_CMD_CRC_ON_OFF		59	/* mandatory for SDIO */
325*4882a593Smuzhiyun #define SD_ACMD_SD_STATUS		13
326*4882a593Smuzhiyun #define SD_ACMD_SEND_NUM_WR_BLOCKS	22
327*4882a593Smuzhiyun #define SD_ACMD_SET_WR_BLOCK_ERASE_CNT	23
328*4882a593Smuzhiyun #define SD_ACMD_SD_SEND_OP_COND		41
329*4882a593Smuzhiyun #define SD_ACMD_SET_CLR_CARD_DETECT	42
330*4882a593Smuzhiyun #define SD_ACMD_SEND_SCR		51
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun /* argument for SD_CMD_IO_RW_DIRECT and SD_CMD_IO_RW_EXTENDED */
333*4882a593Smuzhiyun #define SD_IO_OP_READ		0   /* Read_Write: Read */
334*4882a593Smuzhiyun #define SD_IO_OP_WRITE		1   /* Read_Write: Write */
335*4882a593Smuzhiyun #define SD_IO_RW_NORMAL		0   /* no RAW */
336*4882a593Smuzhiyun #define SD_IO_RW_RAW		1   /* RAW */
337*4882a593Smuzhiyun #define SD_IO_BYTE_MODE		0   /* Byte Mode */
338*4882a593Smuzhiyun #define SD_IO_BLOCK_MODE	1   /* BlockMode */
339*4882a593Smuzhiyun #define SD_IO_FIXED_ADDRESS	0   /* fix Address */
340*4882a593Smuzhiyun #define SD_IO_INCREMENT_ADDRESS	1   /* IncrementAddress */
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun /* build SD_CMD_IO_RW_DIRECT Argument */
343*4882a593Smuzhiyun #define SDIO_IO_RW_DIRECT_ARG(rw, raw, func, addr, data) \
344*4882a593Smuzhiyun 	((((rw) & 1) << 31) | (((func) & 0x7) << 28) | (((raw) & 1) << 27) | \
345*4882a593Smuzhiyun 	 (((addr) & 0x1FFFF) << 9) | ((data) & 0xFF))
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun /* build SD_CMD_IO_RW_EXTENDED Argument */
348*4882a593Smuzhiyun #define SDIO_IO_RW_EXTENDED_ARG(rw, blk, func, addr, inc_addr, count) \
349*4882a593Smuzhiyun 	((((rw) & 1) << 31) | (((func) & 0x7) << 28) | (((blk) & 1) << 27) | \
350*4882a593Smuzhiyun 	 (((inc_addr) & 1) << 26) | (((addr) & 0x1FFFF) << 9) | ((count) & 0x1FF))
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun /* SDIO response parameters */
353*4882a593Smuzhiyun #define SD_RSP_NO_NONE			0
354*4882a593Smuzhiyun #define SD_RSP_NO_1			1
355*4882a593Smuzhiyun #define SD_RSP_NO_2			2
356*4882a593Smuzhiyun #define SD_RSP_NO_3			3
357*4882a593Smuzhiyun #define SD_RSP_NO_4			4
358*4882a593Smuzhiyun #define SD_RSP_NO_5			5
359*4882a593Smuzhiyun #define SD_RSP_NO_6			6
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	/* Modified R6 response (to CMD3) */
362*4882a593Smuzhiyun #define SD_RSP_MR6_COM_CRC_ERROR	0x8000
363*4882a593Smuzhiyun #define SD_RSP_MR6_ILLEGAL_COMMAND	0x4000
364*4882a593Smuzhiyun #define SD_RSP_MR6_ERROR		0x2000
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	/* Modified R1 in R4 Response (to CMD5) */
367*4882a593Smuzhiyun #define SD_RSP_MR1_SBIT			0x80
368*4882a593Smuzhiyun #define SD_RSP_MR1_PARAMETER_ERROR	0x40
369*4882a593Smuzhiyun #define SD_RSP_MR1_RFU5			0x20
370*4882a593Smuzhiyun #define SD_RSP_MR1_FUNC_NUM_ERROR	0x10
371*4882a593Smuzhiyun #define SD_RSP_MR1_COM_CRC_ERROR	0x08
372*4882a593Smuzhiyun #define SD_RSP_MR1_ILLEGAL_COMMAND	0x04
373*4882a593Smuzhiyun #define SD_RSP_MR1_RFU1			0x02
374*4882a593Smuzhiyun #define SD_RSP_MR1_IDLE_STATE		0x01
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	/* R5 response (to CMD52 and CMD53) */
377*4882a593Smuzhiyun #define SD_RSP_R5_COM_CRC_ERROR		0x80
378*4882a593Smuzhiyun #define SD_RSP_R5_ILLEGAL_COMMAND	0x40
379*4882a593Smuzhiyun #define SD_RSP_R5_IO_CURRENTSTATE1	0x20
380*4882a593Smuzhiyun #define SD_RSP_R5_IO_CURRENTSTATE0	0x10
381*4882a593Smuzhiyun #define SD_RSP_R5_ERROR			0x08
382*4882a593Smuzhiyun #define SD_RSP_R5_RFU			0x04
383*4882a593Smuzhiyun #define SD_RSP_R5_FUNC_NUM_ERROR	0x02
384*4882a593Smuzhiyun #define SD_RSP_R5_OUT_OF_RANGE		0x01
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun #define SD_RSP_R5_ERRBITS		0xCB
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun /* ------------------------------------------------
389*4882a593Smuzhiyun  *  SDIO Commands and responses
390*4882a593Smuzhiyun  *
391*4882a593Smuzhiyun  *  I/O only commands are:
392*4882a593Smuzhiyun  *      CMD0, CMD3, CMD5, CMD7, CMD14, CMD15, CMD52, CMD53
393*4882a593Smuzhiyun  * ------------------------------------------------
394*4882a593Smuzhiyun  */
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun /* SDIO Commands */
397*4882a593Smuzhiyun #define SDIOH_CMD_0		0
398*4882a593Smuzhiyun #define SDIOH_CMD_3		3
399*4882a593Smuzhiyun #define SDIOH_CMD_5		5
400*4882a593Smuzhiyun #define SDIOH_CMD_7		7
401*4882a593Smuzhiyun #define SDIOH_CMD_11		11
402*4882a593Smuzhiyun #define SDIOH_CMD_14		14
403*4882a593Smuzhiyun #define SDIOH_CMD_15		15
404*4882a593Smuzhiyun #define SDIOH_CMD_19		19
405*4882a593Smuzhiyun #define SDIOH_CMD_52		52
406*4882a593Smuzhiyun #define SDIOH_CMD_53		53
407*4882a593Smuzhiyun #define SDIOH_CMD_59		59
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun /* SDIO Command Responses */
410*4882a593Smuzhiyun #define SDIOH_RSP_NONE		0
411*4882a593Smuzhiyun #define SDIOH_RSP_R1		1
412*4882a593Smuzhiyun #define SDIOH_RSP_R2		2
413*4882a593Smuzhiyun #define SDIOH_RSP_R3		3
414*4882a593Smuzhiyun #define SDIOH_RSP_R4		4
415*4882a593Smuzhiyun #define SDIOH_RSP_R5		5
416*4882a593Smuzhiyun #define SDIOH_RSP_R6		6
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun /*
419*4882a593Smuzhiyun  *  SDIO Response Error flags
420*4882a593Smuzhiyun  */
421*4882a593Smuzhiyun #define SDIOH_RSP5_ERROR_FLAGS	0xCB
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun /* ------------------------------------------------
424*4882a593Smuzhiyun  * SDIO Command structures. I/O only commands are:
425*4882a593Smuzhiyun  *
426*4882a593Smuzhiyun  * 	CMD0, CMD3, CMD5, CMD7, CMD15, CMD52, CMD53
427*4882a593Smuzhiyun  * ------------------------------------------------
428*4882a593Smuzhiyun  */
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun #define CMD5_OCR_M		BITFIELD_MASK(24)
431*4882a593Smuzhiyun #define CMD5_OCR_S		0
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun #define CMD5_S18R_M		BITFIELD_MASK(1)
434*4882a593Smuzhiyun #define CMD5_S18R_S		24
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun #define CMD7_RCA_M		BITFIELD_MASK(16)
437*4882a593Smuzhiyun #define CMD7_RCA_S		16
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun #define CMD14_RCA_M		BITFIELD_MASK(16)
440*4882a593Smuzhiyun #define CMD14_RCA_S		16
441*4882a593Smuzhiyun #define CMD14_SLEEP_M		BITFIELD_MASK(1)
442*4882a593Smuzhiyun #define CMD14_SLEEP_S		15
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun #define CMD_15_RCA_M		BITFIELD_MASK(16)
445*4882a593Smuzhiyun #define CMD_15_RCA_S		16
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun #define CMD52_DATA_M		BITFIELD_MASK(8)  /* Bits [7:0]    - Write Data/Stuff bits of CMD52
448*4882a593Smuzhiyun 						   */
449*4882a593Smuzhiyun #define CMD52_DATA_S		0
450*4882a593Smuzhiyun #define CMD52_REG_ADDR_M	BITFIELD_MASK(17) /* Bits [25:9]   - register address */
451*4882a593Smuzhiyun #define CMD52_REG_ADDR_S	9
452*4882a593Smuzhiyun #define CMD52_RAW_M		BITFIELD_MASK(1)  /* Bit  27       - Read after Write flag */
453*4882a593Smuzhiyun #define CMD52_RAW_S		27
454*4882a593Smuzhiyun #define CMD52_FUNCTION_M	BITFIELD_MASK(3)  /* Bits [30:28]  - Function number */
455*4882a593Smuzhiyun #define CMD52_FUNCTION_S	28
456*4882a593Smuzhiyun #define CMD52_RW_FLAG_M		BITFIELD_MASK(1)  /* Bit  31       - R/W flag */
457*4882a593Smuzhiyun #define CMD52_RW_FLAG_S		31
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun #define CMD53_BYTE_BLK_CNT_M	BITFIELD_MASK(9) /* Bits [8:0]     - Byte/Block Count of CMD53 */
460*4882a593Smuzhiyun #define CMD53_BYTE_BLK_CNT_S	0
461*4882a593Smuzhiyun #define CMD53_REG_ADDR_M	BITFIELD_MASK(17) /* Bits [25:9]   - register address */
462*4882a593Smuzhiyun #define CMD53_REG_ADDR_S	9
463*4882a593Smuzhiyun #define CMD53_OP_CODE_M		BITFIELD_MASK(1)  /* Bit  26       - R/W Operation Code */
464*4882a593Smuzhiyun #define CMD53_OP_CODE_S		26
465*4882a593Smuzhiyun #define CMD53_BLK_MODE_M	BITFIELD_MASK(1)  /* Bit  27       - Block Mode */
466*4882a593Smuzhiyun #define CMD53_BLK_MODE_S	27
467*4882a593Smuzhiyun #define CMD53_FUNCTION_M	BITFIELD_MASK(3)  /* Bits [30:28]  - Function number */
468*4882a593Smuzhiyun #define CMD53_FUNCTION_S	28
469*4882a593Smuzhiyun #define CMD53_RW_FLAG_M		BITFIELD_MASK(1)  /* Bit  31       - R/W flag */
470*4882a593Smuzhiyun #define CMD53_RW_FLAG_S		31
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun /* ------------------------------------------------------
473*4882a593Smuzhiyun  * SDIO Command Response structures for SD1 and SD4 modes
474*4882a593Smuzhiyun  *  -----------------------------------------------------
475*4882a593Smuzhiyun  */
476*4882a593Smuzhiyun #define RSP4_IO_OCR_M		BITFIELD_MASK(24) /* Bits [23:0]  - Card's OCR Bits [23:0] */
477*4882a593Smuzhiyun #define RSP4_IO_OCR_S		0
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun #define RSP4_S18A_M			BITFIELD_MASK(1) /* Bits [23:0]  - Card's OCR Bits [23:0] */
480*4882a593Smuzhiyun #define RSP4_S18A_S			24
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun #define RSP4_STUFF_M		BITFIELD_MASK(3)  /* Bits [26:24] - Stuff bits */
483*4882a593Smuzhiyun #define RSP4_STUFF_S		24
484*4882a593Smuzhiyun #define RSP4_MEM_PRESENT_M	BITFIELD_MASK(1)  /* Bit  27      - Memory present */
485*4882a593Smuzhiyun #define RSP4_MEM_PRESENT_S	27
486*4882a593Smuzhiyun #define RSP4_NUM_FUNCS_M	BITFIELD_MASK(3)  /* Bits [30:28] - Number of I/O funcs */
487*4882a593Smuzhiyun #define RSP4_NUM_FUNCS_S	28
488*4882a593Smuzhiyun #define RSP4_CARD_READY_M	BITFIELD_MASK(1)  /* Bit  31      - SDIO card ready */
489*4882a593Smuzhiyun #define RSP4_CARD_READY_S	31
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun #define RSP6_STATUS_M		BITFIELD_MASK(16) /* Bits [15:0]  - Card status bits [19,22,23,12:0]
492*4882a593Smuzhiyun 						   */
493*4882a593Smuzhiyun #define RSP6_STATUS_S		0
494*4882a593Smuzhiyun #define RSP6_IO_RCA_M		BITFIELD_MASK(16) /* Bits [31:16] - RCA bits[31-16] */
495*4882a593Smuzhiyun #define RSP6_IO_RCA_S		16
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun #define RSP1_AKE_SEQ_ERROR_M	BITFIELD_MASK(1)  /* Bit 3       - Authentication seq error */
498*4882a593Smuzhiyun #define RSP1_AKE_SEQ_ERROR_S	3
499*4882a593Smuzhiyun #define RSP1_APP_CMD_M		BITFIELD_MASK(1)  /* Bit 5       - Card expects ACMD */
500*4882a593Smuzhiyun #define RSP1_APP_CMD_S		5
501*4882a593Smuzhiyun #define RSP1_READY_FOR_DATA_M	BITFIELD_MASK(1)  /* Bit 8       - Ready for data (buff empty) */
502*4882a593Smuzhiyun #define RSP1_READY_FOR_DATA_S	8
503*4882a593Smuzhiyun #define RSP1_CURR_STATE_M	BITFIELD_MASK(4)  /* Bits [12:9] - State of card
504*4882a593Smuzhiyun 						   * when Cmd was received
505*4882a593Smuzhiyun 						   */
506*4882a593Smuzhiyun #define RSP1_CURR_STATE_S	9
507*4882a593Smuzhiyun #define RSP1_EARSE_RESET_M	BITFIELD_MASK(1)  /* Bit 13   - Erase seq cleared */
508*4882a593Smuzhiyun #define RSP1_EARSE_RESET_S	13
509*4882a593Smuzhiyun #define RSP1_CARD_ECC_DISABLE_M	BITFIELD_MASK(1)  /* Bit 14   - Card ECC disabled */
510*4882a593Smuzhiyun #define RSP1_CARD_ECC_DISABLE_S	14
511*4882a593Smuzhiyun #define RSP1_WP_ERASE_SKIP_M	BITFIELD_MASK(1)  /* Bit 15   - Partial blocks erased due to W/P */
512*4882a593Smuzhiyun #define RSP1_WP_ERASE_SKIP_S	15
513*4882a593Smuzhiyun #define RSP1_CID_CSD_OVERW_M	BITFIELD_MASK(1)  /* Bit 16   - Illegal write to CID or R/O bits
514*4882a593Smuzhiyun 						   * of CSD
515*4882a593Smuzhiyun 						   */
516*4882a593Smuzhiyun #define RSP1_CID_CSD_OVERW_S	16
517*4882a593Smuzhiyun #define RSP1_ERROR_M		BITFIELD_MASK(1)  /* Bit 19   - General/Unknown error */
518*4882a593Smuzhiyun #define RSP1_ERROR_S		19
519*4882a593Smuzhiyun #define RSP1_CC_ERROR_M		BITFIELD_MASK(1)  /* Bit 20   - Internal Card Control error */
520*4882a593Smuzhiyun #define RSP1_CC_ERROR_S		20
521*4882a593Smuzhiyun #define RSP1_CARD_ECC_FAILED_M	BITFIELD_MASK(1)  /* Bit 21   - Card internal ECC failed
522*4882a593Smuzhiyun 						   * to correct data
523*4882a593Smuzhiyun 						   */
524*4882a593Smuzhiyun #define RSP1_CARD_ECC_FAILED_S	21
525*4882a593Smuzhiyun #define RSP1_ILLEGAL_CMD_M	BITFIELD_MASK(1)  /* Bit 22   - Cmd not legal for the card state */
526*4882a593Smuzhiyun #define RSP1_ILLEGAL_CMD_S	22
527*4882a593Smuzhiyun #define RSP1_COM_CRC_ERROR_M	BITFIELD_MASK(1)  /* Bit 23   - CRC check of previous command failed
528*4882a593Smuzhiyun 						   */
529*4882a593Smuzhiyun #define RSP1_COM_CRC_ERROR_S	23
530*4882a593Smuzhiyun #define RSP1_LOCK_UNLOCK_FAIL_M	BITFIELD_MASK(1)  /* Bit 24   - Card lock-unlock Cmd Seq error */
531*4882a593Smuzhiyun #define RSP1_LOCK_UNLOCK_FAIL_S	24
532*4882a593Smuzhiyun #define RSP1_CARD_LOCKED_M	BITFIELD_MASK(1)  /* Bit 25   - Card locked by the host */
533*4882a593Smuzhiyun #define RSP1_CARD_LOCKED_S	25
534*4882a593Smuzhiyun #define RSP1_WP_VIOLATION_M	BITFIELD_MASK(1)  /* Bit 26   - Attempt to program
535*4882a593Smuzhiyun 						   * write-protected blocks
536*4882a593Smuzhiyun 						   */
537*4882a593Smuzhiyun #define RSP1_WP_VIOLATION_S	26
538*4882a593Smuzhiyun #define RSP1_ERASE_PARAM_M	BITFIELD_MASK(1)  /* Bit 27   - Invalid erase blocks */
539*4882a593Smuzhiyun #define RSP1_ERASE_PARAM_S	27
540*4882a593Smuzhiyun #define RSP1_ERASE_SEQ_ERR_M	BITFIELD_MASK(1)  /* Bit 28   - Erase Cmd seq error */
541*4882a593Smuzhiyun #define RSP1_ERASE_SEQ_ERR_S	28
542*4882a593Smuzhiyun #define RSP1_BLK_LEN_ERR_M	BITFIELD_MASK(1)  /* Bit 29   - Block length error */
543*4882a593Smuzhiyun #define RSP1_BLK_LEN_ERR_S	29
544*4882a593Smuzhiyun #define RSP1_ADDR_ERR_M		BITFIELD_MASK(1)  /* Bit 30   - Misaligned address */
545*4882a593Smuzhiyun #define RSP1_ADDR_ERR_S		30
546*4882a593Smuzhiyun #define RSP1_OUT_OF_RANGE_M	BITFIELD_MASK(1)  /* Bit 31   - Cmd arg was out of range */
547*4882a593Smuzhiyun #define RSP1_OUT_OF_RANGE_S	31
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun #define RSP5_DATA_M		BITFIELD_MASK(8)  /* Bits [0:7]   - data */
550*4882a593Smuzhiyun #define RSP5_DATA_S		0
551*4882a593Smuzhiyun #define RSP5_FLAGS_M		BITFIELD_MASK(8)  /* Bit  [15:8]  - Rsp flags */
552*4882a593Smuzhiyun #define RSP5_FLAGS_S		8
553*4882a593Smuzhiyun #define RSP5_STUFF_M		BITFIELD_MASK(16) /* Bits [31:16] - Stuff bits */
554*4882a593Smuzhiyun #define RSP5_STUFF_S		16
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun /* ----------------------------------------------
557*4882a593Smuzhiyun  * SDIO Command Response structures for SPI mode
558*4882a593Smuzhiyun  * ----------------------------------------------
559*4882a593Smuzhiyun  */
560*4882a593Smuzhiyun #define SPIRSP4_IO_OCR_M	BITFIELD_MASK(16) /* Bits [15:0]    - Card's OCR Bits [23:8] */
561*4882a593Smuzhiyun #define SPIRSP4_IO_OCR_S	0
562*4882a593Smuzhiyun #define SPIRSP4_STUFF_M		BITFIELD_MASK(3)  /* Bits [18:16]   - Stuff bits */
563*4882a593Smuzhiyun #define SPIRSP4_STUFF_S		16
564*4882a593Smuzhiyun #define SPIRSP4_MEM_PRESENT_M	BITFIELD_MASK(1)  /* Bit  19        - Memory present */
565*4882a593Smuzhiyun #define SPIRSP4_MEM_PRESENT_S	19
566*4882a593Smuzhiyun #define SPIRSP4_NUM_FUNCS_M	BITFIELD_MASK(3)  /* Bits [22:20]   - Number of I/O funcs */
567*4882a593Smuzhiyun #define SPIRSP4_NUM_FUNCS_S	20
568*4882a593Smuzhiyun #define SPIRSP4_CARD_READY_M	BITFIELD_MASK(1)  /* Bit  23        - SDIO card ready */
569*4882a593Smuzhiyun #define SPIRSP4_CARD_READY_S	23
570*4882a593Smuzhiyun #define SPIRSP4_IDLE_STATE_M	BITFIELD_MASK(1)  /* Bit  24        - idle state */
571*4882a593Smuzhiyun #define SPIRSP4_IDLE_STATE_S	24
572*4882a593Smuzhiyun #define SPIRSP4_ILLEGAL_CMD_M	BITFIELD_MASK(1)  /* Bit  26        - Illegal Cmd error */
573*4882a593Smuzhiyun #define SPIRSP4_ILLEGAL_CMD_S	26
574*4882a593Smuzhiyun #define SPIRSP4_COM_CRC_ERROR_M	BITFIELD_MASK(1)  /* Bit  27        - COM CRC error */
575*4882a593Smuzhiyun #define SPIRSP4_COM_CRC_ERROR_S	27
576*4882a593Smuzhiyun #define SPIRSP4_FUNC_NUM_ERROR_M	BITFIELD_MASK(1)  /* Bit  28        - Function number error
577*4882a593Smuzhiyun 							   */
578*4882a593Smuzhiyun #define SPIRSP4_FUNC_NUM_ERROR_S	28
579*4882a593Smuzhiyun #define SPIRSP4_PARAM_ERROR_M	BITFIELD_MASK(1)  /* Bit  30        - Parameter Error Bit */
580*4882a593Smuzhiyun #define SPIRSP4_PARAM_ERROR_S	30
581*4882a593Smuzhiyun #define SPIRSP4_START_BIT_M	BITFIELD_MASK(1)  /* Bit  31        - Start Bit */
582*4882a593Smuzhiyun #define SPIRSP4_START_BIT_S	31
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun #define SPIRSP5_DATA_M			BITFIELD_MASK(8)  /* Bits [23:16]   - R/W Data */
585*4882a593Smuzhiyun #define SPIRSP5_DATA_S			16
586*4882a593Smuzhiyun #define SPIRSP5_IDLE_STATE_M		BITFIELD_MASK(1)  /* Bit  24        - Idle state */
587*4882a593Smuzhiyun #define SPIRSP5_IDLE_STATE_S		24
588*4882a593Smuzhiyun #define SPIRSP5_ILLEGAL_CMD_M		BITFIELD_MASK(1)  /* Bit  26        - Illegal Cmd error */
589*4882a593Smuzhiyun #define SPIRSP5_ILLEGAL_CMD_S		26
590*4882a593Smuzhiyun #define SPIRSP5_COM_CRC_ERROR_M		BITFIELD_MASK(1)  /* Bit  27        - COM CRC error */
591*4882a593Smuzhiyun #define SPIRSP5_COM_CRC_ERROR_S		27
592*4882a593Smuzhiyun #define SPIRSP5_FUNC_NUM_ERROR_M	BITFIELD_MASK(1)  /* Bit  28        - Function number error
593*4882a593Smuzhiyun 							   */
594*4882a593Smuzhiyun #define SPIRSP5_FUNC_NUM_ERROR_S	28
595*4882a593Smuzhiyun #define SPIRSP5_PARAM_ERROR_M		BITFIELD_MASK(1)  /* Bit  30        - Parameter Error Bit */
596*4882a593Smuzhiyun #define SPIRSP5_PARAM_ERROR_S		30
597*4882a593Smuzhiyun #define SPIRSP5_START_BIT_M		BITFIELD_MASK(1)  /* Bit  31        - Start Bit */
598*4882a593Smuzhiyun #define SPIRSP5_START_BIT_S		31
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun /* RSP6 card status format; Pg 68 Physical Layer spec v 1.10 */
601*4882a593Smuzhiyun #define RSP6STAT_AKE_SEQ_ERROR_M	BITFIELD_MASK(1)  /* Bit 3	- Authentication seq error
602*4882a593Smuzhiyun 							   */
603*4882a593Smuzhiyun #define RSP6STAT_AKE_SEQ_ERROR_S	3
604*4882a593Smuzhiyun #define RSP6STAT_APP_CMD_M		BITFIELD_MASK(1)  /* Bit 5	- Card expects ACMD */
605*4882a593Smuzhiyun #define RSP6STAT_APP_CMD_S		5
606*4882a593Smuzhiyun #define RSP6STAT_READY_FOR_DATA_M	BITFIELD_MASK(1)  /* Bit 8	- Ready for data
607*4882a593Smuzhiyun 							   * (buff empty)
608*4882a593Smuzhiyun 							   */
609*4882a593Smuzhiyun #define RSP6STAT_READY_FOR_DATA_S	8
610*4882a593Smuzhiyun #define RSP6STAT_CURR_STATE_M		BITFIELD_MASK(4)  /* Bits [12:9] - Card state at
611*4882a593Smuzhiyun 							   * Cmd reception
612*4882a593Smuzhiyun 							   */
613*4882a593Smuzhiyun #define RSP6STAT_CURR_STATE_S		9
614*4882a593Smuzhiyun #define RSP6STAT_ERROR_M		BITFIELD_MASK(1)  /* Bit 13  - General/Unknown error Bit 19
615*4882a593Smuzhiyun 							   */
616*4882a593Smuzhiyun #define RSP6STAT_ERROR_S		13
617*4882a593Smuzhiyun #define RSP6STAT_ILLEGAL_CMD_M		BITFIELD_MASK(1)  /* Bit 14  - Illegal cmd for
618*4882a593Smuzhiyun 							   * card state Bit 22
619*4882a593Smuzhiyun 							   */
620*4882a593Smuzhiyun #define RSP6STAT_ILLEGAL_CMD_S		14
621*4882a593Smuzhiyun #define RSP6STAT_COM_CRC_ERROR_M	BITFIELD_MASK(1)  /* Bit 15  - CRC previous command
622*4882a593Smuzhiyun 							   * failed Bit 23
623*4882a593Smuzhiyun 							   */
624*4882a593Smuzhiyun #define RSP6STAT_COM_CRC_ERROR_S	15
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun #define SDIOH_XFER_TYPE_READ    SD_IO_OP_READ
627*4882a593Smuzhiyun #define SDIOH_XFER_TYPE_WRITE   SD_IO_OP_WRITE
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun /* command issue options */
630*4882a593Smuzhiyun #define CMD_OPTION_DEFAULT	0
631*4882a593Smuzhiyun #define CMD_OPTION_TUNING	1
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun /* SDIO message exchange registers */
634*4882a593Smuzhiyun #define SDIO_FN1_MSG_H2D_REG0	0x10030
635*4882a593Smuzhiyun #define SDIO_FN1_MSG_H2D_REG1	0x10034
636*4882a593Smuzhiyun #define SDIO_FN1_MSG_D2H_REG0	0x10038
637*4882a593Smuzhiyun #define SDIO_FN1_MSG_D2H_REG1	0x1003c
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun #define CFG_WRITE_BYTE_MASK	0xff
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun #define HS_POLL_PERIOD_MS 10
642*4882a593Smuzhiyun #define D2H_READY_WD_RESET_MS 1		/* 1ms */
643*4882a593Smuzhiyun #ifdef BCMQT
644*4882a593Smuzhiyun #define D2H_READY_TIMEOUT_MS (1000 * 60 * 3) /* 3 Mins >~ FW download time */
645*4882a593Smuzhiyun #define D2H_VALDN_DONE_TIMEOUT_MS (1000 * 60 * 5) /* 5 Mins >~ Validation time */
646*4882a593Smuzhiyun #define D2H_TRX_HDR_PARSE_DONE_TIMEOUT_MS (1000 * 60 * 1) /* 1 Mins >~ TRX Parsing */
647*4882a593Smuzhiyun #define D2H_READY_WD_RESET_COUNT (84 * 1000) /* ~84secs >~ BL ready time after wd rst */
648*4882a593Smuzhiyun #define D2H_READY_WD_RESET_DBG_PRINT_MS (1000) /* 1000ms - DEBUG print at every 1000ms */
649*4882a593Smuzhiyun #else
650*4882a593Smuzhiyun #define D2H_READY_TIMEOUT_MS (100) /* 100ms >~ FW download time */
651*4882a593Smuzhiyun #define D2H_VALDN_DONE_TIMEOUT_MS (250) /* 250ms >~ Validation time */
652*4882a593Smuzhiyun #define D2H_TRX_HDR_PARSE_DONE_TIMEOUT_MS (50) /* 50ms >~ TRX Parsing */
653*4882a593Smuzhiyun #define D2H_READY_WD_RESET_COUNT (200) /* ~200ms >~ BL ready time after wd rst */
654*4882a593Smuzhiyun #define D2H_READY_WD_RESET_DBG_PRINT_MS (10) /* 10ms - DEBUG print at evry 10ms */
655*4882a593Smuzhiyun #endif // endif
656*4882a593Smuzhiyun 
657*4882a593Smuzhiyun typedef struct bl_hs_address {
658*4882a593Smuzhiyun 	volatile void *d2h;
659*4882a593Smuzhiyun 	volatile void *h2d;
660*4882a593Smuzhiyun } hs_addrs_t;
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun /* [D2H] Dongle to host handshake bits shift */
663*4882a593Smuzhiyun enum {
664*4882a593Smuzhiyun 	D2H_START_SHIFT			= 0,
665*4882a593Smuzhiyun 	D2H_READY_SHIFT			= 1,
666*4882a593Smuzhiyun 	D2H_STEADY_SHIFT		= 2,
667*4882a593Smuzhiyun 	D2H_TRX_HDR_PARSE_DONE_SHIFT	= 3,
668*4882a593Smuzhiyun 	D2H_VALDN_START_SHIFT		= 4,
669*4882a593Smuzhiyun 	D2H_VALDN_RESULT_SHIFT		= 5,
670*4882a593Smuzhiyun 	D2H_VALDN_DONE_SHIFT		= 6
671*4882a593Smuzhiyun 	/* Bits 31:7 reserved for future */
672*4882a593Smuzhiyun };
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun /* [H2D] Host to dongle handshake bits shift */
675*4882a593Smuzhiyun enum {
676*4882a593Smuzhiyun 	H2D_DL_START_SHIFT		= 0,
677*4882a593Smuzhiyun 	H2D_DL_DONE_SHIFT		= 1,
678*4882a593Smuzhiyun 	H2D_DL_NVRAM_DONE_SHIFT		= 2,
679*4882a593Smuzhiyun 	H2D_BL_RESET_ON_ERROR_SHIFT	= 3
680*4882a593Smuzhiyun 	/* Bits 31:4 reserved for future */
681*4882a593Smuzhiyun };
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun #endif /* def BCMSDIO */
684*4882a593Smuzhiyun #endif /* _SDIO_H */
685