xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: ISC
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2010 Broadcom Corporation
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef	BRCMFMAC_SDIO_H
7*4882a593Smuzhiyun #define	BRCMFMAC_SDIO_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/skbuff.h>
10*4882a593Smuzhiyun #include <linux/firmware.h>
11*4882a593Smuzhiyun #include "firmware.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define SDIOD_FBR_SIZE		0x100
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /* io_en */
16*4882a593Smuzhiyun #define SDIO_FUNC_ENABLE_1	0x02
17*4882a593Smuzhiyun #define SDIO_FUNC_ENABLE_2	0x04
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* io_rdys */
20*4882a593Smuzhiyun #define SDIO_FUNC_READY_1	0x02
21*4882a593Smuzhiyun #define SDIO_FUNC_READY_2	0x04
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* intr_status */
24*4882a593Smuzhiyun #define INTR_STATUS_FUNC1	0x2
25*4882a593Smuzhiyun #define INTR_STATUS_FUNC2	0x4
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /* mask of register map */
28*4882a593Smuzhiyun #define REG_F0_REG_MASK		0x7FF
29*4882a593Smuzhiyun #define REG_F1_MISC_MASK	0x1FFFF
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /* function 0 vendor specific CCCR registers */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_CARDCAP			0xf0
34*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT	BIT(1)
35*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT	BIT(2)
36*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC	BIT(3)
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* Interrupt enable bits for each function */
39*4882a593Smuzhiyun #define SDIO_CCCR_IEN_FUNC0			BIT(0)
40*4882a593Smuzhiyun #define SDIO_CCCR_IEN_FUNC1			BIT(1)
41*4882a593Smuzhiyun #define SDIO_CCCR_IEN_FUNC2			BIT(2)
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_CARDCTRL			0xf1
44*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_CARDCTRL_WLANRESET	BIT(1)
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_SEPINT			0xf2
47*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_SEPINT_MASK		BIT(0)
48*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_SEPINT_OE		BIT(1)
49*4882a593Smuzhiyun #define SDIO_CCCR_BRCM_SEPINT_ACT_HI		BIT(2)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* function 1 miscellaneous registers */
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /* sprom command and status */
54*4882a593Smuzhiyun #define SBSDIO_SPROM_CS			0x10000
55*4882a593Smuzhiyun /* sprom info register */
56*4882a593Smuzhiyun #define SBSDIO_SPROM_INFO		0x10001
57*4882a593Smuzhiyun /* sprom indirect access data byte 0 */
58*4882a593Smuzhiyun #define SBSDIO_SPROM_DATA_LOW		0x10002
59*4882a593Smuzhiyun /* sprom indirect access data byte 1 */
60*4882a593Smuzhiyun #define SBSDIO_SPROM_DATA_HIGH		0x10003
61*4882a593Smuzhiyun /* sprom indirect access addr byte 0 */
62*4882a593Smuzhiyun #define SBSDIO_SPROM_ADDR_LOW		0x10004
63*4882a593Smuzhiyun /* gpio select */
64*4882a593Smuzhiyun #define SBSDIO_GPIO_SELECT		0x10005
65*4882a593Smuzhiyun /* gpio output */
66*4882a593Smuzhiyun #define SBSDIO_GPIO_OUT			0x10006
67*4882a593Smuzhiyun /* gpio enable */
68*4882a593Smuzhiyun #define SBSDIO_GPIO_EN			0x10007
69*4882a593Smuzhiyun /* rev < 7, watermark for sdio device TX path */
70*4882a593Smuzhiyun #define SBSDIO_WATERMARK		0x10008
71*4882a593Smuzhiyun /* control busy signal generation */
72*4882a593Smuzhiyun #define SBSDIO_DEVICE_CTL		0x10009
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /* SB Address Window Low (b15) */
75*4882a593Smuzhiyun #define SBSDIO_FUNC1_SBADDRLOW		0x1000A
76*4882a593Smuzhiyun /* SB Address Window Mid (b23:b16) */
77*4882a593Smuzhiyun #define SBSDIO_FUNC1_SBADDRMID		0x1000B
78*4882a593Smuzhiyun /* SB Address Window High (b31:b24)    */
79*4882a593Smuzhiyun #define SBSDIO_FUNC1_SBADDRHIGH		0x1000C
80*4882a593Smuzhiyun /* Frame Control (frame term/abort) */
81*4882a593Smuzhiyun #define SBSDIO_FUNC1_FRAMECTRL		0x1000D
82*4882a593Smuzhiyun /* ChipClockCSR (ALP/HT ctl/status) */
83*4882a593Smuzhiyun #define SBSDIO_FUNC1_CHIPCLKCSR		0x1000E
84*4882a593Smuzhiyun /* SdioPullUp (on cmd, d0-d2) */
85*4882a593Smuzhiyun #define SBSDIO_FUNC1_SDIOPULLUP		0x1000F
86*4882a593Smuzhiyun /* Write Frame Byte Count Low */
87*4882a593Smuzhiyun #define SBSDIO_FUNC1_WFRAMEBCLO		0x10019
88*4882a593Smuzhiyun /* Write Frame Byte Count High */
89*4882a593Smuzhiyun #define SBSDIO_FUNC1_WFRAMEBCHI		0x1001A
90*4882a593Smuzhiyun /* Read Frame Byte Count Low */
91*4882a593Smuzhiyun #define SBSDIO_FUNC1_RFRAMEBCLO		0x1001B
92*4882a593Smuzhiyun /* Read Frame Byte Count High */
93*4882a593Smuzhiyun #define SBSDIO_FUNC1_RFRAMEBCHI		0x1001C
94*4882a593Smuzhiyun /* MesBusyCtl (rev 11) */
95*4882a593Smuzhiyun #define SBSDIO_FUNC1_MESBUSYCTRL	0x1001D
96*4882a593Smuzhiyun /* Watermark for sdio device RX path */
97*4882a593Smuzhiyun #define SBSDIO_MESBUSY_RXFIFO_WM_MASK	0x7F
98*4882a593Smuzhiyun #define SBSDIO_MESBUSY_RXFIFO_WM_SHIFT	0
99*4882a593Smuzhiyun /* Enable busy capability for MES access */
100*4882a593Smuzhiyun #define SBSDIO_MESBUSYCTRL_ENAB		0x80
101*4882a593Smuzhiyun #define SBSDIO_MESBUSYCTRL_ENAB_SHIFT	7
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun /* Sdio Core Rev 12 */
104*4882a593Smuzhiyun #define SBSDIO_FUNC1_WAKEUPCTRL		0x1001E
105*4882a593Smuzhiyun #define SBSDIO_FUNC1_WCTRL_ALPWAIT_MASK		0x1
106*4882a593Smuzhiyun #define SBSDIO_FUNC1_WCTRL_ALPWAIT_SHIFT	0
107*4882a593Smuzhiyun #define SBSDIO_FUNC1_WCTRL_HTWAIT_MASK		0x2
108*4882a593Smuzhiyun #define SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT		1
109*4882a593Smuzhiyun #define SBSDIO_FUNC1_SLEEPCSR		0x1001F
110*4882a593Smuzhiyun #define SBSDIO_FUNC1_SLEEPCSR_KSO_MASK		0x1
111*4882a593Smuzhiyun #define SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT		0
112*4882a593Smuzhiyun #define SBSDIO_FUNC1_SLEEPCSR_KSO_EN		1
113*4882a593Smuzhiyun #define SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK	0x2
114*4882a593Smuzhiyun #define SBSDIO_FUNC1_SLEEPCSR_DEVON_SHIFT	1
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define SBSDIO_FUNC1_MISC_REG_START	0x10000	/* f1 misc register start */
117*4882a593Smuzhiyun #define SBSDIO_FUNC1_MISC_REG_LIMIT	0x1001F	/* f1 misc register end */
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun /* function 1 OCP space */
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /* sb offset addr is <= 15 bits, 32k */
122*4882a593Smuzhiyun #define SBSDIO_SB_OFT_ADDR_MASK		0x07FFF
123*4882a593Smuzhiyun #define SBSDIO_SB_OFT_ADDR_LIMIT	0x08000
124*4882a593Smuzhiyun /* with b15, maps to 32-bit SB access */
125*4882a593Smuzhiyun #define SBSDIO_SB_ACCESS_2_4B_FLAG	0x08000
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /* Address bits from SBADDR regs */
128*4882a593Smuzhiyun #define SBSDIO_SBWINDOW_MASK		0xffff8000
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #define SDIOH_READ              0	/* Read request */
131*4882a593Smuzhiyun #define SDIOH_WRITE             1	/* Write request */
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define SDIOH_DATA_FIX          0	/* Fixed addressing */
134*4882a593Smuzhiyun #define SDIOH_DATA_INC          1	/* Incremental addressing */
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun /* internal return code */
137*4882a593Smuzhiyun #define SUCCESS	0
138*4882a593Smuzhiyun #define ERROR	1
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun /* Packet alignment for most efficient SDIO (can change based on platform) */
141*4882a593Smuzhiyun #define BRCMF_SDALIGN	(1 << 6)
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* watchdog polling interval */
144*4882a593Smuzhiyun #define BRCMF_WD_POLL	msecs_to_jiffies(10)
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /**
147*4882a593Smuzhiyun  * enum brcmf_sdiod_state - the state of the bus.
148*4882a593Smuzhiyun  *
149*4882a593Smuzhiyun  * @BRCMF_SDIOD_DOWN: Device can be accessed, no DPC.
150*4882a593Smuzhiyun  * @BRCMF_SDIOD_DATA: Ready for data transfers, DPC enabled.
151*4882a593Smuzhiyun  * @BRCMF_SDIOD_NOMEDIUM: No medium access to dongle possible.
152*4882a593Smuzhiyun  */
153*4882a593Smuzhiyun enum brcmf_sdiod_state {
154*4882a593Smuzhiyun 	BRCMF_SDIOD_DOWN,
155*4882a593Smuzhiyun 	BRCMF_SDIOD_DATA,
156*4882a593Smuzhiyun 	BRCMF_SDIOD_NOMEDIUM
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun struct brcmf_sdreg {
160*4882a593Smuzhiyun 	int func;
161*4882a593Smuzhiyun 	int offset;
162*4882a593Smuzhiyun 	int value;
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun struct brcmf_sdio;
166*4882a593Smuzhiyun struct brcmf_sdiod_freezer;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun struct brcmf_sdio_dev {
169*4882a593Smuzhiyun 	struct sdio_func *func1;
170*4882a593Smuzhiyun 	struct sdio_func *func2;
171*4882a593Smuzhiyun 	u32 sbwad;			/* Save backplane window address */
172*4882a593Smuzhiyun 	struct brcmf_core *cc_core;	/* chipcommon core info struct */
173*4882a593Smuzhiyun 	struct brcmf_sdio *bus;
174*4882a593Smuzhiyun 	struct device *dev;
175*4882a593Smuzhiyun 	struct brcmf_bus *bus_if;
176*4882a593Smuzhiyun 	struct brcmf_mp_device *settings;
177*4882a593Smuzhiyun 	bool oob_irq_requested;
178*4882a593Smuzhiyun 	bool sd_irq_requested;
179*4882a593Smuzhiyun 	bool irq_en;			/* irq enable flags */
180*4882a593Smuzhiyun 	spinlock_t irq_en_lock;
181*4882a593Smuzhiyun 	bool sg_support;
182*4882a593Smuzhiyun 	uint max_request_size;
183*4882a593Smuzhiyun 	ushort max_segment_count;
184*4882a593Smuzhiyun 	uint max_segment_size;
185*4882a593Smuzhiyun 	uint txglomsz;
186*4882a593Smuzhiyun 	struct sg_table sgtable;
187*4882a593Smuzhiyun 	char fw_name[BRCMF_FW_NAME_LEN];
188*4882a593Smuzhiyun 	char nvram_name[BRCMF_FW_NAME_LEN];
189*4882a593Smuzhiyun 	bool wowl_enabled;
190*4882a593Smuzhiyun 	enum brcmf_sdiod_state state;
191*4882a593Smuzhiyun 	struct brcmf_sdiod_freezer *freezer;
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun /* sdio core registers */
195*4882a593Smuzhiyun struct sdpcmd_regs {
196*4882a593Smuzhiyun 	u32 corecontrol;		/* 0x00, rev8 */
197*4882a593Smuzhiyun 	u32 corestatus;			/* rev8 */
198*4882a593Smuzhiyun 	u32 PAD[1];
199*4882a593Smuzhiyun 	u32 biststatus;			/* rev8 */
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	/* PCMCIA access */
202*4882a593Smuzhiyun 	u16 pcmciamesportaladdr;	/* 0x010, rev8 */
203*4882a593Smuzhiyun 	u16 PAD[1];
204*4882a593Smuzhiyun 	u16 pcmciamesportalmask;	/* rev8 */
205*4882a593Smuzhiyun 	u16 PAD[1];
206*4882a593Smuzhiyun 	u16 pcmciawrframebc;		/* rev8 */
207*4882a593Smuzhiyun 	u16 PAD[1];
208*4882a593Smuzhiyun 	u16 pcmciaunderflowtimer;	/* rev8 */
209*4882a593Smuzhiyun 	u16 PAD[1];
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	/* interrupt */
212*4882a593Smuzhiyun 	u32 intstatus;			/* 0x020, rev8 */
213*4882a593Smuzhiyun 	u32 hostintmask;		/* rev8 */
214*4882a593Smuzhiyun 	u32 intmask;			/* rev8 */
215*4882a593Smuzhiyun 	u32 sbintstatus;		/* rev8 */
216*4882a593Smuzhiyun 	u32 sbintmask;			/* rev8 */
217*4882a593Smuzhiyun 	u32 funcintmask;		/* rev4 */
218*4882a593Smuzhiyun 	u32 PAD[2];
219*4882a593Smuzhiyun 	u32 tosbmailbox;		/* 0x040, rev8 */
220*4882a593Smuzhiyun 	u32 tohostmailbox;		/* rev8 */
221*4882a593Smuzhiyun 	u32 tosbmailboxdata;		/* rev8 */
222*4882a593Smuzhiyun 	u32 tohostmailboxdata;		/* rev8 */
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	/* synchronized access to registers in SDIO clock domain */
225*4882a593Smuzhiyun 	u32 sdioaccess;			/* 0x050, rev8 */
226*4882a593Smuzhiyun 	u32 PAD[3];
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	/* PCMCIA frame control */
229*4882a593Smuzhiyun 	u8 pcmciaframectrl;		/* 0x060, rev8 */
230*4882a593Smuzhiyun 	u8 PAD[3];
231*4882a593Smuzhiyun 	u8 pcmciawatermark;		/* rev8 */
232*4882a593Smuzhiyun 	u8 PAD[155];
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	/* interrupt batching control */
235*4882a593Smuzhiyun 	u32 intrcvlazy;			/* 0x100, rev8 */
236*4882a593Smuzhiyun 	u32 PAD[3];
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	/* counters */
239*4882a593Smuzhiyun 	u32 cmd52rd;			/* 0x110, rev8 */
240*4882a593Smuzhiyun 	u32 cmd52wr;			/* rev8 */
241*4882a593Smuzhiyun 	u32 cmd53rd;			/* rev8 */
242*4882a593Smuzhiyun 	u32 cmd53wr;			/* rev8 */
243*4882a593Smuzhiyun 	u32 abort;			/* rev8 */
244*4882a593Smuzhiyun 	u32 datacrcerror;		/* rev8 */
245*4882a593Smuzhiyun 	u32 rdoutofsync;		/* rev8 */
246*4882a593Smuzhiyun 	u32 wroutofsync;		/* rev8 */
247*4882a593Smuzhiyun 	u32 writebusy;			/* rev8 */
248*4882a593Smuzhiyun 	u32 readwait;			/* rev8 */
249*4882a593Smuzhiyun 	u32 readterm;			/* rev8 */
250*4882a593Smuzhiyun 	u32 writeterm;			/* rev8 */
251*4882a593Smuzhiyun 	u32 PAD[40];
252*4882a593Smuzhiyun 	u32 clockctlstatus;		/* rev8 */
253*4882a593Smuzhiyun 	u32 PAD[7];
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	u32 PAD[128];			/* DMA engines */
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	/* SDIO/PCMCIA CIS region */
258*4882a593Smuzhiyun 	char cis[512];			/* 0x400-0x5ff, rev6 */
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	/* PCMCIA function control registers */
261*4882a593Smuzhiyun 	char pcmciafcr[256];		/* 0x600-6ff, rev6 */
262*4882a593Smuzhiyun 	u16 PAD[55];
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	/* PCMCIA backplane access */
265*4882a593Smuzhiyun 	u16 backplanecsr;		/* 0x76E, rev6 */
266*4882a593Smuzhiyun 	u16 backplaneaddr0;		/* rev6 */
267*4882a593Smuzhiyun 	u16 backplaneaddr1;		/* rev6 */
268*4882a593Smuzhiyun 	u16 backplaneaddr2;		/* rev6 */
269*4882a593Smuzhiyun 	u16 backplaneaddr3;		/* rev6 */
270*4882a593Smuzhiyun 	u16 backplanedata0;		/* rev6 */
271*4882a593Smuzhiyun 	u16 backplanedata1;		/* rev6 */
272*4882a593Smuzhiyun 	u16 backplanedata2;		/* rev6 */
273*4882a593Smuzhiyun 	u16 backplanedata3;		/* rev6 */
274*4882a593Smuzhiyun 	u16 PAD[31];
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	/* sprom "size" & "blank" info */
277*4882a593Smuzhiyun 	u16 spromstatus;		/* 0x7BE, rev2 */
278*4882a593Smuzhiyun 	u32 PAD[464];
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	u16 PAD[0x80];
281*4882a593Smuzhiyun };
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun /* Register/deregister interrupt handler. */
284*4882a593Smuzhiyun int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev);
285*4882a593Smuzhiyun void brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev);
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun /* SDIO device register access interface */
288*4882a593Smuzhiyun /* Accessors for SDIO Function 0 */
289*4882a593Smuzhiyun #define brcmf_sdiod_func0_rb(sdiodev, addr, r) \
290*4882a593Smuzhiyun 	sdio_f0_readb((sdiodev)->func1, (addr), (r))
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun #define brcmf_sdiod_func0_wb(sdiodev, addr, v, ret) \
293*4882a593Smuzhiyun 	sdio_f0_writeb((sdiodev)->func1, (v), (addr), (ret))
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun /* Accessors for SDIO Function 1 */
296*4882a593Smuzhiyun #define brcmf_sdiod_readb(sdiodev, addr, r) \
297*4882a593Smuzhiyun 	sdio_readb((sdiodev)->func1, (addr), (r))
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun #define brcmf_sdiod_writeb(sdiodev, addr, v, ret) \
300*4882a593Smuzhiyun 	sdio_writeb((sdiodev)->func1, (v), (addr), (ret))
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
303*4882a593Smuzhiyun void brcmf_sdiod_writel(struct brcmf_sdio_dev *sdiodev, u32 addr, u32 data,
304*4882a593Smuzhiyun 			int *ret);
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /* Buffer transfer to/from device (client) core via cmd53.
307*4882a593Smuzhiyun  *   fn:       function number
308*4882a593Smuzhiyun  *   flags:    backplane width, address increment, sync/async
309*4882a593Smuzhiyun  *   buf:      pointer to memory data buffer
310*4882a593Smuzhiyun  *   nbytes:   number of bytes to transfer to/from buf
311*4882a593Smuzhiyun  *   pkt:      pointer to packet associated with buf (if any)
312*4882a593Smuzhiyun  *   complete: callback function for command completion (async only)
313*4882a593Smuzhiyun  *   handle:   handle for completion callback (first arg in callback)
314*4882a593Smuzhiyun  * Returns 0 or error code.
315*4882a593Smuzhiyun  * NOTE: Async operation is not currently supported.
316*4882a593Smuzhiyun  */
317*4882a593Smuzhiyun int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev,
318*4882a593Smuzhiyun 			 struct sk_buff_head *pktq);
319*4882a593Smuzhiyun int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes);
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt);
322*4882a593Smuzhiyun int brcmf_sdiod_recv_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes);
323*4882a593Smuzhiyun int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev,
324*4882a593Smuzhiyun 			   struct sk_buff_head *pktq, uint totlen);
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun /* Flags bits */
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun /* Four-byte target (backplane) width (vs. two-byte) */
329*4882a593Smuzhiyun #define SDIO_REQ_4BYTE	0x1
330*4882a593Smuzhiyun /* Fixed address (FIFO) (vs. incrementing address) */
331*4882a593Smuzhiyun #define SDIO_REQ_FIXED	0x2
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun /* Read/write to memory block (F1, no FIFO) via CMD53 (sync only).
334*4882a593Smuzhiyun  *   rw:       read or write (0/1)
335*4882a593Smuzhiyun  *   addr:     direct SDIO address
336*4882a593Smuzhiyun  *   buf:      pointer to memory data buffer
337*4882a593Smuzhiyun  *   nbytes:   number of bytes to transfer to/from buf
338*4882a593Smuzhiyun  * Returns 0 or error code.
339*4882a593Smuzhiyun  */
340*4882a593Smuzhiyun int brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
341*4882a593Smuzhiyun 		      u8 *data, uint size);
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun /* Issue an abort to the specified function */
344*4882a593Smuzhiyun int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, struct sdio_func *func);
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev);
347*4882a593Smuzhiyun void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
348*4882a593Smuzhiyun 			      enum brcmf_sdiod_state state);
349*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
350*4882a593Smuzhiyun bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev);
351*4882a593Smuzhiyun void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev);
352*4882a593Smuzhiyun void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev);
353*4882a593Smuzhiyun void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev);
354*4882a593Smuzhiyun #else
brcmf_sdiod_freezing(struct brcmf_sdio_dev * sdiodev)355*4882a593Smuzhiyun static inline bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev)
356*4882a593Smuzhiyun {
357*4882a593Smuzhiyun 	return false;
358*4882a593Smuzhiyun }
brcmf_sdiod_try_freeze(struct brcmf_sdio_dev * sdiodev)359*4882a593Smuzhiyun static inline void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun }
brcmf_sdiod_freezer_count(struct brcmf_sdio_dev * sdiodev)362*4882a593Smuzhiyun static inline void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun }
brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev * sdiodev)365*4882a593Smuzhiyun static inline void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun #endif /* CONFIG_PM_SLEEP */
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev);
371*4882a593Smuzhiyun int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev);
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev);
374*4882a593Smuzhiyun void brcmf_sdio_remove(struct brcmf_sdio *bus);
375*4882a593Smuzhiyun void brcmf_sdio_isr(struct brcmf_sdio *bus, bool in_isr);
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, bool active);
378*4882a593Smuzhiyun void brcmf_sdio_wowl_config(struct device *dev, bool enabled);
379*4882a593Smuzhiyun int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep);
380*4882a593Smuzhiyun void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus);
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun #endif /* BRCMFMAC_SDIO_H */
383