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