Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * PHY support for Xenon SDHC
0004  *
0005  * Copyright (C) 2016 Marvell, All Rights Reserved.
0006  *
0007  * Author:  Hu Ziji <huziji@marvell.com>
0008  * Date:    2016-8-24
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 /* Register base for eMMC PHY 5.0 Version */
0020 #define XENON_EMMC_5_0_PHY_REG_BASE     0x0160
0021 /* Register base for eMMC PHY 5.1 Version */
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 /* Preferred ZNR and ZPR value vary between different boards.
0085  * The specific ZNR and ZPR value should be defined here
0086  * according to board actual timing.
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  * List offset of PHY registers and some special register values
0114  * in eMMC PHY 5.0 or eMMC PHY 5.1
0115  */
0116 struct xenon_emmc_phy_regs {
0117     /* Offset of Timing Adjust register */
0118     u16 timing_adj;
0119     /* Offset of Func Control register */
0120     u16 func_ctrl;
0121     /* Offset of Pad Control register */
0122     u16 pad_ctrl;
0123     /* Offset of Pad Control register 2 */
0124     u16 pad_ctrl2;
0125     /* Offset of DLL Control register */
0126     u16 dll_ctrl;
0127     /* Offset of Logic Timing Adjust register */
0128     u16 logic_timing_adj;
0129     /* DLL Update Enable bit */
0130     u32 dll_update;
0131     /* value in Logic Timing Adjustment register */
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     /* Register address of SoC PHY PAD ctrl */
0153     void __iomem    *reg;
0154     /* SoC PHY PAD ctrl type */
0155     enum soc_pad_ctrl_type pad_type;
0156     /* SoC specific operation to set SoC PHY PAD */
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  * eMMC PHY configuration and operations
0185  */
0186 struct xenon_emmc_phy_params {
0187     bool    slow_mode;
0188 
0189     u8  znr;
0190     u8  zpr;
0191 
0192     /* Nr of consecutive Sampling Points of a Valid Sampling Window */
0193     u8  nr_tun_times;
0194     /* Divider for calculating Tuning Step */
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  * eMMC 5.0/5.1 PHY init/re-init.
0221  * eMMC PHY init should be executed after:
0222  * 1. SDCLK frequency changes.
0223  * 2. SDCLK is stopped and re-enabled.
0224  * 3. config in emmc_phy_regs->timing_adj and emmc_phy_regs->func_ctrl
0225  * are changed
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     /* Add duration of FC_SYNC_RST */
0240     wait = ((reg >> XENON_FC_SYNC_RST_DURATION_SHIFT) &
0241             XENON_FC_SYNC_RST_DURATION_MASK);
0242     /* Add interval between FC_SYNC_EN and FC_SYNC_RST */
0243     wait += ((reg >> XENON_FC_SYNC_RST_EN_DURATION_SHIFT) &
0244             XENON_FC_SYNC_RST_EN_DURATION_MASK);
0245     /* Add duration of asserting FC_SYNC_EN */
0246     wait += ((reg >> XENON_FC_SYNC_EN_DURATION_SHIFT) &
0247             XENON_FC_SYNC_EN_DURATION_MASK);
0248     /* Add duration of waiting for PHY */
0249     wait += ((reg >> XENON_WAIT_CYCLE_BEFORE_USING_SHIFT) &
0250             XENON_WAIT_CYCLE_BEFORE_USING_MASK);
0251     /* 4 additional bus clock and 4 AXI bus clock are required */
0252     wait += 8;
0253     wait <<= 20;
0254 
0255     clock = host->clock;
0256     if (!clock)
0257         /* Use the possibly slowest bus frequency value */
0258         clock = XENON_LOWEST_SDCLK_FREQ;
0259     /* get the wait time */
0260     wait /= clock;
0261     wait++;
0262     /* wait for host eMMC PHY init completes */
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  * Set SoC PHY voltage PAD control register,
0298  * according to the operation voltage on PAD.
0299  * The detailed operation depends on SoC implementation.
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  * Enable eMMC PHY HW DLL
0317  * DLL should be enabled and stable before HS200/SDR104 tuning,
0318  * and before HS400 data strobe setting.
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     /* Enable DLL */
0336     reg = sdhci_readl(host, phy_regs->dll_ctrl);
0337     reg |= (XENON_DLL_ENABLE | XENON_DLL_FAST_LOCK);
0338 
0339     /*
0340      * Set Phase as 90 degree, which is most common value.
0341      * Might set another value if necessary.
0342      * The granularity is 1 degree.
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     /* Wait max 32 ms */
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  * Config to eMMC PHY to prepare for tuning.
0374  * Enable HW DLL and set the TUNING_STEP
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     /* Achieve TUNING_STEP with HW DLL help */
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     /* Set TUNING_STEP for later tuning */
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     /* Disable both SDHC Data Strobe and Enhanced Strobe */
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     /* Clear Strobe line Pull down or Pull up */
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 /* Set HS400 Data Strobe and Enhanced Strobe */
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     /* Enable SDHC Data Strobe */
0454     reg = sdhci_readl(host, XENON_SLOT_EMMC_CTRL);
0455     reg |= XENON_ENABLE_DATA_STROBE;
0456     /*
0457      * Enable SDHC Enhanced Strobe if supported
0458      * Xenon Enhanced Strobe should be enabled only when
0459      * 1. card is in HS400 mode and
0460      * 2. SDCLK is higher than 52MHz
0461      * 3. DLL is enabled
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     /* Set Data Strobe Pull down */
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  * If eMMC PHY Slow Mode is required in lower speed mode (SDCLK < 55MHz)
0483  * in SDR mode, enable Slow Mode to bypass eMMC PHY.
0484  * SDIO slower SDR mode also requires Slow Mode.
0485  *
0486  * If Slow Mode is enabled, return true.
0487  * Otherwise, return false.
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     /* When in slower SDR mode, enable Slow Mode for SDIO
0504      * or when Slow Mode flag is set
0505      */
0506     switch (timing) {
0507     case MMC_TIMING_LEGACY:
0508         /*
0509          * If Slow Mode is required, enable Slow Mode by default
0510          * in early init phase to avoid any potential issue.
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  * Set-up eMMC 5.0/5.1 PHY.
0542  * Specific configuration depends on the current speed mode in use.
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     /* Setup pad, set bit[28] and bits[26:24] */
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     /* All FC_XX_RECEIVCE should be set as CMOS Type */
0560     reg |= XENON_FC_ALL_CMOS_RECEIVER;
0561     sdhci_writel(host, reg, phy_regs->pad_ctrl);
0562 
0563     /* Set CMD and DQ Pull Up */
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      * If SDIO card, set SDIO Mode
0583      * Otherwise, clear SDIO Mode
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      * Set preferred ZNR and ZPR value
0597      * The ZNR and ZPR value vary between different boards.
0598      * Define them both in sdhci-xenon-emmc-phy.h.
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      * When setting EMMC_PHY_FUNC_CONTROL register,
0607      * SD clock should be disabled
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     /* Enable bus clock */
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         /* Hardware team recommend a value for HS400 */
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 /* Set SoC PHY Voltage PAD */
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  * Setting PHY when card is working in High Speed Mode.
0736  * HS400 set Data Strobe and Enhanced Strobe if it is supported.
0737  * HS200/SDR104 set tuning config to prepare for tuning.
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          * DDR Mode requires driver to scan Sampling Fixed Delay Line,
0757          * to find out a perfect operation sampling point.
0758          * It is hard to implement such a scan in host driver
0759          * since initiating commands by host driver is not safe.
0760          * Thus so far just keep PHY Sampling Fixed Delay in
0761          * default value of DDR mode.
0762          *
0763          * If any timing issue occurs in DDR mode on Marvell products,
0764          * please contact maintainer for internal support in Marvell.
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  * Adjust PHY setting.
0775  * PHY setting should be adjusted when SDCLK frequency, Bus Width
0776  * or Speed Mode is changed.
0777  * Additional config are required when card is working in High Speed mode,
0778  * after leaving Legacy Mode.
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      * The timing, frequency or bus width is changed,
0793      * better to set eMMC PHY based on current setting
0794      * and adjust Xenon SDHC delay.
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     /* Update the record */
0804     priv->bus_width = ios->bus_width;
0805 
0806     priv->timing = ios->timing;
0807     priv->clock = host->clock;
0808 
0809     /* Legacy mode is a special case */
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 }