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