Yes, the issue can be resolved by the software workaround.
DPSI and SD card(HS only) work when we configure
For below listed RCW settings
SDHC1_DIR_PMUX=3
SDHC1_DS_PMUX=2
SDHC1_BASE_PMUX=3
In order to get DSPI and SD card (both HS and UHS modes) work simultaneously, SDHC1_BASE_PMUX should be set to 0. The configuration should be fine after this change. Please also make sure that you do indeed to make change to an UHS mode in your code and switch the voltage to 1.8V as part of the routine.
I searched the code to control the EVDD voltage under Linux code. Please refer the subroutine esdhc_signal_voltage_switch in drivers/mmc/host/sdhci-of-esdhc.c. You need to switch the voltage to 1.8V when running at an UHS mode.
static int esdhc_signal_voltage_switch(struct mmc_host *mmc,
struct mmc_ios *ios)
{
struct sdhci_host *host = mmc_priv(mmc);
struct device_node *scfg_node;
void __iomem *scfg_base = NULL;
u32 sdhciovselcr;
u32 val;
/*
* Signal Voltage Switching is only applicable for Host Controllers
* v3.00 and above.
*/
if (host->version < SDHCI_SPEC_300)
return 0;
val = sdhci_readl(host, ESDHC_PROCTL);
switch (ios->signal_voltage) {
case MMC_SIGNAL_VOLTAGE_330:
val &= ~ESDHC_VOLT_SEL;
sdhci_writel(host, val, ESDHC_PROCTL);
return 0;
case MMC_SIGNAL_VOLTAGE_180:
scfg_node = of_find_matching_node(NULL, scfg_device_ids);
if (scfg_node)
scfg_base = of_iomap(scfg_node, 0);
if (scfg_base) {
sdhciovselcr = SDHCIOVSELCR_TGLEN |
SDHCIOVSELCR_VSELVAL;
iowrite32be(sdhciovselcr,
scfg_base + SCFG_SDHCIOVSELCR);
val |= ESDHC_VOLT_SEL;
sdhci_writel(host, val, ESDHC_PROCTL);
mdelay(5);
sdhciovselcr = SDHCIOVSELCR_TGLEN |
SDHCIOVSELCR_SDHC_VS;
iowrite32be(sdhciovselcr,
scfg_base + SCFG_SDHCIOVSELCR);
iounmap(scfg_base);
} else {
val |= ESDHC_VOLT_SEL;
sdhci_writel(host, val, ESDHC_PROCTL);
}
return 0;
default:
return 0;
}
}