Received: by 2002:a05:7412:6592:b0:d7:7d3a:4fe2 with SMTP id m18csp901005rdg; Fri, 11 Aug 2023 03:48:49 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHHQO/2bIBRFf2sUIo9Rc8S+pJGiRm2oEbWNQ/fw8BOUPuwoDwGgTxvHyhFL28hHuLu727H X-Received: by 2002:a17:907:78c5:b0:991:bf04:2047 with SMTP id kv5-20020a17090778c500b00991bf042047mr1417571ejc.14.1691750928886; Fri, 11 Aug 2023 03:48:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691750928; cv=none; d=google.com; s=arc-20160816; b=XBmXWLTQDK6KVGLP3zm+lNHWocx8DIrONIWrCcHLSbj2Mvdf+SWAe+LH7JgaiTKbKg j36kP7ECK2ipcT4WIMsycd2BTVbMiFmrQKZ0I37RX3zBhyxRF4vpedY3Q78mlQNY/JyF fffJMfliFhRo2GdPTERZdypJ9soulR7s2Axz7eQkT0YXS6vevzUOmH0MglG+Nq4GktR5 bcP7JqRhCQI/U7I9wEa+t+uMlFGx44JIDTU2QiF0Mbn7KlgZlNMgbYp610nvFketIbWa 4r9KXV9XNx/xtoOW71pobK74Hvk/3RE9j4j2cKEBUdcJ7y1uR01CXYKBoaQc0Pbs5714 7liw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=7RiLDVzYfGeq/75nyVMCH9Ez1G1IWtk1jFuILLki9h4=; fh=kBcgfHLsgdRaUlJHSe4j8A6ex54uoJXErlNSji9SfTw=; b=VveuHvMDIoQeXPDwfQZeKCJJYNcMvZvmPXNhAwGKULxOqgGOvw/5RGbdbOsGngQ9Qx UQzWLY6g1Z9JHiAj5yHiCl3HeafFRp7gCaJXc50EoYlfFOTHjXnWoIVrzxzDCnncARMU N04cmL1feOZuD8uHAcFQj/Zh36Xnaej6h1/fvPedXoSVVveYHvva6uOGY9LHduZ93zjH bqWHLsb/KkbuwxkMrIuItTaA44PnyhuGCHycN+RI7LdA3OZ3qbWkWqNn1/i5U/2WOu1e HjXk7s0cUnuc6wF8f0OYc8uXrM8nVXkdd8G/aoRzsbZZve5RBbiszfwNC+/228c/qaAo WiKg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=s9umU4UD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id jw21-20020a17090776b500b00988b1c57f15si3258428ejc.272.2023.08.11.03.48.23; Fri, 11 Aug 2023 03:48:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=s9umU4UD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229447AbjHKIgu (ORCPT + 99 others); Fri, 11 Aug 2023 04:36:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40624 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231406AbjHKIgt (ORCPT ); Fri, 11 Aug 2023 04:36:49 -0400 Received: from mail-yw1-x112c.google.com (mail-yw1-x112c.google.com [IPv6:2607:f8b0:4864:20::112c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C486130C0 for ; Fri, 11 Aug 2023 01:36:48 -0700 (PDT) Received: by mail-yw1-x112c.google.com with SMTP id 00721157ae682-583b3aa4f41so18822017b3.2 for ; Fri, 11 Aug 2023 01:36:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691743008; x=1692347808; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=7RiLDVzYfGeq/75nyVMCH9Ez1G1IWtk1jFuILLki9h4=; b=s9umU4UDjsz9zz7+kZXT8kRxjdfXSfhncTHhwGN6CIw8099q+qBHWeZE0nKnuhIN3p 3GT+SvePUoUzRc84ZD9O3yLvVTZI1ONEaaujIQwpju9x7hJBFuMFc4BaO/2GK4G4o8MQ ylVK0GDbdg5ND0zjw4e6yxU+V1mZAv4ayVvehZPyflqkjBusPpzLkAsUQ4Ln64Pjuwxb NdC/A7wRlJFdjkQsazjbZV8YXqYtaus2gkxiaLSrc+otTyAoSlxSypgMJ/yIY5tXq/nB xaAy8Fm4TOmUS7iFxvTvqs4YrZ3T3VuU5FXPRde7ZJz/OCs3zMPXnLygsnCQs7FylG+B KWrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691743008; x=1692347808; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=7RiLDVzYfGeq/75nyVMCH9Ez1G1IWtk1jFuILLki9h4=; b=QH+zS7KyGriHqBXhXmq5UF5OGlW8Uhui+qyM+DOQG4BT69FqlAD6i4z3EcLgkEGgxw vMUSzXdUtnpfj6QVSi8rgFEh8FtV+6b66NNG3fCXgGQUxp67piY4UJaOth59dgYKsYjI 5ro9gP03TYhggAV5pWY1/dftYgZCsiCdj41fJ4X0jh6eDftjhbwsVUWsUIRzTwCxr0G3 T1sNRFdBE5EEmzAiXh1YLcMhqm74Gn+VVJOwf+MUG3mtGcOXopm2z62Xx3WqAbp7HNxz 64IJ4qiQRU1UENCVVcfEywFIU5NSBWMQ9J56mKTYjGu9FpFNfnBoC6AC0SrIqny+pu44 F7pQ== X-Gm-Message-State: AOJu0YxzqrWRSqHr2VF4rWAtVPVayjrVUaoOaawSlr+dkMSB84NlfDYZ RHQ8m8+Nkui/BMjl62ebrVcjZwhMbiEQsoyl4kvwHg== X-Received: by 2002:a0d:eb83:0:b0:586:a00f:717d with SMTP id u125-20020a0deb83000000b00586a00f717dmr1102637ywe.6.1691743007992; Fri, 11 Aug 2023 01:36:47 -0700 (PDT) MIME-Version: 1.0 References: <79137159a833c164ea8ea3f05d8d6d9537db2f42.1683747334.git.limings@nvidia.com> <20230808202319.191434-1-limings@nvidia.com> <16047c7a-5bd1-868c-e6eb-e5f415e77fdd@intel.com> In-Reply-To: From: Ulf Hansson Date: Fri, 11 Aug 2023 10:36:12 +0200 Message-ID: Subject: Re: [PATCH v7] mmc: sdhci-of-dwcmshc: Add runtime PM operations To: Adrian Hunter Cc: Liming Sun , David Thompson , Shawn Lin , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 11 Aug 2023 at 07:57, Adrian Hunter wrote: > > On 10/08/23 19:34, Ulf Hansson wrote: > > On Thu, 10 Aug 2023 at 14:44, Adrian Hunter wrote: > >> > >> On 10/08/23 13:21, Ulf Hansson wrote: > >>> On Thu, 10 Aug 2023 at 10:13, Adrian Hunter wrote: > >>>> > >>>> On 8/08/23 23:23, Liming Sun wrote: > >>>>> This commit implements the runtime PM operations to disable eMMC > >>>>> card clock when idle. > >>>>> > >>>>> Reviewed-by: David Thompson > >>>>> Signed-off-by: Liming Sun > >>>>> --- > >>>>> v6->v7: > >>>>> - Address Ulf's comment; > >>>>> v5->v6: > >>>>> - Address Adrian's more comments and add coordination between > >>>>> runtime PM and system PM; > >>>>> v4->v5: > >>>>> - Address Adrian's comment to move the pm_enable to the end to > >>>>> avoid race; > >>>>> v3->v4: > >>>>> - Fix compiling reported by 'kernel test robot'; > >>>>> v2->v3: > >>>>> - Revise the commit message; > >>>>> v1->v2: > >>>>> Updates for comments from Ulf: > >>>>> - Make the runtime PM logic generic for sdhci-of-dwcmshc; > >>>>> v1: Initial version. > >>>>> --- > >>>>> drivers/mmc/host/sdhci-of-dwcmshc.c | 72 ++++++++++++++++++++++++++++- > >>>>> 1 file changed, 70 insertions(+), 2 deletions(-) > >>>>> > >>>>> diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c > >>>>> index e68cd87998c8..c8e145031429 100644 > >>>>> --- a/drivers/mmc/host/sdhci-of-dwcmshc.c > >>>>> +++ b/drivers/mmc/host/sdhci-of-dwcmshc.c > >>>>> @@ -15,6 +15,7 @@ > >>>>> #include > >>>>> #include > >>>>> #include > >>>>> +#include > >>>>> #include > >>>>> #include > >>>>> > >>>>> @@ -548,9 +549,13 @@ static int dwcmshc_probe(struct platform_device *pdev) > >>>>> > >>>>> host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY; > >>>>> > >>>>> + pm_runtime_get_noresume(dev); > >>>>> + pm_runtime_set_active(dev); > >>>>> + pm_runtime_enable(dev); > >>>>> + > >>>>> err = sdhci_setup_host(host); > >>>>> if (err) > >>>>> - goto err_clk; > >>>>> + goto err_rpm; > >>>>> > >>>>> if (rk_priv) > >>>>> dwcmshc_rk35xx_postinit(host, priv); > >>>>> @@ -559,10 +564,15 @@ static int dwcmshc_probe(struct platform_device *pdev) > >>>>> if (err) > >>>>> goto err_setup_host; > >>>>> > >>>>> + pm_runtime_put(dev); > >>>>> + > >>>>> return 0; > >>>>> > >>>>> err_setup_host: > >>>>> sdhci_cleanup_host(host); > >>>>> +err_rpm: > >>>>> + pm_runtime_disable(dev); > >>>>> + pm_runtime_put_noidle(dev); > >>>>> err_clk: > >>>>> clk_disable_unprepare(pltfm_host->clk); > >>>>> clk_disable_unprepare(priv->bus_clk); > >>>>> @@ -606,6 +616,12 @@ static int dwcmshc_suspend(struct device *dev) > >>>>> if (ret) > >>>>> return ret; > >>>>> > >>>>> + ret = pm_runtime_force_suspend(dev); > >>>>> + if (ret) { > >>>>> + sdhci_resume_host(host); > >>>>> + return ret; > >>>>> + } > >>>> > >>>> Since you are only using the runtime PM callbacks to turn off the card > >>>> clock via SDHCI_CLOCK_CONTROL, pm_runtime_force_suspend() and > >>>> pm_runtime_force_resume() are not needed at all. > >>> > >>> Right, it can be done without these too. > >>> > >>>> > >>>> sdhci_suspend_host() does not care if SDHCI_CLOCK_CARD_EN is on or off. > >>>> (And you are disabling pltfm_host->clk and priv->bus_clk, so presumably > >>>> the result is no clock either way) > >>>> > >>>> sdhci_resume_host() does not restore state unless > >>>> SDHCI_QUIRK2_HOST_OFF_CARD_ON is used, it just resets, so the internal clock > >>>> SDHCI_CLOCK_INT_EN is off which is consistent with either runtime suspended > >>>> or runtime resumed. > >>> > >>> Even if this may work, to me, it doesn't look like good practice for > >>> how to use runtime PM in combination with system wide suspend/resume. > >>> > >>> The point is, sdhci_suspend|resume_host() may end up reading/writing > >>> to sdhci registers - and we should *not* allow that (because it may > >>> not always work), unless the sdhci controller has been runtime resumed > >>> first, right? > >> > >> I am OK with drivers that just want to use runtime PM to turn off a > >> functional clock. sdhci-tegra.c is also doing that although using the > >> clock framework. > > > > Yes, I agree. At least this works for SoC specific drivers. > > > >> > >> Certainly that approach assumes that the host controller's power state > >> is not changed due to runtime PM. > >> > >> To ensure that the host controller is runtime resumed before calling > >> sdhci_suspend_host(), we can just call pm_runtime_resume() I think. > > > > Yes, that was kind of what I proposed in the other thread as option 1) > > (except for the replacement of pm_runtime_force_suspend|resume). > > > > Although, to be clear I would probably use pm_runtime_get_sync() > > instead, to make sure the usage count is incremented too. > > In that case, a matching pm_runtime_put() is needed also at the > end of the resume callback. Yes, of course. Or depending if we are using the force_suspend|resume helper, a pm_runtime_put_noidle is sufficient after pm_runtime_force_suspend() has been called. [...] Kind regards Uffe