From patchwork Tue Sep 19 22:32:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 113066 Delivered-To: patch@linaro.org Received: by 10.140.106.117 with SMTP id d108csp33917qgf; Tue, 19 Sep 2017 15:32:52 -0700 (PDT) X-Received: by 10.98.69.137 with SMTP id n9mr135835pfi.164.1505860372630; Tue, 19 Sep 2017 15:32:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1505860372; cv=none; d=google.com; s=arc-20160816; b=WUGusdZP1i0lexd9ZxTqD9kBQAKLLXUsfgnVhWGZ7rXLlrqHDbGBKVI9x4a2/meNMC 2LAgBlTnW+TW4pM50PD/Y/Yv2H+e81VyJ63OWlwK3n5PQkZ4qc46B7yCgszgxj5AtoAr KZeeO7FgvpHScNMjs4BFgRobdWg41/VFqI2fZ1MuouPgXbzu0XDj28BjCCQYFMahbigX Lt5ljs5WocmTwG6QyH58HiSsSmu65pmzqhNKP8Icm7ZfUtbSL0bHVT2KWe69fqxOI7tV isEufK+lffHyK28Ca5+0+oeWyf9DQ8rI/4z02TPk1JISveGX9AThzaRSG/rtyzN9eo2J fmUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=Ms17HxLEqyX7GMSEfKAhb+YPLu4N4CxXpKYoZfW9Ojo=; b=nAHsLqYP5P++XWOPcmCyM5oyttTSBKxOGMjZ1DpalKniIUjnE+JGHchcWdqGHboYmO rMfopDHShiHdUeonUhbk1dD5mL4PvWJXSz6aMiA9IylZdmJW8oRSIZCzm5hymH74KEVq 3BMjXAB7sgpjo5JnaHTotdexJTQw+alJuhG3S1NSags/G3MZZfxqb2+h9bDEY31W/m2b CpHSRaSrNhUmZjRmqqN0EA0r68OEaA/KLrdrKKISXxnfIknmNEhA6aZ94U2R/DlwM2fm trls1dYz0C/vOVMN0I2Px8K02jxQlFsGQWbs+AGRvk6GOivyr/TMjWv8IGvlE0ZGGK8G tlog== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=U2PHAVk/; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y7si231205plh.605.2017.09.19.15.32.52; Tue, 19 Sep 2017 15:32:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=U2PHAVk/; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-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 S1751747AbdISWct (ORCPT + 12 others); Tue, 19 Sep 2017 18:32:49 -0400 Received: from mail-pg0-f54.google.com ([74.125.83.54]:53637 "EHLO mail-pg0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751710AbdISWcr (ORCPT ); Tue, 19 Sep 2017 18:32:47 -0400 Received: by mail-pg0-f54.google.com with SMTP id j70so600673pgc.10 for ; Tue, 19 Sep 2017 15:32:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=Ms17HxLEqyX7GMSEfKAhb+YPLu4N4CxXpKYoZfW9Ojo=; b=U2PHAVk/li09quNGXzFU6OdpkcqRI+aJMRGJY4kwjw7MfrdJw8b5Uvv20Xujk9Wo/2 I1gf3wOv4ESyMU/rFcrazR+4v7DMnxsFbK2I79+VDmrlkWdBdRnwhgZMyPfUoZJFNcDn 96AxXQz2MZ31kftZVoOnHvMEN0vAQzcMugWFA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=Ms17HxLEqyX7GMSEfKAhb+YPLu4N4CxXpKYoZfW9Ojo=; b=UmC1Zdgd4o1Kg0LlqEvyK8+1omTvBB30Mc2tSYaIak0Ien6B+ClRMNW2cqZgp47NBh 2ZBvFMEBBpOHkZ4nip1tGIbMGImpV4oJQNlc2VTHo0FYLAEFIY7hS8AZsoveiRzHqIW1 rwF9yTqBv81t17yadX8TToAfY1jb+WBPWfvu8pE4rbu+Zm3PWIFCo+n1CrUjZIjLJn3d eNeSxzTq9sb/fxGuy1tdSx6tm7u74bgmFv1qEU7U+RjSBthuvNdnvXgjf7/qA4TNr3aa 9fGvSiTqwp/ZZEs6TDiD8z0ZntSLpN79M+wg/op5OHMVrbr3JVwJLXyd+lhlTO3K/1Kf zlvg== X-Gm-Message-State: AHPjjUjsBX62zhSxhCIDFnFvY00dmlER/dTSzNNe3wFsdZz1zrgigpYz nNELJpUPP/1n8jA5b2WQV90HtA== X-Google-Smtp-Source: AOwi7QDtx2Y3rZKKCSZzdLMur+Yxhxztm1o3IBHAoUUAmHWLZ7335ygHJmg0tpruUmkcU2LEaT9oiw== X-Received: by 10.101.85.4 with SMTP id f4mr138372pgr.10.1505860366433; Tue, 19 Sep 2017 15:32:46 -0700 (PDT) Received: from localhost (cpe-172-88-64-62.socal.res.rr.com. [172.88.64.62]) by smtp.gmail.com with ESMTPSA id u77sm5406901pfk.87.2017.09.19.15.32.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Sep 2017 15:32:45 -0700 (PDT) From: Viresh Kumar To: Rafael Wysocki , ulf.hansson@linaro.org, Kevin Hilman Cc: Viresh Kumar , linux-pm@vger.kernel.org, Vincent Guittot , Stephen Boyd , Nishanth Menon , robh+dt@kernel.org, lina.iyer@linaro.org, rnayak@codeaurora.org, sudeep.holla@arm.com, linux-kernel@vger.kernel.org, Len Brown , Pavel Machek , Andy Gross , David Brown Subject: [PATCH V10 6/7] mmc: sdhci-msm: Adapt the driver to use OPPs to set clocks/performance state Date: Tue, 19 Sep 2017 15:32:22 -0700 Message-Id: X-Mailer: git-send-email 2.7.4 In-Reply-To: References: In-Reply-To: References: Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org From: Rajendra Nayak THIS IS TEST CODE, SHOULDN'T BE MERGED. SDHCI driver needs to set a performance state along with scaling its clocks. Modify the driver to use the newly introducded powerdomain performance state based OPPs to scale clocks as well as set an appropriate powerdomain performance state. The patch also adds OPPs for sdhci device on msm8996. The changes have to be validated by populating similar OPP tables on all other devices which use the sdhci driver. This is for now validated only on msm8996 and with missing OPP tables for other devices is known to break those platforms. Not-signed-off-by: Rajendra Nayak Not-signed-off-by: Viresh Kumar --- arch/arm64/boot/dts/qcom/msm8996.dtsi | 34 ++++++++++++++++++++++++++++++ drivers/clk/qcom/gcc-msm8996.c | 8 +++---- drivers/mmc/host/sdhci-msm.c | 39 ++++++++++++++++++++++++++--------- 3 files changed, 67 insertions(+), 14 deletions(-) -- 2.7.4 diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi index 0be1db559d61..71183c009c58 100644 --- a/arch/arm64/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi @@ -515,8 +515,42 @@ <&gcc GCC_SDCC2_APPS_CLK>, <&xo_board>; bus-width = <4>; + power-domains = <&rpmpd 0>; + operating-points-v2 = <&sdhc_opp_table>; }; + sdhc_opp_table: opp_table { + compatible = "operating-points-v2"; + + opp@400000 { + opp-hz = /bits/ 64 <400000>; + }; + + opp@20000000 { + opp-hz = /bits/ 64 <20000000>; + }; + + opp@25000000 { + opp-hz = /bits/ 64 <25000000>; + }; + + opp@50000000 { + opp-hz = /bits/ 64 <50000000>; + }; + + opp@96000000 { + opp-hz = /bits/ 64 <96000000>; + }; + + opp@192000000 { + opp-hz = /bits/ 64 <192000000>; + }; + + opp@384000000 { + opp-hz = /bits/ 64 <384000000>; + }; + }; + msmgpio: pinctrl@1010000 { compatible = "qcom,msm8996-pinctrl"; reg = <0x01010000 0x300000>; diff --git a/drivers/clk/qcom/gcc-msm8996.c b/drivers/clk/qcom/gcc-msm8996.c index 7ddec886fcd3..38034692f5aa 100644 --- a/drivers/clk/qcom/gcc-msm8996.c +++ b/drivers/clk/qcom/gcc-msm8996.c @@ -460,7 +460,7 @@ static struct clk_rcg2 sdcc1_apps_clk_src = { .name = "sdcc1_apps_clk_src", .parent_names = gcc_xo_gpll0_gpll4_gpll0_early_div, .num_parents = 4, - .ops = &clk_rcg2_floor_ops, + .ops = &clk_rcg2_ops, }, }; @@ -505,7 +505,7 @@ static struct clk_rcg2 sdcc2_apps_clk_src = { .name = "sdcc2_apps_clk_src", .parent_names = gcc_xo_gpll0_gpll4, .num_parents = 3, - .ops = &clk_rcg2_floor_ops, + .ops = &clk_rcg2_ops, }, }; @@ -519,7 +519,7 @@ static struct clk_rcg2 sdcc3_apps_clk_src = { .name = "sdcc3_apps_clk_src", .parent_names = gcc_xo_gpll0_gpll4, .num_parents = 3, - .ops = &clk_rcg2_floor_ops, + .ops = &clk_rcg2_ops, }, }; @@ -543,7 +543,7 @@ static struct clk_rcg2 sdcc4_apps_clk_src = { .name = "sdcc4_apps_clk_src", .parent_names = gcc_xo_gpll0, .num_parents = 2, - .ops = &clk_rcg2_floor_ops, + .ops = &clk_rcg2_ops, }, }; diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index fc73e56eb1e2..cbc5a12af772 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "sdhci-pltfm.h" @@ -131,6 +132,7 @@ struct sdhci_msm_host { struct clk *pclk; /* SDHC peripheral bus clock */ struct clk *bus_clk; /* SDHC bus voter clock */ struct clk *xo_clk; /* TCXO clk needed for FLL feature of cm_dll*/ + struct opp_table *opp_table; unsigned long clk_rate; struct mmc_host *mmc; bool use_14lpp_dll_reset; @@ -140,7 +142,7 @@ struct sdhci_msm_host { bool use_cdclp533; }; -static unsigned int msm_get_clock_rate_for_bus_mode(struct sdhci_host *host, +static long unsigned int msm_get_clock_rate_for_bus_mode(struct sdhci_host *host, unsigned int clock) { struct mmc_ios ios = host->mmc->ios; @@ -165,16 +167,22 @@ static void msm_set_clock_rate_for_bus_mode(struct sdhci_host *host, struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); struct mmc_ios curr_ios = host->mmc->ios; int rc; + struct device *dev = &msm_host->pdev->dev; + struct dev_pm_opp *opp; + long unsigned int freq; + + freq = msm_get_clock_rate_for_bus_mode(host, clock); + opp = dev_pm_opp_find_freq_floor(dev, &freq); + if (IS_ERR(opp)) + pr_err("%s: failed to find OPP for %u at timing %d\n", + mmc_hostname(host->mmc), clock, curr_ios.timing); + + rc = dev_pm_opp_set_rate(dev, freq); + if (rc) + pr_err("%s: error in setting opp\n", __func__); + + msm_host->clk_rate = freq; - clock = msm_get_clock_rate_for_bus_mode(host, clock); - rc = clk_set_rate(msm_host->clk, clock); - if (rc) { - pr_err("%s: Failed to set clock at rate %u at timing %d\n", - mmc_hostname(host->mmc), clock, - curr_ios.timing); - return; - } - msm_host->clk_rate = clock; pr_debug("%s: Setting clock at rate %lu at timing %d\n", mmc_hostname(host->mmc), clk_get_rate(msm_host->clk), curr_ios.timing); @@ -1268,6 +1276,13 @@ static int sdhci_msm_probe(struct platform_device *pdev) goto clk_disable; } + /* Set up the OPP table */ + msm_host->opp_table = dev_pm_opp_set_clkname(&pdev->dev, "core"); + + ret = dev_pm_opp_of_add_table(&pdev->dev); + if (ret) + dev_warn(&pdev->dev, "%s: No OPP table specified\n", __func__); + pm_runtime_get_noresume(&pdev->dev); pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); @@ -1289,6 +1304,8 @@ static int sdhci_msm_probe(struct platform_device *pdev) pm_runtime_disable(&pdev->dev); pm_runtime_set_suspended(&pdev->dev); pm_runtime_put_noidle(&pdev->dev); + dev_pm_opp_of_remove_table(&pdev->dev); + dev_pm_opp_put_clkname(msm_host->opp_table); clk_disable: clk_disable_unprepare(msm_host->clk); pclk_disable: @@ -1314,6 +1331,8 @@ static int sdhci_msm_remove(struct platform_device *pdev) pm_runtime_get_sync(&pdev->dev); pm_runtime_disable(&pdev->dev); pm_runtime_put_noidle(&pdev->dev); + dev_pm_opp_of_remove_table(&pdev->dev); + dev_pm_opp_put_clkname(msm_host->opp_table); clk_disable_unprepare(msm_host->clk); clk_disable_unprepare(msm_host->pclk);