From patchwork Mon Oct 25 22:40:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 12583293 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 52BBAC433FE for ; Mon, 25 Oct 2021 22:47:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 31D566008E for ; Mon, 25 Oct 2021 22:47:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235614AbhJYWth (ORCPT ); Mon, 25 Oct 2021 18:49:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41626 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235154AbhJYWsn (ORCPT ); Mon, 25 Oct 2021 18:48:43 -0400 Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7CB20C061227; Mon, 25 Oct 2021 15:46:04 -0700 (PDT) Received: by mail-lf1-x135.google.com with SMTP id u21so16869823lff.8; Mon, 25 Oct 2021 15:46:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=epiJBkohh4ZmYg/r7+Q6DcSDeXTiYkOM/HNEWohJN6I=; b=fZyLIi0aIAT00OpdUucYqOwlAsX5cCCXM5RWlmQfUKyTjDIjzWcZNAorNVXBiOvKQm 3EMtlDPmhJyGde/fZUgV7V2nDrXsK6Rxb1Xo8NGnAEiaFg1GEmtsFMpHFlNzNukuPuDn iY79vApNej2tFRb+oK7SXuPisFBknI3Rb6dr2rw6qzUxZmhM25SC5Hmt2WboAjevktQE NHP4p/3yFDqth6LzhnQCkUHVbYu38oa4Xrhd1LWoixL/jFrXV0kLtF1UQr0OYBCJYU49 UrL9XPxndsB2vDtqGyvzu0mstMnzqF6Q2iggiMiPP+f2DEt86xf55O1IQKJNeLHvTxYC ccRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=epiJBkohh4ZmYg/r7+Q6DcSDeXTiYkOM/HNEWohJN6I=; b=NI2aBFRb/x3dwwDK8ecejlvwR4eAeKU46/N2mCT76l3ITiqnQePmvDdSvQFyyvTpOR m1rlJHmLvSahr4zi7/nMt01tK5KCgHsjWJxsSD5HvZO2zAMICS9agea+Ty9GKufvf+47 DEDLL9PRgXzdGWiCdWjbCHNiAjJc42F8g4GAHKpd8+CyENx1bMYeJqNnGIYugegC12s8 bVV9S2rqD3aw9XJvIW9sOynTjc0UdujdmHuzq941Q7Mq1rzTvBEMUFDZYq/i5HyBc6qT hGInt5I2zBygklezhSucovfzCevyYFV7xjgsvM+GsLbhQFrvEfkAxrYhB+/mkZPl1Zox FLMg== X-Gm-Message-State: AOAM53015NZyiFX8reS1L4aesdH0PB4oAGubAENnJDtJOzTOFv7HDFs7 rpEs+W9hQcLu4aBxYGKhc/M= X-Google-Smtp-Source: ABdhPJzPX/j5y0aukgUmWgucha8iyYlLr1g0M5v+R9wgHMvCixTzhkoI2jsuvKhy9SRjHOmyulDISA== X-Received: by 2002:a05:6512:23a5:: with SMTP id c37mr589407lfv.19.1635201962919; Mon, 25 Oct 2021 15:46:02 -0700 (PDT) Received: from localhost.localdomain (46-138-41-28.dynamic.spd-mgts.ru. [46.138.41.28]) by smtp.gmail.com with ESMTPSA id t20sm2040956lft.240.2021.10.25.15.46.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Oct 2021 15:46:02 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Ulf Hansson , Viresh Kumar , Stephen Boyd , Peter De Schrijver , Mikko Perttunen , Lee Jones , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Nishanth Menon , Adrian Hunter , Michael Turquette Cc: linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org, linux-pm@vger.kernel.org, linux-pwm@vger.kernel.org, linux-mmc@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-clk@vger.kernel.org, David Heidelberg Subject: [PATCH v14 18/39] usb: chipidea: tegra: Add runtime PM and OPP support Date: Tue, 26 Oct 2021 01:40:11 +0300 Message-Id: <20211025224032.21012-19-digetx@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211025224032.21012-1-digetx@gmail.com> References: <20211025224032.21012-1-digetx@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org The Tegra USB controller belongs to the core power domain and we're going to enable GENPD support for the core domain. Now USB controller must be resumed using runtime PM API in order to initialize the USB power state. We already support runtime PM for the CI device, but CI's PM is separated from the RPM managed by tegra-usb driver. Add runtime PM and OPP support to the driver. Acked-by: Peter Chen Signed-off-by: Dmitry Osipenko --- drivers/usb/chipidea/ci_hdrc_tegra.c | 55 ++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/drivers/usb/chipidea/ci_hdrc_tegra.c b/drivers/usb/chipidea/ci_hdrc_tegra.c index 60361141ac04..0fff1e4407ca 100644 --- a/drivers/usb/chipidea/ci_hdrc_tegra.c +++ b/drivers/usb/chipidea/ci_hdrc_tegra.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -15,6 +16,8 @@ #include #include +#include + #include "../host/ehci.h" #include "ci.h" @@ -278,6 +281,8 @@ static int tegra_usb_probe(struct platform_device *pdev) if (!usb) return -ENOMEM; + platform_set_drvdata(pdev, usb); + soc = of_device_get_match_data(&pdev->dev); if (!soc) { dev_err(&pdev->dev, "failed to match OF data\n"); @@ -296,11 +301,17 @@ static int tegra_usb_probe(struct platform_device *pdev) return err; } - err = clk_prepare_enable(usb->clk); - if (err < 0) { - dev_err(&pdev->dev, "failed to enable clock: %d\n", err); + err = devm_pm_runtime_enable(&pdev->dev); + if (err) + return err; + + err = devm_tegra_core_dev_init_opp_table_common(&pdev->dev); + if (err) + return err; + + err = pm_runtime_resume_and_get(&pdev->dev); + if (err) return err; - } if (device_property_present(&pdev->dev, "nvidia,needs-double-reset")) usb->needs_double_reset = true; @@ -320,8 +331,6 @@ static int tegra_usb_probe(struct platform_device *pdev) if (err) goto fail_power_off; - platform_set_drvdata(pdev, usb); - /* setup and register ChipIdea HDRC device */ usb->soc = soc; usb->data.name = "tegra-usb"; @@ -350,7 +359,8 @@ static int tegra_usb_probe(struct platform_device *pdev) phy_shutdown: usb_phy_shutdown(usb->phy); fail_power_off: - clk_disable_unprepare(usb->clk); + pm_runtime_put_sync_suspend(&pdev->dev); + return err; } @@ -360,15 +370,46 @@ static int tegra_usb_remove(struct platform_device *pdev) ci_hdrc_remove_device(usb->dev); usb_phy_shutdown(usb->phy); + + pm_runtime_put_sync_suspend(&pdev->dev); + pm_runtime_force_suspend(&pdev->dev); + + return 0; +} + +static int __maybe_unused tegra_usb_runtime_resume(struct device *dev) +{ + struct tegra_usb *usb = dev_get_drvdata(dev); + int err; + + err = clk_prepare_enable(usb->clk); + if (err < 0) { + dev_err(dev, "failed to enable clock: %d\n", err); + return err; + } + + return 0; +} + +static int __maybe_unused tegra_usb_runtime_suspend(struct device *dev) +{ + struct tegra_usb *usb = dev_get_drvdata(dev); + clk_disable_unprepare(usb->clk); return 0; } +static const struct dev_pm_ops tegra_usb_pm = { + SET_RUNTIME_PM_OPS(tegra_usb_runtime_suspend, tegra_usb_runtime_resume, + NULL) +}; + static struct platform_driver tegra_usb_driver = { .driver = { .name = "tegra-usb", .of_match_table = tegra_usb_of_match, + .pm = &tegra_usb_pm, }, .probe = tegra_usb_probe, .remove = tegra_usb_remove,