[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <c7lpaij5f5monr7zfeqitncwnau22iollid2gs7okyorlegtmg@jlq65x7ipp25>
Date: Tue, 1 Jul 2025 13:27:42 +0300
From: Dmitry Baryshkov <dmitry.baryshkov@....qualcomm.com>
To: Sarthak Garg <quic_sartgarg@...cinc.com>
Cc: Adrian Hunter <adrian.hunter@...el.com>,
Ulf Hansson <ulf.hansson@...aro.org>, linux-arm-msm@...r.kernel.org,
linux-mmc@...r.kernel.org, linux-kernel@...r.kernel.org,
quic_cang@...cinc.com, quic_nguyenb@...cinc.com,
quic_rampraka@...cinc.com, quic_pragalla@...cinc.com,
quic_sayalil@...cinc.com, quic_nitirawa@...cinc.com,
quic_bhaskarv@...cinc.com, kernel@....qualcomm.com
Subject: Re: [PATCH V3] mmc: sdhci-msm: Ensure SD card power isn't ON when
card removed
On Tue, Jul 01, 2025 at 03:36:59PM +0530, Sarthak Garg wrote:
> Many mobile phones feature multi-card tray designs, where the same
> tray is used for both SD and SIM cards. If the SD card is placed
> at the outermost location in the tray, the SIM card may come in
> contact with SD card power-supply while removing the tray, possibly
> resulting in SIM damage.
>
> To prevent that, make sure the SD card is really inserted by reading
> the Card Detect pin state. If it's not, turn off the power in
> sdhci_msm_check_power_status() and also set the BUS_FAIL power state
> on the controller as part of pwr_irq handling for BUS_ON request.
>
> Signed-off-by: Sarthak Garg <quic_sartgarg@...cinc.com>
> Acked-by: Adrian Hunter <adrian.hunter@...el.com>
Should this be handled by the MMC core instead?
> ---
> Changes from v2:
> As per Konrad Dybcio's comment :
> - Updated commit text
> - Removed READ_ONCE as mmc->ops will be present always
> - Passed the parameter directly to msm_host_writel
> As per Adrian Hunter's comment :
> - Removed get_cd function as not much use now
>
> Changes from v1:
> As per Adrian Hunter's comment :
> - Removed unrelated changes
> - Created a separate function get_cd for cleaner code
> - Used READ_ONCE when getting mmc->ops to handle card removal cases
> - Reordered if check conditions
> ---
> drivers/mmc/host/sdhci-msm.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
> index bf91cb96a0ea..f99fb3b096d6 100644
> --- a/drivers/mmc/host/sdhci-msm.c
> +++ b/drivers/mmc/host/sdhci-msm.c
> @@ -1579,6 +1579,7 @@ static void sdhci_msm_check_power_status(struct sdhci_host *host, u32 req_type)
> {
> struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host);
> + struct mmc_host *mmc = host->mmc;
> bool done = false;
> u32 val = SWITCHABLE_SIGNALING_VOLTAGE;
> const struct sdhci_msm_offset *msm_offset =
> @@ -1636,6 +1637,12 @@ static void sdhci_msm_check_power_status(struct sdhci_host *host, u32 req_type)
> "%s: pwr_irq for req: (%d) timed out\n",
> mmc_hostname(host->mmc), req_type);
> }
> +
> + if ((req_type & REQ_BUS_ON) && mmc->card && !mmc->ops->get_cd(mmc)) {
> + sdhci_writeb(host, 0, SDHCI_POWER_CONTROL);
> + host->pwr = 0;
> + }
> +
> pr_debug("%s: %s: request %d done\n", mmc_hostname(host->mmc),
> __func__, req_type);
> }
> @@ -1694,6 +1701,13 @@ static void sdhci_msm_handle_pwr_irq(struct sdhci_host *host, int irq)
> udelay(10);
> }
>
> + if ((irq_status & CORE_PWRCTL_BUS_ON) && mmc->card &&
> + !mmc->ops->get_cd(mmc)) {
> + msm_host_writel(msm_host, CORE_PWRCTL_BUS_FAIL, host,
> + msm_offset->core_pwrctl_ctl);
> + return;
> + }
> +
> /* Handle BUS ON/OFF*/
> if (irq_status & CORE_PWRCTL_BUS_ON) {
> pwr_state = REQ_BUS_ON;
> --
> 2.34.1
>
--
With best wishes
Dmitry
Powered by blists - more mailing lists