From nobody Thu Apr 9 14:59:48 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (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 1D48941162A for ; Mon, 2 Mar 2026 15:13:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772464438; cv=none; b=q5RsgZxS0qfVdyx9A9/ngtoqMJCdYsPn9OE9lrWcVpS+YZClLjyXO5YtP71mlbxwK9EKh0CmcPvqAXUteR2rWnxVLyNsNkf0OuR1UEMAvskxQ2VcvJoQtHgB/7MiPVkQLA1wSowBc6/up24gjqiGNt1a6fl/HIBHXDfv9xmyrfU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772464438; c=relaxed/simple; bh=l7yFNiOmqsvt7j2PZxlgkxZHr4AJ1C5sRtgpqni7WX8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pBZ2h91p+9lVrP/wINiP6POOAJTY575M5aiUG8Jl8oX41MVc9EL2x67/Tohrkb1zQSjPni3Toa9YuCOV+5FkfRD0fR8vE5GOwLF96dNWkzSQ7m7bMDh6hfv4MM+KXiVk4ohHZzB/8tt3MXom+WomfO9yEPuNNtl7M3h0a9SeG4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=G6rACf5v; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="G6rACf5v" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-48371119eacso57394475e9.2 for ; Mon, 02 Mar 2026 07:13:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772464435; x=1773069235; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=eBh/BEMhIYd7yMIKn9wpAoeG/vOOsjbo+uR3/+VkGQw=; b=G6rACf5v3vPEKsMklKuY8ycf0uE252osOOOy9QhPhabf3Pni/0KKP6ZIfHMBaQgqNK uOXRpApVWdAqkFHPo3rf0L6lbENq8swBz2XRwuzTNeDIN9QMS5SQqWANq/TTp9pxzzBU zgWRrvtF3CDXsALzQvB5soJX+iIlMHxciqYiPZyvxj8Y73980WFsxlQ32WOMBG45VKsk QUBRfslhi24c4KxDk9IErxdTcuCmpSQp14kcmFkJF6EiAV+BAs17aTYgaHYUOLNhnmTt trcHvh3vPZPD5TenbTOwpsskUReD9R6zzfKwEzyJsMYbSHXMYDICV+yOfmjvzVo5gwJM Q5kQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772464435; x=1773069235; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=eBh/BEMhIYd7yMIKn9wpAoeG/vOOsjbo+uR3/+VkGQw=; b=K+gltnOL2Ne/XkbIjfa+syE9JfwPQRY1Phn/niILv/K2zRfRlkiX/bNvvIp8VT958Z QreDOaewMFRa9cf/gQQSpZuec50N/2vM04BqWmbIb3H7EUKG6SkXMWGgUr2FrFfZdIwi PiWCLRBDeRVjnqnZly5r59JQLnvTTVJsD82KdCXrcXEHB9U/f4A2jQxGjGh84DBzQq7k 4LkgDDIpzevhA6lEzPJTbUymRuv4+RiANDO5slyq63bb2+jyijmmP1Wnazy1d1vBTmmJ R81vxPgAMBZ2sihiWEa1L0An00klXlHJwjocR7+lcZgxWwcH4xkbqVpjaWLKbD1Ryq8j nl7A== X-Forwarded-Encrypted: i=1; AJvYcCUN/JmR4Oafw4J+KUJ+7m0NTEyiuY/R2rGPJ1mRq7tgJ2Vny/4x9kA72a1WtpgugqNYL++1/2bT2wzClsI=@vger.kernel.org X-Gm-Message-State: AOJu0YwYW/NY1Wq6Yac8PpyhZ/q9x9SPMpJtjA71Vb5hbD6RVx/ik26L 53uKZN6DOiQsqPU6b5Ewu3uBkrkuP4oc2kMCDU7/XLPD9Cl56+8/ddlK X-Gm-Gg: ATEYQzzeu/YjgbxEFtz/bWxXqK/TN351/zmG96mfOxu0OXmNOwsxES+YsjkE/3YBdmn 7FIE/IF5Nv0XbUxQrpTbsKfcfHMBjfunJPQBzna0axLIkrwCK8C2Xs1bmXF1OQwsB6oyXlxktdZ vN9d1s5tgS6h6AD/fz1W06Q1ryK0W5fPjPfbGSu+tvjXc9YkxqIJwdiZJOpuTcAciuRslcyLBve WhL2g8M5+I5djsUVuErh8+ztgsbAIDCLU8KDNsde0yiUr92zk5TJPX9+Ovd4gAIb0nT8stJEnh2 JbsoWOnuhI52FS/JC0W4Y4BOFu/Xmb2Z8whabX6rpwZRRdkx7ZEgBfEFe6fDc6TVLst4Lu9mjsW K4Kwcf8inKmJlKK0zlP2Rdy6Ju5C3ncBA5CE+CKzmTPTwvVdTFU5wok9sIXO6wP3+9NVTvN0KYO t07AbdIzCr4V+Mh99U1f/XDJ/Vm0U8gRwWUWUuNillgfZlKrlXfQ29eAUsVROQegHjMg== X-Received: by 2002:a05:600c:3b18:b0:483:b01c:9508 with SMTP id 5b1f17b1804b1-483c9bb7c0bmr236115405e9.2.1772464435275; Mon, 02 Mar 2026 07:13:55 -0800 (PST) Received: from ipedrosa-thinkpadx1carbongen12.rmtes.csb ([67.218.235.131]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd70e692sm437240265e9.7.2026.03.02.07.13.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 07:13:54 -0800 (PST) From: Iker Pedrosa Date: Mon, 02 Mar 2026 16:13:25 +0100 Subject: [PATCH 04/10] mmc: sdhci-of-k1: add pinctrl state switching for voltage changes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260302-orangepi-sd-card-uhs-v1-4-89c219973c0c@gmail.com> References: <20260302-orangepi-sd-card-uhs-v1-0-89c219973c0c@gmail.com> In-Reply-To: <20260302-orangepi-sd-card-uhs-v1-0-89c219973c0c@gmail.com> To: Ulf Hansson , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Yixun Lan , Adrian Hunter , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: Michael Opdenacker , Javier Martinez Canillas , linux-mmc@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, Iker Pedrosa X-Mailer: b4 0.14.2 Add support for switching pinctrl states during voltage transitions to ensure proper pin drive strength and configuration for different I/O voltage domains (3.3V vs 1.8V). Pinctrl states are optional and the driver degrades gracefully if they are not defined in the device tree. This allows boards to enable proper pin drive strength optimization for UHS-I modes without breaking existing functionality. The pinctrl setup uses: - "default" state for 3.3V operation (higher drive strength) - "state_uhs" state for 1.8V operation (lower drive strength) Signed-off-by: Iker Pedrosa --- drivers/mmc/host/sdhci-of-k1.c | 59 ++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-of-k1.c b/drivers/mmc/host/sdhci-of-k1.c index c260cb89704ae7a25bec0f07831d495553405bbd..2a982bca2a50ca96f43af7b4de5= bc4fb4b5b195b 100644 --- a/drivers/mmc/host/sdhci-of-k1.c +++ b/drivers/mmc/host/sdhci-of-k1.c @@ -15,6 +15,7 @@ #include #include #include +#include #include =20 #include "sdhci.h" @@ -70,6 +71,9 @@ struct spacemit_sdhci_host { struct clk *clk_core; struct clk *clk_io; + struct pinctrl *pinctrl; + struct pinctrl_state *pinctrl_default; + struct pinctrl_state *pinctrl_uhs; }; =20 /* All helper functions will update clr/set while preserve rest bits */ @@ -219,7 +223,42 @@ static void spacemit_sdhci_pre_hs400_to_hs200(struct m= mc_host *mmc) static int spacemit_sdhci_start_signal_voltage_switch(struct mmc_host *mmc, struct mmc_ios *ios) { - return sdhci_start_signal_voltage_switch(mmc, ios); + struct sdhci_host *host =3D mmc_priv(mmc); + struct sdhci_pltfm_host *pltfm_host =3D sdhci_priv(host); + struct spacemit_sdhci_host *sdhst =3D sdhci_pltfm_priv(pltfm_host); + struct pinctrl_state *state; + int ret; + + ret =3D sdhci_start_signal_voltage_switch(mmc, ios); + if (ret) + return ret; + + /* Select appropriate pinctrl state based on signal voltage */ + if (sdhst->pinctrl) { + switch (ios->signal_voltage) { + case MMC_SIGNAL_VOLTAGE_330: + state =3D sdhst->pinctrl_default; + break; + case MMC_SIGNAL_VOLTAGE_180: + state =3D sdhst->pinctrl_uhs; + break; + default: + dev_warn(mmc_dev(mmc), "unsupported voltage %d\n", ios->signal_voltage); + return 0; + } + + if (state) { + ret =3D pinctrl_select_state(sdhst->pinctrl, state); + if (ret) { + dev_warn(mmc_dev(mmc), "failed to select pinctrl state: %d\n", ret); + return 0; + } + dev_dbg(mmc_dev(mmc), "switched to %s pinctrl state\n", + ios->signal_voltage =3D=3D MMC_SIGNAL_VOLTAGE_180 ? "UHS" : "default"); + } + } + + return 0; } =20 static inline int spacemit_sdhci_get_clocks(struct device *dev, @@ -301,6 +340,24 @@ static int spacemit_sdhci_probe(struct platform_device= *pdev) if (ret) dev_warn(dev, "Failed to get regulators: %d\n", ret); =20 + sdhst =3D sdhci_pltfm_priv(pltfm_host); + sdhst->pinctrl =3D devm_pinctrl_get(dev); + if (!IS_ERR(sdhst->pinctrl)) { + sdhst->pinctrl_default =3D pinctrl_lookup_state(sdhst->pinctrl, "default= "); + if (IS_ERR(sdhst->pinctrl_default)) + sdhst->pinctrl_default =3D NULL; + + sdhst->pinctrl_uhs =3D pinctrl_lookup_state(sdhst->pinctrl, "state_uhs"); + if (IS_ERR(sdhst->pinctrl_uhs)) + sdhst->pinctrl_uhs =3D NULL; + + dev_dbg(dev, "pinctrl setup: default=3D%p, uhs=3D%p\n", + sdhst->pinctrl_default, sdhst->pinctrl_uhs); + } else { + sdhst->pinctrl =3D NULL; + dev_dbg(dev, "pinctrl not available, voltage switching will work without= it\n"); + } + host->mmc_host_ops.start_signal_voltage_switch =3D spacemit_sdhci_start_s= ignal_voltage_switch; =20 ret =3D spacemit_sdhci_get_clocks(dev, pltfm_host); --=20 2.53.0