| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Date: Thu, 11 Jan 2018 15:51:58 +0200 |
| Subject: sdhci: Advertise 2.0v supply on SDIO host controller |
| |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| |
| |
| [ Upstream commit 2a609abe71ca59e4bd7139e161eaca2144ae6f2e ] |
| |
| On Intel Edison the Broadcom Wi-Fi card, which is connected to SDIO, |
| requires 2.0v, while the host, according to Intel Merrifield TRM, |
| supports 1.8v supply only. |
| |
| The card announces itself as |
| |
| mmc2: new ultra high speed DDR50 SDIO card at address 0001 |
| |
| Introduce a custom OCR mask for SDIO host controller on Intel Merrifield |
| and add a special case to sdhci_set_power_noreg() to override 2.0v supply |
| by enforcing 1.8v power choice. |
| |
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Acked-by: Adrian Hunter <adrian.hunter@intel.com> |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/mmc/host/sdhci-pci-core.c | 2 ++ |
| drivers/mmc/host/sdhci.c | 7 +++++++ |
| 2 files changed, 9 insertions(+) |
| |
| --- a/drivers/mmc/host/sdhci-pci-core.c |
| +++ b/drivers/mmc/host/sdhci-pci-core.c |
| @@ -492,6 +492,8 @@ static int intel_mrfld_mmc_probe_slot(st |
| slot->host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V; |
| break; |
| case INTEL_MRFLD_SDIO: |
| + /* Advertise 2.0v for compatibility with the SDIO card's OCR */ |
| + slot->host->ocr_mask = MMC_VDD_20_21 | MMC_VDD_165_195; |
| slot->host->mmc->caps |= MMC_CAP_NONREMOVABLE | |
| MMC_CAP_POWER_OFF_CARD; |
| break; |
| --- a/drivers/mmc/host/sdhci.c |
| +++ b/drivers/mmc/host/sdhci.c |
| @@ -1404,6 +1404,13 @@ void sdhci_set_power_noreg(struct sdhci_ |
| if (mode != MMC_POWER_OFF) { |
| switch (1 << vdd) { |
| case MMC_VDD_165_195: |
| + /* |
| + * Without a regulator, SDHCI does not support 2.0v |
| + * so we only get here if the driver deliberately |
| + * added the 2.0v range to ocr_avail. Map it to 1.8v |
| + * for the purpose of turning on the power. |
| + */ |
| + case MMC_VDD_20_21: |
| pwr = SDHCI_POWER_180; |
| break; |
| case MMC_VDD_29_30: |