]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mmc: rtsx_pci: add quirk to disable MMC_CAP_AGGRESSIVE_PM for RTS525A
authorMatthew Schwartz <matthew.schwartz@linux.dev>
Sat, 3 Jan 2026 20:42:26 +0000 (12:42 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Jan 2026 15:36:32 +0000 (16:36 +0100)
Using MMC_CAP_AGGRESSIVE_PM on RTS525A card readers causes game
performance issues when the card reader comes back from idle into active
use. This can be observed in Hades II when loading new sections of the
game or menu after the card reader puts itself into idle, and presents
as a 1-2 second hang.

Add EXTRA_CAPS_NO_AGGRESSIVE_PM quirk to allow cardreader drivers to
opt-out of aggressive PM, and set it for RTS525A.

Closes: https://lore.kernel.org/linux-mmc/ff9a7c20-f465-4afa-bf29-708d4a52974a@linux.dev/
Signed-off-by: Matthew Schwartz <matthew.schwartz@linux.dev>
Link: https://patch.msgid.link/20260103204226.71752-1-matthew.schwartz@linux.dev
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/cardreader/rts5249.c
drivers/mmc/host/rtsx_pci_sdmmc.c
include/linux/rtsx_pci.h

index 38aefd8db452a3cfe647e1b0497037416f1fd549..87d576a03e68e95e735f97bbc5286a7a89b5726d 100644 (file)
@@ -78,6 +78,9 @@ static void rtsx_base_fetch_vendor_settings(struct rtsx_pcr *pcr)
        if (CHK_PCI_PID(pcr, PID_524A) || CHK_PCI_PID(pcr, PID_525A))
                pcr->rtd3_en = rtsx_reg_to_rtd3_uhsii(reg);
 
+       if (CHK_PCI_PID(pcr, PID_525A))
+               pcr->extra_caps |= EXTRA_CAPS_NO_AGGRESSIVE_PM;
+
        if (rtsx_check_mmc_support(reg))
                pcr->extra_caps |= EXTRA_CAPS_NO_MMC;
        pcr->sd30_drive_sel_3v3 = rtsx_reg_to_sd30_drive_sel_3v3(reg);
index dc2587ff8519f8816815524104ae7200952a9d3c..5d3599ee06bff7546b8707c73166f67563c4e049 100644 (file)
@@ -1456,8 +1456,8 @@ static void realtek_init_host(struct realtek_pci_sdmmc *host)
        mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SD_HIGHSPEED |
                MMC_CAP_MMC_HIGHSPEED | MMC_CAP_BUS_WIDTH_TEST |
                MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25;
-       if (pcr->rtd3_en)
-               mmc->caps = mmc->caps | MMC_CAP_AGGRESSIVE_PM;
+       if (pcr->rtd3_en && !(pcr->extra_caps & EXTRA_CAPS_NO_AGGRESSIVE_PM))
+               mmc->caps |= MMC_CAP_AGGRESSIVE_PM;
        mmc->caps2 = MMC_CAP2_NO_PRESCAN_POWERUP | MMC_CAP2_FULL_PWR_CYCLE |
                MMC_CAP2_NO_SDIO;
        mmc->max_current_330 = 400;
index 3c5689356004e63e40e9e533f811075c9fe3f05b..f6122349c00ec827b3b182f657fef9d6eb790454 100644 (file)
@@ -1230,6 +1230,7 @@ struct rtsx_pcr {
 #define EXTRA_CAPS_MMC_8BIT            (1 << 5)
 #define EXTRA_CAPS_NO_MMC              (1 << 7)
 #define EXTRA_CAPS_SD_EXPRESS          (1 << 8)
+#define EXTRA_CAPS_NO_AGGRESSIVE_PM    (1 << 9)
        u32                             extra_caps;
 
 #define IC_VER_A                       0