1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * SDIO spec header file 3*4882a593Smuzhiyun * Protocol and standard (common) device definitions 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (C) 1999-2017, Broadcom Corporation 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 10*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 11*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 12*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 13*4882a593Smuzhiyun * following added to such license: 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 16*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 17*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 18*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 19*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 20*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 21*4882a593Smuzhiyun * modifications of the software. 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun * Notwithstanding the above, under no circumstances may you combine this 24*4882a593Smuzhiyun * software in any way with any other Broadcom software provided under a license 25*4882a593Smuzhiyun * other than the GPL, without Broadcom's express prior written consent. 26*4882a593Smuzhiyun * 27*4882a593Smuzhiyun * 28*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Open:>> 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun * $Id: sdio.h 689948 2017-03-14 05:21:03Z $ 31*4882a593Smuzhiyun */ 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #ifndef _SDIO_H 34*4882a593Smuzhiyun #define _SDIO_H 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifdef BCMSDIO 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* CCCR structure for function 0 */ 39*4882a593Smuzhiyun typedef volatile struct { 40*4882a593Smuzhiyun uint8 cccr_sdio_rev; /* RO, cccr and sdio revision */ 41*4882a593Smuzhiyun uint8 sd_rev; /* RO, sd spec revision */ 42*4882a593Smuzhiyun uint8 io_en; /* I/O enable */ 43*4882a593Smuzhiyun uint8 io_rdy; /* I/O ready reg */ 44*4882a593Smuzhiyun uint8 intr_ctl; /* Master and per function interrupt enable control */ 45*4882a593Smuzhiyun uint8 intr_status; /* RO, interrupt pending status */ 46*4882a593Smuzhiyun uint8 io_abort; /* read/write abort or reset all functions */ 47*4882a593Smuzhiyun uint8 bus_inter; /* bus interface control */ 48*4882a593Smuzhiyun uint8 capability; /* RO, card capability */ 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun uint8 cis_base_low; /* 0x9 RO, common CIS base address, LSB */ 51*4882a593Smuzhiyun uint8 cis_base_mid; 52*4882a593Smuzhiyun uint8 cis_base_high; /* 0xB RO, common CIS base address, MSB */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* suspend/resume registers */ 55*4882a593Smuzhiyun uint8 bus_suspend; /* 0xC */ 56*4882a593Smuzhiyun uint8 func_select; /* 0xD */ 57*4882a593Smuzhiyun uint8 exec_flag; /* 0xE */ 58*4882a593Smuzhiyun uint8 ready_flag; /* 0xF */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun uint8 fn0_blk_size[2]; /* 0x10(LSB), 0x11(MSB) */ 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun uint8 power_control; /* 0x12 (SDIO version 1.10) */ 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun uint8 speed_control; /* 0x13 */ 65*4882a593Smuzhiyun } sdio_regs_t; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* SDIO Device CCCR offsets */ 68*4882a593Smuzhiyun #define SDIOD_CCCR_REV 0x00 69*4882a593Smuzhiyun #define SDIOD_CCCR_SDREV 0x01 70*4882a593Smuzhiyun #define SDIOD_CCCR_IOEN 0x02 71*4882a593Smuzhiyun #define SDIOD_CCCR_IORDY 0x03 72*4882a593Smuzhiyun #define SDIOD_CCCR_INTEN 0x04 73*4882a593Smuzhiyun #define SDIOD_CCCR_INTPEND 0x05 74*4882a593Smuzhiyun #define SDIOD_CCCR_IOABORT 0x06 75*4882a593Smuzhiyun #define SDIOD_CCCR_BICTRL 0x07 76*4882a593Smuzhiyun #define SDIOD_CCCR_CAPABLITIES 0x08 77*4882a593Smuzhiyun #define SDIOD_CCCR_CISPTR_0 0x09 78*4882a593Smuzhiyun #define SDIOD_CCCR_CISPTR_1 0x0A 79*4882a593Smuzhiyun #define SDIOD_CCCR_CISPTR_2 0x0B 80*4882a593Smuzhiyun #define SDIOD_CCCR_BUSSUSP 0x0C 81*4882a593Smuzhiyun #define SDIOD_CCCR_FUNCSEL 0x0D 82*4882a593Smuzhiyun #define SDIOD_CCCR_EXECFLAGS 0x0E 83*4882a593Smuzhiyun #define SDIOD_CCCR_RDYFLAGS 0x0F 84*4882a593Smuzhiyun #define SDIOD_CCCR_BLKSIZE_0 0x10 85*4882a593Smuzhiyun #define SDIOD_CCCR_BLKSIZE_1 0x11 86*4882a593Smuzhiyun #define SDIOD_CCCR_POWER_CONTROL 0x12 87*4882a593Smuzhiyun #define SDIOD_CCCR_SPEED_CONTROL 0x13 88*4882a593Smuzhiyun #define SDIOD_CCCR_UHSI_SUPPORT 0x14 89*4882a593Smuzhiyun #define SDIOD_CCCR_DRIVER_STRENGTH 0x15 90*4882a593Smuzhiyun #define SDIOD_CCCR_INTR_EXTN 0x16 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* Broadcom extensions (corerev >= 1) */ 93*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP 0xf0 94*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP_CMD14_SUPPORT 0x02 95*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP_CMD14_EXT 0x04 96*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP_CMD_NODEC 0x08 97*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP_CHIPID_PRESENT 0x40 98*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCAP_SECURE_MODE 0x80 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CARDCTL 0xf1 101*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_CISLOADED 0x1 102*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_WLANRST_ONF0ABORT 0x2 103*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_SDIORST_ONWLANRST 0x20 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define SDIOD_CCCR_BRCM_SEPINT 0xf2 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* cccr_sdio_rev */ 108*4882a593Smuzhiyun #define SDIO_REV_SDIOID_MASK 0xf0 /* SDIO spec revision number */ 109*4882a593Smuzhiyun #define SDIO_REV_CCCRID_MASK 0x0f /* CCCR format version number */ 110*4882a593Smuzhiyun #define SDIO_SPEC_VERSION_3_0 0x40 /* SDIO spec version 3.0 */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* sd_rev */ 113*4882a593Smuzhiyun #define SD_REV_PHY_MASK 0x0f /* SD format version number */ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* io_en */ 116*4882a593Smuzhiyun #define SDIO_FUNC_ENABLE_1 0x02 /* function 1 I/O enable */ 117*4882a593Smuzhiyun #define SDIO_FUNC_ENABLE_2 0x04 /* function 2 I/O enable */ 118*4882a593Smuzhiyun #if defined(BT_OVER_SDIO) 119*4882a593Smuzhiyun #define SDIO_FUNC_ENABLE_3 0x08 /* function 2 I/O enable */ 120*4882a593Smuzhiyun #define SDIO_FUNC_DISABLE_3 0xF0 /* function 2 I/O enable */ 121*4882a593Smuzhiyun #endif /* defined (BT_OVER_SDIO) */ 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* io_rdys */ 124*4882a593Smuzhiyun #define SDIO_FUNC_READY_1 0x02 /* function 1 I/O ready */ 125*4882a593Smuzhiyun #define SDIO_FUNC_READY_2 0x04 /* function 2 I/O ready */ 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /* intr_ctl */ 128*4882a593Smuzhiyun #define INTR_CTL_MASTER_EN 0x1 /* interrupt enable master */ 129*4882a593Smuzhiyun #define INTR_CTL_FUNC1_EN 0x2 /* interrupt enable for function 1 */ 130*4882a593Smuzhiyun #define INTR_CTL_FUNC2_EN 0x4 /* interrupt enable for function 2 */ 131*4882a593Smuzhiyun #if defined(BT_OVER_SDIO) 132*4882a593Smuzhiyun #define INTR_CTL_FUNC3_EN 0x8 /* interrupt enable for function 3 */ 133*4882a593Smuzhiyun #endif /* defined (BT_OVER_SDIO) */ 134*4882a593Smuzhiyun /* intr_status */ 135*4882a593Smuzhiyun #define INTR_STATUS_FUNC1 0x2 /* interrupt pending for function 1 */ 136*4882a593Smuzhiyun #define INTR_STATUS_FUNC2 0x4 /* interrupt pending for function 2 */ 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /* io_abort */ 139*4882a593Smuzhiyun #define IO_ABORT_RESET_ALL 0x08 /* I/O card reset */ 140*4882a593Smuzhiyun #define IO_ABORT_FUNC_MASK 0x07 /* abort selction: function x */ 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* bus_inter */ 143*4882a593Smuzhiyun #define BUS_CARD_DETECT_DIS 0x80 /* Card Detect disable */ 144*4882a593Smuzhiyun #define BUS_SPI_CONT_INTR_CAP 0x40 /* support continuous SPI interrupt */ 145*4882a593Smuzhiyun #define BUS_SPI_CONT_INTR_EN 0x20 /* continuous SPI interrupt enable */ 146*4882a593Smuzhiyun #define BUS_SD_DATA_WIDTH_MASK 0x03 /* bus width mask */ 147*4882a593Smuzhiyun #define BUS_SD_DATA_WIDTH_4BIT 0x02 /* bus width 4-bit mode */ 148*4882a593Smuzhiyun #define BUS_SD_DATA_WIDTH_1BIT 0x00 /* bus width 1-bit mode */ 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* capability */ 151*4882a593Smuzhiyun #define SDIO_CAP_4BLS 0x80 /* 4-bit support for low speed card */ 152*4882a593Smuzhiyun #define SDIO_CAP_LSC 0x40 /* low speed card */ 153*4882a593Smuzhiyun #define SDIO_CAP_E4MI 0x20 /* enable interrupt between block of data in 4-bit mode */ 154*4882a593Smuzhiyun #define SDIO_CAP_S4MI 0x10 /* support interrupt between block of data in 4-bit mode */ 155*4882a593Smuzhiyun #define SDIO_CAP_SBS 0x08 /* support suspend/resume */ 156*4882a593Smuzhiyun #define SDIO_CAP_SRW 0x04 /* support read wait */ 157*4882a593Smuzhiyun #define SDIO_CAP_SMB 0x02 /* support multi-block transfer */ 158*4882a593Smuzhiyun #define SDIO_CAP_SDC 0x01 /* Support Direct commands during multi-byte transfer */ 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* power_control */ 161*4882a593Smuzhiyun #define SDIO_POWER_SMPC 0x01 /* supports master power control (RO) */ 162*4882a593Smuzhiyun #define SDIO_POWER_EMPC 0x02 /* enable master power control (allow > 200mA) (RW) */ 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun /* speed_control (control device entry into high-speed clocking mode) */ 165*4882a593Smuzhiyun #define SDIO_SPEED_SHS 0x01 /* supports high-speed [clocking] mode (RO) */ 166*4882a593Smuzhiyun #define SDIO_SPEED_EHS 0x02 /* enable high-speed [clocking] mode (RW) */ 167*4882a593Smuzhiyun #define SDIO_SPEED_UHSI_DDR50 0x08 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /* for setting bus speed in card: 0x13h */ 170*4882a593Smuzhiyun #define SDIO_BUS_SPEED_UHSISEL_M BITFIELD_MASK(3) 171*4882a593Smuzhiyun #define SDIO_BUS_SPEED_UHSISEL_S 1 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* for getting bus speed cap in card: 0x14h */ 174*4882a593Smuzhiyun #define SDIO_BUS_SPEED_UHSICAP_M BITFIELD_MASK(3) 175*4882a593Smuzhiyun #define SDIO_BUS_SPEED_UHSICAP_S 0 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun /* for getting driver type CAP in card: 0x15h */ 178*4882a593Smuzhiyun #define SDIO_BUS_DRVR_TYPE_CAP_M BITFIELD_MASK(3) 179*4882a593Smuzhiyun #define SDIO_BUS_DRVR_TYPE_CAP_S 0 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* for setting driver type selection in card: 0x15h */ 182*4882a593Smuzhiyun #define SDIO_BUS_DRVR_TYPE_SEL_M BITFIELD_MASK(2) 183*4882a593Smuzhiyun #define SDIO_BUS_DRVR_TYPE_SEL_S 4 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* for getting async int support in card: 0x16h */ 186*4882a593Smuzhiyun #define SDIO_BUS_ASYNCINT_CAP_M BITFIELD_MASK(1) 187*4882a593Smuzhiyun #define SDIO_BUS_ASYNCINT_CAP_S 0 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun /* for setting async int selection in card: 0x16h */ 190*4882a593Smuzhiyun #define SDIO_BUS_ASYNCINT_SEL_M BITFIELD_MASK(1) 191*4882a593Smuzhiyun #define SDIO_BUS_ASYNCINT_SEL_S 1 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* brcm sepint */ 194*4882a593Smuzhiyun #define SDIO_SEPINT_MASK 0x01 /* route sdpcmdev intr onto separate pad (chip-specific) */ 195*4882a593Smuzhiyun #define SDIO_SEPINT_OE 0x02 /* 1 asserts output enable for above pad */ 196*4882a593Smuzhiyun #define SDIO_SEPINT_ACT_HI 0x04 /* use active high interrupt level instead of active low */ 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /* FBR structure for function 1-7, FBR addresses and register offsets */ 199*4882a593Smuzhiyun typedef volatile struct { 200*4882a593Smuzhiyun uint8 devctr; /* device interface, CSA control */ 201*4882a593Smuzhiyun uint8 ext_dev; /* extended standard I/O device type code */ 202*4882a593Smuzhiyun uint8 pwr_sel; /* power selection support */ 203*4882a593Smuzhiyun uint8 PAD[6]; /* reserved */ 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun uint8 cis_low; /* CIS LSB */ 206*4882a593Smuzhiyun uint8 cis_mid; 207*4882a593Smuzhiyun uint8 cis_high; /* CIS MSB */ 208*4882a593Smuzhiyun uint8 csa_low; /* code storage area, LSB */ 209*4882a593Smuzhiyun uint8 csa_mid; 210*4882a593Smuzhiyun uint8 csa_high; /* code storage area, MSB */ 211*4882a593Smuzhiyun uint8 csa_dat_win; /* data access window to function */ 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun uint8 fnx_blk_size[2]; /* block size, little endian */ 214*4882a593Smuzhiyun } sdio_fbr_t; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun /* Maximum number of I/O funcs */ 217*4882a593Smuzhiyun #define SDIOD_MAX_FUNCS 8 218*4882a593Smuzhiyun #define SDIOD_MAX_IOFUNCS 7 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun /* SDIO Device FBR Start Address */ 221*4882a593Smuzhiyun #define SDIOD_FBR_STARTADDR 0x100 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun /* SDIO Device FBR Size */ 224*4882a593Smuzhiyun #define SDIOD_FBR_SIZE 0x100 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /* Macro to calculate FBR register base */ 227*4882a593Smuzhiyun #define SDIOD_FBR_BASE(n) ((n) * 0x100) 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun /* Function register offsets */ 230*4882a593Smuzhiyun #define SDIOD_FBR_DEVCTR 0x00 /* basic info for function */ 231*4882a593Smuzhiyun #define SDIOD_FBR_EXT_DEV 0x01 /* extended I/O device code */ 232*4882a593Smuzhiyun #define SDIOD_FBR_PWR_SEL 0x02 /* power selection bits */ 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /* SDIO Function CIS ptr offset */ 235*4882a593Smuzhiyun #define SDIOD_FBR_CISPTR_0 0x09 236*4882a593Smuzhiyun #define SDIOD_FBR_CISPTR_1 0x0A 237*4882a593Smuzhiyun #define SDIOD_FBR_CISPTR_2 0x0B 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* Code Storage Area pointer */ 240*4882a593Smuzhiyun #define SDIOD_FBR_CSA_ADDR_0 0x0C 241*4882a593Smuzhiyun #define SDIOD_FBR_CSA_ADDR_1 0x0D 242*4882a593Smuzhiyun #define SDIOD_FBR_CSA_ADDR_2 0x0E 243*4882a593Smuzhiyun #define SDIOD_FBR_CSA_DATA 0x0F 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /* SDIO Function I/O Block Size */ 246*4882a593Smuzhiyun #define SDIOD_FBR_BLKSIZE_0 0x10 247*4882a593Smuzhiyun #define SDIOD_FBR_BLKSIZE_1 0x11 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun /* devctr */ 250*4882a593Smuzhiyun #define SDIOD_FBR_DEVCTR_DIC 0x0f /* device interface code */ 251*4882a593Smuzhiyun #define SDIOD_FBR_DECVTR_CSA 0x40 /* CSA support flag */ 252*4882a593Smuzhiyun #define SDIOD_FBR_DEVCTR_CSA_EN 0x80 /* CSA enabled */ 253*4882a593Smuzhiyun /* interface codes */ 254*4882a593Smuzhiyun #define SDIOD_DIC_NONE 0 /* SDIO standard interface is not supported */ 255*4882a593Smuzhiyun #define SDIOD_DIC_UART 1 256*4882a593Smuzhiyun #define SDIOD_DIC_BLUETOOTH_A 2 257*4882a593Smuzhiyun #define SDIOD_DIC_BLUETOOTH_B 3 258*4882a593Smuzhiyun #define SDIOD_DIC_GPS 4 259*4882a593Smuzhiyun #define SDIOD_DIC_CAMERA 5 260*4882a593Smuzhiyun #define SDIOD_DIC_PHS 6 261*4882a593Smuzhiyun #define SDIOD_DIC_WLAN 7 262*4882a593Smuzhiyun #define SDIOD_DIC_EXT 0xf /* extended device interface, read ext_dev register */ 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun /* pwr_sel */ 265*4882a593Smuzhiyun #define SDIOD_PWR_SEL_SPS 0x01 /* supports power selection */ 266*4882a593Smuzhiyun #define SDIOD_PWR_SEL_EPS 0x02 /* enable power selection (low-current mode) */ 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun /* misc defines */ 269*4882a593Smuzhiyun #define SDIO_FUNC_0 0 270*4882a593Smuzhiyun #define SDIO_FUNC_1 1 271*4882a593Smuzhiyun #define SDIO_FUNC_2 2 272*4882a593Smuzhiyun #define SDIO_FUNC_4 4 273*4882a593Smuzhiyun #define SDIO_FUNC_5 5 274*4882a593Smuzhiyun #define SDIO_FUNC_6 6 275*4882a593Smuzhiyun #define SDIO_FUNC_7 7 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun #define SD_CARD_TYPE_UNKNOWN 0 /* bad type or unrecognized */ 278*4882a593Smuzhiyun #define SD_CARD_TYPE_IO 1 /* IO only card */ 279*4882a593Smuzhiyun #define SD_CARD_TYPE_MEMORY 2 /* memory only card */ 280*4882a593Smuzhiyun #define SD_CARD_TYPE_COMBO 3 /* IO and memory combo card */ 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun #define SDIO_MAX_BLOCK_SIZE 2048 /* maximum block size for block mode operation */ 283*4882a593Smuzhiyun #define SDIO_MIN_BLOCK_SIZE 1 /* minimum block size for block mode operation */ 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun /* Card registers: status bit position */ 286*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_OUTOFRANGE 31 287*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_COMCRCERROR 23 288*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_ILLEGALCOMMAND 22 289*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_ERROR 19 290*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_IOCURRENTSTATE3 12 291*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_IOCURRENTSTATE2 11 292*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_IOCURRENTSTATE1 10 293*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_IOCURRENTSTATE0 9 294*4882a593Smuzhiyun #define CARDREG_STATUS_BIT_FUN_NUM_ERROR 4 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun #define SD_CMD_GO_IDLE_STATE 0 /* mandatory for SDIO */ 297*4882a593Smuzhiyun #define SD_CMD_SEND_OPCOND 1 298*4882a593Smuzhiyun #define SD_CMD_MMC_SET_RCA 3 299*4882a593Smuzhiyun #define SD_CMD_IO_SEND_OP_COND 5 /* mandatory for SDIO */ 300*4882a593Smuzhiyun #define SD_CMD_SELECT_DESELECT_CARD 7 301*4882a593Smuzhiyun #define SD_CMD_SEND_CSD 9 302*4882a593Smuzhiyun #define SD_CMD_SEND_CID 10 303*4882a593Smuzhiyun #define SD_CMD_STOP_TRANSMISSION 12 304*4882a593Smuzhiyun #define SD_CMD_SEND_STATUS 13 305*4882a593Smuzhiyun #define SD_CMD_GO_INACTIVE_STATE 15 306*4882a593Smuzhiyun #define SD_CMD_SET_BLOCKLEN 16 307*4882a593Smuzhiyun #define SD_CMD_READ_SINGLE_BLOCK 17 308*4882a593Smuzhiyun #define SD_CMD_READ_MULTIPLE_BLOCK 18 309*4882a593Smuzhiyun #define SD_CMD_WRITE_BLOCK 24 310*4882a593Smuzhiyun #define SD_CMD_WRITE_MULTIPLE_BLOCK 25 311*4882a593Smuzhiyun #define SD_CMD_PROGRAM_CSD 27 312*4882a593Smuzhiyun #define SD_CMD_SET_WRITE_PROT 28 313*4882a593Smuzhiyun #define SD_CMD_CLR_WRITE_PROT 29 314*4882a593Smuzhiyun #define SD_CMD_SEND_WRITE_PROT 30 315*4882a593Smuzhiyun #define SD_CMD_ERASE_WR_BLK_START 32 316*4882a593Smuzhiyun #define SD_CMD_ERASE_WR_BLK_END 33 317*4882a593Smuzhiyun #define SD_CMD_ERASE 38 318*4882a593Smuzhiyun #define SD_CMD_LOCK_UNLOCK 42 319*4882a593Smuzhiyun #define SD_CMD_IO_RW_DIRECT 52 /* mandatory for SDIO */ 320*4882a593Smuzhiyun #define SD_CMD_IO_RW_EXTENDED 53 /* mandatory for SDIO */ 321*4882a593Smuzhiyun #define SD_CMD_APP_CMD 55 322*4882a593Smuzhiyun #define SD_CMD_GEN_CMD 56 323*4882a593Smuzhiyun #define SD_CMD_READ_OCR 58 324*4882a593Smuzhiyun #define SD_CMD_CRC_ON_OFF 59 /* mandatory for SDIO */ 325*4882a593Smuzhiyun #define SD_ACMD_SD_STATUS 13 326*4882a593Smuzhiyun #define SD_ACMD_SEND_NUM_WR_BLOCKS 22 327*4882a593Smuzhiyun #define SD_ACMD_SET_WR_BLOCK_ERASE_CNT 23 328*4882a593Smuzhiyun #define SD_ACMD_SD_SEND_OP_COND 41 329*4882a593Smuzhiyun #define SD_ACMD_SET_CLR_CARD_DETECT 42 330*4882a593Smuzhiyun #define SD_ACMD_SEND_SCR 51 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun /* argument for SD_CMD_IO_RW_DIRECT and SD_CMD_IO_RW_EXTENDED */ 333*4882a593Smuzhiyun #define SD_IO_OP_READ 0 /* Read_Write: Read */ 334*4882a593Smuzhiyun #define SD_IO_OP_WRITE 1 /* Read_Write: Write */ 335*4882a593Smuzhiyun #define SD_IO_RW_NORMAL 0 /* no RAW */ 336*4882a593Smuzhiyun #define SD_IO_RW_RAW 1 /* RAW */ 337*4882a593Smuzhiyun #define SD_IO_BYTE_MODE 0 /* Byte Mode */ 338*4882a593Smuzhiyun #define SD_IO_BLOCK_MODE 1 /* BlockMode */ 339*4882a593Smuzhiyun #define SD_IO_FIXED_ADDRESS 0 /* fix Address */ 340*4882a593Smuzhiyun #define SD_IO_INCREMENT_ADDRESS 1 /* IncrementAddress */ 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun /* build SD_CMD_IO_RW_DIRECT Argument */ 343*4882a593Smuzhiyun #define SDIO_IO_RW_DIRECT_ARG(rw, raw, func, addr, data) \ 344*4882a593Smuzhiyun ((((rw) & 1) << 31) | (((func) & 0x7) << 28) | (((raw) & 1) << 27) | \ 345*4882a593Smuzhiyun (((addr) & 0x1FFFF) << 9) | ((data) & 0xFF)) 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun /* build SD_CMD_IO_RW_EXTENDED Argument */ 348*4882a593Smuzhiyun #define SDIO_IO_RW_EXTENDED_ARG(rw, blk, func, addr, inc_addr, count) \ 349*4882a593Smuzhiyun ((((rw) & 1) << 31) | (((func) & 0x7) << 28) | (((blk) & 1) << 27) | \ 350*4882a593Smuzhiyun (((inc_addr) & 1) << 26) | (((addr) & 0x1FFFF) << 9) | ((count) & 0x1FF)) 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun /* SDIO response parameters */ 353*4882a593Smuzhiyun #define SD_RSP_NO_NONE 0 354*4882a593Smuzhiyun #define SD_RSP_NO_1 1 355*4882a593Smuzhiyun #define SD_RSP_NO_2 2 356*4882a593Smuzhiyun #define SD_RSP_NO_3 3 357*4882a593Smuzhiyun #define SD_RSP_NO_4 4 358*4882a593Smuzhiyun #define SD_RSP_NO_5 5 359*4882a593Smuzhiyun #define SD_RSP_NO_6 6 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun /* Modified R6 response (to CMD3) */ 362*4882a593Smuzhiyun #define SD_RSP_MR6_COM_CRC_ERROR 0x8000 363*4882a593Smuzhiyun #define SD_RSP_MR6_ILLEGAL_COMMAND 0x4000 364*4882a593Smuzhiyun #define SD_RSP_MR6_ERROR 0x2000 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun /* Modified R1 in R4 Response (to CMD5) */ 367*4882a593Smuzhiyun #define SD_RSP_MR1_SBIT 0x80 368*4882a593Smuzhiyun #define SD_RSP_MR1_PARAMETER_ERROR 0x40 369*4882a593Smuzhiyun #define SD_RSP_MR1_RFU5 0x20 370*4882a593Smuzhiyun #define SD_RSP_MR1_FUNC_NUM_ERROR 0x10 371*4882a593Smuzhiyun #define SD_RSP_MR1_COM_CRC_ERROR 0x08 372*4882a593Smuzhiyun #define SD_RSP_MR1_ILLEGAL_COMMAND 0x04 373*4882a593Smuzhiyun #define SD_RSP_MR1_RFU1 0x02 374*4882a593Smuzhiyun #define SD_RSP_MR1_IDLE_STATE 0x01 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun /* R5 response (to CMD52 and CMD53) */ 377*4882a593Smuzhiyun #define SD_RSP_R5_COM_CRC_ERROR 0x80 378*4882a593Smuzhiyun #define SD_RSP_R5_ILLEGAL_COMMAND 0x40 379*4882a593Smuzhiyun #define SD_RSP_R5_IO_CURRENTSTATE1 0x20 380*4882a593Smuzhiyun #define SD_RSP_R5_IO_CURRENTSTATE0 0x10 381*4882a593Smuzhiyun #define SD_RSP_R5_ERROR 0x08 382*4882a593Smuzhiyun #define SD_RSP_R5_RFU 0x04 383*4882a593Smuzhiyun #define SD_RSP_R5_FUNC_NUM_ERROR 0x02 384*4882a593Smuzhiyun #define SD_RSP_R5_OUT_OF_RANGE 0x01 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun #define SD_RSP_R5_ERRBITS 0xCB 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun /* ------------------------------------------------ 389*4882a593Smuzhiyun * SDIO Commands and responses 390*4882a593Smuzhiyun * 391*4882a593Smuzhiyun * I/O only commands are: 392*4882a593Smuzhiyun * CMD0, CMD3, CMD5, CMD7, CMD14, CMD15, CMD52, CMD53 393*4882a593Smuzhiyun * ------------------------------------------------ 394*4882a593Smuzhiyun */ 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun /* SDIO Commands */ 397*4882a593Smuzhiyun #define SDIOH_CMD_0 0 398*4882a593Smuzhiyun #define SDIOH_CMD_3 3 399*4882a593Smuzhiyun #define SDIOH_CMD_5 5 400*4882a593Smuzhiyun #define SDIOH_CMD_7 7 401*4882a593Smuzhiyun #define SDIOH_CMD_11 11 402*4882a593Smuzhiyun #define SDIOH_CMD_14 14 403*4882a593Smuzhiyun #define SDIOH_CMD_15 15 404*4882a593Smuzhiyun #define SDIOH_CMD_19 19 405*4882a593Smuzhiyun #define SDIOH_CMD_52 52 406*4882a593Smuzhiyun #define SDIOH_CMD_53 53 407*4882a593Smuzhiyun #define SDIOH_CMD_59 59 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun /* SDIO Command Responses */ 410*4882a593Smuzhiyun #define SDIOH_RSP_NONE 0 411*4882a593Smuzhiyun #define SDIOH_RSP_R1 1 412*4882a593Smuzhiyun #define SDIOH_RSP_R2 2 413*4882a593Smuzhiyun #define SDIOH_RSP_R3 3 414*4882a593Smuzhiyun #define SDIOH_RSP_R4 4 415*4882a593Smuzhiyun #define SDIOH_RSP_R5 5 416*4882a593Smuzhiyun #define SDIOH_RSP_R6 6 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun /* 419*4882a593Smuzhiyun * SDIO Response Error flags 420*4882a593Smuzhiyun */ 421*4882a593Smuzhiyun #define SDIOH_RSP5_ERROR_FLAGS 0xCB 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun /* ------------------------------------------------ 424*4882a593Smuzhiyun * SDIO Command structures. I/O only commands are: 425*4882a593Smuzhiyun * 426*4882a593Smuzhiyun * CMD0, CMD3, CMD5, CMD7, CMD15, CMD52, CMD53 427*4882a593Smuzhiyun * ------------------------------------------------ 428*4882a593Smuzhiyun */ 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun #define CMD5_OCR_M BITFIELD_MASK(24) 431*4882a593Smuzhiyun #define CMD5_OCR_S 0 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun #define CMD5_S18R_M BITFIELD_MASK(1) 434*4882a593Smuzhiyun #define CMD5_S18R_S 24 435*4882a593Smuzhiyun 436*4882a593Smuzhiyun #define CMD7_RCA_M BITFIELD_MASK(16) 437*4882a593Smuzhiyun #define CMD7_RCA_S 16 438*4882a593Smuzhiyun 439*4882a593Smuzhiyun #define CMD14_RCA_M BITFIELD_MASK(16) 440*4882a593Smuzhiyun #define CMD14_RCA_S 16 441*4882a593Smuzhiyun #define CMD14_SLEEP_M BITFIELD_MASK(1) 442*4882a593Smuzhiyun #define CMD14_SLEEP_S 15 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun #define CMD_15_RCA_M BITFIELD_MASK(16) 445*4882a593Smuzhiyun #define CMD_15_RCA_S 16 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun #define CMD52_DATA_M BITFIELD_MASK(8) /* Bits [7:0] - Write Data/Stuff bits of CMD52 448*4882a593Smuzhiyun */ 449*4882a593Smuzhiyun #define CMD52_DATA_S 0 450*4882a593Smuzhiyun #define CMD52_REG_ADDR_M BITFIELD_MASK(17) /* Bits [25:9] - register address */ 451*4882a593Smuzhiyun #define CMD52_REG_ADDR_S 9 452*4882a593Smuzhiyun #define CMD52_RAW_M BITFIELD_MASK(1) /* Bit 27 - Read after Write flag */ 453*4882a593Smuzhiyun #define CMD52_RAW_S 27 454*4882a593Smuzhiyun #define CMD52_FUNCTION_M BITFIELD_MASK(3) /* Bits [30:28] - Function number */ 455*4882a593Smuzhiyun #define CMD52_FUNCTION_S 28 456*4882a593Smuzhiyun #define CMD52_RW_FLAG_M BITFIELD_MASK(1) /* Bit 31 - R/W flag */ 457*4882a593Smuzhiyun #define CMD52_RW_FLAG_S 31 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun #define CMD53_BYTE_BLK_CNT_M BITFIELD_MASK(9) /* Bits [8:0] - Byte/Block Count of CMD53 */ 460*4882a593Smuzhiyun #define CMD53_BYTE_BLK_CNT_S 0 461*4882a593Smuzhiyun #define CMD53_REG_ADDR_M BITFIELD_MASK(17) /* Bits [25:9] - register address */ 462*4882a593Smuzhiyun #define CMD53_REG_ADDR_S 9 463*4882a593Smuzhiyun #define CMD53_OP_CODE_M BITFIELD_MASK(1) /* Bit 26 - R/W Operation Code */ 464*4882a593Smuzhiyun #define CMD53_OP_CODE_S 26 465*4882a593Smuzhiyun #define CMD53_BLK_MODE_M BITFIELD_MASK(1) /* Bit 27 - Block Mode */ 466*4882a593Smuzhiyun #define CMD53_BLK_MODE_S 27 467*4882a593Smuzhiyun #define CMD53_FUNCTION_M BITFIELD_MASK(3) /* Bits [30:28] - Function number */ 468*4882a593Smuzhiyun #define CMD53_FUNCTION_S 28 469*4882a593Smuzhiyun #define CMD53_RW_FLAG_M BITFIELD_MASK(1) /* Bit 31 - R/W flag */ 470*4882a593Smuzhiyun #define CMD53_RW_FLAG_S 31 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun /* ------------------------------------------------------ 473*4882a593Smuzhiyun * SDIO Command Response structures for SD1 and SD4 modes 474*4882a593Smuzhiyun * ----------------------------------------------------- 475*4882a593Smuzhiyun */ 476*4882a593Smuzhiyun #define RSP4_IO_OCR_M BITFIELD_MASK(24) /* Bits [23:0] - Card's OCR Bits [23:0] */ 477*4882a593Smuzhiyun #define RSP4_IO_OCR_S 0 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun #define RSP4_S18A_M BITFIELD_MASK(1) /* Bits [23:0] - Card's OCR Bits [23:0] */ 480*4882a593Smuzhiyun #define RSP4_S18A_S 24 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun #define RSP4_STUFF_M BITFIELD_MASK(3) /* Bits [26:24] - Stuff bits */ 483*4882a593Smuzhiyun #define RSP4_STUFF_S 24 484*4882a593Smuzhiyun #define RSP4_MEM_PRESENT_M BITFIELD_MASK(1) /* Bit 27 - Memory present */ 485*4882a593Smuzhiyun #define RSP4_MEM_PRESENT_S 27 486*4882a593Smuzhiyun #define RSP4_NUM_FUNCS_M BITFIELD_MASK(3) /* Bits [30:28] - Number of I/O funcs */ 487*4882a593Smuzhiyun #define RSP4_NUM_FUNCS_S 28 488*4882a593Smuzhiyun #define RSP4_CARD_READY_M BITFIELD_MASK(1) /* Bit 31 - SDIO card ready */ 489*4882a593Smuzhiyun #define RSP4_CARD_READY_S 31 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun #define RSP6_STATUS_M BITFIELD_MASK(16) /* Bits [15:0] - Card status bits [19,22,23,12:0] 492*4882a593Smuzhiyun */ 493*4882a593Smuzhiyun #define RSP6_STATUS_S 0 494*4882a593Smuzhiyun #define RSP6_IO_RCA_M BITFIELD_MASK(16) /* Bits [31:16] - RCA bits[31-16] */ 495*4882a593Smuzhiyun #define RSP6_IO_RCA_S 16 496*4882a593Smuzhiyun 497*4882a593Smuzhiyun #define RSP1_AKE_SEQ_ERROR_M BITFIELD_MASK(1) /* Bit 3 - Authentication seq error */ 498*4882a593Smuzhiyun #define RSP1_AKE_SEQ_ERROR_S 3 499*4882a593Smuzhiyun #define RSP1_APP_CMD_M BITFIELD_MASK(1) /* Bit 5 - Card expects ACMD */ 500*4882a593Smuzhiyun #define RSP1_APP_CMD_S 5 501*4882a593Smuzhiyun #define RSP1_READY_FOR_DATA_M BITFIELD_MASK(1) /* Bit 8 - Ready for data (buff empty) */ 502*4882a593Smuzhiyun #define RSP1_READY_FOR_DATA_S 8 503*4882a593Smuzhiyun #define RSP1_CURR_STATE_M BITFIELD_MASK(4) /* Bits [12:9] - State of card 504*4882a593Smuzhiyun * when Cmd was received 505*4882a593Smuzhiyun */ 506*4882a593Smuzhiyun #define RSP1_CURR_STATE_S 9 507*4882a593Smuzhiyun #define RSP1_EARSE_RESET_M BITFIELD_MASK(1) /* Bit 13 - Erase seq cleared */ 508*4882a593Smuzhiyun #define RSP1_EARSE_RESET_S 13 509*4882a593Smuzhiyun #define RSP1_CARD_ECC_DISABLE_M BITFIELD_MASK(1) /* Bit 14 - Card ECC disabled */ 510*4882a593Smuzhiyun #define RSP1_CARD_ECC_DISABLE_S 14 511*4882a593Smuzhiyun #define RSP1_WP_ERASE_SKIP_M BITFIELD_MASK(1) /* Bit 15 - Partial blocks erased due to W/P */ 512*4882a593Smuzhiyun #define RSP1_WP_ERASE_SKIP_S 15 513*4882a593Smuzhiyun #define RSP1_CID_CSD_OVERW_M BITFIELD_MASK(1) /* Bit 16 - Illegal write to CID or R/O bits 514*4882a593Smuzhiyun * of CSD 515*4882a593Smuzhiyun */ 516*4882a593Smuzhiyun #define RSP1_CID_CSD_OVERW_S 16 517*4882a593Smuzhiyun #define RSP1_ERROR_M BITFIELD_MASK(1) /* Bit 19 - General/Unknown error */ 518*4882a593Smuzhiyun #define RSP1_ERROR_S 19 519*4882a593Smuzhiyun #define RSP1_CC_ERROR_M BITFIELD_MASK(1) /* Bit 20 - Internal Card Control error */ 520*4882a593Smuzhiyun #define RSP1_CC_ERROR_S 20 521*4882a593Smuzhiyun #define RSP1_CARD_ECC_FAILED_M BITFIELD_MASK(1) /* Bit 21 - Card internal ECC failed 522*4882a593Smuzhiyun * to correct data 523*4882a593Smuzhiyun */ 524*4882a593Smuzhiyun #define RSP1_CARD_ECC_FAILED_S 21 525*4882a593Smuzhiyun #define RSP1_ILLEGAL_CMD_M BITFIELD_MASK(1) /* Bit 22 - Cmd not legal for the card state */ 526*4882a593Smuzhiyun #define RSP1_ILLEGAL_CMD_S 22 527*4882a593Smuzhiyun #define RSP1_COM_CRC_ERROR_M BITFIELD_MASK(1) /* Bit 23 - CRC check of previous command failed 528*4882a593Smuzhiyun */ 529*4882a593Smuzhiyun #define RSP1_COM_CRC_ERROR_S 23 530*4882a593Smuzhiyun #define RSP1_LOCK_UNLOCK_FAIL_M BITFIELD_MASK(1) /* Bit 24 - Card lock-unlock Cmd Seq error */ 531*4882a593Smuzhiyun #define RSP1_LOCK_UNLOCK_FAIL_S 24 532*4882a593Smuzhiyun #define RSP1_CARD_LOCKED_M BITFIELD_MASK(1) /* Bit 25 - Card locked by the host */ 533*4882a593Smuzhiyun #define RSP1_CARD_LOCKED_S 25 534*4882a593Smuzhiyun #define RSP1_WP_VIOLATION_M BITFIELD_MASK(1) /* Bit 26 - Attempt to program 535*4882a593Smuzhiyun * write-protected blocks 536*4882a593Smuzhiyun */ 537*4882a593Smuzhiyun #define RSP1_WP_VIOLATION_S 26 538*4882a593Smuzhiyun #define RSP1_ERASE_PARAM_M BITFIELD_MASK(1) /* Bit 27 - Invalid erase blocks */ 539*4882a593Smuzhiyun #define RSP1_ERASE_PARAM_S 27 540*4882a593Smuzhiyun #define RSP1_ERASE_SEQ_ERR_M BITFIELD_MASK(1) /* Bit 28 - Erase Cmd seq error */ 541*4882a593Smuzhiyun #define RSP1_ERASE_SEQ_ERR_S 28 542*4882a593Smuzhiyun #define RSP1_BLK_LEN_ERR_M BITFIELD_MASK(1) /* Bit 29 - Block length error */ 543*4882a593Smuzhiyun #define RSP1_BLK_LEN_ERR_S 29 544*4882a593Smuzhiyun #define RSP1_ADDR_ERR_M BITFIELD_MASK(1) /* Bit 30 - Misaligned address */ 545*4882a593Smuzhiyun #define RSP1_ADDR_ERR_S 30 546*4882a593Smuzhiyun #define RSP1_OUT_OF_RANGE_M BITFIELD_MASK(1) /* Bit 31 - Cmd arg was out of range */ 547*4882a593Smuzhiyun #define RSP1_OUT_OF_RANGE_S 31 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun #define RSP5_DATA_M BITFIELD_MASK(8) /* Bits [0:7] - data */ 550*4882a593Smuzhiyun #define RSP5_DATA_S 0 551*4882a593Smuzhiyun #define RSP5_FLAGS_M BITFIELD_MASK(8) /* Bit [15:8] - Rsp flags */ 552*4882a593Smuzhiyun #define RSP5_FLAGS_S 8 553*4882a593Smuzhiyun #define RSP5_STUFF_M BITFIELD_MASK(16) /* Bits [31:16] - Stuff bits */ 554*4882a593Smuzhiyun #define RSP5_STUFF_S 16 555*4882a593Smuzhiyun 556*4882a593Smuzhiyun /* ---------------------------------------------- 557*4882a593Smuzhiyun * SDIO Command Response structures for SPI mode 558*4882a593Smuzhiyun * ---------------------------------------------- 559*4882a593Smuzhiyun */ 560*4882a593Smuzhiyun #define SPIRSP4_IO_OCR_M BITFIELD_MASK(16) /* Bits [15:0] - Card's OCR Bits [23:8] */ 561*4882a593Smuzhiyun #define SPIRSP4_IO_OCR_S 0 562*4882a593Smuzhiyun #define SPIRSP4_STUFF_M BITFIELD_MASK(3) /* Bits [18:16] - Stuff bits */ 563*4882a593Smuzhiyun #define SPIRSP4_STUFF_S 16 564*4882a593Smuzhiyun #define SPIRSP4_MEM_PRESENT_M BITFIELD_MASK(1) /* Bit 19 - Memory present */ 565*4882a593Smuzhiyun #define SPIRSP4_MEM_PRESENT_S 19 566*4882a593Smuzhiyun #define SPIRSP4_NUM_FUNCS_M BITFIELD_MASK(3) /* Bits [22:20] - Number of I/O funcs */ 567*4882a593Smuzhiyun #define SPIRSP4_NUM_FUNCS_S 20 568*4882a593Smuzhiyun #define SPIRSP4_CARD_READY_M BITFIELD_MASK(1) /* Bit 23 - SDIO card ready */ 569*4882a593Smuzhiyun #define SPIRSP4_CARD_READY_S 23 570*4882a593Smuzhiyun #define SPIRSP4_IDLE_STATE_M BITFIELD_MASK(1) /* Bit 24 - idle state */ 571*4882a593Smuzhiyun #define SPIRSP4_IDLE_STATE_S 24 572*4882a593Smuzhiyun #define SPIRSP4_ILLEGAL_CMD_M BITFIELD_MASK(1) /* Bit 26 - Illegal Cmd error */ 573*4882a593Smuzhiyun #define SPIRSP4_ILLEGAL_CMD_S 26 574*4882a593Smuzhiyun #define SPIRSP4_COM_CRC_ERROR_M BITFIELD_MASK(1) /* Bit 27 - COM CRC error */ 575*4882a593Smuzhiyun #define SPIRSP4_COM_CRC_ERROR_S 27 576*4882a593Smuzhiyun #define SPIRSP4_FUNC_NUM_ERROR_M BITFIELD_MASK(1) /* Bit 28 - Function number error 577*4882a593Smuzhiyun */ 578*4882a593Smuzhiyun #define SPIRSP4_FUNC_NUM_ERROR_S 28 579*4882a593Smuzhiyun #define SPIRSP4_PARAM_ERROR_M BITFIELD_MASK(1) /* Bit 30 - Parameter Error Bit */ 580*4882a593Smuzhiyun #define SPIRSP4_PARAM_ERROR_S 30 581*4882a593Smuzhiyun #define SPIRSP4_START_BIT_M BITFIELD_MASK(1) /* Bit 31 - Start Bit */ 582*4882a593Smuzhiyun #define SPIRSP4_START_BIT_S 31 583*4882a593Smuzhiyun 584*4882a593Smuzhiyun #define SPIRSP5_DATA_M BITFIELD_MASK(8) /* Bits [23:16] - R/W Data */ 585*4882a593Smuzhiyun #define SPIRSP5_DATA_S 16 586*4882a593Smuzhiyun #define SPIRSP5_IDLE_STATE_M BITFIELD_MASK(1) /* Bit 24 - Idle state */ 587*4882a593Smuzhiyun #define SPIRSP5_IDLE_STATE_S 24 588*4882a593Smuzhiyun #define SPIRSP5_ILLEGAL_CMD_M BITFIELD_MASK(1) /* Bit 26 - Illegal Cmd error */ 589*4882a593Smuzhiyun #define SPIRSP5_ILLEGAL_CMD_S 26 590*4882a593Smuzhiyun #define SPIRSP5_COM_CRC_ERROR_M BITFIELD_MASK(1) /* Bit 27 - COM CRC error */ 591*4882a593Smuzhiyun #define SPIRSP5_COM_CRC_ERROR_S 27 592*4882a593Smuzhiyun #define SPIRSP5_FUNC_NUM_ERROR_M BITFIELD_MASK(1) /* Bit 28 - Function number error 593*4882a593Smuzhiyun */ 594*4882a593Smuzhiyun #define SPIRSP5_FUNC_NUM_ERROR_S 28 595*4882a593Smuzhiyun #define SPIRSP5_PARAM_ERROR_M BITFIELD_MASK(1) /* Bit 30 - Parameter Error Bit */ 596*4882a593Smuzhiyun #define SPIRSP5_PARAM_ERROR_S 30 597*4882a593Smuzhiyun #define SPIRSP5_START_BIT_M BITFIELD_MASK(1) /* Bit 31 - Start Bit */ 598*4882a593Smuzhiyun #define SPIRSP5_START_BIT_S 31 599*4882a593Smuzhiyun 600*4882a593Smuzhiyun /* RSP6 card status format; Pg 68 Physical Layer spec v 1.10 */ 601*4882a593Smuzhiyun #define RSP6STAT_AKE_SEQ_ERROR_M BITFIELD_MASK(1) /* Bit 3 - Authentication seq error 602*4882a593Smuzhiyun */ 603*4882a593Smuzhiyun #define RSP6STAT_AKE_SEQ_ERROR_S 3 604*4882a593Smuzhiyun #define RSP6STAT_APP_CMD_M BITFIELD_MASK(1) /* Bit 5 - Card expects ACMD */ 605*4882a593Smuzhiyun #define RSP6STAT_APP_CMD_S 5 606*4882a593Smuzhiyun #define RSP6STAT_READY_FOR_DATA_M BITFIELD_MASK(1) /* Bit 8 - Ready for data 607*4882a593Smuzhiyun * (buff empty) 608*4882a593Smuzhiyun */ 609*4882a593Smuzhiyun #define RSP6STAT_READY_FOR_DATA_S 8 610*4882a593Smuzhiyun #define RSP6STAT_CURR_STATE_M BITFIELD_MASK(4) /* Bits [12:9] - Card state at 611*4882a593Smuzhiyun * Cmd reception 612*4882a593Smuzhiyun */ 613*4882a593Smuzhiyun #define RSP6STAT_CURR_STATE_S 9 614*4882a593Smuzhiyun #define RSP6STAT_ERROR_M BITFIELD_MASK(1) /* Bit 13 - General/Unknown error Bit 19 615*4882a593Smuzhiyun */ 616*4882a593Smuzhiyun #define RSP6STAT_ERROR_S 13 617*4882a593Smuzhiyun #define RSP6STAT_ILLEGAL_CMD_M BITFIELD_MASK(1) /* Bit 14 - Illegal cmd for 618*4882a593Smuzhiyun * card state Bit 22 619*4882a593Smuzhiyun */ 620*4882a593Smuzhiyun #define RSP6STAT_ILLEGAL_CMD_S 14 621*4882a593Smuzhiyun #define RSP6STAT_COM_CRC_ERROR_M BITFIELD_MASK(1) /* Bit 15 - CRC previous command 622*4882a593Smuzhiyun * failed Bit 23 623*4882a593Smuzhiyun */ 624*4882a593Smuzhiyun #define RSP6STAT_COM_CRC_ERROR_S 15 625*4882a593Smuzhiyun 626*4882a593Smuzhiyun #define SDIOH_XFER_TYPE_READ SD_IO_OP_READ 627*4882a593Smuzhiyun #define SDIOH_XFER_TYPE_WRITE SD_IO_OP_WRITE 628*4882a593Smuzhiyun 629*4882a593Smuzhiyun /* command issue options */ 630*4882a593Smuzhiyun #define CMD_OPTION_DEFAULT 0 631*4882a593Smuzhiyun #define CMD_OPTION_TUNING 1 632*4882a593Smuzhiyun 633*4882a593Smuzhiyun /* SDIO message exchange registers */ 634*4882a593Smuzhiyun #define SDIO_FN1_MSG_H2D_REG0 0x10030 635*4882a593Smuzhiyun #define SDIO_FN1_MSG_H2D_REG1 0x10034 636*4882a593Smuzhiyun #define SDIO_FN1_MSG_D2H_REG0 0x10038 637*4882a593Smuzhiyun #define SDIO_FN1_MSG_D2H_REG1 0x1003c 638*4882a593Smuzhiyun 639*4882a593Smuzhiyun #define CFG_WRITE_BYTE_MASK 0xff 640*4882a593Smuzhiyun 641*4882a593Smuzhiyun #define HS_POLL_PERIOD_MS 10 642*4882a593Smuzhiyun #define D2H_READY_WD_RESET_MS 1 /* 1ms */ 643*4882a593Smuzhiyun #ifdef BCMQT 644*4882a593Smuzhiyun #define D2H_READY_TIMEOUT_MS (1000 * 60 * 3) /* 3 Mins >~ FW download time */ 645*4882a593Smuzhiyun #define D2H_VALDN_DONE_TIMEOUT_MS (1000 * 60 * 5) /* 5 Mins >~ Validation time */ 646*4882a593Smuzhiyun #define D2H_TRX_HDR_PARSE_DONE_TIMEOUT_MS (1000 * 60 * 1) /* 1 Mins >~ TRX Parsing */ 647*4882a593Smuzhiyun #define D2H_READY_WD_RESET_COUNT (84 * 1000) /* ~84secs >~ BL ready time after wd rst */ 648*4882a593Smuzhiyun #define D2H_READY_WD_RESET_DBG_PRINT_MS (1000) /* 1000ms - DEBUG print at every 1000ms */ 649*4882a593Smuzhiyun #else 650*4882a593Smuzhiyun #define D2H_READY_TIMEOUT_MS (100) /* 100ms >~ FW download time */ 651*4882a593Smuzhiyun #define D2H_VALDN_DONE_TIMEOUT_MS (250) /* 250ms >~ Validation time */ 652*4882a593Smuzhiyun #define D2H_TRX_HDR_PARSE_DONE_TIMEOUT_MS (50) /* 50ms >~ TRX Parsing */ 653*4882a593Smuzhiyun #define D2H_READY_WD_RESET_COUNT (200) /* ~200ms >~ BL ready time after wd rst */ 654*4882a593Smuzhiyun #define D2H_READY_WD_RESET_DBG_PRINT_MS (10) /* 10ms - DEBUG print at evry 10ms */ 655*4882a593Smuzhiyun #endif // endif 656*4882a593Smuzhiyun 657*4882a593Smuzhiyun typedef struct bl_hs_address { 658*4882a593Smuzhiyun volatile void *d2h; 659*4882a593Smuzhiyun volatile void *h2d; 660*4882a593Smuzhiyun } hs_addrs_t; 661*4882a593Smuzhiyun 662*4882a593Smuzhiyun /* [D2H] Dongle to host handshake bits shift */ 663*4882a593Smuzhiyun enum { 664*4882a593Smuzhiyun D2H_START_SHIFT = 0, 665*4882a593Smuzhiyun D2H_READY_SHIFT = 1, 666*4882a593Smuzhiyun D2H_STEADY_SHIFT = 2, 667*4882a593Smuzhiyun D2H_TRX_HDR_PARSE_DONE_SHIFT = 3, 668*4882a593Smuzhiyun D2H_VALDN_START_SHIFT = 4, 669*4882a593Smuzhiyun D2H_VALDN_RESULT_SHIFT = 5, 670*4882a593Smuzhiyun D2H_VALDN_DONE_SHIFT = 6 671*4882a593Smuzhiyun /* Bits 31:7 reserved for future */ 672*4882a593Smuzhiyun }; 673*4882a593Smuzhiyun 674*4882a593Smuzhiyun /* [H2D] Host to dongle handshake bits shift */ 675*4882a593Smuzhiyun enum { 676*4882a593Smuzhiyun H2D_DL_START_SHIFT = 0, 677*4882a593Smuzhiyun H2D_DL_DONE_SHIFT = 1, 678*4882a593Smuzhiyun H2D_DL_NVRAM_DONE_SHIFT = 2, 679*4882a593Smuzhiyun H2D_BL_RESET_ON_ERROR_SHIFT = 3 680*4882a593Smuzhiyun /* Bits 31:4 reserved for future */ 681*4882a593Smuzhiyun }; 682*4882a593Smuzhiyun 683*4882a593Smuzhiyun #endif /* def BCMSDIO */ 684*4882a593Smuzhiyun #endif /* _SDIO_H */ 685