xref: /openbmc/linux/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1daeccac2SArend van Spriel // SPDX-License-Identifier: ISC
205491d2cSKalle Valo /*
305491d2cSKalle Valo  * Copyright (c) 2010 Broadcom Corporation
405491d2cSKalle Valo  */
505491d2cSKalle Valo 
605491d2cSKalle Valo #ifndef	BRCMFMAC_SDIO_H
705491d2cSKalle Valo #define	BRCMFMAC_SDIO_H
805491d2cSKalle Valo 
905491d2cSKalle Valo #include <linux/skbuff.h>
1005491d2cSKalle Valo #include <linux/firmware.h>
1105491d2cSKalle Valo #include "firmware.h"
1205491d2cSKalle Valo 
1305491d2cSKalle Valo #define SDIOD_FBR_SIZE		0x100
1405491d2cSKalle Valo 
1505491d2cSKalle Valo /* io_en */
1605491d2cSKalle Valo #define SDIO_FUNC_ENABLE_1	0x02
1705491d2cSKalle Valo #define SDIO_FUNC_ENABLE_2	0x04
1805491d2cSKalle Valo 
1905491d2cSKalle Valo /* io_rdys */
2005491d2cSKalle Valo #define SDIO_FUNC_READY_1	0x02
2105491d2cSKalle Valo #define SDIO_FUNC_READY_2	0x04
2205491d2cSKalle Valo 
2305491d2cSKalle Valo /* intr_status */
2405491d2cSKalle Valo #define INTR_STATUS_FUNC1	0x2
2505491d2cSKalle Valo #define INTR_STATUS_FUNC2	0x4
2605491d2cSKalle Valo 
2705491d2cSKalle Valo /* mask of register map */
2805491d2cSKalle Valo #define REG_F0_REG_MASK		0x7FF
2905491d2cSKalle Valo #define REG_F1_MISC_MASK	0x1FFFF
3005491d2cSKalle Valo 
3105491d2cSKalle Valo /* function 0 vendor specific CCCR registers */
3271bd508dSIan Molton 
3305491d2cSKalle Valo #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)
3705491d2cSKalle Valo 
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)
5005491d2cSKalle Valo 
5105491d2cSKalle Valo /* function 1 miscellaneous registers */
5205491d2cSKalle Valo 
5305491d2cSKalle Valo /* sprom command and status */
5405491d2cSKalle Valo #define SBSDIO_SPROM_CS			0x10000
5505491d2cSKalle Valo /* sprom info register */
5605491d2cSKalle Valo #define SBSDIO_SPROM_INFO		0x10001
5705491d2cSKalle Valo /* sprom indirect access data byte 0 */
5805491d2cSKalle Valo #define SBSDIO_SPROM_DATA_LOW		0x10002
5905491d2cSKalle Valo /* sprom indirect access data byte 1 */
6005491d2cSKalle Valo #define SBSDIO_SPROM_DATA_HIGH		0x10003
6105491d2cSKalle Valo /* sprom indirect access addr byte 0 */
6205491d2cSKalle Valo #define SBSDIO_SPROM_ADDR_LOW		0x10004
6305491d2cSKalle Valo /* gpio select */
6405491d2cSKalle Valo #define SBSDIO_GPIO_SELECT		0x10005
6505491d2cSKalle Valo /* gpio output */
6605491d2cSKalle Valo #define SBSDIO_GPIO_OUT			0x10006
6705491d2cSKalle Valo /* gpio enable */
6805491d2cSKalle Valo #define SBSDIO_GPIO_EN			0x10007
6958e4bbeaSMadhan Mohan R /* rev < 7, watermark for sdio device TX path */
7005491d2cSKalle Valo #define SBSDIO_WATERMARK		0x10008
7105491d2cSKalle Valo /* control busy signal generation */
7205491d2cSKalle Valo #define SBSDIO_DEVICE_CTL		0x10009
7305491d2cSKalle Valo 
7405491d2cSKalle Valo /* SB Address Window Low (b15) */
7505491d2cSKalle Valo #define SBSDIO_FUNC1_SBADDRLOW		0x1000A
7605491d2cSKalle Valo /* SB Address Window Mid (b23:b16) */
7705491d2cSKalle Valo #define SBSDIO_FUNC1_SBADDRMID		0x1000B
7805491d2cSKalle Valo /* SB Address Window High (b31:b24)    */
7905491d2cSKalle Valo #define SBSDIO_FUNC1_SBADDRHIGH		0x1000C
8005491d2cSKalle Valo /* Frame Control (frame term/abort) */
8105491d2cSKalle Valo #define SBSDIO_FUNC1_FRAMECTRL		0x1000D
8205491d2cSKalle Valo /* ChipClockCSR (ALP/HT ctl/status) */
8305491d2cSKalle Valo #define SBSDIO_FUNC1_CHIPCLKCSR		0x1000E
8405491d2cSKalle Valo /* SdioPullUp (on cmd, d0-d2) */
8505491d2cSKalle Valo #define SBSDIO_FUNC1_SDIOPULLUP		0x1000F
8605491d2cSKalle Valo /* Write Frame Byte Count Low */
8705491d2cSKalle Valo #define SBSDIO_FUNC1_WFRAMEBCLO		0x10019
8805491d2cSKalle Valo /* Write Frame Byte Count High */
8905491d2cSKalle Valo #define SBSDIO_FUNC1_WFRAMEBCHI		0x1001A
9005491d2cSKalle Valo /* Read Frame Byte Count Low */
9105491d2cSKalle Valo #define SBSDIO_FUNC1_RFRAMEBCLO		0x1001B
9205491d2cSKalle Valo /* Read Frame Byte Count High */
9305491d2cSKalle Valo #define SBSDIO_FUNC1_RFRAMEBCHI		0x1001C
9405491d2cSKalle Valo /* MesBusyCtl (rev 11) */
9505491d2cSKalle Valo #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 
10305491d2cSKalle Valo /* Sdio Core Rev 12 */
10405491d2cSKalle Valo #define SBSDIO_FUNC1_WAKEUPCTRL		0x1001E
10505491d2cSKalle Valo #define SBSDIO_FUNC1_WCTRL_ALPWAIT_MASK		0x1
10605491d2cSKalle Valo #define SBSDIO_FUNC1_WCTRL_ALPWAIT_SHIFT	0
10705491d2cSKalle Valo #define SBSDIO_FUNC1_WCTRL_HTWAIT_MASK		0x2
10805491d2cSKalle Valo #define SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT		1
10905491d2cSKalle Valo #define SBSDIO_FUNC1_SLEEPCSR		0x1001F
11005491d2cSKalle Valo #define SBSDIO_FUNC1_SLEEPCSR_KSO_MASK		0x1
11105491d2cSKalle Valo #define SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT		0
11205491d2cSKalle Valo #define SBSDIO_FUNC1_SLEEPCSR_KSO_EN		1
11305491d2cSKalle Valo #define SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK	0x2
11405491d2cSKalle Valo #define SBSDIO_FUNC1_SLEEPCSR_DEVON_SHIFT	1
11505491d2cSKalle Valo 
11605491d2cSKalle Valo #define SBSDIO_FUNC1_MISC_REG_START	0x10000	/* f1 misc register start */
11705491d2cSKalle Valo #define SBSDIO_FUNC1_MISC_REG_LIMIT	0x1001F	/* f1 misc register end */
11805491d2cSKalle Valo 
11905491d2cSKalle Valo /* function 1 OCP space */
12005491d2cSKalle Valo 
12105491d2cSKalle Valo /* sb offset addr is <= 15 bits, 32k */
12205491d2cSKalle Valo #define SBSDIO_SB_OFT_ADDR_MASK		0x07FFF
12305491d2cSKalle Valo #define SBSDIO_SB_OFT_ADDR_LIMIT	0x08000
12405491d2cSKalle Valo /* with b15, maps to 32-bit SB access */
12505491d2cSKalle Valo #define SBSDIO_SB_ACCESS_2_4B_FLAG	0x08000
12605491d2cSKalle Valo 
12705491d2cSKalle Valo /* Address bits from SBADDR regs */
12805491d2cSKalle Valo #define SBSDIO_SBWINDOW_MASK		0xffff8000
12905491d2cSKalle Valo 
13005491d2cSKalle Valo #define SDIOH_READ              0	/* Read request */
13105491d2cSKalle Valo #define SDIOH_WRITE             1	/* Write request */
13205491d2cSKalle Valo 
13305491d2cSKalle Valo #define SDIOH_DATA_FIX          0	/* Fixed addressing */
13405491d2cSKalle Valo #define SDIOH_DATA_INC          1	/* Incremental addressing */
13505491d2cSKalle Valo 
13605491d2cSKalle Valo /* internal return code */
13705491d2cSKalle Valo #define SUCCESS	0
13805491d2cSKalle Valo #define ERROR	1
13905491d2cSKalle Valo 
14005491d2cSKalle Valo /* Packet alignment for most efficient SDIO (can change based on platform) */
14105491d2cSKalle Valo #define BRCMF_SDALIGN	(1 << 6)
14205491d2cSKalle Valo 
14363ce3d5dSArend van Spriel /* watchdog polling interval */
14463ce3d5dSArend van Spriel #define BRCMF_WD_POLL	msecs_to_jiffies(10)
14505491d2cSKalle Valo 
14605491d2cSKalle Valo /**
14705491d2cSKalle Valo  * enum brcmf_sdiod_state - the state of the bus.
14805491d2cSKalle Valo  *
14905491d2cSKalle Valo  * @BRCMF_SDIOD_DOWN: Device can be accessed, no DPC.
15005491d2cSKalle Valo  * @BRCMF_SDIOD_DATA: Ready for data transfers, DPC enabled.
15105491d2cSKalle Valo  * @BRCMF_SDIOD_NOMEDIUM: No medium access to dongle possible.
15205491d2cSKalle Valo  */
15305491d2cSKalle Valo enum brcmf_sdiod_state {
15405491d2cSKalle Valo 	BRCMF_SDIOD_DOWN,
15505491d2cSKalle Valo 	BRCMF_SDIOD_DATA,
15605491d2cSKalle Valo 	BRCMF_SDIOD_NOMEDIUM
15705491d2cSKalle Valo };
15805491d2cSKalle Valo 
15905491d2cSKalle Valo struct brcmf_sdreg {
16005491d2cSKalle Valo 	int func;
16105491d2cSKalle Valo 	int offset;
16205491d2cSKalle Valo 	int value;
16305491d2cSKalle Valo };
16405491d2cSKalle Valo 
16505491d2cSKalle Valo struct brcmf_sdio;
16605491d2cSKalle Valo struct brcmf_sdiod_freezer;
16705491d2cSKalle Valo 
16805491d2cSKalle Valo struct brcmf_sdio_dev {
169c9aa7a91SArend Van Spriel 	struct sdio_func *func1;
170c9aa7a91SArend Van Spriel 	struct sdio_func *func2;
17105491d2cSKalle Valo 	u32 sbwad;			/* Save backplane window address */
172874bb8e4SIan Molton 	struct brcmf_core *cc_core;	/* chipcommon core info struct */
17305491d2cSKalle Valo 	struct brcmf_sdio *bus;
17405491d2cSKalle Valo 	struct device *dev;
17505491d2cSKalle Valo 	struct brcmf_bus *bus_if;
176af5b5e62SHante Meuleman 	struct brcmf_mp_device *settings;
17705491d2cSKalle Valo 	bool oob_irq_requested;
178b88a2e80SChristian Daudt 	bool sd_irq_requested;
17905491d2cSKalle Valo 	bool irq_en;			/* irq enable flags */
18005491d2cSKalle Valo 	spinlock_t irq_en_lock;
18105491d2cSKalle Valo 	bool sg_support;
18205491d2cSKalle Valo 	uint max_request_size;
18305491d2cSKalle Valo 	ushort max_segment_count;
18405491d2cSKalle Valo 	uint max_segment_size;
18505491d2cSKalle Valo 	uint txglomsz;
18605491d2cSKalle Valo 	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];
19005491d2cSKalle Valo 	bool wowl_enabled;
191*e4efa515SHans de Goede 	bool func1_power_manageable;
192*e4efa515SHans de Goede 	bool func2_power_manageable;
19305491d2cSKalle Valo 	enum brcmf_sdiod_state state;
19405491d2cSKalle Valo 	struct brcmf_sdiod_freezer *freezer;
195a1b5a902SHector Martin 	const struct firmware *clm_fw;
19605491d2cSKalle Valo };
19705491d2cSKalle Valo 
19805491d2cSKalle Valo /* sdio core registers */
19905491d2cSKalle Valo struct sdpcmd_regs {
20005491d2cSKalle Valo 	u32 corecontrol;		/* 0x00, rev8 */
20105491d2cSKalle Valo 	u32 corestatus;			/* rev8 */
20205491d2cSKalle Valo 	u32 PAD[1];
20305491d2cSKalle Valo 	u32 biststatus;			/* rev8 */
20405491d2cSKalle Valo 
20505491d2cSKalle Valo 	/* PCMCIA access */
20605491d2cSKalle Valo 	u16 pcmciamesportaladdr;	/* 0x010, rev8 */
20705491d2cSKalle Valo 	u16 PAD[1];
20805491d2cSKalle Valo 	u16 pcmciamesportalmask;	/* rev8 */
20905491d2cSKalle Valo 	u16 PAD[1];
21005491d2cSKalle Valo 	u16 pcmciawrframebc;		/* rev8 */
21105491d2cSKalle Valo 	u16 PAD[1];
21205491d2cSKalle Valo 	u16 pcmciaunderflowtimer;	/* rev8 */
21305491d2cSKalle Valo 	u16 PAD[1];
21405491d2cSKalle Valo 
21505491d2cSKalle Valo 	/* interrupt */
21605491d2cSKalle Valo 	u32 intstatus;			/* 0x020, rev8 */
21705491d2cSKalle Valo 	u32 hostintmask;		/* rev8 */
21805491d2cSKalle Valo 	u32 intmask;			/* rev8 */
21905491d2cSKalle Valo 	u32 sbintstatus;		/* rev8 */
22005491d2cSKalle Valo 	u32 sbintmask;			/* rev8 */
22105491d2cSKalle Valo 	u32 funcintmask;		/* rev4 */
22205491d2cSKalle Valo 	u32 PAD[2];
22305491d2cSKalle Valo 	u32 tosbmailbox;		/* 0x040, rev8 */
22405491d2cSKalle Valo 	u32 tohostmailbox;		/* rev8 */
22505491d2cSKalle Valo 	u32 tosbmailboxdata;		/* rev8 */
22605491d2cSKalle Valo 	u32 tohostmailboxdata;		/* rev8 */
22705491d2cSKalle Valo 
22805491d2cSKalle Valo 	/* synchronized access to registers in SDIO clock domain */
22905491d2cSKalle Valo 	u32 sdioaccess;			/* 0x050, rev8 */
23005491d2cSKalle Valo 	u32 PAD[3];
23105491d2cSKalle Valo 
23205491d2cSKalle Valo 	/* PCMCIA frame control */
23305491d2cSKalle Valo 	u8 pcmciaframectrl;		/* 0x060, rev8 */
23405491d2cSKalle Valo 	u8 PAD[3];
23505491d2cSKalle Valo 	u8 pcmciawatermark;		/* rev8 */
23605491d2cSKalle Valo 	u8 PAD[155];
23705491d2cSKalle Valo 
23805491d2cSKalle Valo 	/* interrupt batching control */
23905491d2cSKalle Valo 	u32 intrcvlazy;			/* 0x100, rev8 */
24005491d2cSKalle Valo 	u32 PAD[3];
24105491d2cSKalle Valo 
24205491d2cSKalle Valo 	/* counters */
24305491d2cSKalle Valo 	u32 cmd52rd;			/* 0x110, rev8 */
24405491d2cSKalle Valo 	u32 cmd52wr;			/* rev8 */
24505491d2cSKalle Valo 	u32 cmd53rd;			/* rev8 */
24605491d2cSKalle Valo 	u32 cmd53wr;			/* rev8 */
24705491d2cSKalle Valo 	u32 abort;			/* rev8 */
24805491d2cSKalle Valo 	u32 datacrcerror;		/* rev8 */
24905491d2cSKalle Valo 	u32 rdoutofsync;		/* rev8 */
25005491d2cSKalle Valo 	u32 wroutofsync;		/* rev8 */
25105491d2cSKalle Valo 	u32 writebusy;			/* rev8 */
25205491d2cSKalle Valo 	u32 readwait;			/* rev8 */
25305491d2cSKalle Valo 	u32 readterm;			/* rev8 */
25405491d2cSKalle Valo 	u32 writeterm;			/* rev8 */
25505491d2cSKalle Valo 	u32 PAD[40];
25605491d2cSKalle Valo 	u32 clockctlstatus;		/* rev8 */
25705491d2cSKalle Valo 	u32 PAD[7];
25805491d2cSKalle Valo 
25905491d2cSKalle Valo 	u32 PAD[128];			/* DMA engines */
26005491d2cSKalle Valo 
26105491d2cSKalle Valo 	/* SDIO/PCMCIA CIS region */
26205491d2cSKalle Valo 	char cis[512];			/* 0x400-0x5ff, rev6 */
26305491d2cSKalle Valo 
26405491d2cSKalle Valo 	/* PCMCIA function control registers */
26505491d2cSKalle Valo 	char pcmciafcr[256];		/* 0x600-6ff, rev6 */
26605491d2cSKalle Valo 	u16 PAD[55];
26705491d2cSKalle Valo 
26805491d2cSKalle Valo 	/* PCMCIA backplane access */
26905491d2cSKalle Valo 	u16 backplanecsr;		/* 0x76E, rev6 */
27005491d2cSKalle Valo 	u16 backplaneaddr0;		/* rev6 */
27105491d2cSKalle Valo 	u16 backplaneaddr1;		/* rev6 */
27205491d2cSKalle Valo 	u16 backplaneaddr2;		/* rev6 */
27305491d2cSKalle Valo 	u16 backplaneaddr3;		/* rev6 */
27405491d2cSKalle Valo 	u16 backplanedata0;		/* rev6 */
27505491d2cSKalle Valo 	u16 backplanedata1;		/* rev6 */
27605491d2cSKalle Valo 	u16 backplanedata2;		/* rev6 */
27705491d2cSKalle Valo 	u16 backplanedata3;		/* rev6 */
27805491d2cSKalle Valo 	u16 PAD[31];
27905491d2cSKalle Valo 
28005491d2cSKalle Valo 	/* sprom "size" & "blank" info */
28105491d2cSKalle Valo 	u16 spromstatus;		/* 0x7BE, rev2 */
28205491d2cSKalle Valo 	u32 PAD[464];
28305491d2cSKalle Valo 
28405491d2cSKalle Valo 	u16 PAD[0x80];
28505491d2cSKalle Valo };
28605491d2cSKalle Valo 
28705491d2cSKalle Valo /* Register/deregister interrupt handler. */
28805491d2cSKalle Valo int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev);
289b7467401SChristian Daudt void brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev);
29005491d2cSKalle Valo 
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,
30805491d2cSKalle Valo 			int *ret);
30905491d2cSKalle Valo 
31005491d2cSKalle Valo /* Buffer transfer to/from device (client) core via cmd53.
31105491d2cSKalle Valo  *   fn:       function number
31205491d2cSKalle Valo  *   flags:    backplane width, address increment, sync/async
31305491d2cSKalle Valo  *   buf:      pointer to memory data buffer
31405491d2cSKalle Valo  *   nbytes:   number of bytes to transfer to/from buf
31505491d2cSKalle Valo  *   pkt:      pointer to packet associated with buf (if any)
31605491d2cSKalle Valo  *   complete: callback function for command completion (async only)
31705491d2cSKalle Valo  *   handle:   handle for completion callback (first arg in callback)
31805491d2cSKalle Valo  * Returns 0 or error code.
31905491d2cSKalle Valo  * NOTE: Async operation is not currently supported.
32005491d2cSKalle Valo  */
32105491d2cSKalle Valo int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev,
32205491d2cSKalle Valo 			 struct sk_buff_head *pktq);
32305491d2cSKalle Valo int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes);
32405491d2cSKalle Valo 
32505491d2cSKalle Valo int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt);
32605491d2cSKalle Valo int brcmf_sdiod_recv_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes);
32705491d2cSKalle Valo int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev,
32805491d2cSKalle Valo 			   struct sk_buff_head *pktq, uint totlen);
32905491d2cSKalle Valo 
33005491d2cSKalle Valo /* Flags bits */
33105491d2cSKalle Valo 
33205491d2cSKalle Valo /* Four-byte target (backplane) width (vs. two-byte) */
33305491d2cSKalle Valo #define SDIO_REQ_4BYTE	0x1
33405491d2cSKalle Valo /* Fixed address (FIFO) (vs. incrementing address) */
33505491d2cSKalle Valo #define SDIO_REQ_FIXED	0x2
33605491d2cSKalle Valo 
33705491d2cSKalle Valo /* Read/write to memory block (F1, no FIFO) via CMD53 (sync only).
33805491d2cSKalle Valo  *   rw:       read or write (0/1)
33905491d2cSKalle Valo  *   addr:     direct SDIO address
34005491d2cSKalle Valo  *   buf:      pointer to memory data buffer
34105491d2cSKalle Valo  *   nbytes:   number of bytes to transfer to/from buf
34205491d2cSKalle Valo  * Returns 0 or error code.
34305491d2cSKalle Valo  */
34405491d2cSKalle Valo int brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
34505491d2cSKalle Valo 		      u8 *data, uint size);
34605491d2cSKalle Valo 
34705491d2cSKalle Valo /* 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);
35105491d2cSKalle Valo void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
35205491d2cSKalle Valo 			      enum brcmf_sdiod_state state);
35305491d2cSKalle Valo bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev);
35405491d2cSKalle Valo void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev);
35505491d2cSKalle Valo void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev);
35605491d2cSKalle Valo void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev);
35705491d2cSKalle Valo 
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 
36105491d2cSKalle Valo struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev);
36205491d2cSKalle Valo void brcmf_sdio_remove(struct brcmf_sdio *bus);
363d067c0faSSebastian Andrzej Siewior void brcmf_sdio_isr(struct brcmf_sdio *bus, bool in_isr);
36405491d2cSKalle Valo 
3654011fc49SArend van Spriel void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, bool active);
36605491d2cSKalle Valo void brcmf_sdio_wowl_config(struct device *dev, bool enabled);
36705491d2cSKalle Valo int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep);
36805491d2cSKalle Valo void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus);
36905491d2cSKalle Valo 
37005491d2cSKalle Valo #endif /* BRCMFMAC_SDIO_H */
371