Message ID | 20231101-tidss-probe-v1-2-45149e0f9415@ideasonboard.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:abcd:0:b0:403:3b70:6f57 with SMTP id f13csp282378vqx; Wed, 1 Nov 2023 02:19:03 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHKQMCoJMQeoeDpltv+r/f6YwNtRMz2nWllCgEA1vf/cB32to3v3MQAzZUkaU9iUJ1LxDzY X-Received: by 2002:a17:903:41cc:b0:1cc:5dd4:7ce5 with SMTP id u12-20020a17090341cc00b001cc5dd47ce5mr7068120ple.19.1698830343272; Wed, 01 Nov 2023 02:19:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698830343; cv=none; d=google.com; s=arc-20160816; b=X5hvGi3VXnAl3CXOLSPn9wXljYPOj1lfREKUtmnShqr/Tpfn0E45EEgswQ9vmOOCeF JR90qykHrbtC+5QIAyw3EIXAIXVenrkRyheQxKrKZfTNJwk3f5pFOYhm5CYR6M1hPo/R A95twIpVyx2hVbIiyUeY+aYzXZl3Tvb0ygnTiZP8zGE6/kPNLCHP0r/5L7kZjdAhqQWz it2vh0CoRRhUgIDzzEN+AeJTtFQabL1qM4EhgtZUKhpPENDCqs9oggEIkGGuW2Vtw13B /m+WF2FnNXk5nhGVPeGAI7QIiagWvJ+oziRgem09+/sdfxX9F9SCoiCVdgUWyX0Nlh/k mt2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=3yyJZeIL7Ueb0PsHWIdSyRyjprOtnWSXlL2eGiTOfuk=; fh=IpenHstmzluQ2qG4rgZds4W72uLPbZNMEjQq5GLr0+k=; b=u/VlzomIP018vNQLKOt7qsHDKDEs6tZKvNEePFuzsiZfIN1zpJtkRH5pEHICXSMf3d Nlv+QtKbXM8cQHM0dtk22UPYnk6THvux8eV5P8nKdntzOSCUgZ2EXNtuoyVWmnd78teZ iQxB2iuZivfWVGBXOr/nfrZMuJKte9wwXwyVpSn90FpYDy1rpU4qyCyTUlxB5ClzzOui xhIGlMk0DbhSHXTj8knn92r8eCCO88d34UpJyGnUWYBwpDuQZXwYq4hfq71r+epkMI3P 7D5WKAcBzI/Bj9/9bKQx2zYWA2IhR9xMlViHBS//4MRvm9yM3pEj5TOmfH2fOI5n9qRE JQIw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=jPCXMnQl; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id b2-20020a170903228200b001c76b4c349esi2748755plh.218.2023.11.01.02.19.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Nov 2023 02:19:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=jPCXMnQl; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 4041B802B045; Wed, 1 Nov 2023 02:19:02 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234508AbjKAJSv (ORCPT <rfc822;rbbytesnap@gmail.com> + 35 others); Wed, 1 Nov 2023 05:18:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56944 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234431AbjKAJSt (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 1 Nov 2023 05:18:49 -0400 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5C78BB9 for <linux-kernel@vger.kernel.org>; Wed, 1 Nov 2023 02:18:43 -0700 (PDT) Received: from [127.0.1.1] (91-158-149-209.elisa-laajakaista.fi [91.158.149.209]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A68F68E1; Wed, 1 Nov 2023 10:18:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1698830299; bh=xQfh4wFKSK2nLKdijYY1UXEQqCMe4QymvcSpQaHogdw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jPCXMnQlK5QA+NqQ5hjcsWNTq9cQXbhcyJgOPZIsF3DARySjdLJKLrzvGIgX2DK8F dzT80FHD5Wsl45jzxgy8UwRwhwUJXqL078FLSXGQIG8tw7YZ1RT+i0sCRqaAH6L0fN 43tT3dMXxEHYncXH15dYGEBAld5wukbngtbxCqN0= From: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Date: Wed, 01 Nov 2023 11:17:39 +0200 Subject: [PATCH 02/10] drm/tidss: Use PM autosuspend MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20231101-tidss-probe-v1-2-45149e0f9415@ideasonboard.com> References: <20231101-tidss-probe-v1-0-45149e0f9415@ideasonboard.com> In-Reply-To: <20231101-tidss-probe-v1-0-45149e0f9415@ideasonboard.com> To: Aradhya Bhatia <a-bhatia1@ti.com>, Devarsh Thakkar <devarsht@ti.com>, Jyri Sarha <jyri.sarha@iki.fi>, Maarten Lankhorst <maarten.lankhorst@linux.intel.com>, Maxime Ripard <mripard@kernel.org>, Thomas Zimmermann <tzimmermann@suse.de>, David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch> Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Laurent Pinchart <laurent.pinchart@ideasonboard.com>, Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=openpgp-sha256; l=1500; i=tomi.valkeinen@ideasonboard.com; h=from:subject:message-id; bh=xQfh4wFKSK2nLKdijYY1UXEQqCMe4QymvcSpQaHogdw=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBlQhfm0I1aAJ++gXl9qnfA5qLiH+x6aRiH7mAW5 zUZv9k+nuiJAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCZUIX5gAKCRD6PaqMvJYe 9YG1D/40auunKVvVoDGofklPD3crxDwf0t3XWtc9ifEcq1Es7pzT0bGRlJEA/QtVknEd/WoaMId VTEE0zkuesRfqrb7FWvPVzfmPypjevvBvfh5bzYBHykZM1weROy5rM50aCM8C8bcNycTnKtNiN4 35TvD/cCYulFpH0TCDuNFk6CyR4agCnmar6JtbbDNG4BgIW1fq0knzLAuAdK/nRnPMb1Flv+b/C KHPFKCC4FfCuauDhpk4ddsjJlGeLSu8XpLMuP6tWWV/LmDG6BfRtmP23yWXz3Pq8g+knewoN9GP odpXfOP1ZOA0HTW15vQsQiTypWsFnaHd/Mn2DqD/EvtAisfp102e47UJg6gKsU/6WwNbcIvhV6U mh6mfko8ilsMa2IkR4vmOYG/Guwa8DGkOfDiDhe397tHt9HzkBBPreIPVuuYVhbplrMGAcK/7jk U0cfZIOrGVE2hSF9Tcq7HUtk0UJQrZ22m5d2i7FWU1SbcuTRJ6iPLejmPWf2/5ZOyneZgWBpX2u /d650d6D3am8cYYyoqL0RtWdUt7knVMZ033HahQzpdkBObMxYkHiJYAGFWjfkV80CKXqnjwIIpj /AaG24xgseqw8ZH94ivjlxH6Swc6QYlVbMsoa/HID6JhXelZoBfdy6WjRvYPQmJMcYwrkwzfy6v tn0raEbb3/qropw== X-Developer-Key: i=tomi.valkeinen@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 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_BLOCKED, SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE,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: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Wed, 01 Nov 2023 02:19:02 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781352725984837834 X-GMAIL-MSGID: 1781352725984837834 |
Series |
drm/tidss: Probe related fixes and cleanups
|
|
Commit Message
Tomi Valkeinen
Nov. 1, 2023, 9:17 a.m. UTC
Use runtime PM autosuspend feature, with 1s timeout, to avoid
unnecessary suspend-resume cycles when, e.g. the userspace temporarily
turns off the crtcs when configuring the outputs.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/tidss/tidss_drv.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
Comments
Hi Tomi, Thank you for the patch. On Wed, Nov 01, 2023 at 11:17:39AM +0200, Tomi Valkeinen wrote: > Use runtime PM autosuspend feature, with 1s timeout, to avoid > unnecessary suspend-resume cycles when, e.g. the userspace temporarily > turns off the crtcs when configuring the outputs. > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> > --- > drivers/gpu/drm/tidss/tidss_drv.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/tidss/tidss_drv.c b/drivers/gpu/drm/tidss/tidss_drv.c > index f403db11b846..64914331715a 100644 > --- a/drivers/gpu/drm/tidss/tidss_drv.c > +++ b/drivers/gpu/drm/tidss/tidss_drv.c > @@ -43,7 +43,9 @@ void tidss_runtime_put(struct tidss_device *tidss) > > dev_dbg(tidss->dev, "%s\n", __func__); > > - r = pm_runtime_put_sync(tidss->dev); > + pm_runtime_mark_last_busy(tidss->dev); > + > + r = pm_runtime_put_autosuspend(tidss->dev); > WARN_ON(r < 0); > } > > @@ -144,6 +146,9 @@ static int tidss_probe(struct platform_device *pdev) > > pm_runtime_enable(dev); > > + pm_runtime_set_autosuspend_delay(dev, 1000); > + pm_runtime_use_autosuspend(dev); > + > #ifndef CONFIG_PM > /* If we don't have PM, we need to call resume manually */ > dispc_runtime_resume(tidss->dispc); By the way, there's a way to handle this without any ifdef: dispc_runtime_resume(tidss->dispc); pm_runtime_set_active(dev); pm_runtime_get_noresume(dev); pm_runtime_enable(dev); pm_runtime_set_autosuspend_delay(dev, 1000); pm_runtime_use_autosuspend(dev); Then, in the error path, pm_runtime_dont_use_autosuspend(dev); pm_runtime_disable(dev); pm_runtime_put_noidle(dev); dispc_runtime_suspend(tidss->dispc); And in remove: pm_runtime_dont_use_autosuspend(dev); pm_runtime_disable(dev); if (!pm_runtime_status_suspended(dev)) dispc_runtime_suspend(tidss->dispc); pm_runtime_set_suspended(dev); And yes, runtime PM is a horrible API. > @@ -215,6 +220,7 @@ static void tidss_remove(struct platform_device *pdev) > /* If we don't have PM, we need to call suspend manually */ > dispc_runtime_suspend(tidss->dispc); > #endif > + pm_runtime_dont_use_autosuspend(dev); This also needs to be done in the probe error path. > pm_runtime_disable(dev); > > /* devm allocated dispc goes away with the dev so mark it NULL */ >
On 01/11/2023 15:54, Laurent Pinchart wrote: > Hi Tomi, > > Thank you for the patch. > > On Wed, Nov 01, 2023 at 11:17:39AM +0200, Tomi Valkeinen wrote: >> Use runtime PM autosuspend feature, with 1s timeout, to avoid >> unnecessary suspend-resume cycles when, e.g. the userspace temporarily >> turns off the crtcs when configuring the outputs. >> >> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> >> --- >> drivers/gpu/drm/tidss/tidss_drv.c | 8 +++++++- >> 1 file changed, 7 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/tidss/tidss_drv.c b/drivers/gpu/drm/tidss/tidss_drv.c >> index f403db11b846..64914331715a 100644 >> --- a/drivers/gpu/drm/tidss/tidss_drv.c >> +++ b/drivers/gpu/drm/tidss/tidss_drv.c >> @@ -43,7 +43,9 @@ void tidss_runtime_put(struct tidss_device *tidss) >> >> dev_dbg(tidss->dev, "%s\n", __func__); >> >> - r = pm_runtime_put_sync(tidss->dev); >> + pm_runtime_mark_last_busy(tidss->dev); >> + >> + r = pm_runtime_put_autosuspend(tidss->dev); >> WARN_ON(r < 0); >> } >> >> @@ -144,6 +146,9 @@ static int tidss_probe(struct platform_device *pdev) >> >> pm_runtime_enable(dev); >> >> + pm_runtime_set_autosuspend_delay(dev, 1000); >> + pm_runtime_use_autosuspend(dev); >> + >> #ifndef CONFIG_PM >> /* If we don't have PM, we need to call resume manually */ >> dispc_runtime_resume(tidss->dispc); > > By the way, there's a way to handle this without any ifdef: > > dispc_runtime_resume(tidss->dispc); > > pm_runtime_set_active(dev); > pm_runtime_get_noresume(dev); > pm_runtime_enable(dev); > pm_runtime_set_autosuspend_delay(dev, 1000); > pm_runtime_use_autosuspend(dev); I'm not sure I follow what you are trying to do here. The call to dispc_runtime_resume() would crash if we have PM, as the HW would not be enabled at that point. And even if it wouldn't, we don't want to call dispc_runtime_resume() in probe when we have PM. > Then, in the error path, > > pm_runtime_dont_use_autosuspend(dev); > pm_runtime_disable(dev); > pm_runtime_put_noidle(dev); > > dispc_runtime_suspend(tidss->dispc); > > And in remove: > > pm_runtime_dont_use_autosuspend(dev); > pm_runtime_disable(dev); > if (!pm_runtime_status_suspended(dev)) > dispc_runtime_suspend(tidss->dispc); > pm_runtime_set_suspended(dev); > > And yes, runtime PM is a horrible API. > >> @@ -215,6 +220,7 @@ static void tidss_remove(struct platform_device *pdev) >> /* If we don't have PM, we need to call suspend manually */ >> dispc_runtime_suspend(tidss->dispc); >> #endif >> + pm_runtime_dont_use_autosuspend(dev); > > This also needs to be done in the probe error path. Oops. Right, I'll add that. Tomi
Hi Tomi, CC'ing Sakari for his expertise on runtime PM (I think he will soon start wishing he would be ignorant in this area). On Thu, Nov 02, 2023 at 08:34:45AM +0200, Tomi Valkeinen wrote: > On 01/11/2023 15:54, Laurent Pinchart wrote: > > On Wed, Nov 01, 2023 at 11:17:39AM +0200, Tomi Valkeinen wrote: > >> Use runtime PM autosuspend feature, with 1s timeout, to avoid > >> unnecessary suspend-resume cycles when, e.g. the userspace temporarily > >> turns off the crtcs when configuring the outputs. > >> > >> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> > >> --- > >> drivers/gpu/drm/tidss/tidss_drv.c | 8 +++++++- > >> 1 file changed, 7 insertions(+), 1 deletion(-) > >> > >> diff --git a/drivers/gpu/drm/tidss/tidss_drv.c b/drivers/gpu/drm/tidss/tidss_drv.c > >> index f403db11b846..64914331715a 100644 > >> --- a/drivers/gpu/drm/tidss/tidss_drv.c > >> +++ b/drivers/gpu/drm/tidss/tidss_drv.c > >> @@ -43,7 +43,9 @@ void tidss_runtime_put(struct tidss_device *tidss) > >> > >> dev_dbg(tidss->dev, "%s\n", __func__); > >> > >> - r = pm_runtime_put_sync(tidss->dev); > >> + pm_runtime_mark_last_busy(tidss->dev); > >> + > >> + r = pm_runtime_put_autosuspend(tidss->dev); > >> WARN_ON(r < 0); > >> } > >> > >> @@ -144,6 +146,9 @@ static int tidss_probe(struct platform_device *pdev) > >> > >> pm_runtime_enable(dev); > >> > >> + pm_runtime_set_autosuspend_delay(dev, 1000); > >> + pm_runtime_use_autosuspend(dev); > >> + > >> #ifndef CONFIG_PM > >> /* If we don't have PM, we need to call resume manually */ > >> dispc_runtime_resume(tidss->dispc); > > > > By the way, there's a way to handle this without any ifdef: > > > > dispc_runtime_resume(tidss->dispc); > > > > pm_runtime_set_active(dev); > > pm_runtime_get_noresume(dev); > > pm_runtime_enable(dev); > > pm_runtime_set_autosuspend_delay(dev, 1000); > > pm_runtime_use_autosuspend(dev); > > I'm not sure I follow what you are trying to do here. The call to > dispc_runtime_resume() would crash if we have PM, as the HW would not be > enabled at that point. Isn't dispc_runtime_resume() meant to enable the hardware ? The idea is to enable the hardware, then enable runtime PM, and tell the runtime PM framework that the device is enabled. If CONFIG_PM is not set, the RPM calls will be no-ops, and the device will stay enable. If CONFIG_PM is set, the device will be enabled, and will get disabled at end of probe by a call to pm_runtime_put_autosuspend(). > And even if it wouldn't, we don't want to call dispc_runtime_resume() > in probe when we have PM. Don't you need to enable the device at probe time in order to reset it, as done in later patches in the series ? > > Then, in the error path, > > > > pm_runtime_dont_use_autosuspend(dev); > > pm_runtime_disable(dev); > > pm_runtime_put_noidle(dev); > > > > dispc_runtime_suspend(tidss->dispc); > > > > And in remove: > > > > pm_runtime_dont_use_autosuspend(dev); > > pm_runtime_disable(dev); > > if (!pm_runtime_status_suspended(dev)) > > dispc_runtime_suspend(tidss->dispc); > > pm_runtime_set_suspended(dev); > > > > And yes, runtime PM is a horrible API. > > > >> @@ -215,6 +220,7 @@ static void tidss_remove(struct platform_device *pdev) > >> /* If we don't have PM, we need to call suspend manually */ > >> dispc_runtime_suspend(tidss->dispc); > >> #endif > >> + pm_runtime_dont_use_autosuspend(dev); > > > > This also needs to be done in the probe error path. > > Oops. Right, I'll add that.
On 06/11/2023 00:53, Laurent Pinchart wrote: > Hi Tomi, > > CC'ing Sakari for his expertise on runtime PM (I think he will soon > start wishing he would be ignorant in this area). > > On Thu, Nov 02, 2023 at 08:34:45AM +0200, Tomi Valkeinen wrote: >> On 01/11/2023 15:54, Laurent Pinchart wrote: >>> On Wed, Nov 01, 2023 at 11:17:39AM +0200, Tomi Valkeinen wrote: >>>> Use runtime PM autosuspend feature, with 1s timeout, to avoid >>>> unnecessary suspend-resume cycles when, e.g. the userspace temporarily >>>> turns off the crtcs when configuring the outputs. >>>> >>>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> >>>> --- >>>> drivers/gpu/drm/tidss/tidss_drv.c | 8 +++++++- >>>> 1 file changed, 7 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/drivers/gpu/drm/tidss/tidss_drv.c b/drivers/gpu/drm/tidss/tidss_drv.c >>>> index f403db11b846..64914331715a 100644 >>>> --- a/drivers/gpu/drm/tidss/tidss_drv.c >>>> +++ b/drivers/gpu/drm/tidss/tidss_drv.c >>>> @@ -43,7 +43,9 @@ void tidss_runtime_put(struct tidss_device *tidss) >>>> >>>> dev_dbg(tidss->dev, "%s\n", __func__); >>>> >>>> - r = pm_runtime_put_sync(tidss->dev); >>>> + pm_runtime_mark_last_busy(tidss->dev); >>>> + >>>> + r = pm_runtime_put_autosuspend(tidss->dev); >>>> WARN_ON(r < 0); >>>> } >>>> >>>> @@ -144,6 +146,9 @@ static int tidss_probe(struct platform_device *pdev) >>>> >>>> pm_runtime_enable(dev); >>>> >>>> + pm_runtime_set_autosuspend_delay(dev, 1000); >>>> + pm_runtime_use_autosuspend(dev); >>>> + >>>> #ifndef CONFIG_PM >>>> /* If we don't have PM, we need to call resume manually */ >>>> dispc_runtime_resume(tidss->dispc); >>> >>> By the way, there's a way to handle this without any ifdef: >>> >>> dispc_runtime_resume(tidss->dispc); >>> >>> pm_runtime_set_active(dev); >>> pm_runtime_get_noresume(dev); >>> pm_runtime_enable(dev); >>> pm_runtime_set_autosuspend_delay(dev, 1000); >>> pm_runtime_use_autosuspend(dev); >> >> I'm not sure I follow what you are trying to do here. The call to >> dispc_runtime_resume() would crash if we have PM, as the HW would not be >> enabled at that point. > > Isn't dispc_runtime_resume() meant to enable the hardware ? > > The idea is to enable the hardware, then enable runtime PM, and tell the > runtime PM framework that the device is enabled. If CONFIG_PM is not > set, the RPM calls will be no-ops, and the device will stay enable. If > CONFIG_PM is set, the device will be enabled, and will get disabled at > end of probe by a call to pm_runtime_put_autosuspend(). (The text below is more about the end result of this series, rather than this specific patch): Hmm, no, I don't think that's how it works. My understanding is this: There are multiple parts "enabling the hardware", and I think they usually need to be done in this order: 1) enabling the parent devices, 2) system level HW module enable (this is possibly really part of the 1), 3) clk/regulator/register setup. 3) is handled by the driver, but 1) and 2) are handled via the runtime PM framework. Calling dispc_runtime_resume() as the first thing could mean that DSS's parents are not enabled or that the DSS HW module is not enabled at the system control level. That's why I first call pm_runtime_set_active(), which should handle 1) and 2). The only thing dispc_runtime_resume() does wrt. enabling the hardware is enabling the fclk. It does a lot more, but all the rest is just configuring the hardware to settings that we always want to use (e.g. fifo management). Now, if the bootloader had enabled the display, and the driver did: - pm_runtime_enable() - pm_runtime_get() - dispc_reset() it would cause dispc_runtime_resume() to be called before the reset. This would mean that the dispc_runtime_resume() would be changing settings that must not be changed while streaming is enabled. We could do a DSS reset always as the first thing in dispc_runtime_resume() (after enabling the fclk), but that feels a bit pointless as after the first reset the DSS is in a known state. Also, if we don't do a reset at probe time, there are things we need to take care of: at least we need to mask the IRQs (presuming we register the DSS interrupt at probe time). But generally speaking, I feel a bit uncomfortable leaving an IP possibly running in an unknown state after probe. I'd much rather just reset it at probe. Tomi
diff --git a/drivers/gpu/drm/tidss/tidss_drv.c b/drivers/gpu/drm/tidss/tidss_drv.c index f403db11b846..64914331715a 100644 --- a/drivers/gpu/drm/tidss/tidss_drv.c +++ b/drivers/gpu/drm/tidss/tidss_drv.c @@ -43,7 +43,9 @@ void tidss_runtime_put(struct tidss_device *tidss) dev_dbg(tidss->dev, "%s\n", __func__); - r = pm_runtime_put_sync(tidss->dev); + pm_runtime_mark_last_busy(tidss->dev); + + r = pm_runtime_put_autosuspend(tidss->dev); WARN_ON(r < 0); } @@ -144,6 +146,9 @@ static int tidss_probe(struct platform_device *pdev) pm_runtime_enable(dev); + pm_runtime_set_autosuspend_delay(dev, 1000); + pm_runtime_use_autosuspend(dev); + #ifndef CONFIG_PM /* If we don't have PM, we need to call resume manually */ dispc_runtime_resume(tidss->dispc); @@ -215,6 +220,7 @@ static void tidss_remove(struct platform_device *pdev) /* If we don't have PM, we need to call suspend manually */ dispc_runtime_suspend(tidss->dispc); #endif + pm_runtime_dont_use_autosuspend(dev); pm_runtime_disable(dev); /* devm allocated dispc goes away with the dev so mark it NULL */