1*ddaf02d1SJit Loon Lim /* 2*ddaf02d1SJit Loon Lim * Copyright (c) 2022-2023, Intel Corporation. All rights reserved. 3*ddaf02d1SJit Loon Lim * 4*ddaf02d1SJit Loon Lim * SPDX-License-Identifier: BSD-3-Clause 5*ddaf02d1SJit Loon Lim */ 6*ddaf02d1SJit Loon Lim 7*ddaf02d1SJit Loon Lim #ifndef CDN_COMBOPHY_H 8*ddaf02d1SJit Loon Lim #define CDN_COMBOPHY_H 9*ddaf02d1SJit Loon Lim 10*ddaf02d1SJit Loon Lim /* SRS */ 11*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS02 0x8 12*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS03 0xC 13*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS04 0x10 14*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS05 0x14 15*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS06 0x18 16*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS07 0x1C 17*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS09 0x24 18*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS10 0x28 19*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS11 0x2C 20*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS12 0x30 21*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS13 0x34 22*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS14 0x38 23*ddaf02d1SJit Loon Lim 24*ddaf02d1SJit Loon Lim /* SRS03 */ 25*ddaf02d1SJit Loon Lim /* Response Type Select 26*ddaf02d1SJit Loon Lim * Defines the expected response length. 27*ddaf02d1SJit Loon Lim */ 28*ddaf02d1SJit Loon Lim #define SDMMC_CDN_RTS 16 29*ddaf02d1SJit Loon Lim 30*ddaf02d1SJit Loon Lim /* Command CRC Check Enable 31*ddaf02d1SJit Loon Lim * When set to 1, the host checks if the CRC field of the response is valid. 32*ddaf02d1SJit Loon Lim * When 0, the CRC check is disabled and the CRC field of the response is ignored. 33*ddaf02d1SJit Loon Lim */ 34*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CRCCE 19 35*ddaf02d1SJit Loon Lim 36*ddaf02d1SJit Loon Lim /* Command Index 37*ddaf02d1SJit Loon Lim * This field contains a command number (index) of the command to be sent. 38*ddaf02d1SJit Loon Lim */ 39*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CIDX 24 40*ddaf02d1SJit Loon Lim 41*ddaf02d1SJit Loon Lim /* SRS09 */ 42*ddaf02d1SJit Loon Lim /* Card Inserted 43*ddaf02d1SJit Loon Lim * Indicates if the card is inserted inside the slot. 44*ddaf02d1SJit Loon Lim */ 45*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CI 16 46*ddaf02d1SJit Loon Lim 47*ddaf02d1SJit Loon Lim /* SRS10 */ 48*ddaf02d1SJit Loon Lim /* Data Transfer Width 49*ddaf02d1SJit Loon Lim * Bit used to configure DAT bus width to 1 or 4. 50*ddaf02d1SJit Loon Lim */ 51*ddaf02d1SJit Loon Lim #define SDMMC_CDN_DTW 1 52*ddaf02d1SJit Loon Lim 53*ddaf02d1SJit Loon Lim /* Extended Data Transfer Width 54*ddaf02d1SJit Loon Lim * This bit is to enable/disable 8-bit DAT bus width mode. 55*ddaf02d1SJit Loon Lim */ 56*ddaf02d1SJit Loon Lim #define SDMMC_CDN_EDTW 5 57*ddaf02d1SJit Loon Lim 58*ddaf02d1SJit Loon Lim /* SD Bus Power for VDD1 59*ddaf02d1SJit Loon Lim * When set to 1, the VDD1 voltage is supplied to card/device. 60*ddaf02d1SJit Loon Lim */ 61*ddaf02d1SJit Loon Lim #define SDMMC_CDN_BP 8 62*ddaf02d1SJit Loon Lim 63*ddaf02d1SJit Loon Lim /* SD Bus Voltage Select 64*ddaf02d1SJit Loon Lim * This field is used to configure VDD1 voltage level. 65*ddaf02d1SJit Loon Lim */ 66*ddaf02d1SJit Loon Lim #define SDMMC_CDN_BVS 9 67*ddaf02d1SJit Loon Lim 68*ddaf02d1SJit Loon Lim /* SRS11 */ 69*ddaf02d1SJit Loon Lim /* Internal Clock Enable 70*ddaf02d1SJit Loon Lim * This field is designated to controls (enable/disable) external clock generator. 71*ddaf02d1SJit Loon Lim */ 72*ddaf02d1SJit Loon Lim #define SDMMC_CDN_ICE 0 73*ddaf02d1SJit Loon Lim 74*ddaf02d1SJit Loon Lim /* Internal Clock Stable 75*ddaf02d1SJit Loon Lim * When 1, indicates that the clock on sdmclk pin of the host is stable. 76*ddaf02d1SJit Loon Lim * When 0, indicates that the clock is not stable . 77*ddaf02d1SJit Loon Lim */ 78*ddaf02d1SJit Loon Lim #define SDMMC_CDN_ICS 1 79*ddaf02d1SJit Loon Lim 80*ddaf02d1SJit Loon Lim /* SD Clock Enable 81*ddaf02d1SJit Loon Lim * When set, SDCLK clock is enabled. 82*ddaf02d1SJit Loon Lim * When clear, SDCLK clock is stopped. 83*ddaf02d1SJit Loon Lim */ 84*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SDCE 2 85*ddaf02d1SJit Loon Lim 86*ddaf02d1SJit Loon Lim /* USDCLK Frequency Select 87*ddaf02d1SJit Loon Lim * This is used to calculate frequency of USDCLK clock. 88*ddaf02d1SJit Loon Lim */ 89*ddaf02d1SJit Loon Lim #define SDMMC_CDN_USDCLKFS 6 90*ddaf02d1SJit Loon Lim 91*ddaf02d1SJit Loon Lim /* SDCLK Frequency Select 92*ddaf02d1SJit Loon Lim * This is used to calculate frequency of SDCLK clock. 93*ddaf02d1SJit Loon Lim */ 94*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SDCLKFS 8 95*ddaf02d1SJit Loon Lim 96*ddaf02d1SJit Loon Lim /* Data Timeout Counter Value 97*ddaf02d1SJit Loon Lim * This value determines the interval by which DAT line timeouts are detected 98*ddaf02d1SJit Loon Lim */ 99*ddaf02d1SJit Loon Lim #define SDMMC_CDN_DTCV 16 100*ddaf02d1SJit Loon Lim 101*ddaf02d1SJit Loon Lim /* SRS12 */ 102*ddaf02d1SJit Loon Lim /* Command Complete 103*ddaf02d1SJit Loon Lim * Generated when the end bit of the response is received. 104*ddaf02d1SJit Loon Lim */ 105*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CC 0 106*ddaf02d1SJit Loon Lim 107*ddaf02d1SJit Loon Lim /* Transfer Complete 108*ddaf02d1SJit Loon Lim * Generated when the transfer which uses the DAT line is complete. 109*ddaf02d1SJit Loon Lim */ 110*ddaf02d1SJit Loon Lim #define SDMMC_CDN_TC 1 111*ddaf02d1SJit Loon Lim 112*ddaf02d1SJit Loon Lim /* Error Interrupt 113*ddaf02d1SJit Loon Lim * The software can check for an error by reading this single bit first. 114*ddaf02d1SJit Loon Lim */ 115*ddaf02d1SJit Loon Lim #define SDMMC_CDN_EINT 15 116*ddaf02d1SJit Loon Lim 117*ddaf02d1SJit Loon Lim /* SRS14 */ 118*ddaf02d1SJit Loon Lim /* Command Complete Interrupt Enable */ 119*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CC_IE 0 120*ddaf02d1SJit Loon Lim 121*ddaf02d1SJit Loon Lim /* Transfer Complete Interrupt Enable */ 122*ddaf02d1SJit Loon Lim #define SDMMC_CDN_TC_IE 1 123*ddaf02d1SJit Loon Lim 124*ddaf02d1SJit Loon Lim /* DMA Interrupt Enable */ 125*ddaf02d1SJit Loon Lim #define SDMMC_CDN_DMAINT_IE 3 126*ddaf02d1SJit Loon Lim 127*ddaf02d1SJit Loon Lim /* Combo PHY DLL registers */ 128*ddaf02d1SJit Loon Lim #define CP_DLL_REG_BASE (0x10B92000) 129*ddaf02d1SJit Loon Lim #define CP_DLL_DQ_TIMING_REG (0x00) 130*ddaf02d1SJit Loon Lim #define CP_DLL_DQS_TIMING_REG (0x04) 131*ddaf02d1SJit Loon Lim #define CP_DLL_GATE_LPBK_CTRL_REG (0x08) 132*ddaf02d1SJit Loon Lim #define CP_DLL_MASTER_CTRL_REG (0x0C) 133*ddaf02d1SJit Loon Lim #define CP_DLL_SLAVE_CTRL_REG (0x10) 134*ddaf02d1SJit Loon Lim #define CP_DLL_IE_TIMING_REG (0x14) 135*ddaf02d1SJit Loon Lim 136*ddaf02d1SJit Loon Lim #define CP_DQ_TIMING_REG_SDR (0x00000002) 137*ddaf02d1SJit Loon Lim #define CP_DQS_TIMING_REG_SDR (0x00100004) 138*ddaf02d1SJit Loon Lim #define CP_GATE_LPBK_CTRL_REG_SDR (0x00D80000) 139*ddaf02d1SJit Loon Lim #define CP_DLL_MASTER_CTRL_REG_SDR (0x00800000) 140*ddaf02d1SJit Loon Lim #define CP_DLL_SLAVE_CTRL_REG_SDR (0x00000000) 141*ddaf02d1SJit Loon Lim 142*ddaf02d1SJit Loon Lim #define CP_DLL(_reg) (CP_DLL_REG_BASE \ 143*ddaf02d1SJit Loon Lim + (CP_DLL_##_reg)) 144*ddaf02d1SJit Loon Lim 145*ddaf02d1SJit Loon Lim /* Control Timing Block registers */ 146*ddaf02d1SJit Loon Lim #define CP_CTB_REG_BASE (0x10B92080) 147*ddaf02d1SJit Loon Lim #define CP_CTB_CTRL_REG (0x00) 148*ddaf02d1SJit Loon Lim #define CP_CTB_TSEL_REG (0x04) 149*ddaf02d1SJit Loon Lim #define CP_CTB_GPIO_CTRL0 (0x08) 150*ddaf02d1SJit Loon Lim #define CP_CTB_GPIO_CTRL1 (0x0C) 151*ddaf02d1SJit Loon Lim #define CP_CTB_GPIO_STATUS0 (0x10) 152*ddaf02d1SJit Loon Lim #define CP_CTB_GPIO_STATUS1 (0x14) 153*ddaf02d1SJit Loon Lim 154*ddaf02d1SJit Loon Lim #define CP_CTRL_REG_SDR (0x00004040) 155*ddaf02d1SJit Loon Lim #define CP_TSEL_REG_SDR (0x00000000) 156*ddaf02d1SJit Loon Lim 157*ddaf02d1SJit Loon Lim #define CP_CTB(_reg) (CP_CTB_REG_BASE \ 158*ddaf02d1SJit Loon Lim + (CP_CTB_##_reg)) 159*ddaf02d1SJit Loon Lim 160*ddaf02d1SJit Loon Lim /* Combo PHY */ 161*ddaf02d1SJit Loon Lim #define SDMMC_CDN_REG_BASE 0x10808200 162*ddaf02d1SJit Loon Lim #define PHY_DQ_TIMING_REG 0x2000 163*ddaf02d1SJit Loon Lim #define PHY_DQS_TIMING_REG 0x2004 164*ddaf02d1SJit Loon Lim #define PHY_GATE_LPBK_CTRL_REG 0x2008 165*ddaf02d1SJit Loon Lim #define PHY_DLL_MASTER_CTRL_REG 0x200C 166*ddaf02d1SJit Loon Lim #define PHY_DLL_SLAVE_CTRL_REG 0x2010 167*ddaf02d1SJit Loon Lim #define PHY_CTRL_REG 0x2080 168*ddaf02d1SJit Loon Lim #define PHY_REG_ADDR_MASK 0xFFFF 169*ddaf02d1SJit Loon Lim #define PHY_REG_DATA_MASK 0xFFFFFFFF 170*ddaf02d1SJit Loon Lim 171*ddaf02d1SJit Loon Lim /* PHY_DQS_TIMING_REG */ 172*ddaf02d1SJit Loon Lim #define CP_USE_EXT_LPBK_DQS(x) ((x) << 22) //0x1 173*ddaf02d1SJit Loon Lim #define CP_USE_LPBK_DQS(x) ((x) << 21) //0x1 174*ddaf02d1SJit Loon Lim #define CP_USE_PHONY_DQS(x) ((x) << 20) //0x1 175*ddaf02d1SJit Loon Lim #define CP_USE_PHONY_DQS_CMD(x) ((x) << 19) //0x1 176*ddaf02d1SJit Loon Lim 177*ddaf02d1SJit Loon Lim /* PHY_GATE_LPBK_CTRL_REG */ 178*ddaf02d1SJit Loon Lim #define CP_SYNC_METHOD(x) ((x) << 31) //0x1 179*ddaf02d1SJit Loon Lim #define CP_SW_HALF_CYCLE_SHIFT(x) ((x) << 28) //0x1 180*ddaf02d1SJit Loon Lim #define CP_RD_DEL_SEL(x) ((x) << 19) //0x3f 181*ddaf02d1SJit Loon Lim #define CP_UNDERRUN_SUPPRESS(x) ((x) << 18) //0x1 182*ddaf02d1SJit Loon Lim #define CP_GATE_CFG_ALWAYS_ON(x) ((x) << 6) //0x1 183*ddaf02d1SJit Loon Lim 184*ddaf02d1SJit Loon Lim /* PHY_DLL_MASTER_CTRL_REG */ 185*ddaf02d1SJit Loon Lim #define CP_DLL_BYPASS_MODE(x) ((x) << 23) //0x1 186*ddaf02d1SJit Loon Lim #define CP_DLL_START_POINT(x) ((x) << 0) //0xff 187*ddaf02d1SJit Loon Lim 188*ddaf02d1SJit Loon Lim /* PHY_DLL_SLAVE_CTRL_REG */ 189*ddaf02d1SJit Loon Lim #define CP_READ_DQS_CMD_DELAY(x) ((x) << 24) //0xff 190*ddaf02d1SJit Loon Lim #define CP_CLK_WRDQS_DELAY(x) ((x) << 16) //0xff 191*ddaf02d1SJit Loon Lim #define CP_CLK_WR_DELAY(x) ((x) << 8) //0xff 192*ddaf02d1SJit Loon Lim #define CP_READ_DQS_DELAY(x) ((x) << 0) //0xff 193*ddaf02d1SJit Loon Lim 194*ddaf02d1SJit Loon Lim /* PHY_DQ_TIMING_REG */ 195*ddaf02d1SJit Loon Lim #define CP_IO_MASK_ALWAYS_ON(x) ((x) << 31) //0x1 196*ddaf02d1SJit Loon Lim #define CP_IO_MASK_END(x) ((x) << 27) //0x7 197*ddaf02d1SJit Loon Lim #define CP_IO_MASK_START(x) ((x) << 24) //0x7 198*ddaf02d1SJit Loon Lim #define CP_DATA_SELECT_OE_END(x) ((x) << 0) //0x7 199*ddaf02d1SJit Loon Lim 200*ddaf02d1SJit Loon Lim /* PHY_CTRL_REG */ 201*ddaf02d1SJit Loon Lim #define CP_PHONY_DQS_TIMING_MASK 0x3F 202*ddaf02d1SJit Loon Lim #define CP_PHONY_DQS_TIMING_SHIFT 4 203*ddaf02d1SJit Loon Lim 204*ddaf02d1SJit Loon Lim /* Shared Macros */ 205*ddaf02d1SJit Loon Lim #define SDMMC_CDN(_reg) (SDMMC_CDN_REG_BASE + \ 206*ddaf02d1SJit Loon Lim (SDMMC_CDN_##_reg)) 207*ddaf02d1SJit Loon Lim 208*ddaf02d1SJit Loon Lim struct cdns_sdmmc_combo_phy { 209*ddaf02d1SJit Loon Lim uint32_t cp_clk_wr_delay; 210*ddaf02d1SJit Loon Lim uint32_t cp_clk_wrdqs_delay; 211*ddaf02d1SJit Loon Lim uint32_t cp_data_select_oe_end; 212*ddaf02d1SJit Loon Lim uint32_t cp_dll_bypass_mode; 213*ddaf02d1SJit Loon Lim uint32_t cp_dll_locked_mode; 214*ddaf02d1SJit Loon Lim uint32_t cp_dll_start_point; 215*ddaf02d1SJit Loon Lim uint32_t cp_gate_cfg_always_on; 216*ddaf02d1SJit Loon Lim uint32_t cp_io_mask_always_on; 217*ddaf02d1SJit Loon Lim uint32_t cp_io_mask_end; 218*ddaf02d1SJit Loon Lim uint32_t cp_io_mask_start; 219*ddaf02d1SJit Loon Lim uint32_t cp_rd_del_sel; 220*ddaf02d1SJit Loon Lim uint32_t cp_read_dqs_cmd_delay; 221*ddaf02d1SJit Loon Lim uint32_t cp_read_dqs_delay; 222*ddaf02d1SJit Loon Lim uint32_t cp_sw_half_cycle_shift; 223*ddaf02d1SJit Loon Lim uint32_t cp_sync_method; 224*ddaf02d1SJit Loon Lim uint32_t cp_underrun_suppress; 225*ddaf02d1SJit Loon Lim uint32_t cp_use_ext_lpbk_dqs; 226*ddaf02d1SJit Loon Lim uint32_t cp_use_lpbk_dqs; 227*ddaf02d1SJit Loon Lim uint32_t cp_use_phony_dqs; 228*ddaf02d1SJit Loon Lim uint32_t cp_use_phony_dqs_cmd; 229*ddaf02d1SJit Loon Lim }; 230*ddaf02d1SJit Loon Lim 231*ddaf02d1SJit Loon Lim /* Function Prototype */ 232*ddaf02d1SJit Loon Lim 233*ddaf02d1SJit Loon Lim int cdns_sdmmc_write_phy_reg(uint32_t phy_reg_addr, uint32_t phy_reg_addr_value, 234*ddaf02d1SJit Loon Lim uint32_t phy_reg_data, uint32_t phy_reg_data_value); 235*ddaf02d1SJit Loon Lim int cdns_sd_card_detect(void); 236*ddaf02d1SJit Loon Lim int cdns_emmc_card_reset(void); 237*ddaf02d1SJit Loon Lim 238*ddaf02d1SJit Loon Lim #endif 239