Message ID | 20240410191639.526324-7-hdegoede@redhat.com |
---|---|
State | New |
Headers | show |
Series | mmc: sdhci-acpi: Add some DMI quirks to fix various issues on Bay Trail devices | expand |
Hi Andy, On 4/10/24 10:06 PM, Andy Shevchenko wrote: > On Wed, Apr 10, 2024 at 09:16:39PM +0200, Hans de Goede wrote: >> The card-detect GPIO for the microSD slot on Asus T100TA / T100TAM models >> stopped working under Linux after commit 6fd03f024828 ("gpiolib: acpi: >> support bias pull disable"). >> >> The GPIO in question is connected to a mechanical switch in the slot >> which shorts the pin to GND when a card is inserted. >> >> The GPIO pin correctly gets configured with a 20K pull-up by the BIOS, >> but there is a bug in the DSDT where the GpioInt for the card-detect is >> configured with a PullNone setting: >> >> GpioInt (Edge, ActiveBoth, SharedAndWake, PullNone, 0x2710, >> "\\_SB.GPO0", 0x00, ResourceConsumer, , >> ) >> { // Pin list >> 0x0026 >> } >> >> Linux now actually honors the PullNone setting and disables the 20K pull-up >> configured by the BIOS. >> >> Add a new DMI_QUIRK_SD_CD_ENABLE_PULL_UP quirk which when set calls >> mmc_gpiod_set_cd_config() to re-enable the pull-up and set this for >> the Asus T100TA models to fix this. > > ... > >> + mmc_gpiod_set_cd_config(host->mmc, >> + PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 20000)); > > > Just noticed, the PIN_CONF_PACKED() is a helper for pinconf-generic.h. It seems > unusual to use it directly, and AFAIU documentation, it's for static > initialisations, however it's not explicitly said. I saw the static vs runtime comment, but I assumed that applies to the parameters passed to PIN_CONF_PACKED() being determined at runtime (not the cases here) vs the parameters being static / const. Regards, Hans
diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c index f7d4808413cb..eb8f427f9770 100644 --- a/drivers/mmc/host/sdhci-acpi.c +++ b/drivers/mmc/host/sdhci-acpi.c @@ -10,6 +10,7 @@ #include <linux/export.h> #include <linux/module.h> #include <linux/device.h> +#include <linux/pinctrl/pinconf-generic.h> #include <linux/platform_device.h> #include <linux/ioport.h> #include <linux/io.h> @@ -81,6 +82,7 @@ enum { DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP = BIT(0), DMI_QUIRK_SD_NO_WRITE_PROTECT = BIT(1), DMI_QUIRK_SD_CD_ACTIVE_HIGH = BIT(2), + DMI_QUIRK_SD_CD_ENABLE_PULL_UP = BIT(3), }; static inline void *sdhci_acpi_priv(struct sdhci_acpi_host *c) @@ -734,6 +736,14 @@ static const struct dmi_system_id sdhci_acpi_quirks[] = { }, .driver_data = (void *)DMI_QUIRK_SD_NO_WRITE_PROTECT, }, + { + /* Asus T100TA, needs pull-up for cd but DSDT GpioInt has NoPull set */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "T100TA"), + }, + .driver_data = (void *)DMI_QUIRK_SD_CD_ENABLE_PULL_UP, + }, { /* * The Lenovo Miix 320-10ICR has a bug in the _PS0 method of @@ -908,6 +918,9 @@ static int sdhci_acpi_probe(struct platform_device *pdev) goto err_free; dev_warn(dev, "failed to setup card detect gpio\n"); c->use_runtime_pm = false; + } else if (quirks & DMI_QUIRK_SD_CD_ENABLE_PULL_UP) { + mmc_gpiod_set_cd_config(host->mmc, + PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 20000)); } if (quirks & DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP)