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

mmc: sdhci-of-arasan: add sdhci_arasan_voltage_switch for arasan, 5.1

Per the vendor's requirement, we shouldn't do any setting for
1.8V Signaling Enable, otherwise the interaction/behaviour between
phy and controller will be undefined. Mostly it works fine if we do
that, but we still see failures. Anyway, let's fix it to meet the
vendor's requirement. The error log looks like:

[ 93.405085] mmc1: unexpected status 0x800900 after switch
[ 93.408474] mmc1: switch to bus width 1 failed
[ 93.408482] mmc1: mmc_select_hs200 failed, error -110
[ 93.408492] mmc1: error -110 during resume (card was removed?)
[ 93.408705] PM: resume of devices complete after 213.453 msecs

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

Shawn Lin and committed by
Ulf Hansson
8a3bee9b 4f25580f

+24
+24
drivers/mmc/host/sdhci-of-arasan.c
··· 265 265 } 266 266 } 267 267 268 + static int sdhci_arasan_voltage_switch(struct mmc_host *mmc, 269 + struct mmc_ios *ios) 270 + { 271 + switch (ios->signal_voltage) { 272 + case MMC_SIGNAL_VOLTAGE_180: 273 + /* 274 + * Plese don't switch to 1V8 as arasan,5.1 doesn't 275 + * actually refer to this setting to indicate the 276 + * signal voltage and the state machine will be broken 277 + * actually if we force to enable 1V8. That's something 278 + * like broken quirk but we could work around here. 279 + */ 280 + return 0; 281 + case MMC_SIGNAL_VOLTAGE_330: 282 + case MMC_SIGNAL_VOLTAGE_120: 283 + /* We don't support 3V3 and 1V2 */ 284 + break; 285 + } 286 + 287 + return -EINVAL; 288 + } 289 + 268 290 static struct sdhci_ops sdhci_arasan_ops = { 269 291 .set_clock = sdhci_arasan_set_clock, 270 292 .get_max_clock = sdhci_pltfm_clk_get_max_clock, ··· 683 661 684 662 host->mmc_host_ops.hs400_enhanced_strobe = 685 663 sdhci_arasan_hs400_enhanced_strobe; 664 + host->mmc_host_ops.start_signal_voltage_switch = 665 + sdhci_arasan_voltage_switch; 686 666 } 687 667 688 668 ret = sdhci_add_host(host);