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