0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/slab.h>
0012 #include <linux/delay.h>
0013 #include <linux/ktime.h>
0014 #include <linux/of_address.h>
0015
0016 #include "sdhci-pltfm.h"
0017 #include "sdhci-xenon.h"
0018
0019
0020 #define XENON_EMMC_5_0_PHY_REG_BASE 0x0160
0021
0022 #define XENON_EMMC_PHY_REG_BASE 0x0170
0023
0024 #define XENON_EMMC_PHY_TIMING_ADJUST XENON_EMMC_PHY_REG_BASE
0025 #define XENON_EMMC_5_0_PHY_TIMING_ADJUST XENON_EMMC_5_0_PHY_REG_BASE
0026 #define XENON_TIMING_ADJUST_SLOW_MODE BIT(29)
0027 #define XENON_TIMING_ADJUST_SDIO_MODE BIT(28)
0028 #define XENON_SAMPL_INV_QSP_PHASE_SELECT BIT(18)
0029 #define XENON_SAMPL_INV_QSP_PHASE_SELECT_SHIFT 18
0030 #define XENON_PHY_INITIALIZAION BIT(31)
0031 #define XENON_WAIT_CYCLE_BEFORE_USING_MASK 0xF
0032 #define XENON_WAIT_CYCLE_BEFORE_USING_SHIFT 12
0033 #define XENON_FC_SYNC_EN_DURATION_MASK 0xF
0034 #define XENON_FC_SYNC_EN_DURATION_SHIFT 8
0035 #define XENON_FC_SYNC_RST_EN_DURATION_MASK 0xF
0036 #define XENON_FC_SYNC_RST_EN_DURATION_SHIFT 4
0037 #define XENON_FC_SYNC_RST_DURATION_MASK 0xF
0038 #define XENON_FC_SYNC_RST_DURATION_SHIFT 0
0039
0040 #define XENON_EMMC_PHY_FUNC_CONTROL (XENON_EMMC_PHY_REG_BASE + 0x4)
0041 #define XENON_EMMC_5_0_PHY_FUNC_CONTROL \
0042 (XENON_EMMC_5_0_PHY_REG_BASE + 0x4)
0043 #define XENON_ASYNC_DDRMODE_MASK BIT(23)
0044 #define XENON_ASYNC_DDRMODE_SHIFT 23
0045 #define XENON_CMD_DDR_MODE BIT(16)
0046 #define XENON_DQ_DDR_MODE_SHIFT 8
0047 #define XENON_DQ_DDR_MODE_MASK 0xFF
0048 #define XENON_DQ_ASYNC_MODE BIT(4)
0049
0050 #define XENON_EMMC_PHY_PAD_CONTROL (XENON_EMMC_PHY_REG_BASE + 0x8)
0051 #define XENON_EMMC_5_0_PHY_PAD_CONTROL \
0052 (XENON_EMMC_5_0_PHY_REG_BASE + 0x8)
0053 #define XENON_REC_EN_SHIFT 24
0054 #define XENON_REC_EN_MASK 0xF
0055 #define XENON_FC_DQ_RECEN BIT(24)
0056 #define XENON_FC_CMD_RECEN BIT(25)
0057 #define XENON_FC_QSP_RECEN BIT(26)
0058 #define XENON_FC_QSN_RECEN BIT(27)
0059 #define XENON_OEN_QSN BIT(28)
0060 #define XENON_AUTO_RECEN_CTRL BIT(30)
0061 #define XENON_FC_ALL_CMOS_RECEIVER 0xF000
0062
0063 #define XENON_EMMC5_FC_QSP_PD BIT(18)
0064 #define XENON_EMMC5_FC_QSP_PU BIT(22)
0065 #define XENON_EMMC5_FC_CMD_PD BIT(17)
0066 #define XENON_EMMC5_FC_CMD_PU BIT(21)
0067 #define XENON_EMMC5_FC_DQ_PD BIT(16)
0068 #define XENON_EMMC5_FC_DQ_PU BIT(20)
0069
0070 #define XENON_EMMC_PHY_PAD_CONTROL1 (XENON_EMMC_PHY_REG_BASE + 0xC)
0071 #define XENON_EMMC5_1_FC_QSP_PD BIT(9)
0072 #define XENON_EMMC5_1_FC_QSP_PU BIT(25)
0073 #define XENON_EMMC5_1_FC_CMD_PD BIT(8)
0074 #define XENON_EMMC5_1_FC_CMD_PU BIT(24)
0075 #define XENON_EMMC5_1_FC_DQ_PD 0xFF
0076 #define XENON_EMMC5_1_FC_DQ_PU (0xFF << 16)
0077
0078 #define XENON_EMMC_PHY_PAD_CONTROL2 (XENON_EMMC_PHY_REG_BASE + 0x10)
0079 #define XENON_EMMC_5_0_PHY_PAD_CONTROL2 \
0080 (XENON_EMMC_5_0_PHY_REG_BASE + 0xC)
0081 #define XENON_ZNR_MASK 0x1F
0082 #define XENON_ZNR_SHIFT 8
0083 #define XENON_ZPR_MASK 0x1F
0084
0085
0086
0087
0088 #define XENON_ZNR_DEF_VALUE 0xF
0089 #define XENON_ZPR_DEF_VALUE 0xF
0090
0091 #define XENON_EMMC_PHY_DLL_CONTROL (XENON_EMMC_PHY_REG_BASE + 0x14)
0092 #define XENON_EMMC_5_0_PHY_DLL_CONTROL \
0093 (XENON_EMMC_5_0_PHY_REG_BASE + 0x10)
0094 #define XENON_DLL_ENABLE BIT(31)
0095 #define XENON_DLL_UPDATE_STROBE_5_0 BIT(30)
0096 #define XENON_DLL_REFCLK_SEL BIT(30)
0097 #define XENON_DLL_UPDATE BIT(23)
0098 #define XENON_DLL_PHSEL1_SHIFT 24
0099 #define XENON_DLL_PHSEL0_SHIFT 16
0100 #define XENON_DLL_PHASE_MASK 0x3F
0101 #define XENON_DLL_PHASE_90_DEGREE 0x1F
0102 #define XENON_DLL_FAST_LOCK BIT(5)
0103 #define XENON_DLL_GAIN2X BIT(3)
0104 #define XENON_DLL_BYPASS_EN BIT(0)
0105
0106 #define XENON_EMMC_5_0_PHY_LOGIC_TIMING_ADJUST \
0107 (XENON_EMMC_5_0_PHY_REG_BASE + 0x14)
0108 #define XENON_EMMC_5_0_PHY_LOGIC_TIMING_VALUE 0x5A54
0109 #define XENON_EMMC_PHY_LOGIC_TIMING_ADJUST (XENON_EMMC_PHY_REG_BASE + 0x18)
0110 #define XENON_LOGIC_TIMING_VALUE 0x00AA8977
0111
0112
0113
0114
0115
0116 struct xenon_emmc_phy_regs {
0117
0118 u16 timing_adj;
0119
0120 u16 func_ctrl;
0121
0122 u16 pad_ctrl;
0123
0124 u16 pad_ctrl2;
0125
0126 u16 dll_ctrl;
0127
0128 u16 logic_timing_adj;
0129
0130 u32 dll_update;
0131
0132 u32 logic_timing_val;
0133 };
0134
0135 static const char * const phy_types[] = {
0136 "emmc 5.0 phy",
0137 "emmc 5.1 phy"
0138 };
0139
0140 enum xenon_phy_type_enum {
0141 EMMC_5_0_PHY,
0142 EMMC_5_1_PHY,
0143 NR_PHY_TYPES
0144 };
0145
0146 enum soc_pad_ctrl_type {
0147 SOC_PAD_SD,
0148 SOC_PAD_FIXED_1_8V,
0149 };
0150
0151 struct soc_pad_ctrl {
0152
0153 void __iomem *reg;
0154
0155 enum soc_pad_ctrl_type pad_type;
0156
0157 void (*set_soc_pad)(struct sdhci_host *host,
0158 unsigned char signal_voltage);
0159 };
0160
0161 static struct xenon_emmc_phy_regs xenon_emmc_5_0_phy_regs = {
0162 .timing_adj = XENON_EMMC_5_0_PHY_TIMING_ADJUST,
0163 .func_ctrl = XENON_EMMC_5_0_PHY_FUNC_CONTROL,
0164 .pad_ctrl = XENON_EMMC_5_0_PHY_PAD_CONTROL,
0165 .pad_ctrl2 = XENON_EMMC_5_0_PHY_PAD_CONTROL2,
0166 .dll_ctrl = XENON_EMMC_5_0_PHY_DLL_CONTROL,
0167 .logic_timing_adj = XENON_EMMC_5_0_PHY_LOGIC_TIMING_ADJUST,
0168 .dll_update = XENON_DLL_UPDATE_STROBE_5_0,
0169 .logic_timing_val = XENON_EMMC_5_0_PHY_LOGIC_TIMING_VALUE,
0170 };
0171
0172 static struct xenon_emmc_phy_regs xenon_emmc_5_1_phy_regs = {
0173 .timing_adj = XENON_EMMC_PHY_TIMING_ADJUST,
0174 .func_ctrl = XENON_EMMC_PHY_FUNC_CONTROL,
0175 .pad_ctrl = XENON_EMMC_PHY_PAD_CONTROL,
0176 .pad_ctrl2 = XENON_EMMC_PHY_PAD_CONTROL2,
0177 .dll_ctrl = XENON_EMMC_PHY_DLL_CONTROL,
0178 .logic_timing_adj = XENON_EMMC_PHY_LOGIC_TIMING_ADJUST,
0179 .dll_update = XENON_DLL_UPDATE,
0180 .logic_timing_val = XENON_LOGIC_TIMING_VALUE,
0181 };
0182
0183
0184
0185
0186 struct xenon_emmc_phy_params {
0187 bool slow_mode;
0188
0189 u8 znr;
0190 u8 zpr;
0191
0192
0193 u8 nr_tun_times;
0194
0195 u8 tun_step_divider;
0196
0197 struct soc_pad_ctrl pad_ctrl;
0198 };
0199
0200 static int xenon_alloc_emmc_phy(struct sdhci_host *host)
0201 {
0202 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0203 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0204 struct xenon_emmc_phy_params *params;
0205
0206 params = devm_kzalloc(mmc_dev(host->mmc), sizeof(*params), GFP_KERNEL);
0207 if (!params)
0208 return -ENOMEM;
0209
0210 priv->phy_params = params;
0211 if (priv->phy_type == EMMC_5_0_PHY)
0212 priv->emmc_phy_regs = &xenon_emmc_5_0_phy_regs;
0213 else
0214 priv->emmc_phy_regs = &xenon_emmc_5_1_phy_regs;
0215
0216 return 0;
0217 }
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227 static int xenon_emmc_phy_init(struct sdhci_host *host)
0228 {
0229 u32 reg;
0230 u32 wait, clock;
0231 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0232 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0233 struct xenon_emmc_phy_regs *phy_regs = priv->emmc_phy_regs;
0234
0235 reg = sdhci_readl(host, phy_regs->timing_adj);
0236 reg |= XENON_PHY_INITIALIZAION;
0237 sdhci_writel(host, reg, phy_regs->timing_adj);
0238
0239
0240 wait = ((reg >> XENON_FC_SYNC_RST_DURATION_SHIFT) &
0241 XENON_FC_SYNC_RST_DURATION_MASK);
0242
0243 wait += ((reg >> XENON_FC_SYNC_RST_EN_DURATION_SHIFT) &
0244 XENON_FC_SYNC_RST_EN_DURATION_MASK);
0245
0246 wait += ((reg >> XENON_FC_SYNC_EN_DURATION_SHIFT) &
0247 XENON_FC_SYNC_EN_DURATION_MASK);
0248
0249 wait += ((reg >> XENON_WAIT_CYCLE_BEFORE_USING_SHIFT) &
0250 XENON_WAIT_CYCLE_BEFORE_USING_MASK);
0251
0252 wait += 8;
0253 wait <<= 20;
0254
0255 clock = host->clock;
0256 if (!clock)
0257
0258 clock = XENON_LOWEST_SDCLK_FREQ;
0259
0260 wait /= clock;
0261 wait++;
0262
0263 udelay(wait);
0264
0265 reg = sdhci_readl(host, phy_regs->timing_adj);
0266 reg &= XENON_PHY_INITIALIZAION;
0267 if (reg) {
0268 dev_err(mmc_dev(host->mmc), "eMMC PHY init cannot complete after %d us\n",
0269 wait);
0270 return -ETIMEDOUT;
0271 }
0272
0273 return 0;
0274 }
0275
0276 #define ARMADA_3700_SOC_PAD_1_8V 0x1
0277 #define ARMADA_3700_SOC_PAD_3_3V 0x0
0278
0279 static void armada_3700_soc_pad_voltage_set(struct sdhci_host *host,
0280 unsigned char signal_voltage)
0281 {
0282 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0283 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0284 struct xenon_emmc_phy_params *params = priv->phy_params;
0285
0286 if (params->pad_ctrl.pad_type == SOC_PAD_FIXED_1_8V) {
0287 writel(ARMADA_3700_SOC_PAD_1_8V, params->pad_ctrl.reg);
0288 } else if (params->pad_ctrl.pad_type == SOC_PAD_SD) {
0289 if (signal_voltage == MMC_SIGNAL_VOLTAGE_180)
0290 writel(ARMADA_3700_SOC_PAD_1_8V, params->pad_ctrl.reg);
0291 else if (signal_voltage == MMC_SIGNAL_VOLTAGE_330)
0292 writel(ARMADA_3700_SOC_PAD_3_3V, params->pad_ctrl.reg);
0293 }
0294 }
0295
0296
0297
0298
0299
0300
0301 static void xenon_emmc_phy_set_soc_pad(struct sdhci_host *host,
0302 unsigned char signal_voltage)
0303 {
0304 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0305 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0306 struct xenon_emmc_phy_params *params = priv->phy_params;
0307
0308 if (!params->pad_ctrl.reg)
0309 return;
0310
0311 if (params->pad_ctrl.set_soc_pad)
0312 params->pad_ctrl.set_soc_pad(host, signal_voltage);
0313 }
0314
0315
0316
0317
0318
0319
0320 static int xenon_emmc_phy_enable_dll(struct sdhci_host *host)
0321 {
0322 u32 reg;
0323 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0324 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0325 struct xenon_emmc_phy_regs *phy_regs = priv->emmc_phy_regs;
0326 ktime_t timeout;
0327
0328 if (WARN_ON(host->clock <= MMC_HIGH_52_MAX_DTR))
0329 return -EINVAL;
0330
0331 reg = sdhci_readl(host, phy_regs->dll_ctrl);
0332 if (reg & XENON_DLL_ENABLE)
0333 return 0;
0334
0335
0336 reg = sdhci_readl(host, phy_regs->dll_ctrl);
0337 reg |= (XENON_DLL_ENABLE | XENON_DLL_FAST_LOCK);
0338
0339
0340
0341
0342
0343
0344 reg &= ~((XENON_DLL_PHASE_MASK << XENON_DLL_PHSEL0_SHIFT) |
0345 (XENON_DLL_PHASE_MASK << XENON_DLL_PHSEL1_SHIFT));
0346 reg |= ((XENON_DLL_PHASE_90_DEGREE << XENON_DLL_PHSEL0_SHIFT) |
0347 (XENON_DLL_PHASE_90_DEGREE << XENON_DLL_PHSEL1_SHIFT));
0348
0349 reg &= ~XENON_DLL_BYPASS_EN;
0350 reg |= phy_regs->dll_update;
0351 if (priv->phy_type == EMMC_5_1_PHY)
0352 reg &= ~XENON_DLL_REFCLK_SEL;
0353 sdhci_writel(host, reg, phy_regs->dll_ctrl);
0354
0355
0356 timeout = ktime_add_ms(ktime_get(), 32);
0357 while (1) {
0358 bool timedout = ktime_after(ktime_get(), timeout);
0359
0360 if (sdhci_readw(host, XENON_SLOT_EXT_PRESENT_STATE) &
0361 XENON_DLL_LOCK_STATE)
0362 break;
0363 if (timedout) {
0364 dev_err(mmc_dev(host->mmc), "Wait for DLL Lock time-out\n");
0365 return -ETIMEDOUT;
0366 }
0367 udelay(100);
0368 }
0369 return 0;
0370 }
0371
0372
0373
0374
0375
0376 static int xenon_emmc_phy_config_tuning(struct sdhci_host *host)
0377 {
0378 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0379 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0380 struct xenon_emmc_phy_params *params = priv->phy_params;
0381 u32 reg, tuning_step;
0382 int ret;
0383
0384 if (host->clock <= MMC_HIGH_52_MAX_DTR)
0385 return -EINVAL;
0386
0387 ret = xenon_emmc_phy_enable_dll(host);
0388 if (ret)
0389 return ret;
0390
0391
0392 reg = sdhci_readl(host, XENON_SLOT_DLL_CUR_DLY_VAL);
0393 tuning_step = reg / params->tun_step_divider;
0394 if (unlikely(tuning_step > XENON_TUNING_STEP_MASK)) {
0395 dev_warn(mmc_dev(host->mmc),
0396 "HS200 TUNING_STEP %d is larger than MAX value\n",
0397 tuning_step);
0398 tuning_step = XENON_TUNING_STEP_MASK;
0399 }
0400
0401
0402 reg = sdhci_readl(host, XENON_SLOT_OP_STATUS_CTRL);
0403 reg &= ~(XENON_TUN_CONSECUTIVE_TIMES_MASK <<
0404 XENON_TUN_CONSECUTIVE_TIMES_SHIFT);
0405 reg |= (params->nr_tun_times << XENON_TUN_CONSECUTIVE_TIMES_SHIFT);
0406 reg &= ~(XENON_TUNING_STEP_MASK << XENON_TUNING_STEP_SHIFT);
0407 reg |= (tuning_step << XENON_TUNING_STEP_SHIFT);
0408 sdhci_writel(host, reg, XENON_SLOT_OP_STATUS_CTRL);
0409
0410 return 0;
0411 }
0412
0413 static void xenon_emmc_phy_disable_strobe(struct sdhci_host *host)
0414 {
0415 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0416 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0417 u32 reg;
0418
0419
0420 reg = sdhci_readl(host, XENON_SLOT_EMMC_CTRL);
0421 reg &= ~(XENON_ENABLE_DATA_STROBE | XENON_ENABLE_RESP_STROBE);
0422 sdhci_writel(host, reg, XENON_SLOT_EMMC_CTRL);
0423
0424
0425 if (priv->phy_type == EMMC_5_0_PHY) {
0426 reg = sdhci_readl(host, XENON_EMMC_5_0_PHY_PAD_CONTROL);
0427 reg &= ~(XENON_EMMC5_FC_QSP_PD | XENON_EMMC5_FC_QSP_PU);
0428 sdhci_writel(host, reg, XENON_EMMC_5_0_PHY_PAD_CONTROL);
0429 } else {
0430 reg = sdhci_readl(host, XENON_EMMC_PHY_PAD_CONTROL1);
0431 reg &= ~(XENON_EMMC5_1_FC_QSP_PD | XENON_EMMC5_1_FC_QSP_PU);
0432 sdhci_writel(host, reg, XENON_EMMC_PHY_PAD_CONTROL1);
0433 }
0434 }
0435
0436
0437 static void xenon_emmc_phy_strobe_delay_adj(struct sdhci_host *host)
0438 {
0439 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0440 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0441 u32 reg;
0442
0443 if (WARN_ON(host->timing != MMC_TIMING_MMC_HS400))
0444 return;
0445
0446 if (host->clock <= MMC_HIGH_52_MAX_DTR)
0447 return;
0448
0449 dev_dbg(mmc_dev(host->mmc), "starts HS400 strobe delay adjustment\n");
0450
0451 xenon_emmc_phy_enable_dll(host);
0452
0453
0454 reg = sdhci_readl(host, XENON_SLOT_EMMC_CTRL);
0455 reg |= XENON_ENABLE_DATA_STROBE;
0456
0457
0458
0459
0460
0461
0462
0463 if (host->mmc->ios.enhanced_strobe)
0464 reg |= XENON_ENABLE_RESP_STROBE;
0465 sdhci_writel(host, reg, XENON_SLOT_EMMC_CTRL);
0466
0467
0468 if (priv->phy_type == EMMC_5_0_PHY) {
0469 reg = sdhci_readl(host, XENON_EMMC_5_0_PHY_PAD_CONTROL);
0470 reg |= XENON_EMMC5_FC_QSP_PD;
0471 reg &= ~XENON_EMMC5_FC_QSP_PU;
0472 sdhci_writel(host, reg, XENON_EMMC_5_0_PHY_PAD_CONTROL);
0473 } else {
0474 reg = sdhci_readl(host, XENON_EMMC_PHY_PAD_CONTROL1);
0475 reg |= XENON_EMMC5_1_FC_QSP_PD;
0476 reg &= ~XENON_EMMC5_1_FC_QSP_PU;
0477 sdhci_writel(host, reg, XENON_EMMC_PHY_PAD_CONTROL1);
0478 }
0479 }
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489 static bool xenon_emmc_phy_slow_mode(struct sdhci_host *host,
0490 unsigned char timing)
0491 {
0492 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0493 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0494 struct xenon_emmc_phy_params *params = priv->phy_params;
0495 struct xenon_emmc_phy_regs *phy_regs = priv->emmc_phy_regs;
0496 u32 reg;
0497 int ret;
0498
0499 if (host->clock > MMC_HIGH_52_MAX_DTR)
0500 return false;
0501
0502 reg = sdhci_readl(host, phy_regs->timing_adj);
0503
0504
0505
0506 switch (timing) {
0507 case MMC_TIMING_LEGACY:
0508
0509
0510
0511
0512 if (params->slow_mode) {
0513 reg |= XENON_TIMING_ADJUST_SLOW_MODE;
0514 ret = true;
0515 } else {
0516 reg &= ~XENON_TIMING_ADJUST_SLOW_MODE;
0517 ret = false;
0518 }
0519 break;
0520 case MMC_TIMING_UHS_SDR25:
0521 case MMC_TIMING_UHS_SDR12:
0522 case MMC_TIMING_SD_HS:
0523 case MMC_TIMING_MMC_HS:
0524 if ((priv->init_card_type == MMC_TYPE_SDIO) ||
0525 params->slow_mode) {
0526 reg |= XENON_TIMING_ADJUST_SLOW_MODE;
0527 ret = true;
0528 break;
0529 }
0530 fallthrough;
0531 default:
0532 reg &= ~XENON_TIMING_ADJUST_SLOW_MODE;
0533 ret = false;
0534 }
0535
0536 sdhci_writel(host, reg, phy_regs->timing_adj);
0537 return ret;
0538 }
0539
0540
0541
0542
0543
0544 static void xenon_emmc_phy_set(struct sdhci_host *host,
0545 unsigned char timing)
0546 {
0547 u32 reg;
0548 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0549 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0550 struct xenon_emmc_phy_params *params = priv->phy_params;
0551 struct xenon_emmc_phy_regs *phy_regs = priv->emmc_phy_regs;
0552
0553 dev_dbg(mmc_dev(host->mmc), "eMMC PHY setting starts\n");
0554
0555
0556 reg = sdhci_readl(host, phy_regs->pad_ctrl);
0557 reg |= (XENON_FC_DQ_RECEN | XENON_FC_CMD_RECEN |
0558 XENON_FC_QSP_RECEN | XENON_OEN_QSN);
0559
0560 reg |= XENON_FC_ALL_CMOS_RECEIVER;
0561 sdhci_writel(host, reg, phy_regs->pad_ctrl);
0562
0563
0564 if (priv->phy_type == EMMC_5_0_PHY) {
0565 reg = sdhci_readl(host, XENON_EMMC_5_0_PHY_PAD_CONTROL);
0566 reg |= (XENON_EMMC5_FC_CMD_PU | XENON_EMMC5_FC_DQ_PU);
0567 reg &= ~(XENON_EMMC5_FC_CMD_PD | XENON_EMMC5_FC_DQ_PD);
0568 sdhci_writel(host, reg, XENON_EMMC_5_0_PHY_PAD_CONTROL);
0569 } else {
0570 reg = sdhci_readl(host, XENON_EMMC_PHY_PAD_CONTROL1);
0571 reg |= (XENON_EMMC5_1_FC_CMD_PU | XENON_EMMC5_1_FC_DQ_PU);
0572 reg &= ~(XENON_EMMC5_1_FC_CMD_PD | XENON_EMMC5_1_FC_DQ_PD);
0573 sdhci_writel(host, reg, XENON_EMMC_PHY_PAD_CONTROL1);
0574 }
0575
0576 if (timing == MMC_TIMING_LEGACY) {
0577 xenon_emmc_phy_slow_mode(host, timing);
0578 goto phy_init;
0579 }
0580
0581
0582
0583
0584
0585 reg = sdhci_readl(host, phy_regs->timing_adj);
0586 if (priv->init_card_type == MMC_TYPE_SDIO)
0587 reg |= XENON_TIMING_ADJUST_SDIO_MODE;
0588 else
0589 reg &= ~XENON_TIMING_ADJUST_SDIO_MODE;
0590 sdhci_writel(host, reg, phy_regs->timing_adj);
0591
0592 if (xenon_emmc_phy_slow_mode(host, timing))
0593 goto phy_init;
0594
0595
0596
0597
0598
0599
0600 reg = sdhci_readl(host, phy_regs->pad_ctrl2);
0601 reg &= ~((XENON_ZNR_MASK << XENON_ZNR_SHIFT) | XENON_ZPR_MASK);
0602 reg |= ((params->znr << XENON_ZNR_SHIFT) | params->zpr);
0603 sdhci_writel(host, reg, phy_regs->pad_ctrl2);
0604
0605
0606
0607
0608
0609 reg = sdhci_readl(host, SDHCI_CLOCK_CONTROL);
0610 reg &= ~SDHCI_CLOCK_CARD_EN;
0611 sdhci_writew(host, reg, SDHCI_CLOCK_CONTROL);
0612
0613 reg = sdhci_readl(host, phy_regs->func_ctrl);
0614 switch (timing) {
0615 case MMC_TIMING_MMC_HS400:
0616 reg |= (XENON_DQ_DDR_MODE_MASK << XENON_DQ_DDR_MODE_SHIFT) |
0617 XENON_CMD_DDR_MODE;
0618 reg &= ~XENON_DQ_ASYNC_MODE;
0619 break;
0620 case MMC_TIMING_UHS_DDR50:
0621 case MMC_TIMING_MMC_DDR52:
0622 reg |= (XENON_DQ_DDR_MODE_MASK << XENON_DQ_DDR_MODE_SHIFT) |
0623 XENON_CMD_DDR_MODE | XENON_DQ_ASYNC_MODE;
0624 break;
0625 default:
0626 reg &= ~((XENON_DQ_DDR_MODE_MASK << XENON_DQ_DDR_MODE_SHIFT) |
0627 XENON_CMD_DDR_MODE);
0628 reg |= XENON_DQ_ASYNC_MODE;
0629 }
0630 sdhci_writel(host, reg, phy_regs->func_ctrl);
0631
0632
0633 reg = sdhci_readl(host, SDHCI_CLOCK_CONTROL);
0634 reg |= SDHCI_CLOCK_CARD_EN;
0635 sdhci_writew(host, reg, SDHCI_CLOCK_CONTROL);
0636
0637 if (timing == MMC_TIMING_MMC_HS400)
0638
0639 sdhci_writel(host, phy_regs->logic_timing_val,
0640 phy_regs->logic_timing_adj);
0641 else
0642 xenon_emmc_phy_disable_strobe(host);
0643
0644 phy_init:
0645 xenon_emmc_phy_init(host);
0646
0647 dev_dbg(mmc_dev(host->mmc), "eMMC PHY setting completes\n");
0648 }
0649
0650 static int get_dt_pad_ctrl_data(struct sdhci_host *host,
0651 struct device_node *np,
0652 struct xenon_emmc_phy_params *params)
0653 {
0654 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0655 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0656 int ret = 0;
0657 const char *name;
0658 struct resource iomem;
0659
0660 if (priv->hw_version == XENON_A3700)
0661 params->pad_ctrl.set_soc_pad = armada_3700_soc_pad_voltage_set;
0662 else
0663 return 0;
0664
0665 if (of_address_to_resource(np, 1, &iomem)) {
0666 dev_err(mmc_dev(host->mmc), "Unable to find SoC PAD ctrl register address for %pOFn\n",
0667 np);
0668 return -EINVAL;
0669 }
0670
0671 params->pad_ctrl.reg = devm_ioremap_resource(mmc_dev(host->mmc),
0672 &iomem);
0673 if (IS_ERR(params->pad_ctrl.reg))
0674 return PTR_ERR(params->pad_ctrl.reg);
0675
0676 ret = of_property_read_string(np, "marvell,pad-type", &name);
0677 if (ret) {
0678 dev_err(mmc_dev(host->mmc), "Unable to determine SoC PHY PAD ctrl type\n");
0679 return ret;
0680 }
0681 if (!strcmp(name, "sd")) {
0682 params->pad_ctrl.pad_type = SOC_PAD_SD;
0683 } else if (!strcmp(name, "fixed-1-8v")) {
0684 params->pad_ctrl.pad_type = SOC_PAD_FIXED_1_8V;
0685 } else {
0686 dev_err(mmc_dev(host->mmc), "Unsupported SoC PHY PAD ctrl type %s\n",
0687 name);
0688 return -EINVAL;
0689 }
0690
0691 return ret;
0692 }
0693
0694 static int xenon_emmc_phy_parse_params(struct sdhci_host *host,
0695 struct device *dev,
0696 struct xenon_emmc_phy_params *params)
0697 {
0698 u32 value;
0699
0700 params->slow_mode = false;
0701 if (device_property_read_bool(dev, "marvell,xenon-phy-slow-mode"))
0702 params->slow_mode = true;
0703
0704 params->znr = XENON_ZNR_DEF_VALUE;
0705 if (!device_property_read_u32(dev, "marvell,xenon-phy-znr", &value))
0706 params->znr = value & XENON_ZNR_MASK;
0707
0708 params->zpr = XENON_ZPR_DEF_VALUE;
0709 if (!device_property_read_u32(dev, "marvell,xenon-phy-zpr", &value))
0710 params->zpr = value & XENON_ZPR_MASK;
0711
0712 params->nr_tun_times = XENON_TUN_CONSECUTIVE_TIMES;
0713 if (!device_property_read_u32(dev, "marvell,xenon-phy-nr-success-tun",
0714 &value))
0715 params->nr_tun_times = value & XENON_TUN_CONSECUTIVE_TIMES_MASK;
0716
0717 params->tun_step_divider = XENON_TUNING_STEP_DIVIDER;
0718 if (!device_property_read_u32(dev, "marvell,xenon-phy-tun-step-divider",
0719 &value))
0720 params->tun_step_divider = value & 0xFF;
0721
0722 if (dev->of_node)
0723 return get_dt_pad_ctrl_data(host, dev->of_node, params);
0724 return 0;
0725 }
0726
0727
0728 void xenon_soc_pad_ctrl(struct sdhci_host *host,
0729 unsigned char signal_voltage)
0730 {
0731 xenon_emmc_phy_set_soc_pad(host, signal_voltage);
0732 }
0733
0734
0735
0736
0737
0738
0739 static int xenon_hs_delay_adj(struct sdhci_host *host)
0740 {
0741 int ret = 0;
0742
0743 if (WARN_ON(host->clock <= XENON_DEFAULT_SDCLK_FREQ))
0744 return -EINVAL;
0745
0746 switch (host->timing) {
0747 case MMC_TIMING_MMC_HS400:
0748 xenon_emmc_phy_strobe_delay_adj(host);
0749 return 0;
0750 case MMC_TIMING_MMC_HS200:
0751 case MMC_TIMING_UHS_SDR104:
0752 return xenon_emmc_phy_config_tuning(host);
0753 case MMC_TIMING_MMC_DDR52:
0754 case MMC_TIMING_UHS_DDR50:
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766 dev_warn_once(mmc_dev(host->mmc), "Timing issue might occur in DDR mode\n");
0767 return 0;
0768 }
0769
0770 return ret;
0771 }
0772
0773
0774
0775
0776
0777
0778
0779
0780 int xenon_phy_adj(struct sdhci_host *host, struct mmc_ios *ios)
0781 {
0782 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0783 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0784 int ret = 0;
0785
0786 if (!host->clock) {
0787 priv->clock = 0;
0788 return 0;
0789 }
0790
0791
0792
0793
0794
0795
0796 if ((host->clock == priv->clock) &&
0797 (ios->bus_width == priv->bus_width) &&
0798 (ios->timing == priv->timing))
0799 return 0;
0800
0801 xenon_emmc_phy_set(host, ios->timing);
0802
0803
0804 priv->bus_width = ios->bus_width;
0805
0806 priv->timing = ios->timing;
0807 priv->clock = host->clock;
0808
0809
0810 if (ios->timing == MMC_TIMING_LEGACY)
0811 return 0;
0812
0813 if (host->clock > XENON_DEFAULT_SDCLK_FREQ)
0814 ret = xenon_hs_delay_adj(host);
0815 return ret;
0816 }
0817
0818 static int xenon_add_phy(struct device *dev, struct sdhci_host *host,
0819 const char *phy_name)
0820 {
0821 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
0822 struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
0823 int ret;
0824
0825 priv->phy_type = match_string(phy_types, NR_PHY_TYPES, phy_name);
0826 if (priv->phy_type < 0) {
0827 dev_err(mmc_dev(host->mmc),
0828 "Unable to determine PHY name %s. Use default eMMC 5.1 PHY\n",
0829 phy_name);
0830 priv->phy_type = EMMC_5_1_PHY;
0831 }
0832
0833 ret = xenon_alloc_emmc_phy(host);
0834 if (ret)
0835 return ret;
0836
0837 return xenon_emmc_phy_parse_params(host, dev, priv->phy_params);
0838 }
0839
0840 int xenon_phy_parse_params(struct device *dev, struct sdhci_host *host)
0841 {
0842 const char *phy_type = NULL;
0843
0844 if (!device_property_read_string(dev, "marvell,xenon-phy-type", &phy_type))
0845 return xenon_add_phy(dev, host, phy_type);
0846
0847 return xenon_add_phy(dev, host, "emmc 5.1 phy");
0848 }