@@ -155,6 +155,7 @@ struct sdhci_am654_data {
155155 u32 tuning_loop ;
156156
157157#define SDHCI_AM654_QUIRK_FORCE_CDTEST BIT(0)
158+ #define SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA BIT(1)
158159};
159160
160161struct window {
@@ -166,6 +167,7 @@ struct window {
166167struct sdhci_am654_driver_data {
167168 const struct sdhci_pltfm_data * pdata ;
168169 u32 flags ;
170+ u32 quirks ;
169171#define IOMUX_PRESENT (1 << 0)
170172#define FREQSEL_2_BIT (1 << 1)
171173#define STRBSEL_4_BIT (1 << 2)
@@ -356,6 +358,29 @@ static void sdhci_j721e_4bit_set_clock(struct sdhci_host *host,
356358 sdhci_set_clock (host , clock );
357359}
358360
361+ static int sdhci_am654_start_signal_voltage_switch (struct mmc_host * mmc , struct mmc_ios * ios )
362+ {
363+ struct sdhci_host * host = mmc_priv (mmc );
364+ struct sdhci_pltfm_host * pltfm_host = sdhci_priv (host );
365+ struct sdhci_am654_data * sdhci_am654 = sdhci_pltfm_priv (pltfm_host );
366+ int ret ;
367+
368+ if ((sdhci_am654 -> quirks & SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA ) &&
369+ ios -> signal_voltage == MMC_SIGNAL_VOLTAGE_180 ) {
370+ if (!IS_ERR (mmc -> supply .vqmmc )) {
371+ ret = mmc_regulator_set_vqmmc (mmc , ios );
372+ if (ret < 0 ) {
373+ pr_err ("%s: Switching to 1.8V signalling voltage failed,\n" ,
374+ mmc_hostname (mmc ));
375+ return - EIO ;
376+ }
377+ }
378+ return 0 ;
379+ }
380+
381+ return sdhci_start_signal_voltage_switch (mmc , ios );
382+ }
383+
359384static u8 sdhci_am654_write_power_on (struct sdhci_host * host , u8 val , int reg )
360385{
361386 writeb (val , host -> ioaddr + reg );
@@ -650,6 +675,12 @@ static const struct sdhci_am654_driver_data sdhci_j721e_4bit_drvdata = {
650675 .flags = IOMUX_PRESENT ,
651676};
652677
678+ static const struct sdhci_am654_driver_data sdhci_am62_4bit_drvdata = {
679+ .pdata = & sdhci_j721e_4bit_pdata ,
680+ .flags = IOMUX_PRESENT ,
681+ .quirks = SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA ,
682+ };
683+
653684static const struct soc_device_attribute sdhci_am654_devices [] = {
654685 { .family = "AM65X" ,
655686 .revision = "SR1.0" ,
@@ -872,7 +903,7 @@ static const struct of_device_id sdhci_am654_of_match[] = {
872903 },
873904 {
874905 .compatible = "ti,am62-sdhci" ,
875- .data = & sdhci_j721e_4bit_drvdata ,
906+ .data = & sdhci_am62_4bit_drvdata ,
876907 },
877908 { /* sentinel */ }
878909};
@@ -906,6 +937,7 @@ static int sdhci_am654_probe(struct platform_device *pdev)
906937 pltfm_host = sdhci_priv (host );
907938 sdhci_am654 = sdhci_pltfm_priv (pltfm_host );
908939 sdhci_am654 -> flags = drvdata -> flags ;
940+ sdhci_am654 -> quirks = drvdata -> quirks ;
909941
910942 clk_xin = devm_clk_get (dev , "clk_xin" );
911943 if (IS_ERR (clk_xin )) {
@@ -940,6 +972,7 @@ static int sdhci_am654_probe(struct platform_device *pdev)
940972 goto err_pltfm_free ;
941973 }
942974
975+ host -> mmc_host_ops .start_signal_voltage_switch = sdhci_am654_start_signal_voltage_switch ;
943976 host -> mmc_host_ops .execute_tuning = sdhci_am654_execute_tuning ;
944977
945978 pm_runtime_get_noresume (dev );
0 commit comments