1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2019-2020, Broadcom 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef SDIO_H 8*91f16700Schasinglulu #define SDIO_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <stdbool.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #define SR_IPROC_SDIO0_CFG_BASE 0x689006e4 13*91f16700Schasinglulu #define SR_IPROC_SDIO0_SID_BASE 0x68900b00 14*91f16700Schasinglulu #define SR_IPROC_SDIO0_PAD_BASE 0x68a4017c 15*91f16700Schasinglulu #define SR_IPROC_SDIO0_IOCTRL_BASE 0x68e02408 16*91f16700Schasinglulu 17*91f16700Schasinglulu #define SR_IPROC_SDIO1_CFG_BASE 0x68900734 18*91f16700Schasinglulu #define SR_IPROC_SDIO1_SID_BASE 0x68900b08 19*91f16700Schasinglulu #define SR_IPROC_SDIO1_PAD_BASE 0x68a401b4 20*91f16700Schasinglulu #define SR_IPROC_SDIO1_IOCTRL_BASE 0x68e03408 21*91f16700Schasinglulu 22*91f16700Schasinglulu #define NS3Z_IPROC_SDIO0_CFG_BASE 0x68a20540 23*91f16700Schasinglulu #define NS3Z_IPROC_SDIO0_SID_BASE 0x68900b00 24*91f16700Schasinglulu #define NS3Z_IPROC_SDIO0_TP_OUT_SEL 0x68a20308 25*91f16700Schasinglulu #define NS3Z_IPROC_SDIO0_PAD_BASE 0x68a20500 26*91f16700Schasinglulu #define NS3Z_IPROC_SDIO0_IOCTRL_BASE 0x68e02408 27*91f16700Schasinglulu 28*91f16700Schasinglulu #define PHY_BYPASS BIT(14) 29*91f16700Schasinglulu #define LEGACY_EN BIT(31) 30*91f16700Schasinglulu #define PHY_DISABLE (LEGACY_EN | PHY_BYPASS) 31*91f16700Schasinglulu 32*91f16700Schasinglulu #define NS3Z_IPROC_SDIO1_CFG_BASE 0x68a30540 33*91f16700Schasinglulu #define NS3Z_IPROC_SDIO1_SID_BASE 0x68900b08 34*91f16700Schasinglulu #define NS3Z_IPROC_SDIO1_PAD_BASE 0x68a30500 35*91f16700Schasinglulu #define NS3Z_IPROC_SDIO1_IOCTRL_BASE 0x68e03408 36*91f16700Schasinglulu 37*91f16700Schasinglulu #define ICFG_SDIO_CAP0 0x10 38*91f16700Schasinglulu #define ICFG_SDIO_CAP1 0x14 39*91f16700Schasinglulu #define ICFG_SDIO_STRAPSTATUS_0 0x0 40*91f16700Schasinglulu #define ICFG_SDIO_STRAPSTATUS_1 0x4 41*91f16700Schasinglulu #define ICFG_SDIO_STRAPSTATUS_2 0x8 42*91f16700Schasinglulu #define ICFG_SDIO_STRAPSTATUS_3 0xc 43*91f16700Schasinglulu #define ICFG_SDIO_STRAPSTATUS_4 0x18 44*91f16700Schasinglulu 45*91f16700Schasinglulu #define ICFG_SDIO_SID_ARADDR 0x0 46*91f16700Schasinglulu #define ICFG_SDIO_SID_AWADDR 0x4 47*91f16700Schasinglulu 48*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__SLOT_TYPE_MASK 0x3 49*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__SLOT_TYPE_SHIFT 27 50*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__INT_MODE_SHIFT 26 51*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__SYS_BUS_64BIT_SHIFT 25 52*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__VOLTAGE_1P8V_SHIFT 24 53*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__VOLTAGE_3P0V_SHIFT 23 54*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__VOLTAGE_3P3V_SHIFT 22 55*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__SUSPEND_RESUME_SHIFT 21 56*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__SDMA_SHIFT 20 57*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__HIGH_SPEED_SHIFT 19 58*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__ADMA2_SHIFT 18 59*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__EXTENDED_MEDIA_SHIFT 17 60*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__MAX_BLOCK_LEN_MASK 0x3 61*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__MAX_BLOCK_LEN_SHIFT 15 62*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__BASE_CLK_FREQ_MASK 0xff 63*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__BASE_CLK_FREQ_SHIFT 7 64*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__TIMEOUT_UNIT_SHIFT 6 65*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__TIMEOUT_CLK_FREQ_MASK 0x3f 66*91f16700Schasinglulu #define ICFG_SDIOx_CAP0__TIMEOUT_CLK_FREQ_SHIFT 0 67*91f16700Schasinglulu 68*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__SPI_BLOCK_MODE_SHIFT 22 69*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__SPI_MODE_SHIFT 21 70*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__CLK_MULT_MASK 0xff 71*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__CLK_MULT_SHIFT 13 72*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__RETUNING_MODE_MASK 0x3 73*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__RETUNING_MODE_SHIFT 11 74*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__TUNE_SDR50_SHIFT 10 75*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__TIME_RETUNE_MASK 0xf 76*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__TIME_RETUNE_SHIFT 6 77*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__DRIVER_D_SHIFT 5 78*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__DRIVER_C_SHIFT 4 79*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__DRIVER_A_SHIFT 3 80*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__DDR50_SHIFT 2 81*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__SDR104_SHIFT 1 82*91f16700Schasinglulu #define ICFG_SDIOx_CAP1__SDR50_SHIFT 0 83*91f16700Schasinglulu 84*91f16700Schasinglulu #ifdef USE_DDR 85*91f16700Schasinglulu #define SDIO_DMA 1 86*91f16700Schasinglulu #else 87*91f16700Schasinglulu #define SDIO_DMA 0 88*91f16700Schasinglulu #endif 89*91f16700Schasinglulu 90*91f16700Schasinglulu #define SDIO0_CAP0_CFG \ 91*91f16700Schasinglulu (0x1 << ICFG_SDIOx_CAP0__SLOT_TYPE_SHIFT) \ 92*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP0__INT_MODE_SHIFT) \ 93*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP0__SYS_BUS_64BIT_SHIFT) \ 94*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__VOLTAGE_1P8V_SHIFT) \ 95*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__VOLTAGE_3P0V_SHIFT) \ 96*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__VOLTAGE_3P3V_SHIFT) \ 97*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__SUSPEND_RESUME_SHIFT) \ 98*91f16700Schasinglulu | (SDIO_DMA << ICFG_SDIOx_CAP0__SDMA_SHIFT) \ 99*91f16700Schasinglulu | (SDIO_DMA << ICFG_SDIOx_CAP0__ADMA2_SHIFT) \ 100*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__HIGH_SPEED_SHIFT) \ 101*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__EXTENDED_MEDIA_SHIFT) \ 102*91f16700Schasinglulu | (0x2 << ICFG_SDIOx_CAP0__MAX_BLOCK_LEN_SHIFT) \ 103*91f16700Schasinglulu | (0xc8 << ICFG_SDIOx_CAP0__BASE_CLK_FREQ_SHIFT) \ 104*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__TIMEOUT_UNIT_SHIFT) \ 105*91f16700Schasinglulu | (0x30 << ICFG_SDIOx_CAP0__TIMEOUT_CLK_FREQ_SHIFT) 106*91f16700Schasinglulu 107*91f16700Schasinglulu #define SDIO0_CAP1_CFG \ 108*91f16700Schasinglulu (0x1 << ICFG_SDIOx_CAP1__SPI_BLOCK_MODE_SHIFT)\ 109*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__SPI_MODE_SHIFT)\ 110*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP1__CLK_MULT_SHIFT)\ 111*91f16700Schasinglulu | (0x2 << ICFG_SDIOx_CAP1__RETUNING_MODE_SHIFT)\ 112*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__TUNE_SDR50_SHIFT)\ 113*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP1__DRIVER_D_SHIFT)\ 114*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP1__DRIVER_C_SHIFT)\ 115*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__DRIVER_A_SHIFT)\ 116*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__DDR50_SHIFT)\ 117*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__SDR104_SHIFT)\ 118*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__SDR50_SHIFT) 119*91f16700Schasinglulu 120*91f16700Schasinglulu #define SDIO1_CAP0_CFG \ 121*91f16700Schasinglulu (0x0 << ICFG_SDIOx_CAP0__SLOT_TYPE_SHIFT) \ 122*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP0__INT_MODE_SHIFT) \ 123*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP0__SYS_BUS_64BIT_SHIFT) \ 124*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__VOLTAGE_1P8V_SHIFT) \ 125*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__VOLTAGE_3P0V_SHIFT) \ 126*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__VOLTAGE_3P3V_SHIFT) \ 127*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__SUSPEND_RESUME_SHIFT) \ 128*91f16700Schasinglulu | (SDIO_DMA << ICFG_SDIOx_CAP0__SDMA_SHIFT) \ 129*91f16700Schasinglulu | (SDIO_DMA << ICFG_SDIOx_CAP0__ADMA2_SHIFT) \ 130*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__HIGH_SPEED_SHIFT) \ 131*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__EXTENDED_MEDIA_SHIFT) \ 132*91f16700Schasinglulu | (0x2 << ICFG_SDIOx_CAP0__MAX_BLOCK_LEN_SHIFT) \ 133*91f16700Schasinglulu | (0xc8 << ICFG_SDIOx_CAP0__BASE_CLK_FREQ_SHIFT) \ 134*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP0__TIMEOUT_UNIT_SHIFT) \ 135*91f16700Schasinglulu | (0x30 << ICFG_SDIOx_CAP0__TIMEOUT_CLK_FREQ_SHIFT) 136*91f16700Schasinglulu 137*91f16700Schasinglulu #define SDIO1_CAP1_CFG \ 138*91f16700Schasinglulu (0x1 << ICFG_SDIOx_CAP1__SPI_BLOCK_MODE_SHIFT)\ 139*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__SPI_MODE_SHIFT)\ 140*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP1__CLK_MULT_SHIFT)\ 141*91f16700Schasinglulu | (0x2 << ICFG_SDIOx_CAP1__RETUNING_MODE_SHIFT)\ 142*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__TUNE_SDR50_SHIFT)\ 143*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP1__DRIVER_D_SHIFT)\ 144*91f16700Schasinglulu | (0x0 << ICFG_SDIOx_CAP1__DRIVER_C_SHIFT)\ 145*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__DRIVER_A_SHIFT)\ 146*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__DDR50_SHIFT)\ 147*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__SDR104_SHIFT)\ 148*91f16700Schasinglulu | (0x1 << ICFG_SDIOx_CAP1__SDR50_SHIFT) 149*91f16700Schasinglulu 150*91f16700Schasinglulu #define PAD_SDIO_CLK 0x4 151*91f16700Schasinglulu #define PAD_SDIO_DATA0 0x8 152*91f16700Schasinglulu #define PAD_SDIO_DATA1 0xc 153*91f16700Schasinglulu #define PAD_SDIO_DATA2 0x10 154*91f16700Schasinglulu #define PAD_SDIO_DATA3 0x14 155*91f16700Schasinglulu #define PAD_SDIO_DATA4 0x18 156*91f16700Schasinglulu #define PAD_SDIO_DATA5 0x1c 157*91f16700Schasinglulu #define PAD_SDIO_DATA6 0x20 158*91f16700Schasinglulu #define PAD_SDIO_DATA7 0x24 159*91f16700Schasinglulu #define PAD_SDIO_CMD 0x28 160*91f16700Schasinglulu 161*91f16700Schasinglulu /* 12mA Drive strength*/ 162*91f16700Schasinglulu #define PAD_SDIO_SELX (0x5 << 1) 163*91f16700Schasinglulu #define PAD_SDIO_SRC (1 << 0) 164*91f16700Schasinglulu #define PAD_SDIO_MASK (0xF << 0) 165*91f16700Schasinglulu #define PAD_SDIO_VALUE (PAD_SDIO_SELX | PAD_SDIO_SRC) 166*91f16700Schasinglulu 167*91f16700Schasinglulu /* 168*91f16700Schasinglulu * SDIO_PRESETVAL0 169*91f16700Schasinglulu * 170*91f16700Schasinglulu * Each 13 Bit filed consists: 171*91f16700Schasinglulu * drivestrength - 12:11 172*91f16700Schasinglulu * clkgensel - b10 173*91f16700Schasinglulu * sdkclkfreqsel - 9:0 174*91f16700Schasinglulu * Field Bit(s) Description 175*91f16700Schasinglulu * ============================================================ 176*91f16700Schasinglulu * SDR25_PRESET 25:13 Preset Value for SDR25 177*91f16700Schasinglulu * SDR50_PRESET 12:0 Preset Value for SDR50 178*91f16700Schasinglulu */ 179*91f16700Schasinglulu #define SDIO_PRESETVAL0 0x01005001 180*91f16700Schasinglulu 181*91f16700Schasinglulu /* 182*91f16700Schasinglulu * SDIO_PRESETVAL1 183*91f16700Schasinglulu * 184*91f16700Schasinglulu * Each 13 Bit filed consists: 185*91f16700Schasinglulu * drivestrength - 12:11 186*91f16700Schasinglulu * clkgensel - b10 187*91f16700Schasinglulu * sdkclkfreqsel - 9:0 188*91f16700Schasinglulu * Field Bit(s) Description 189*91f16700Schasinglulu * ============================================================ 190*91f16700Schasinglulu * SDR104_PRESET 25:13 Preset Value for SDR104 191*91f16700Schasinglulu * SDR12_PRESET 12:0 Preset Value for SDR12 192*91f16700Schasinglulu */ 193*91f16700Schasinglulu #define SDIO_PRESETVAL1 0x03000004 194*91f16700Schasinglulu 195*91f16700Schasinglulu /* 196*91f16700Schasinglulu * SDIO_PRESETVAL2 197*91f16700Schasinglulu * 198*91f16700Schasinglulu * Each 13 Bit filed consists: 199*91f16700Schasinglulu * drivestrength - 12:11 200*91f16700Schasinglulu * clkgensel - b10 201*91f16700Schasinglulu * sdkclkfreqsel - 9:0 202*91f16700Schasinglulu * Field Bit(s) Description 203*91f16700Schasinglulu * ============================================================ 204*91f16700Schasinglulu * HIGH_SPEED_PRESET 25:13 Preset Value for High Speed 205*91f16700Schasinglulu * INIT_PRESET 12:0 Preset Value for Initialization 206*91f16700Schasinglulu */ 207*91f16700Schasinglulu #define SDIO_PRESETVAL2 0x010040FA 208*91f16700Schasinglulu 209*91f16700Schasinglulu /* 210*91f16700Schasinglulu * SDIO_PRESETVAL3 211*91f16700Schasinglulu * 212*91f16700Schasinglulu * Each 13 Bit filed consists: 213*91f16700Schasinglulu * drivestrength - 12:11 214*91f16700Schasinglulu * clkgensel - b10 215*91f16700Schasinglulu * sdkclkfreqsel - 9:0 216*91f16700Schasinglulu * Field Bit(s) Description 217*91f16700Schasinglulu * ============================================================ 218*91f16700Schasinglulu * DDR50_PRESET 25:13 Preset Value for DDR50 219*91f16700Schasinglulu * DEFAULT_PRESET 12:0 Preset Value for Default Speed 220*91f16700Schasinglulu */ 221*91f16700Schasinglulu #define SDIO_PRESETVAL3 0x01004004 222*91f16700Schasinglulu 223*91f16700Schasinglulu /* 224*91f16700Schasinglulu * SDIO_PRESETVAL4 225*91f16700Schasinglulu * 226*91f16700Schasinglulu * Field Bit(s) Description 227*91f16700Schasinglulu * ============================================================ 228*91f16700Schasinglulu * FORCE_USE_IP_TUNE_CLK 30 Force use IP clock 229*91f16700Schasinglulu * TUNING_COUNT 29:24 Tuning count 230*91f16700Schasinglulu * OVERRIDE_1P8V 23:16 231*91f16700Schasinglulu * OVERRIDE_3P3V 15:8 232*91f16700Schasinglulu * OVERRIDE_3P0V 7:0 233*91f16700Schasinglulu */ 234*91f16700Schasinglulu #define SDIO_PRESETVAL4 0x20010101 235*91f16700Schasinglulu 236*91f16700Schasinglulu #define SDIO_SID_SHIFT 5 237*91f16700Schasinglulu 238*91f16700Schasinglulu typedef struct { 239*91f16700Schasinglulu uintptr_t cfg_base; 240*91f16700Schasinglulu uintptr_t sid_base; 241*91f16700Schasinglulu uintptr_t io_ctrl_base; 242*91f16700Schasinglulu uintptr_t pad_base; 243*91f16700Schasinglulu } SDIO_CFG; 244*91f16700Schasinglulu 245*91f16700Schasinglulu void brcm_stingray_sdio_init(void); 246*91f16700Schasinglulu 247*91f16700Schasinglulu #endif /* SDIO_H */ 248