1 /* 2 * Copyright 2022, Cypress Semiconductor Corporation (an Infineon company) 3 * SPDX-License-Identifier: Apache-2.0 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #ifndef INCLUDED_WHD_SDIO_H_ 19 #define INCLUDED_WHD_SDIO_H_ 20 21 #ifdef __cplusplus 22 extern "C" { 23 #endif 24 25 /****************************************************** 26 * SDIO Constants 27 ******************************************************/ 28 /* CurrentSdiodProgGuide r23 */ 29 30 /* Base registers */ 31 #define SDIO_CORE(wd) ( (uint32_t)(GET_C_VAR(wd, SDIOD_CORE_BASE_ADDRESS) + 0x00) ) 32 #define SDIO_INT_STATUS(wd) ( (uint32_t)(GET_C_VAR(wd, SDIOD_CORE_BASE_ADDRESS) + 0x20) ) 33 #define SDIO_TO_SB_MAILBOX(wd) ( (uint32_t)(GET_C_VAR(wd, SDIOD_CORE_BASE_ADDRESS) + 0x40) ) 34 #define SDIO_TO_SB_MAILBOX_DATA(wd) ( (uint32_t)(GET_C_VAR(wd, SDIOD_CORE_BASE_ADDRESS) + 0x48) ) 35 #define SDIO_TO_HOST_MAILBOX_DATA(wd) ( (uint32_t)(GET_C_VAR(wd, SDIOD_CORE_BASE_ADDRESS) + 0x4C) ) 36 #define SDIO_INT_HOST_MASK(wd) ( (uint32_t)(GET_C_VAR(wd, SDIOD_CORE_BASE_ADDRESS) + 0x24) ) 37 #define SDIO_FUNCTION_INT_MASK(wd) ( (uint32_t)(GET_C_VAR(wd, SDIOD_CORE_BASE_ADDRESS) + 0x34) ) 38 39 /* SDIO Function 0 (SDIO Bus) register addresses */ 40 41 /* SDIO Device CCCR (Card Common Control Register) offsets */ 42 /* CCCR accesses do not require backpane clock */ 43 #define SDIOD_CCCR_REV ( (uint32_t)0x00 ) /* CCCR/SDIO Revision */ 44 #define SDIOD_CCCR_SDREV ( (uint32_t)0x01 ) /* SD Revision */ 45 #define SDIOD_CCCR_IOEN ( (uint32_t)0x02 ) /* I/O Enable */ 46 #define SDIOD_CCCR_IORDY ( (uint32_t)0x03 ) /* I/O Ready */ 47 #define SDIOD_CCCR_INTEN ( (uint32_t)0x04 ) /* Interrupt Enable */ 48 #define SDIOD_CCCR_INTPEND ( (uint32_t)0x05 ) /* Interrupt Pending */ 49 #define SDIOD_CCCR_IOABORT ( (uint32_t)0x06 ) /* I/O Abort */ 50 #define SDIOD_CCCR_BICTRL ( (uint32_t)0x07 ) /* Bus Interface control */ 51 #define SDIOD_CCCR_CAPABLITIES ( (uint32_t)0x08 ) /* Card Capabilities */ 52 #define SDIOD_CCCR_CISPTR_0 ( (uint32_t)0x09 ) /* Common CIS Base Address Pointer Register 0 (LSB) */ 53 #define SDIOD_CCCR_CISPTR_1 ( (uint32_t)0x0A ) /* Common CIS Base Address Pointer Register 1 */ 54 #define SDIOD_CCCR_CISPTR_2 ( (uint32_t)0x0B ) /* Common CIS Base Address Pointer Register 2 (MSB - only bit 1 valid)*/ 55 #define SDIOD_CCCR_BUSSUSP ( (uint32_t)0x0C ) /* Bus Suspend. Valid only if SBS is set */ 56 #define SDIOD_CCCR_FUNCSEL ( (uint32_t)0x0D ) /* Function Select. Valid only if SBS is set */ 57 #define SDIOD_CCCR_EXECFLAGS ( (uint32_t)0x0E ) /* Exec Flags. Valid only if SBS is set */ 58 #define SDIOD_CCCR_RDYFLAGS ( (uint32_t)0x0F ) /* Ready Flags. Valid only if SBS is set */ 59 #define SDIOD_CCCR_BLKSIZE_0 ( (uint32_t)0x10 ) /* Function 0 (Bus) SDIO Block Size Register 0 (LSB) */ 60 #define SDIOD_CCCR_BLKSIZE_1 ( (uint32_t)0x11 ) /* Function 0 (Bus) SDIO Block Size Register 1 (MSB) */ 61 #define SDIOD_CCCR_POWER_CONTROL ( (uint32_t)0x12 ) /* Power Control */ 62 #define SDIOD_CCCR_SPEED_CONTROL ( (uint32_t)0x13 ) /* Bus Speed Select (control device entry into high-speed clocking mode) */ 63 #define SDIOD_CCCR_UHS_I ( (uint32_t)0x14 ) /* UHS-I Support */ 64 #define SDIOD_CCCR_DRIVE ( (uint32_t)0x15 ) /* Drive Strength */ 65 #define SDIOD_CCCR_INTEXT ( (uint32_t)0x16 ) /* Interrupt Extension */ 66 #define SDIOD_CCCR_BRCM_CARDCAP ( (uint32_t)0xF0 ) /* Brcm Card Capability */ 67 #define SDIOD_SEP_INT_CTL ( (uint32_t)0xF2 ) /* Separate Interrupt Control*/ 68 #define SDIOD_CCCR_F1INFO ( (uint32_t)0x100 ) /* Function 1 (Backplane) Info */ 69 #define SDIOD_CCCR_F1HP ( (uint32_t)0x102 ) /* Function 1 (Backplane) High Power */ 70 #define SDIOD_CCCR_F1CISPTR_0 ( (uint32_t)0x109 ) /* Function 1 (Backplane) CIS Base Address Pointer Register 0 (LSB) */ 71 #define SDIOD_CCCR_F1CISPTR_1 ( (uint32_t)0x10A ) /* Function 1 (Backplane) CIS Base Address Pointer Register 1 */ 72 #define SDIOD_CCCR_F1CISPTR_2 ( (uint32_t)0x10B ) /* Function 1 (Backplane) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ 73 #define SDIOD_CCCR_F1BLKSIZE_0 ( (uint32_t)0x110 ) /* Function 1 (Backplane) SDIO Block Size Register 0 (LSB) */ 74 #define SDIOD_CCCR_F1BLKSIZE_1 ( (uint32_t)0x111 ) /* Function 1 (Backplane) SDIO Block Size Register 1 (MSB) */ 75 #define SDIOD_CCCR_F2INFO ( (uint32_t)0x200 ) /* Function 2 (WLAN Data FIFO) Info */ 76 #define SDIOD_CCCR_F2HP ( (uint32_t)0x202 ) /* Function 2 (WLAN Data FIFO) High Power */ 77 #define SDIOD_CCCR_F2CISPTR_0 ( (uint32_t)0x209 ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ 78 #define SDIOD_CCCR_F2CISPTR_1 ( (uint32_t)0x20A ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 1 */ 79 #define SDIOD_CCCR_F2CISPTR_2 ( (uint32_t)0x20B ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ 80 #define SDIOD_CCCR_F2BLKSIZE_0 ( (uint32_t)0x210 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 0 (LSB) */ 81 #define SDIOD_CCCR_F2BLKSIZE_1 ( (uint32_t)0x211 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 1 (MSB) */ 82 #define SDIOD_CCCR_F3INFO ( (uint32_t)0x300 ) /* Function 3 (Bluetooth Data FIFO) Info */ 83 #define SDIOD_CCCR_F3HP ( (uint32_t)0x302 ) /* Function 3 (Bluetooth Data FIFO) High Power */ 84 #define SDIOD_CCCR_F3CISPTR_0 ( (uint32_t)0x309 ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ 85 #define SDIOD_CCCR_F3CISPTR_1 ( (uint32_t)0x30A ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 1 */ 86 #define SDIOD_CCCR_F3CISPTR_2 ( (uint32_t)0x30B ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ 87 #define SDIOD_CCCR_F3BLKSIZE_0 ( (uint32_t)0x310 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 0 (LSB) */ 88 #define SDIOD_CCCR_F3BLKSIZE_1 ( (uint32_t)0x311 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 1 (MSB) */ 89 90 91 /* SDIO Function 1 (Backplane) register addresses */ 92 /* Addresses 0x00000000 - 0x0000FFFF are directly access the backplane 93 * throught the backplane window. Addresses above 0x0000FFFF are 94 * registers relating to backplane access, and do not require a backpane 95 * clock to access them 96 */ 97 #define SDIO_GPIO_SELECT ( (uint32_t)0x10005 ) 98 #define SDIO_GPIO_OUTPUT ( (uint32_t)0x10006 ) 99 #define SDIO_GPIO_ENABLE ( (uint32_t)0x10007 ) 100 #define SDIO_FUNCTION2_WATERMARK ( (uint32_t)0x10008 ) 101 #define SDIO_DEVICE_CONTROL ( (uint32_t)0x10009 ) 102 #define SDIO_BACKPLANE_ADDRESS_LOW ( (uint32_t)0x1000A ) 103 #define SDIO_BACKPLANE_ADDRESS_MID ( (uint32_t)0x1000B ) 104 #define SDIO_BACKPLANE_ADDRESS_HIGH ( (uint32_t)0x1000C ) 105 #define SDIO_FRAME_CONTROL ( (uint32_t)0x1000D ) 106 #define SDIO_CHIP_CLOCK_CSR ( (uint32_t)0x1000E ) 107 #define SDIO_PULL_UP ( (uint32_t)0x1000F ) 108 #define SDIO_READ_FRAME_BC_LOW ( (uint32_t)0x1001B ) 109 #define SDIO_READ_FRAME_BC_HIGH ( (uint32_t)0x1001C ) 110 #define SDIO_WAKEUP_CTRL ( (uint32_t)0x1001E ) 111 #define SDIO_SLEEP_CSR ( (uint32_t)0x1001F ) 112 #define I_HMB_SW_MASK ( (uint32_t)0x000000F0 ) 113 #define I_HMB_FRAME_IND (1 << 6) 114 #define I_HMB_HOST_INT (1 << 7) 115 #define I_HMB_FC_CHANGE (1 << 5) 116 #define FRAME_AVAILABLE_MASK I_HMB_SW_MASK 117 118 /****************************************************** 119 * Bit Masks 120 ******************************************************/ 121 122 /* SDIOD_CCCR_REV Bits */ 123 #define SDIO_REV_SDIOID_MASK ( (uint32_t)0xF0 ) /* SDIO spec revision number */ 124 #define SDIO_REV_CCCRID_MASK ( (uint32_t)0x0F ) /* CCCR format version number */ 125 126 /* SDIOD_CCCR_SDREV Bits */ 127 #define SD_REV_PHY_MASK ( (uint32_t)0x0F ) /* SD format version number */ 128 129 /* SDIOD_CCCR_IOEN Bits */ 130 #define SDIO_FUNC_ENABLE_1 ( (uint32_t)0x02 ) /* function 1 I/O enable */ 131 #define SDIO_FUNC_ENABLE_2 ( (uint32_t)0x04 ) /* function 2 I/O enable */ 132 #define SDIO_FUNC_ENABLE_3 ( (uint32_t)0x08 ) /* function 3 I/O enable */ 133 134 /* SDIOD_CCCR_IORDY Bits */ 135 #define SDIO_FUNC_READY_1 ( (uint32_t)0x02 ) /* function 1 I/O ready */ 136 #define SDIO_FUNC_READY_2 ( (uint32_t)0x04 ) /* function 2 I/O ready */ 137 #define SDIO_FUNC_READY_3 ( (uint32_t)0x08 ) /* function 3 I/O ready */ 138 139 /* SDIOD_CCCR_INTEN Bits */ 140 #define INTR_CTL_MASTER_EN ( (uint32_t)0x01 ) /* interrupt enable master */ 141 #define INTR_CTL_FUNC1_EN ( (uint32_t)0x02 ) /* interrupt enable for function 1 */ 142 #define INTR_CTL_FUNC2_EN ( (uint32_t)0x04 ) /* interrupt enable for function 2 */ 143 144 /* SDIOD_SEP_INT_CTL Bits */ 145 #define SEP_INTR_CTL_MASK ( (uint32_t)0x01 ) /* out-of-band interrupt mask */ 146 #define SEP_INTR_CTL_EN ( (uint32_t)0x02 ) /* out-of-band interrupt output enable */ 147 #define SEP_INTR_CTL_POL ( (uint32_t)0x04 ) /* out-of-band interrupt polarity */ 148 149 /* SDIOD_CCCR_INTPEND Bits */ 150 #define INTR_STATUS_FUNC1 ( (uint32_t)0x02 ) /* interrupt pending for function 1 */ 151 #define INTR_STATUS_FUNC2 ( (uint32_t)0x04 ) /* interrupt pending for function 2 */ 152 #define INTR_STATUS_FUNC3 ( (uint32_t)0x08 ) /* interrupt pending for function 3 */ 153 154 /* SDIOD_CCCR_IOABORT Bits */ 155 #define IO_ABORT_RESET_ALL ( (uint32_t)0x08 ) /* I/O card reset */ 156 #define IO_ABORT_FUNC_MASK ( (uint32_t)0x07 ) /* abort selction: function x */ 157 158 /* SDIOD_CCCR_BICTRL Bits */ 159 #define BUS_CARD_DETECT_DIS ( (uint32_t)0x80 ) /* Card Detect disable */ 160 #define BUS_SPI_CONT_INTR_CAP ( (uint32_t)0x40 ) /* support continuous SPI interrupt */ 161 #define BUS_SPI_CONT_INTR_EN ( (uint32_t)0x20 ) /* continuous SPI interrupt enable */ 162 #define BUS_SD_DATA_WIDTH_MASK ( (uint32_t)0x03 ) /* bus width mask */ 163 #define BUS_SD_DATA_WIDTH_4BIT ( (uint32_t)0x02 ) /* bus width 4-bit mode */ 164 #define BUS_SD_DATA_WIDTH_1BIT ( (uint32_t)0x00 ) /* bus width 1-bit mode */ 165 166 /* SDIOD_CCCR_CAPABLITIES Bits */ 167 #define SDIO_CAP_4BLS ( (uint32_t)0x80 ) /* 4-bit support for low speed card */ 168 #define SDIO_CAP_LSC ( (uint32_t)0x40 ) /* low speed card */ 169 #define SDIO_CAP_E4MI ( (uint32_t)0x20 ) /* enable interrupt between block of data in 4-bit mode */ 170 #define SDIO_CAP_S4MI ( (uint32_t)0x10 ) /* support interrupt between block of data in 4-bit mode */ 171 #define SDIO_CAP_SBS ( (uint32_t)0x08 ) /* support suspend/resume */ 172 #define SDIO_CAP_SRW ( (uint32_t)0x04 ) /* support read wait */ 173 #define SDIO_CAP_SMB ( (uint32_t)0x02 ) /* support multi-block transfer */ 174 #define SDIO_CAP_SDC ( (uint32_t)0x01 ) /* Support Direct commands during multi-byte transfer */ 175 176 /* SDIOD_CCCR_POWER_CONTROL Bits */ 177 #define SDIO_POWER_SMPC ( (uint32_t)0x01 ) /* supports master power control (RO) */ 178 #define SDIO_POWER_EMPC ( (uint32_t)0x02 ) /* enable master power control (allow > 200mA) (RW) */ 179 180 /* SDIOD_CCCR_SPEED_CONTROL Bits */ 181 #define SDIO_SPEED_SHS ( (uint32_t)0x01 ) /* supports high-speed [clocking] mode (RO) */ 182 #define SDIO_SPEED_EHS ( (uint32_t)0x02 ) /* enable high-speed [clocking] mode (RW) */ 183 184 /* SDIOD_CCCR_BRCM_CARDCAP Bits */ 185 #define SDIOD_CCCR_BRCM_CARDCAP_CMD14_SUPPORT ( (uint32_t)0x02 ) /* Supports CMD14 */ 186 #define SDIOD_CCCR_BRCM_CARDCAP_CMD14_EXT ( (uint32_t)0x04 ) /* CMD14 is allowed in FSM command state */ 187 #define SDIOD_CCCR_BRCM_CARDCAP_CMD_NODEC ( (uint32_t)0x08 ) /* sdiod_aos does not decode any command */ 188 189 /* SDIO_FUNCTION_INT_MASK Bits*/ 190 #define SDIO_FUNC_MASK_F1 ( (uint32_t)0x01 ) /* interrupt mask enable for function 1 */ 191 #define SDIO_FUNC_MASK_F2 ( (uint32_t)0x02 ) /* interrupt mask enable for function 2 */ 192 193 /* SDIO_DEVICE_CONTROL Bits */ 194 #define SDIO_DATA_PAD_ISO ( (uint32_t)0x08 ) /* isolate internal SDIO data bus signals */ 195 196 /* SDIO_CHIP_CLOCK_CSR Bits */ 197 #define SBSDIO_FORCE_ALP ( (uint32_t)0x01 ) /* Force ALP request to backplane */ 198 #define SBSDIO_FORCE_HT ( (uint32_t)0x02 ) /* Force HT request to backplane */ 199 #define SBSDIO_FORCE_ILP ( (uint32_t)0x04 ) /* Force ILP request to backplane */ 200 #define SBSDIO_ALP_AVAIL_REQ ( (uint32_t)0x08 ) /* Make ALP ready (power up xtal) */ 201 #define SBSDIO_HT_AVAIL_REQ ( (uint32_t)0x10 ) /* Make HT ready (power up PLL) */ 202 #define SBSDIO_FORCE_HW_CLKREQ_OFF ( (uint32_t)0x20 ) /* Squelch clock requests from HW */ 203 #define SBSDIO_ALP_AVAIL ( (uint32_t)0x40 ) /* Status: ALP is ready */ 204 #define SBSDIO_HT_AVAIL ( (uint32_t)0x80 ) /* Status: HT is ready */ 205 #define SBSDIO_Rev8_HT_AVAIL ( (uint32_t)0x40 ) 206 #define SBSDIO_Rev8_ALP_AVAIL ( (uint32_t)0x80 ) 207 208 /* SDIO_FRAME_CONTROL Bits */ 209 #define SFC_RF_TERM ( (uint32_t)(1 << 0) ) /* Read Frame Terminate */ 210 #define SFC_WF_TERM ( (uint32_t)(1 << 1) ) /* Write Frame Terminate */ 211 #define SFC_CRC4WOOS ( (uint32_t)(1 << 2) ) /* HW reports CRC error for write out of sync */ 212 #define SFC_ABORTALL ( (uint32_t)(1 << 3) ) /* Abort cancels all in-progress frames */ 213 214 /* SDIO_TO_SB_MAILBOX bits corresponding to intstatus bits */ 215 #define SMB_NAK ( (uint32_t)(1 << 0) ) /* To SB Mailbox Frame NAK */ 216 #define SMB_INT_ACK ( (uint32_t)(1 << 1) ) /* To SB Mailbox Host Interrupt ACK */ 217 #define SMB_USE_OOB ( (uint32_t)(1 << 2) ) /* To SB Mailbox Use OOB Wakeup */ 218 #define SMB_DEV_INT ( (uint32_t)(1 << 3) ) /* To SB Mailbox Miscellaneous Interrupt */ 219 220 /* SDIO_WAKEUP_CTRL bits */ 221 #define SBSDIO_WCTRL_WAKE_TILL_ALP_AVAIL ( (uint32_t)(1 << 0) ) /* WakeTillAlpAvail bit */ 222 #define SBSDIO_WCTRL_WAKE_TILL_HT_AVAIL ( (uint32_t)(1 << 1) ) /* WakeTillHTAvail bit */ 223 224 /* SDIO_SLEEP_CSR bits */ 225 #define SBSDIO_SLPCSR_KEEP_SDIO_ON ( (uint32_t)(1 << 0) ) /* KeepSdioOn bit */ 226 #define SBSDIO_SLPCSR_DEVICE_ON ( (uint32_t)(1 << 1) ) /* DeviceOn bit */ 227 228 /* To hostmail box data */ 229 #define I_HMB_DATA_NAKHANDLED 0x0001 /* retransmit NAK'd frame */ 230 #define I_HMB_DATA_DEVREADY 0x0002 /* talk to host after enable */ 231 #define I_HMB_DATA_FC 0x0004 /* per prio flowcontrol update flag */ 232 #define I_HMB_DATA_FWREADY 0x0008 /* fw ready for protocol activity */ 233 #define I_HMB_DATA_FWHALT 0x0010 /* firmware halted */ 234 235 #ifdef __cplusplus 236 } /* extern "C" */ 237 #endif 238 239 #endif /* ifndef INCLUDED_WHD_SDIO_H_ */ 240