xref: /linux/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145) !
1daeccac2SArend van Spriel // SPDX-License-Identifier: ISC
25b435de0SArend van Spriel /*
35b435de0SArend van Spriel  * Copyright (c) 2010 Broadcom Corporation
45b435de0SArend van Spriel  */
55b435de0SArend van Spriel 
6888bf76eSHante Meuleman #ifndef	BRCMFMAC_SDIO_H
7888bf76eSHante Meuleman #define	BRCMFMAC_SDIO_H
85b435de0SArend van Spriel 
95b435de0SArend van Spriel #include <linux/skbuff.h>
10c1b20532SDaniel Kim #include <linux/firmware.h>
11c1b20532SDaniel Kim #include "firmware.h"
125b435de0SArend van Spriel 
135b435de0SArend van Spriel #define SDIOD_FBR_SIZE		0x100
145b435de0SArend van Spriel 
155b435de0SArend van Spriel /* io_en */
165b435de0SArend van Spriel #define SDIO_FUNC_ENABLE_1	0x02
175b435de0SArend van Spriel #define SDIO_FUNC_ENABLE_2	0x04
185b435de0SArend van Spriel 
195b435de0SArend van Spriel /* io_rdys */
205b435de0SArend van Spriel #define SDIO_FUNC_READY_1	0x02
215b435de0SArend van Spriel #define SDIO_FUNC_READY_2	0x04
225b435de0SArend van Spriel 
235b435de0SArend van Spriel /* intr_status */
245b435de0SArend van Spriel #define INTR_STATUS_FUNC1	0x2
255b435de0SArend van Spriel #define INTR_STATUS_FUNC2	0x4
265b435de0SArend van Spriel 
27e9b8d91dSFranky Lin /* mask of register map */
28d8b3fc59SFranky Lin #define REG_F0_REG_MASK		0x7FF
29e9b8d91dSFranky Lin #define REG_F1_MISC_MASK	0x1FFFF
30e9b8d91dSFranky Lin 
31ba89bf19SFranky Lin /* function 0 vendor specific CCCR registers */
3271bd508dSIan Molton 
334a3da990SPiotr Haber #define SDIO_CCCR_BRCM_CARDCAP			0xf0
34eeef8a5dSIan Molton #define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT	BIT(1)
35eeef8a5dSIan Molton #define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT	BIT(2)
36eeef8a5dSIan Molton #define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC	BIT(3)
37ba89bf19SFranky Lin 
389c3438edSIan Molton /* Interrupt enable bits for each function */
399c3438edSIan Molton #define SDIO_CCCR_IEN_FUNC0			BIT(0)
409c3438edSIan Molton #define SDIO_CCCR_IEN_FUNC1			BIT(1)
419c3438edSIan Molton #define SDIO_CCCR_IEN_FUNC2			BIT(2)
429c3438edSIan Molton 
43eeef8a5dSIan Molton #define SDIO_CCCR_BRCM_CARDCTRL			0xf1
44eeef8a5dSIan Molton #define SDIO_CCCR_BRCM_CARDCTRL_WLANRESET	BIT(1)
45eeef8a5dSIan Molton 
46eeef8a5dSIan Molton #define SDIO_CCCR_BRCM_SEPINT			0xf2
47eeef8a5dSIan Molton #define SDIO_CCCR_BRCM_SEPINT_MASK		BIT(0)
48eeef8a5dSIan Molton #define SDIO_CCCR_BRCM_SEPINT_OE		BIT(1)
49eeef8a5dSIan Molton #define SDIO_CCCR_BRCM_SEPINT_ACT_HI		BIT(2)
50ba89bf19SFranky Lin 
515b435de0SArend van Spriel /* function 1 miscellaneous registers */
525b435de0SArend van Spriel 
535b435de0SArend van Spriel /* sprom command and status */
545b435de0SArend van Spriel #define SBSDIO_SPROM_CS			0x10000
555b435de0SArend van Spriel /* sprom info register */
565b435de0SArend van Spriel #define SBSDIO_SPROM_INFO		0x10001
575b435de0SArend van Spriel /* sprom indirect access data byte 0 */
585b435de0SArend van Spriel #define SBSDIO_SPROM_DATA_LOW		0x10002
595b435de0SArend van Spriel /* sprom indirect access data byte 1 */
605b435de0SArend van Spriel #define SBSDIO_SPROM_DATA_HIGH		0x10003
615b435de0SArend van Spriel /* sprom indirect access addr byte 0 */
625b435de0SArend van Spriel #define SBSDIO_SPROM_ADDR_LOW		0x10004
633cdf0a81SHans de Goede /* gpio select */
643cdf0a81SHans de Goede #define SBSDIO_GPIO_SELECT		0x10005
653cdf0a81SHans de Goede /* gpio output */
663cdf0a81SHans de Goede #define SBSDIO_GPIO_OUT			0x10006
673cdf0a81SHans de Goede /* gpio enable */
683cdf0a81SHans de Goede #define SBSDIO_GPIO_EN			0x10007
6958e4bbeaSMadhan Mohan R /* rev < 7, watermark for sdio device TX path */
705b435de0SArend van Spriel #define SBSDIO_WATERMARK		0x10008
715b435de0SArend van Spriel /* control busy signal generation */
725b435de0SArend van Spriel #define SBSDIO_DEVICE_CTL		0x10009
735b435de0SArend van Spriel 
745b435de0SArend van Spriel /* SB Address Window Low (b15) */
755b435de0SArend van Spriel #define SBSDIO_FUNC1_SBADDRLOW		0x1000A
765b435de0SArend van Spriel /* SB Address Window Mid (b23:b16) */
775b435de0SArend van Spriel #define SBSDIO_FUNC1_SBADDRMID		0x1000B
785b435de0SArend van Spriel /* SB Address Window High (b31:b24)    */
795b435de0SArend van Spriel #define SBSDIO_FUNC1_SBADDRHIGH		0x1000C
805b435de0SArend van Spriel /* Frame Control (frame term/abort) */
815b435de0SArend van Spriel #define SBSDIO_FUNC1_FRAMECTRL		0x1000D
825b435de0SArend van Spriel /* ChipClockCSR (ALP/HT ctl/status) */
835b435de0SArend van Spriel #define SBSDIO_FUNC1_CHIPCLKCSR		0x1000E
845b435de0SArend van Spriel /* SdioPullUp (on cmd, d0-d2) */
855b435de0SArend van Spriel #define SBSDIO_FUNC1_SDIOPULLUP		0x1000F
865b435de0SArend van Spriel /* Write Frame Byte Count Low */
875b435de0SArend van Spriel #define SBSDIO_FUNC1_WFRAMEBCLO		0x10019
885b435de0SArend van Spriel /* Write Frame Byte Count High */
895b435de0SArend van Spriel #define SBSDIO_FUNC1_WFRAMEBCHI		0x1001A
905b435de0SArend van Spriel /* Read Frame Byte Count Low */
915b435de0SArend van Spriel #define SBSDIO_FUNC1_RFRAMEBCLO		0x1001B
925b435de0SArend van Spriel /* Read Frame Byte Count High */
935b435de0SArend van Spriel #define SBSDIO_FUNC1_RFRAMEBCHI		0x1001C
944a3da990SPiotr Haber /* MesBusyCtl (rev 11) */
954a3da990SPiotr Haber #define SBSDIO_FUNC1_MESBUSYCTRL	0x1001D
9658e4bbeaSMadhan Mohan R /* Watermark for sdio device RX path */
9758e4bbeaSMadhan Mohan R #define SBSDIO_MESBUSY_RXFIFO_WM_MASK	0x7F
9858e4bbeaSMadhan Mohan R #define SBSDIO_MESBUSY_RXFIFO_WM_SHIFT	0
9958e4bbeaSMadhan Mohan R /* Enable busy capability for MES access */
10058e4bbeaSMadhan Mohan R #define SBSDIO_MESBUSYCTRL_ENAB		0x80
10158e4bbeaSMadhan Mohan R #define SBSDIO_MESBUSYCTRL_ENAB_SHIFT	7
10258e4bbeaSMadhan Mohan R 
1034a3da990SPiotr Haber /* Sdio Core Rev 12 */
1044a3da990SPiotr Haber #define SBSDIO_FUNC1_WAKEUPCTRL		0x1001E
1054a3da990SPiotr Haber #define SBSDIO_FUNC1_WCTRL_ALPWAIT_MASK		0x1
1064a3da990SPiotr Haber #define SBSDIO_FUNC1_WCTRL_ALPWAIT_SHIFT	0
1074a3da990SPiotr Haber #define SBSDIO_FUNC1_WCTRL_HTWAIT_MASK		0x2
1084a3da990SPiotr Haber #define SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT		1
1094a3da990SPiotr Haber #define SBSDIO_FUNC1_SLEEPCSR		0x1001F
1104a3da990SPiotr Haber #define SBSDIO_FUNC1_SLEEPCSR_KSO_MASK		0x1
1114a3da990SPiotr Haber #define SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT		0
1124a3da990SPiotr Haber #define SBSDIO_FUNC1_SLEEPCSR_KSO_EN		1
1134a3da990SPiotr Haber #define SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK	0x2
1144a3da990SPiotr Haber #define SBSDIO_FUNC1_SLEEPCSR_DEVON_SHIFT	1
1155b435de0SArend van Spriel 
1165b435de0SArend van Spriel #define SBSDIO_FUNC1_MISC_REG_START	0x10000	/* f1 misc register start */
1174a3da990SPiotr Haber #define SBSDIO_FUNC1_MISC_REG_LIMIT	0x1001F	/* f1 misc register end */
1185b435de0SArend van Spriel 
1195b435de0SArend van Spriel /* function 1 OCP space */
1205b435de0SArend van Spriel 
1215b435de0SArend van Spriel /* sb offset addr is <= 15 bits, 32k */
1225b435de0SArend van Spriel #define SBSDIO_SB_OFT_ADDR_MASK		0x07FFF
1235b435de0SArend van Spriel #define SBSDIO_SB_OFT_ADDR_LIMIT	0x08000
1245b435de0SArend van Spriel /* with b15, maps to 32-bit SB access */
1255b435de0SArend van Spriel #define SBSDIO_SB_ACCESS_2_4B_FLAG	0x08000
1265b435de0SArend van Spriel 
1275b435de0SArend van Spriel /* Address bits from SBADDR regs */
1285b435de0SArend van Spriel #define SBSDIO_SBWINDOW_MASK		0xffff8000
1295b435de0SArend van Spriel 
1305b435de0SArend van Spriel #define SDIOH_READ              0	/* Read request */
1315b435de0SArend van Spriel #define SDIOH_WRITE             1	/* Write request */
1325b435de0SArend van Spriel 
1335b435de0SArend van Spriel #define SDIOH_DATA_FIX          0	/* Fixed addressing */
1345b435de0SArend van Spriel #define SDIOH_DATA_INC          1	/* Incremental addressing */
1355b435de0SArend van Spriel 
1365b435de0SArend van Spriel /* internal return code */
1375b435de0SArend van Spriel #define SUCCESS	0
1385b435de0SArend van Spriel #define ERROR	1
1395b435de0SArend van Spriel 
1406e3c7128SFranky Lin /* Packet alignment for most efficient SDIO (can change based on platform) */
1416e3c7128SFranky Lin #define BRCMF_SDALIGN	(1 << 6)
1426e3c7128SFranky Lin 
14363ce3d5dSArend van Spriel /* watchdog polling interval */
14463ce3d5dSArend van Spriel #define BRCMF_WD_POLL	msecs_to_jiffies(10)
1456e3c7128SFranky Lin 
146a1ce7a0dSArend van Spriel /**
147a1ce7a0dSArend van Spriel  * enum brcmf_sdiod_state - the state of the bus.
148a1ce7a0dSArend van Spriel  *
149a1ce7a0dSArend van Spriel  * @BRCMF_SDIOD_DOWN: Device can be accessed, no DPC.
150a1ce7a0dSArend van Spriel  * @BRCMF_SDIOD_DATA: Ready for data transfers, DPC enabled.
151a1ce7a0dSArend van Spriel  * @BRCMF_SDIOD_NOMEDIUM: No medium access to dongle possible.
152a1ce7a0dSArend van Spriel  */
153a1ce7a0dSArend van Spriel enum brcmf_sdiod_state {
154a1ce7a0dSArend van Spriel 	BRCMF_SDIOD_DOWN,
155a1ce7a0dSArend van Spriel 	BRCMF_SDIOD_DATA,
156a1ce7a0dSArend van Spriel 	BRCMF_SDIOD_NOMEDIUM
157a1cee865SHante Meuleman };
158a1cee865SHante Meuleman 
1595b435de0SArend van Spriel struct brcmf_sdreg {
1605b435de0SArend van Spriel 	int func;
1615b435de0SArend van Spriel 	int offset;
1625b435de0SArend van Spriel 	int value;
1635b435de0SArend van Spriel };
1645b435de0SArend van Spriel 
1652447ffb0SFranky Lin struct brcmf_sdio;
16699824643SArend van Spriel struct brcmf_sdiod_freezer;
1672447ffb0SFranky Lin 
1685b435de0SArend van Spriel struct brcmf_sdio_dev {
169c9aa7a91SArend Van Spriel 	struct sdio_func *func1;
170c9aa7a91SArend Van Spriel 	struct sdio_func *func2;
1715b435de0SArend van Spriel 	u32 sbwad;			/* Save backplane window address */
172874bb8e4SIan Molton 	struct brcmf_core *cc_core;	/* chipcommon core info struct */
173964ec1cfSArend van Spriel 	struct brcmf_sdio *bus;
174655713beSFranky Lin 	struct device *dev;
175d76d1c8cSFranky Lin 	struct brcmf_bus *bus_if;
176af5b5e62SHante Meuleman 	struct brcmf_mp_device *settings;
177668761acSHante Meuleman 	bool oob_irq_requested;
178b88a2e80SChristian Daudt 	bool sd_irq_requested;
179ba89bf19SFranky Lin 	bool irq_en;			/* irq enable flags */
180ba89bf19SFranky Lin 	spinlock_t irq_en_lock;
18171201496SArend van Spriel 	bool sg_support;
18271201496SArend van Spriel 	uint max_request_size;
18371201496SArend van Spriel 	ushort max_segment_count;
18471201496SArend van Spriel 	uint max_segment_size;
185af1fa210SArend van Spriel 	uint txglomsz;
186af1fa210SArend van Spriel 	struct sg_table sgtable;
18746d703a7SHante Meuleman 	char fw_name[BRCMF_FW_NAME_LEN];
18846d703a7SHante Meuleman 	char nvram_name[BRCMF_FW_NAME_LEN];
189a1b5a902SHector Martin 	char clm_name[BRCMF_FW_NAME_LEN];
190330b4e4bSHante Meuleman 	bool wowl_enabled;
191*e4efa515SHans de Goede 	bool func1_power_manageable;
192*e4efa515SHans de Goede 	bool func2_power_manageable;
193a1ce7a0dSArend van Spriel 	enum brcmf_sdiod_state state;
19499824643SArend van Spriel 	struct brcmf_sdiod_freezer *freezer;
195a1b5a902SHector Martin 	const struct firmware *clm_fw;
1965b435de0SArend van Spriel };
1975b435de0SArend van Spriel 
198cb7cf7beSArend van Spriel /* sdio core registers */
199cb7cf7beSArend van Spriel struct sdpcmd_regs {
200cb7cf7beSArend van Spriel 	u32 corecontrol;		/* 0x00, rev8 */
201cb7cf7beSArend van Spriel 	u32 corestatus;			/* rev8 */
202cb7cf7beSArend van Spriel 	u32 PAD[1];
203cb7cf7beSArend van Spriel 	u32 biststatus;			/* rev8 */
204cb7cf7beSArend van Spriel 
205cb7cf7beSArend van Spriel 	/* PCMCIA access */
206cb7cf7beSArend van Spriel 	u16 pcmciamesportaladdr;	/* 0x010, rev8 */
207cb7cf7beSArend van Spriel 	u16 PAD[1];
208cb7cf7beSArend van Spriel 	u16 pcmciamesportalmask;	/* rev8 */
209cb7cf7beSArend van Spriel 	u16 PAD[1];
210cb7cf7beSArend van Spriel 	u16 pcmciawrframebc;		/* rev8 */
211cb7cf7beSArend van Spriel 	u16 PAD[1];
212cb7cf7beSArend van Spriel 	u16 pcmciaunderflowtimer;	/* rev8 */
213cb7cf7beSArend van Spriel 	u16 PAD[1];
214cb7cf7beSArend van Spriel 
215cb7cf7beSArend van Spriel 	/* interrupt */
216cb7cf7beSArend van Spriel 	u32 intstatus;			/* 0x020, rev8 */
217cb7cf7beSArend van Spriel 	u32 hostintmask;		/* rev8 */
218cb7cf7beSArend van Spriel 	u32 intmask;			/* rev8 */
219cb7cf7beSArend van Spriel 	u32 sbintstatus;		/* rev8 */
220cb7cf7beSArend van Spriel 	u32 sbintmask;			/* rev8 */
221cb7cf7beSArend van Spriel 	u32 funcintmask;		/* rev4 */
222cb7cf7beSArend van Spriel 	u32 PAD[2];
223cb7cf7beSArend van Spriel 	u32 tosbmailbox;		/* 0x040, rev8 */
224cb7cf7beSArend van Spriel 	u32 tohostmailbox;		/* rev8 */
225cb7cf7beSArend van Spriel 	u32 tosbmailboxdata;		/* rev8 */
226cb7cf7beSArend van Spriel 	u32 tohostmailboxdata;		/* rev8 */
227cb7cf7beSArend van Spriel 
228cb7cf7beSArend van Spriel 	/* synchronized access to registers in SDIO clock domain */
229cb7cf7beSArend van Spriel 	u32 sdioaccess;			/* 0x050, rev8 */
230cb7cf7beSArend van Spriel 	u32 PAD[3];
231cb7cf7beSArend van Spriel 
232cb7cf7beSArend van Spriel 	/* PCMCIA frame control */
233cb7cf7beSArend van Spriel 	u8 pcmciaframectrl;		/* 0x060, rev8 */
234cb7cf7beSArend van Spriel 	u8 PAD[3];
235cb7cf7beSArend van Spriel 	u8 pcmciawatermark;		/* rev8 */
236cb7cf7beSArend van Spriel 	u8 PAD[155];
237cb7cf7beSArend van Spriel 
238cb7cf7beSArend van Spriel 	/* interrupt batching control */
239cb7cf7beSArend van Spriel 	u32 intrcvlazy;			/* 0x100, rev8 */
240cb7cf7beSArend van Spriel 	u32 PAD[3];
241cb7cf7beSArend van Spriel 
242cb7cf7beSArend van Spriel 	/* counters */
243cb7cf7beSArend van Spriel 	u32 cmd52rd;			/* 0x110, rev8 */
244cb7cf7beSArend van Spriel 	u32 cmd52wr;			/* rev8 */
245cb7cf7beSArend van Spriel 	u32 cmd53rd;			/* rev8 */
246cb7cf7beSArend van Spriel 	u32 cmd53wr;			/* rev8 */
247cb7cf7beSArend van Spriel 	u32 abort;			/* rev8 */
248cb7cf7beSArend van Spriel 	u32 datacrcerror;		/* rev8 */
249cb7cf7beSArend van Spriel 	u32 rdoutofsync;		/* rev8 */
250cb7cf7beSArend van Spriel 	u32 wroutofsync;		/* rev8 */
251cb7cf7beSArend van Spriel 	u32 writebusy;			/* rev8 */
252cb7cf7beSArend van Spriel 	u32 readwait;			/* rev8 */
253cb7cf7beSArend van Spriel 	u32 readterm;			/* rev8 */
254cb7cf7beSArend van Spriel 	u32 writeterm;			/* rev8 */
255cb7cf7beSArend van Spriel 	u32 PAD[40];
256cb7cf7beSArend van Spriel 	u32 clockctlstatus;		/* rev8 */
257cb7cf7beSArend van Spriel 	u32 PAD[7];
258cb7cf7beSArend van Spriel 
259cb7cf7beSArend van Spriel 	u32 PAD[128];			/* DMA engines */
260cb7cf7beSArend van Spriel 
261cb7cf7beSArend van Spriel 	/* SDIO/PCMCIA CIS region */
262cb7cf7beSArend van Spriel 	char cis[512];			/* 0x400-0x5ff, rev6 */
263cb7cf7beSArend van Spriel 
264cb7cf7beSArend van Spriel 	/* PCMCIA function control registers */
265cb7cf7beSArend van Spriel 	char pcmciafcr[256];		/* 0x600-6ff, rev6 */
266cb7cf7beSArend van Spriel 	u16 PAD[55];
267cb7cf7beSArend van Spriel 
268cb7cf7beSArend van Spriel 	/* PCMCIA backplane access */
269cb7cf7beSArend van Spriel 	u16 backplanecsr;		/* 0x76E, rev6 */
270cb7cf7beSArend van Spriel 	u16 backplaneaddr0;		/* rev6 */
271cb7cf7beSArend van Spriel 	u16 backplaneaddr1;		/* rev6 */
272cb7cf7beSArend van Spriel 	u16 backplaneaddr2;		/* rev6 */
273cb7cf7beSArend van Spriel 	u16 backplaneaddr3;		/* rev6 */
274cb7cf7beSArend van Spriel 	u16 backplanedata0;		/* rev6 */
275cb7cf7beSArend van Spriel 	u16 backplanedata1;		/* rev6 */
276cb7cf7beSArend van Spriel 	u16 backplanedata2;		/* rev6 */
277cb7cf7beSArend van Spriel 	u16 backplanedata3;		/* rev6 */
278cb7cf7beSArend van Spriel 	u16 PAD[31];
279cb7cf7beSArend van Spriel 
280cb7cf7beSArend van Spriel 	/* sprom "size" & "blank" info */
281cb7cf7beSArend van Spriel 	u16 spromstatus;		/* 0x7BE, rev2 */
282cb7cf7beSArend van Spriel 	u32 PAD[464];
283cb7cf7beSArend van Spriel 
284cb7cf7beSArend van Spriel 	u16 PAD[0x80];
285cb7cf7beSArend van Spriel };
286cb7cf7beSArend van Spriel 
287ba89bf19SFranky Lin /* Register/deregister interrupt handler. */
288a39be27bSArend van Spriel int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev);
289b7467401SChristian Daudt void brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev);
2905b435de0SArend van Spriel 
29171bd508dSIan Molton /* SDIO device register access interface */
29271bd508dSIan Molton /* Accessors for SDIO Function 0 */
29371bd508dSIan Molton #define brcmf_sdiod_func0_rb(sdiodev, addr, r) \
294c9aa7a91SArend Van Spriel 	sdio_f0_readb((sdiodev)->func1, (addr), (r))
29571bd508dSIan Molton 
29671bd508dSIan Molton #define brcmf_sdiod_func0_wb(sdiodev, addr, v, ret) \
297c9aa7a91SArend Van Spriel 	sdio_f0_writeb((sdiodev)->func1, (v), (addr), (ret))
29871bd508dSIan Molton 
29971bd508dSIan Molton /* Accessors for SDIO Function 1 */
30071bd508dSIan Molton #define brcmf_sdiod_readb(sdiodev, addr, r) \
301c9aa7a91SArend Van Spriel 	sdio_readb((sdiodev)->func1, (addr), (r))
30271bd508dSIan Molton 
30371bd508dSIan Molton #define brcmf_sdiod_writeb(sdiodev, addr, v, ret) \
304c9aa7a91SArend Van Spriel 	sdio_writeb((sdiodev)->func1, (v), (addr), (ret))
30571bd508dSIan Molton 
30671bd508dSIan Molton u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
30771bd508dSIan Molton void brcmf_sdiod_writel(struct brcmf_sdio_dev *sdiodev, u32 addr, u32 data,
3089bd91f3cSJoe Perches 			int *ret);
309e9b8d91dSFranky Lin 
3105b435de0SArend van Spriel /* Buffer transfer to/from device (client) core via cmd53.
3115b435de0SArend van Spriel  *   fn:       function number
3125b435de0SArend van Spriel  *   flags:    backplane width, address increment, sync/async
3135b435de0SArend van Spriel  *   buf:      pointer to memory data buffer
3145b435de0SArend van Spriel  *   nbytes:   number of bytes to transfer to/from buf
3155b435de0SArend van Spriel  *   pkt:      pointer to packet associated with buf (if any)
3165b435de0SArend van Spriel  *   complete: callback function for command completion (async only)
3175b435de0SArend van Spriel  *   handle:   handle for completion callback (first arg in callback)
3185b435de0SArend van Spriel  * Returns 0 or error code.
3195b435de0SArend van Spriel  * NOTE: Async operation is not currently supported.
3205b435de0SArend van Spriel  */
321a7cdd821SArend van Spriel int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev,
322a7cdd821SArend van Spriel 			 struct sk_buff_head *pktq);
323a7cdd821SArend van Spriel int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes);
3245adfeb63SArend van Spriel 
325a7cdd821SArend van Spriel int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt);
326a7cdd821SArend van Spriel int brcmf_sdiod_recv_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes);
327a7cdd821SArend van Spriel int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev,
328a7cdd821SArend van Spriel 			   struct sk_buff_head *pktq, uint totlen);
3295b435de0SArend van Spriel 
3305b435de0SArend van Spriel /* Flags bits */
3315b435de0SArend van Spriel 
3325b435de0SArend van Spriel /* Four-byte target (backplane) width (vs. two-byte) */
3335b435de0SArend van Spriel #define SDIO_REQ_4BYTE	0x1
3345b435de0SArend van Spriel /* Fixed address (FIFO) (vs. incrementing address) */
3355b435de0SArend van Spriel #define SDIO_REQ_FIXED	0x2
3365b435de0SArend van Spriel 
3375b435de0SArend van Spriel /* Read/write to memory block (F1, no FIFO) via CMD53 (sync only).
3385b435de0SArend van Spriel  *   rw:       read or write (0/1)
3395b435de0SArend van Spriel  *   addr:     direct SDIO address
3405b435de0SArend van Spriel  *   buf:      pointer to memory data buffer
3415b435de0SArend van Spriel  *   nbytes:   number of bytes to transfer to/from buf
3425b435de0SArend van Spriel  * Returns 0 or error code.
3435b435de0SArend van Spriel  */
344a39be27bSArend van Spriel int brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
3459bd91f3cSJoe Perches 		      u8 *data, uint size);
3465b435de0SArend van Spriel 
3475b435de0SArend van Spriel /* Issue an abort to the specified function */
34800eb62cfSIan Molton int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, struct sdio_func *func);
34900eb62cfSIan Molton 
350e0045bf8SHante Meuleman void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev);
35199824643SArend van Spriel void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
35299824643SArend van Spriel 			      enum brcmf_sdiod_state state);
35399824643SArend van Spriel bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev);
35499824643SArend van Spriel void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev);
35599824643SArend van Spriel void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev);
35699824643SArend van Spriel void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev);
3575b435de0SArend van Spriel 
3587836102aSChi-Hsien Lin int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev);
3597836102aSChi-Hsien Lin int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev);
3607836102aSChi-Hsien Lin 
36182d7f3c1SArend van Spriel struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev);
3629fbe2a6dSArend van Spriel void brcmf_sdio_remove(struct brcmf_sdio *bus);
363d067c0faSSebastian Andrzej Siewior void brcmf_sdio_isr(struct brcmf_sdio *bus, bool in_isr);
36482d7f3c1SArend van Spriel 
3654011fc49SArend van Spriel void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, bool active);
366330b4e4bSHante Meuleman void brcmf_sdio_wowl_config(struct device *dev, bool enabled);
36799824643SArend van Spriel int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep);
36899824643SArend van Spriel void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus);
369a1ce7a0dSArend van Spriel 
370888bf76eSHante Meuleman #endif /* BRCMFMAC_SDIO_H */
371