From nobody Fri Jun 12 18:33:11 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CBE4C3FBED0 for ; Wed, 13 May 2026 11:40:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778672421; cv=none; b=SxEv/N/EbuBep5QSfZdLgTP8b948vHwdHMXMY6PtL7oB3w6nOrjtRPreRoCdviD2vS8796EMvlRQGyisPjzJ7GBOleLVRyEcdEzc67xW58oN4lE5HzFJPebtiUF64wZVcTHRpVQIWH1e3gjbVUBJOaUs3K0V1i0r/q7LndiwJeM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778672421; c=relaxed/simple; bh=tOdHxbBJjFZBlIf8bIV0WunkgYiFanYFWu8qQaHdxOE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PjHroQJLvE61ocFr77sisbkTIdsx6XSluv7PT6D+RMgN+3j8VLLymSZ6RTps2Ed207Nz75EJGWW2fad8RAOXARVDu29Wag2p+fKFqDrokb5nPs+y8jRzI4IrELODsd5ZxKtckZNEjkPHGkXf8baw3vzyZ/cS3BUxK+kXTAsLhE0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=starlabs.systems; spf=pass smtp.mailfrom=starlabs.systems; dkim=pass (2048-bit key) header.d=starlabs-systems.20251104.gappssmtp.com header.i=@starlabs-systems.20251104.gappssmtp.com header.b=B65h0YkW; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=starlabs.systems Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=starlabs.systems Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=starlabs-systems.20251104.gappssmtp.com header.i=@starlabs-systems.20251104.gappssmtp.com header.b="B65h0YkW" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-48e56c1bf5dso40289115e9.3 for ; Wed, 13 May 2026 04:40:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=starlabs-systems.20251104.gappssmtp.com; s=20251104; t=1778672418; x=1779277218; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WezRk8pMbMv4stSI3tk0Nplcuh6tkeeC0ibZoOc30qo=; b=B65h0YkWajVu8CydezqemBANjOIdhcG57LThR4v+a9w6H4VouIECRWrjZtM/cIQ4um Ju2H06xqoviGeLe53uUjWSiNFA14c8jCC9Al8l5sAcSSF1Rpe+H3YX2gADRyncvNF/r/ YUbvIarEudeKdXfOSvODq5M8+hh0+ulcAkrKSYnRkluAbYjEFaWBC10YuAQ6xIh3djJs X+0h2gfikmsQ0qFeHCX/X2hDyDXCJ0HTzU3eJHxEcP2JY3/Dl4q0IJf+wy9rSMEhyMNw NpZq9kx4vslA/aMSV3CkegHog5dVoU4W7crgG1Ck4EXrGd/mUyz7EpsZ70VXnQrNeadd QXUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778672418; x=1779277218; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=WezRk8pMbMv4stSI3tk0Nplcuh6tkeeC0ibZoOc30qo=; b=Iv2b8E/5lU8Wqeh/8cjYGw5VlwL+MmPt4rEFvXp7M5d50t3csOWtPIM9Z1VLqR41Qk nvGOMHFUa2awrFmzdiek3PT14tVwNs+xh4HJYqVYwKtW6JePdQCSChYnDkK7ND852AUG dS/j0DOe9S8pvxXua4V1WaiNIJfkfn2rSXWhMli4gLBpPjKadiZNeN2m8kwnd01Nezb3 Uh1F51LkpzOTLISZiJmjb4WNkgbsWjYXxPrcW8fQWee/KJlalogqoVZrhM48bQTdQGUI 1hcEAbp3sj/eSESrfIdKh+4+TOBxqos7Q/3ODhUOQyvCjPdDe3XCgEA9ygpzT1+xArGx ReLg== X-Forwarded-Encrypted: i=1; AFNElJ8lR8a4K39I6dYQkVelWDYXNQT4BgywpBM4M6R2DR+jXo0IzxMOhlF8Dm5P/Rz0/Rcq5OOMn0rCnNUvX94=@vger.kernel.org X-Gm-Message-State: AOJu0YzR5V3RMLhMPI7w9JwQk4OgHHauR0uH5WQc11cuopdGXwqN2UHV reFYQCgdDqglnz9kmjecPX58KDyw/aRV2LrVjpg1Cx3hDpmet5DDXNMl/Og18BBf6Q== X-Gm-Gg: Acq92OFrFBiLatwEcOvS8lVls3vsQCQkCH1at+SfjpllXXyWg9WWTod4nkUF1m0+2kp bxdLyX70RzuqbTxB+qDE2uW2imvV66dQ5cPX5LSbCyoun/Udwn3FAc50C0GZMlW/lvcd4uMfsY2 +xfGXw6th58jEy+vaaeFxo0l5y60LYKCR2I0YRCgocblQZRYsAB95Jgqi2K0fZVDF/Fc5ATHWbN J+YiRksBQr4JJPttzKq/Eexwnbc9xld4JpdoI06pk/uKrNNFol9KzBHE+vJ00vlmNbJeWFtYfvH eyBG4wTCBibbJ0R8IXl36PpjoyPvwTVOXD5I8jyB29OiWjk50vAMRY8Kwe4WNn9h9HuJAGreLER 2gM3Xe0J1hbStQ8bNNJxQF6xMPX4t99JQqw5AHMn/BmLu4KwriCNLongU7HPpIxFbQMFj8+pD1Z hqDljcfXik0Li7IDGE/t3KkqQtgclCgfEpZqodrQuFK0lfpqwCeChvPPG1zD0v2DsOGoR1 X-Received: by 2002:a05:600c:3013:b0:48f:d1c0:5cd3 with SMTP id 5b1f17b1804b1-48fd1c05f08mr14509725e9.13.1778672418216; Wed, 13 May 2026 04:40:18 -0700 (PDT) Received: from horizon.localdomain ([212.105.128.254]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48fcdf64013sm53508475e9.2.2026.05.13.04.40.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 May 2026 04:40:17 -0700 (PDT) From: Sean Rhodes To: Ulf Hansson Cc: Ricky Wu , Avri Altman , Sean Rhodes , Jisheng Zhang , Nathan Chancellor , Dan Carpenter , Binbin Zhou , linux-mmc@vger.kernel.org, Huacai Chen , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, gregkh@linuxfoundation.org, arnd@arndb.de, ulf.hansson@linaro.org, adrian.hunter@intel.com, rogerable@realtek.com, matthew.schwartz@linux.dev Subject: [RFC PATCH 1/2] mmc: rtsx_usb_sdmmc: avoid false card-detect on tray readers Date: Wed, 13 May 2026 12:40:12 +0100 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some Realtek USB SD readers with a tray can assert SD_CD even when no card is present. This can make the MMC core believe a card exists, and may trigger unnecessary initialization and suspend failures. Debounce the CD signal and validate a newly detected card by probing for a response (CMD0 + CMD8/CMD55/CMD1) before reporting it present. Also treat SD_INT as a removal indication even if SD_CD stays asserted. Tested on a Realtek RTS5129 USB reader (0bda:0129): - Tray inserted, no card: no mmc device created (hot-plug and cold boot) - Tray + SDXC card: hot-plug and cold boot detect mmcblk0 Tested-by: Sean Rhodes Signed-off-by: Sean Rhodes --- drivers/mmc/host/rtsx_usb_sdmmc.c | 156 ++++++++++++++++++++++++++++-- 1 file changed, 148 insertions(+), 8 deletions(-) diff --git a/drivers/mmc/host/rtsx_usb_sdmmc.c b/drivers/mmc/host/rtsx_usb_= sdmmc.c index 84674659a84d..ec3eeea78e95 100644 --- a/drivers/mmc/host/rtsx_usb_sdmmc.c +++ b/drivers/mmc/host/rtsx_usb_sdmmc.c @@ -19,6 +19,7 @@ #include #include #include +#include =20 #include #include @@ -30,6 +31,9 @@ #define RTSX_USB_USE_LEDS_CLASS #endif =20 +#define RTSX_USB_SD_CD_DEBOUNCE_CNT 2 +#define RTSX_USB_SD_INSERT_RETRY_MS 1000 + struct rtsx_usb_sdmmc { struct platform_device *pdev; struct rtsx_ucr *ucr; @@ -46,6 +50,8 @@ struct rtsx_usb_sdmmc { bool card_exist; bool initial_mode; bool ddr_mode; + u8 cd_debounce; + unsigned long next_insert_check; =20 unsigned char power_mode; u16 ocp_stat; @@ -72,6 +78,13 @@ static inline void sd_clear_error(struct rtsx_usb_sdmmc = *host) rtsx_usb_clear_fsm_err(ucr); } =20 +static int sd_set_bus_width(struct rtsx_usb_sdmmc *host, + unsigned char bus_width); +static int sd_set_timing(struct rtsx_usb_sdmmc *host, + unsigned char timing, bool *ddr_mode); +static int sd_power_on(struct rtsx_usb_sdmmc *host); +static int sd_power_off(struct rtsx_usb_sdmmc *host); + #ifdef DEBUG static void sd_print_debug_regs(struct rtsx_usb_sdmmc *host) { @@ -768,12 +781,94 @@ static int sdmmc_get_ro(struct mmc_host *mmc) return 0; } =20 +static bool sdmmc_validate_insert_locked(struct rtsx_usb_sdmmc *host) +{ + struct rtsx_ucr *ucr =3D host->ucr; + struct mmc_command cmd =3D { }; + int err =3D 0; + bool probe_powered =3D false; + bool ddr_mode =3D false; + + /* + * Some readers with a tray assert the mechanical SD_CD pin even when no + * card is present. Only report a card present when it responds to a + * minimal reset/probe sequence, similar to the old rts5139 behavior. + * + * Must be called with ucr->dev_mutex held. + */ + if (host->power_mode =3D=3D MMC_POWER_OFF) { + err =3D sd_power_on(host); + if (err) + return false; + probe_powered =3D true; + + /* Issue clock signals to card for at least 74 clocks. */ + rtsx_usb_write_register(ucr, SD_BUS_STAT, + SD_CLK_TOGGLE_EN, SD_CLK_TOGGLE_EN); + usleep_range(200, 400); + rtsx_usb_write_register(ucr, SD_BUS_STAT, SD_CLK_TOGGLE_EN, 0); + } + + /* + * Ensure the interface is in a safe, legacy / initial-clock mode before + * probing for a response. The MMC core may not have configured ios yet. + */ + err =3D sd_set_bus_width(host, MMC_BUS_WIDTH_1); + if (err) + goto out; + + err =3D sd_set_timing(host, MMC_TIMING_LEGACY, &ddr_mode); + if (err) + goto out; + + ucr->cur_clk =3D 0; + err =3D rtsx_usb_switch_clock(ucr, 400000, SSC_DEPTH_512K, + true, true, false); + if (err) + goto out; + + cmd.opcode =3D MMC_GO_IDLE_STATE; + cmd.arg =3D 0; + cmd.flags =3D MMC_RSP_NONE | MMC_CMD_BC; + sd_send_cmd_get_rsp(host, &cmd); + + /* SD v2.0+: CMD8 */ + cmd.opcode =3D SD_SEND_IF_COND; + cmd.arg =3D 0x1aa; + cmd.flags =3D MMC_RSP_R7 | MMC_CMD_BCR; + sd_send_cmd_get_rsp(host, &cmd); + if (!cmd.error) + goto out; + + /* SD v1.x: CMD55 */ + cmd.opcode =3D MMC_APP_CMD; + cmd.arg =3D 0; + cmd.flags =3D MMC_RSP_R1 | MMC_CMD_AC; + sd_send_cmd_get_rsp(host, &cmd); + if (!cmd.error) + goto out; + + /* MMC: CMD1 */ + cmd.opcode =3D MMC_SEND_OP_COND; + cmd.arg =3D 0; + cmd.flags =3D MMC_RSP_R3 | MMC_CMD_BCR; + sd_send_cmd_get_rsp(host, &cmd); + +out: + if (probe_powered) + sd_power_off(host); + return !err && !cmd.error; +} + static int sdmmc_get_cd(struct mmc_host *mmc) { struct rtsx_usb_sdmmc *host =3D mmc_priv(mmc); struct rtsx_ucr *ucr =3D host->ucr; int err; u16 val; + u8 pend; + bool sd_int =3D false; + bool cd_raw =3D false; =20 if (host->host_removal) return -ENOMEDIUM; @@ -782,28 +877,71 @@ static int sdmmc_get_cd(struct mmc_host *mmc) =20 /* Check SD card detect */ err =3D rtsx_usb_get_card_status(ucr, &val); - - mutex_unlock(&ucr->dev_mutex); - - /* Treat failed detection as non-exist */ if (err) - goto no_card; + goto no_card_unlock; =20 /* get OCP status */ host->ocp_stat =3D (val >> 4) & 0x03; =20 - if (val & SD_CD) { - host->card_exist =3D true; + cd_raw =3D !!(val & SD_CD); + + /* Use SD_INT as a reliable removal indication on some tray readers. */ + err =3D rtsx_usb_read_register(ucr, CARD_INT_PEND, &pend); + if (!err) { + sd_int =3D !!(pend & SD_INT); + if (sd_int) + rtsx_usb_write_register(ucr, CARD_INT_PEND, + SD_INT, SD_INT); + } + + if (!cd_raw) { + host->cd_debounce =3D 0; + host->next_insert_check =3D 0; + goto no_card_unlock; + } + + /* + * rts5139-style: when a card is already known present, treat SD_INT as + * a removal event even if SD_CD stays high (e.g. tray-based readers). + */ + if (host->card_exist) { + if (sd_int) { + host->cd_debounce =3D 0; + host->next_insert_check =3D 0; + goto no_card_unlock; + } + mutex_unlock(&ucr->dev_mutex); return 1; } =20 -no_card: + /* Debounce mechanical CD before probing for a response. */ + if (host->cd_debounce < RTSX_USB_SD_CD_DEBOUNCE_CNT) { + host->cd_debounce++; + goto no_card_unlock; + } + + /* Avoid pounding the bus with probes if CD is stuck asserted. */ + if (time_before(jiffies, host->next_insert_check)) + goto no_card_unlock; + + if (!sdmmc_validate_insert_locked(host)) { + host->next_insert_check =3D jiffies + + msecs_to_jiffies(RTSX_USB_SD_INSERT_RETRY_MS); + goto no_card_unlock; + } + + host->card_exist =3D true; + mutex_unlock(&ucr->dev_mutex); + return 1; + +no_card_unlock: /* clear OCP status */ if (host->ocp_stat & (MS_OCP_NOW | MS_OCP_EVER)) { rtsx_usb_write_register(ucr, OCPCTL, MS_OCP_CLEAR, MS_OCP_CLEAR); host->ocp_stat =3D 0; } host->card_exist =3D false; + mutex_unlock(&ucr->dev_mutex); return 0; } =20 @@ -1359,6 +1497,8 @@ static void rtsx_usb_init_host(struct rtsx_usb_sdmmc = *host) =20 host->power_mode =3D MMC_POWER_OFF; host->ocp_stat =3D 0; + host->cd_debounce =3D 0; + host->next_insert_check =3D 0; } =20 static int rtsx_usb_sdmmc_drv_probe(struct platform_device *pdev) From nobody Fri Jun 12 18:33:11 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E9823FF887 for ; Wed, 13 May 2026 11:40:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778672423; cv=none; b=WILw980cR8gLqvQmOgoTWuKKM3J35Vos49Oert57AKJHMnd47N12B3I0WCzAiWWbEbZP0EY/LxiP3QiYgJu3EQGub/BRYTSwLybkka68KR2cIaaaLx5d58gDjtUnbqySiIq0hHJOaRUOe3YMNxai7AemhR2rsoT7I6jtoxVjGKM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778672423; c=relaxed/simple; bh=eMf2CLDG44C1jZ2p7u/edjuiS9xo64r85ao5+r/5ux4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jVPKj75xhZkitYH38GC6rB9R2LlLqmFGCUAsS/6SHPZ6X/ziEiIRZb1/XtHGoxa6FDnfjAOpehtJbfPDzwwAryYoViuwE5lX2mmLu4ZQmE6A8oGBFObddnFGFyBWF1meUXlv+yNaLcdTBjquPcJLLwWDRc+G/s1WbhoAY8IYYpk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=starlabs.systems; spf=pass smtp.mailfrom=starlabs.systems; dkim=pass (2048-bit key) header.d=starlabs-systems.20251104.gappssmtp.com header.i=@starlabs-systems.20251104.gappssmtp.com header.b=l4CWWQCP; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=starlabs.systems Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=starlabs.systems Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=starlabs-systems.20251104.gappssmtp.com header.i=@starlabs-systems.20251104.gappssmtp.com header.b="l4CWWQCP" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-48984d29fe3so71072915e9.0 for ; Wed, 13 May 2026 04:40:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=starlabs-systems.20251104.gappssmtp.com; s=20251104; t=1778672420; x=1779277220; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kQFvj5LmJIGIKjgLPEHd0VQ/ZMItSCOV0/e8nhf5n6k=; b=l4CWWQCPcZu7yzn0CNg+J78xhQ1MJumppuDVdKvB3ZSESP/0igH+6wdDyANWFqrlz/ 2tg9mrl2rVuy/V2CM9JvJylxKNyzvZEmhQAqxXgbUIZK1sNHBSoXdKwnE0PVOdv36BOP KXjMY3axE/H1eq/LltiRpPLLy3Ry6nr4xUYKK9XSq7H7wjac7Skh02I/NX0H2jehvigN tOOTjAtB2x6MPJZRSa7j0IJ5A/h2IeoVIVCVNtvo/uFTPqoCaYubCzc9SK6rnn0tkQbk Qyb00Cdy5nNpvJ412kE2agc0KrdgZc0bczbd2oAGHu/+6RnJG2QnSfC4ovNaan1dPJce 6L+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778672420; x=1779277220; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kQFvj5LmJIGIKjgLPEHd0VQ/ZMItSCOV0/e8nhf5n6k=; b=j4Df5WPACQEaJ/uMB+5m5VUJ9vfgqzOVF965+6yjYCUaOEAF1UdpM6yxny1AgTQn// PmkglKWpX+AdkUxxdi1qzFc0AJc1vyfhsNz5KBTg4NpQ1yJ/2pGx2051ed2JwyW7SlF+ oNmhD9cjMgDXY4xj7ZMeCnMUI7wcgmSW7/yDemzgEHcmggNewZR9ZWapj1/U9U+f+8k4 6fQrtdG23+XTetpDPhyXJo2Ksfb9YX9qi6jPCVE4VhY0K3Ji3Jk5439r8l9Pv6U9CQdH +jUBs81Ib7NpaQI9p2PuGPUjSwFeJxPiPOt6Q5mOGnFxvzb7HgzK9GR0t8ERN95GKx2V fb5w== X-Forwarded-Encrypted: i=1; AFNElJ9VzNeU1tgzy1+OgoOkmd0hPC55RvQdgs71+4e4MOFlhWKOvMypAVKgO+0lZgxhit3UUfGXXamOashdPlI=@vger.kernel.org X-Gm-Message-State: AOJu0YyW7N5YI9TylBslpBTLe5OLJ/z2e8lKDt0r1KGhUWgEEXxffzQR bh61Ue2sNqVtNt/RE8Ntc9Q4m1GllRDuMidOhYedqgKMIcKCcvxkAO9nFRH2bv8Shg== X-Gm-Gg: Acq92OHS9P1uSfsAZMTIAkZHlgTBsM9B+1WGENXfEoyS51HKeuzMAIdezmXO1Zh6pUA +sos0Cj/vHDmnRPRM/WDhH0Pc34SW5+XGakE/od22NIrUAd7TihmtZ2mwTVueg0EY83aVro1iFI UdQSZBsQlUwhTu2w/Zl5PYiFom+/8rK290uJtK7rljnkssZ/ZI8IMRbmIrq+FxNumCpXSxNlnPG sHomaqC0dSCzaGAyiZeGHQNLKsV9p1Dm8bOczgP1IYa1ojS+oD38K/YNUvUSTi4/429BQ/jRaVD 6JIwd+HtlcpUzDHlhX+w+sskoHXHmE+6wgOfYJeYKTfIaboQwIbJlHwE9/825w2BhLJ6L70mOas o27WC1L/F70X8iKMxkGwP/qKKobPOY887JiiyJixc6edfC+W8V8WJUH9qgwqC/M504mdbDh8G1D 7O5P6UWetg3W9sFYNGLyZg8R4edO0DwncnBIKRv/UMz33Jbc51Er95sK61XE2NDfTnVbIz X-Received: by 2002:a05:600c:6303:b0:48a:592c:e632 with SMTP id 5b1f17b1804b1-48fc9a2b921mr44740155e9.16.1778672419876; Wed, 13 May 2026 04:40:19 -0700 (PDT) Received: from horizon.localdomain ([212.105.128.254]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48fcdf64013sm53508475e9.2.2026.05.13.04.40.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 May 2026 04:40:19 -0700 (PDT) From: Sean Rhodes To: Ulf Hansson Cc: Ricky Wu , Avri Altman , Sean Rhodes , Jisheng Zhang , Nathan Chancellor , Dan Carpenter , Binbin Zhou , linux-mmc@vger.kernel.org, Huacai Chen , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, gregkh@linuxfoundation.org, arnd@arndb.de, ulf.hansson@linaro.org, adrian.hunter@intel.com, rogerable@realtek.com, matthew.schwartz@linux.dev Subject: [RFC PATCH 2/2] mmc: rtsx_usb_sdmmc: start card power-up at 3.3V Date: Wed, 13 May 2026 12:40:13 +0100 Message-ID: <7de637dbc99f1c2dc40cd255b078de9f1efd1ccb.1778672403.git.sean@starlabs.systems> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some tray-based readers keep SD_CD asserted even without a card. The rtsx_usb_sdmmc driver now validates insertion with a minimal probe sequence. That probe must start with the SD pads in 3.3V mode. Like the old rts5139 driver (sd_init_power()), force the SD pads to 3.3V and tune the SD18 regulator to 3.3V before powering up the card. This avoids spurious probe timeouts when the reader is left in 1.8V from a previous UHS session. Tested: Realtek RTS5129 (0bda:0129) + tray + Lexar 2TB SDXC Tested: cold boot detects mmcblk0 (2026-02-24) Tested: hotplug insert enumerates mmcblk0 (2026-02-23) Signed-off-by: Sean Rhodes --- drivers/mmc/host/rtsx_usb_sdmmc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/mmc/host/rtsx_usb_sdmmc.c b/drivers/mmc/host/rtsx_usb_= sdmmc.c index ec3eeea78e95..6be98926387d 100644 --- a/drivers/mmc/host/rtsx_usb_sdmmc.c +++ b/drivers/mmc/host/rtsx_usb_sdmmc.c @@ -1108,6 +1108,11 @@ static int sd_power_on(struct rtsx_usb_sdmmc *host) } dev_dbg(sdmmc_dev(host), "%s\n", __func__); rtsx_usb_init_cmd(ucr); + /* Start SD init at 3.3V, like the old rts5139 driver. */ + rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_PAD_CTL, + SD_IO_USING_1V8, SD_IO_USING_3V3); + rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, LDO_POWER_CFG, + TUNE_SD18_MASK, TUNE_SD18_3V3); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_SELECT, 0x07, SD_MOD_SEL); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_SHARE_MODE, CARD_SHARE_MASK, CARD_SHARE_SD);