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