From: hastings Date: Sat, 19 Oct 2024 21:10:03 +0000 (+0000) Subject: Change sdhc_bus_power() behavior to return success and not perform a X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=8ab765f84d4769bbeb688bacea2d9caee85a211e;p=openbsd Change sdhc_bus_power() behavior to return success and not perform a power-off voltage switch sequence when card is already operating at requested voltage. Zap the NOPWR0 quirk for Intel controllers. ok stsp@ kettenis@ --- diff --git a/sys/dev/pci/sdhc_pci.c b/sys/dev/pci/sdhc_pci.c index d495d328df4..6146cf58fad 100644 --- a/sys/dev/pci/sdhc_pci.c +++ b/sys/dev/pci/sdhc_pci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sdhc_pci.c,v 1.26 2024/03/29 02:36:49 jsg Exp $ */ +/* $OpenBSD: sdhc_pci.c,v 1.27 2024/10/19 21:10:22 hastings Exp $ */ /* * Copyright (c) 2006 Uwe Stuehler @@ -126,16 +126,6 @@ sdhc_pci_attach(struct device *parent, struct device *self, void *aux) PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ENE_SDCARD) sc->sc.sc_flags |= SDHC_F_NOPWR0; - /* Some Intel controllers break if set to 0V bus power. */ - if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL && - (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_100SERIES_LP_EMMC || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_APOLLOLAKE_EMMC || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_GLK_EMMC || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_JSL_EMMC || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_EHL_EMMC || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_ADL_N_EMMC)) - sc->sc.sc_flags |= SDHC_F_NOPWR0; - /* Some RICOH controllers need to be bumped into the right mode. */ if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_RICOH && (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_RICOH_R5U822 || diff --git a/sys/dev/sdmmc/sdhc.c b/sys/dev/sdmmc/sdhc.c index badd60d9fba..216e8d09921 100644 --- a/sys/dev/sdmmc/sdhc.c +++ b/sys/dev/sdmmc/sdhc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sdhc.c,v 1.77 2024/08/06 15:03:36 patrick Exp $ */ +/* $OpenBSD: sdhc.c,v 1.78 2024/10/19 21:10:03 hastings Exp $ */ /* * Copyright (c) 2006 Uwe Stuehler @@ -591,14 +591,9 @@ sdhc_bus_power(sdmmc_chipset_handle_t sch, u_int32_t ocr) s = splsdmmc(); - /* - * Disable bus power before voltage change. - */ - if (!(hp->sc->sc_flags & SDHC_F_NOPWR0)) - HWRITE1(hp, SDHC_POWER_CTL, 0); - /* If power is disabled, reset the host and return now. */ if (ocr == 0) { + HWRITE1(hp, SDHC_POWER_CTL, 0); splx(s); (void)sdhc_host_reset(hp); return 0; @@ -620,6 +615,21 @@ sdhc_bus_power(sdmmc_chipset_handle_t sch, u_int32_t ocr) return EINVAL; } + /* + * Return if no change to powered bus voltage. + */ + if (HREAD1(hp, SDHC_POWER_CTL) == + ((vdd << SDHC_VOLTAGE_SHIFT) | SDHC_BUS_POWER)) { + splx(s); + return 0; + } + + /* + * Disable bus power before voltage change. + */ + if (!(hp->sc->sc_flags & SDHC_F_NOPWR0)) + HWRITE1(hp, SDHC_POWER_CTL, 0); + /* * Enable bus power. Wait at least 1 ms (or 74 clocks) plus * voltage ramp until power rises.