@@ -328,12 +328,17 @@ static void dwcmshc_request(struct mmc_host *mmc, struct mmc_request *mrq)
328328 sdhci_request (mmc , mrq );
329329}
330330
331- static void dwcmshc_phy_1_8v_init (struct sdhci_host * host )
331+ static void dwcmshc_phy_init (struct sdhci_host * host )
332332{
333333 struct sdhci_pltfm_host * pltfm_host = sdhci_priv (host );
334334 struct dwcmshc_priv * priv = sdhci_pltfm_priv (pltfm_host );
335+ u32 rxsel = PHY_PAD_RXSEL_3V3 ;
335336 u32 val ;
336337
338+ if (priv -> flags & FLAG_IO_FIXED_1V8 ||
339+ host -> mmc -> ios .timing & MMC_SIGNAL_VOLTAGE_180 )
340+ rxsel = PHY_PAD_RXSEL_1V8 ;
341+
337342 /* deassert phy reset & set tx drive strength */
338343 val = PHY_CNFG_RSTN_DEASSERT ;
339344 val |= FIELD_PREP (PHY_CNFG_PAD_SP_MASK , PHY_CNFG_PAD_SP );
@@ -353,7 +358,7 @@ static void dwcmshc_phy_1_8v_init(struct sdhci_host *host)
353358 sdhci_writeb (host , val , PHY_SDCLKDL_CNFG_R );
354359
355360 /* configure phy pads */
356- val = PHY_PAD_RXSEL_1V8 ;
361+ val = rxsel ;
357362 val |= FIELD_PREP (PHY_PAD_WEAKPULL_MASK , PHY_PAD_WEAKPULL_PULLUP );
358363 val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_P_MASK , PHY_PAD_TXSLEW_CTRL_P );
359364 val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_N_MASK , PHY_PAD_TXSLEW_CTRL_N );
@@ -365,65 +370,22 @@ static void dwcmshc_phy_1_8v_init(struct sdhci_host *host)
365370 val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_N_MASK , PHY_PAD_TXSLEW_CTRL_N );
366371 sdhci_writew (host , val , PHY_CLKPAD_CNFG_R );
367372
368- val = PHY_PAD_RXSEL_1V8 ;
373+ val = rxsel ;
369374 val |= FIELD_PREP (PHY_PAD_WEAKPULL_MASK , PHY_PAD_WEAKPULL_PULLDOWN );
370375 val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_P_MASK , PHY_PAD_TXSLEW_CTRL_P );
371376 val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_N_MASK , PHY_PAD_TXSLEW_CTRL_N );
372377 sdhci_writew (host , val , PHY_STBPAD_CNFG_R );
373378
374379 /* enable data strobe mode */
375- sdhci_writeb (host , FIELD_PREP (PHY_DLLDL_CNFG_SLV_INPSEL_MASK , PHY_DLLDL_CNFG_SLV_INPSEL ),
376- PHY_DLLDL_CNFG_R );
377-
378- /* enable phy dll */
379- sdhci_writeb (host , PHY_DLL_CTRL_ENABLE , PHY_DLL_CTRL_R );
380- }
381-
382- static void dwcmshc_phy_3_3v_init (struct sdhci_host * host )
383- {
384- struct sdhci_pltfm_host * pltfm_host = sdhci_priv (host );
385- struct dwcmshc_priv * priv = sdhci_pltfm_priv (pltfm_host );
386- u32 val ;
387-
388- /* deassert phy reset & set tx drive strength */
389- val = PHY_CNFG_RSTN_DEASSERT ;
390- val |= FIELD_PREP (PHY_CNFG_PAD_SP_MASK , PHY_CNFG_PAD_SP );
391- val |= FIELD_PREP (PHY_CNFG_PAD_SN_MASK , PHY_CNFG_PAD_SN );
392- sdhci_writel (host , val , PHY_CNFG_R );
393-
394- /* disable delay line */
395- sdhci_writeb (host , PHY_SDCLKDL_CNFG_UPDATE , PHY_SDCLKDL_CNFG_R );
396-
397- /* set delay line */
398- sdhci_writeb (host , priv -> delay_line , PHY_SDCLKDL_DC_R );
399- sdhci_writeb (host , PHY_DLL_CNFG2_JUMPSTEP , PHY_DLL_CNFG2_R );
400-
401- /* enable delay lane */
402- val = sdhci_readb (host , PHY_SDCLKDL_CNFG_R );
403- val &= ~(PHY_SDCLKDL_CNFG_UPDATE );
404- sdhci_writeb (host , val , PHY_SDCLKDL_CNFG_R );
380+ if (rxsel == PHY_PAD_RXSEL_1V8 ) {
381+ u8 sel = FIELD_PREP (PHY_DLLDL_CNFG_SLV_INPSEL_MASK , PHY_DLLDL_CNFG_SLV_INPSEL );
405382
406- /* configure phy pads */
407- val = PHY_PAD_RXSEL_3V3 ;
408- val |= FIELD_PREP (PHY_PAD_WEAKPULL_MASK , PHY_PAD_WEAKPULL_PULLUP );
409- val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_P_MASK , PHY_PAD_TXSLEW_CTRL_P );
410- val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_N_MASK , PHY_PAD_TXSLEW_CTRL_N );
411- sdhci_writew (host , val , PHY_CMDPAD_CNFG_R );
412- sdhci_writew (host , val , PHY_DATAPAD_CNFG_R );
413- sdhci_writew (host , val , PHY_RSTNPAD_CNFG_R );
414-
415- val = FIELD_PREP (PHY_PAD_TXSLEW_CTRL_P_MASK , PHY_PAD_TXSLEW_CTRL_P );
416- val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_N_MASK , PHY_PAD_TXSLEW_CTRL_N );
417- sdhci_writew (host , val , PHY_CLKPAD_CNFG_R );
418-
419- val = PHY_PAD_RXSEL_3V3 ;
420- val |= FIELD_PREP (PHY_PAD_WEAKPULL_MASK , PHY_PAD_WEAKPULL_PULLDOWN );
421- val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_P_MASK , PHY_PAD_TXSLEW_CTRL_P );
422- val |= FIELD_PREP (PHY_PAD_TXSLEW_CTRL_N_MASK , PHY_PAD_TXSLEW_CTRL_N );
423- sdhci_writew (host , val , PHY_STBPAD_CNFG_R );
383+ sdhci_writeb (host , sel , PHY_DLLDL_CNFG_R );
384+ }
424385
425386 /* enable phy dll */
426387 sdhci_writeb (host , PHY_DLL_CTRL_ENABLE , PHY_DLL_CTRL_R );
388+
427389}
428390
429391static void th1520_sdhci_set_phy (struct sdhci_host * host )
@@ -433,11 +395,7 @@ static void th1520_sdhci_set_phy(struct sdhci_host *host)
433395 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO ;
434396 u16 emmc_ctrl ;
435397
436- /* Before power on, set PHY configs */
437- if (priv -> flags & FLAG_IO_FIXED_1V8 )
438- dwcmshc_phy_1_8v_init (host );
439- else
440- dwcmshc_phy_3_3v_init (host );
398+ dwcmshc_phy_init (host );
441399
442400 if ((host -> mmc -> caps2 & emmc_caps ) == emmc_caps ) {
443401 emmc_ctrl = sdhci_readw (host , priv -> vendor_specific_area1 + DWCMSHC_EMMC_CONTROL );
@@ -1163,7 +1121,7 @@ static const struct sdhci_ops sdhci_dwcmshc_th1520_ops = {
11631121 .get_max_clock = dwcmshc_get_max_clock ,
11641122 .reset = th1520_sdhci_reset ,
11651123 .adma_write_desc = dwcmshc_adma_write_desc ,
1166- .voltage_switch = dwcmshc_phy_1_8v_init ,
1124+ .voltage_switch = dwcmshc_phy_init ,
11671125 .platform_execute_tuning = th1520_execute_tuning ,
11681126};
11691127
0 commit comments