@@ -155,6 +155,7 @@ struct sdhci_am654_data {
155
155
u32 tuning_loop ;
156
156
157
157
#define SDHCI_AM654_QUIRK_FORCE_CDTEST BIT(0)
158
+ #define SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA BIT(1)
158
159
};
159
160
160
161
struct window {
@@ -166,6 +167,7 @@ struct window {
166
167
struct sdhci_am654_driver_data {
167
168
const struct sdhci_pltfm_data * pdata ;
168
169
u32 flags ;
170
+ u32 quirks ;
169
171
#define IOMUX_PRESENT (1 << 0)
170
172
#define FREQSEL_2_BIT (1 << 1)
171
173
#define STRBSEL_4_BIT (1 << 2)
@@ -356,6 +358,29 @@ static void sdhci_j721e_4bit_set_clock(struct sdhci_host *host,
356
358
sdhci_set_clock (host , clock );
357
359
}
358
360
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
+
359
384
static u8 sdhci_am654_write_power_on (struct sdhci_host * host , u8 val , int reg )
360
385
{
361
386
writeb (val , host -> ioaddr + reg );
@@ -650,6 +675,12 @@ static const struct sdhci_am654_driver_data sdhci_j721e_4bit_drvdata = {
650
675
.flags = IOMUX_PRESENT ,
651
676
};
652
677
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
+
653
684
static const struct soc_device_attribute sdhci_am654_devices [] = {
654
685
{ .family = "AM65X" ,
655
686
.revision = "SR1.0" ,
@@ -872,7 +903,7 @@ static const struct of_device_id sdhci_am654_of_match[] = {
872
903
},
873
904
{
874
905
.compatible = "ti,am62-sdhci" ,
875
- .data = & sdhci_j721e_4bit_drvdata ,
906
+ .data = & sdhci_am62_4bit_drvdata ,
876
907
},
877
908
{ /* sentinel */ }
878
909
};
@@ -906,6 +937,7 @@ static int sdhci_am654_probe(struct platform_device *pdev)
906
937
pltfm_host = sdhci_priv (host );
907
938
sdhci_am654 = sdhci_pltfm_priv (pltfm_host );
908
939
sdhci_am654 -> flags = drvdata -> flags ;
940
+ sdhci_am654 -> quirks = drvdata -> quirks ;
909
941
910
942
clk_xin = devm_clk_get (dev , "clk_xin" );
911
943
if (IS_ERR (clk_xin )) {
@@ -940,6 +972,7 @@ static int sdhci_am654_probe(struct platform_device *pdev)
940
972
goto err_pltfm_free ;
941
973
}
942
974
975
+ host -> mmc_host_ops .start_signal_voltage_switch = sdhci_am654_start_signal_voltage_switch ;
943
976
host -> mmc_host_ops .execute_tuning = sdhci_am654_execute_tuning ;
944
977
945
978
pm_runtime_get_noresume (dev );
0 commit comments