Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mmc: sdhci-of-dwcmshc: Change to dwcmshc_phy_init for reusing codes

dwcmshc_phy_1_8v_init and dwcmshc_phy_3_3v_init differ only by a few
lines of code. This allow us to reuse code depending on voltage.

Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/20250131025406.1753513-1-jh80.chung@samsung.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

Jaehoon Chung and committed by
Ulf Hansson
4e35c611 6bc02265

+15 -57
+15 -57
drivers/mmc/host/sdhci-of-dwcmshc.c
··· 328 328 sdhci_request(mmc, mrq); 329 329 } 330 330 331 - static void dwcmshc_phy_1_8v_init(struct sdhci_host *host) 331 + static void dwcmshc_phy_init(struct sdhci_host *host) 332 332 { 333 333 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); 334 334 struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host); 335 + u32 rxsel = PHY_PAD_RXSEL_3V3; 335 336 u32 val; 337 + 338 + if (priv->flags & FLAG_IO_FIXED_1V8 || 339 + host->mmc->ios.timing & MMC_SIGNAL_VOLTAGE_180) 340 + rxsel = PHY_PAD_RXSEL_1V8; 336 341 337 342 /* deassert phy reset & set tx drive strength */ 338 343 val = PHY_CNFG_RSTN_DEASSERT; ··· 358 353 sdhci_writeb(host, val, PHY_SDCLKDL_CNFG_R); 359 354 360 355 /* configure phy pads */ 361 - val = PHY_PAD_RXSEL_1V8; 356 + val = rxsel; 362 357 val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLUP); 363 358 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P); 364 359 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N); ··· 370 365 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N); 371 366 sdhci_writew(host, val, PHY_CLKPAD_CNFG_R); 372 367 373 - val = PHY_PAD_RXSEL_1V8; 368 + val = rxsel; 374 369 val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLDOWN); 375 370 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P); 376 371 val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N); 377 372 sdhci_writew(host, val, PHY_STBPAD_CNFG_R); 378 373 379 374 /* enable data strobe mode */ 380 - sdhci_writeb(host, FIELD_PREP(PHY_DLLDL_CNFG_SLV_INPSEL_MASK, PHY_DLLDL_CNFG_SLV_INPSEL), 381 - PHY_DLLDL_CNFG_R); 375 + if (rxsel == PHY_PAD_RXSEL_1V8) { 376 + u8 sel = FIELD_PREP(PHY_DLLDL_CNFG_SLV_INPSEL_MASK, PHY_DLLDL_CNFG_SLV_INPSEL); 377 + 378 + sdhci_writeb(host, sel, PHY_DLLDL_CNFG_R); 379 + } 382 380 383 381 /* enable phy dll */ 384 382 sdhci_writeb(host, PHY_DLL_CTRL_ENABLE, PHY_DLL_CTRL_R); 385 - } 386 383 387 - static void dwcmshc_phy_3_3v_init(struct sdhci_host *host) 388 - { 389 - struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); 390 - struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host); 391 - u32 val; 392 - 393 - /* deassert phy reset & set tx drive strength */ 394 - val = PHY_CNFG_RSTN_DEASSERT; 395 - val |= FIELD_PREP(PHY_CNFG_PAD_SP_MASK, PHY_CNFG_PAD_SP); 396 - val |= FIELD_PREP(PHY_CNFG_PAD_SN_MASK, PHY_CNFG_PAD_SN); 397 - sdhci_writel(host, val, PHY_CNFG_R); 398 - 399 - /* disable delay line */ 400 - sdhci_writeb(host, PHY_SDCLKDL_CNFG_UPDATE, PHY_SDCLKDL_CNFG_R); 401 - 402 - /* set delay line */ 403 - sdhci_writeb(host, priv->delay_line, PHY_SDCLKDL_DC_R); 404 - sdhci_writeb(host, PHY_DLL_CNFG2_JUMPSTEP, PHY_DLL_CNFG2_R); 405 - 406 - /* enable delay lane */ 407 - val = sdhci_readb(host, PHY_SDCLKDL_CNFG_R); 408 - val &= ~(PHY_SDCLKDL_CNFG_UPDATE); 409 - sdhci_writeb(host, val, PHY_SDCLKDL_CNFG_R); 410 - 411 - /* configure phy pads */ 412 - val = PHY_PAD_RXSEL_3V3; 413 - val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLUP); 414 - val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P); 415 - val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N); 416 - sdhci_writew(host, val, PHY_CMDPAD_CNFG_R); 417 - sdhci_writew(host, val, PHY_DATAPAD_CNFG_R); 418 - sdhci_writew(host, val, PHY_RSTNPAD_CNFG_R); 419 - 420 - val = FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P); 421 - val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N); 422 - sdhci_writew(host, val, PHY_CLKPAD_CNFG_R); 423 - 424 - val = PHY_PAD_RXSEL_3V3; 425 - val |= FIELD_PREP(PHY_PAD_WEAKPULL_MASK, PHY_PAD_WEAKPULL_PULLDOWN); 426 - val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_P_MASK, PHY_PAD_TXSLEW_CTRL_P); 427 - val |= FIELD_PREP(PHY_PAD_TXSLEW_CTRL_N_MASK, PHY_PAD_TXSLEW_CTRL_N); 428 - sdhci_writew(host, val, PHY_STBPAD_CNFG_R); 429 - 430 - /* enable phy dll */ 431 - sdhci_writeb(host, PHY_DLL_CTRL_ENABLE, PHY_DLL_CTRL_R); 432 384 } 433 385 434 386 static void th1520_sdhci_set_phy(struct sdhci_host *host) ··· 395 433 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO; 396 434 u16 emmc_ctrl; 397 435 398 - /* Before power on, set PHY configs */ 399 - if (priv->flags & FLAG_IO_FIXED_1V8) 400 - dwcmshc_phy_1_8v_init(host); 401 - else 402 - dwcmshc_phy_3_3v_init(host); 436 + dwcmshc_phy_init(host); 403 437 404 438 if ((host->mmc->caps2 & emmc_caps) == emmc_caps) { 405 439 emmc_ctrl = sdhci_readw(host, priv->vendor_specific_area1 + DWCMSHC_EMMC_CONTROL); ··· 1121 1163 .get_max_clock = dwcmshc_get_max_clock, 1122 1164 .reset = th1520_sdhci_reset, 1123 1165 .adma_write_desc = dwcmshc_adma_write_desc, 1124 - .voltage_switch = dwcmshc_phy_1_8v_init, 1166 + .voltage_switch = dwcmshc_phy_init, 1125 1167 .platform_execute_tuning = th1520_execute_tuning, 1126 1168 }; 1127 1169