Received: by 10.213.65.68 with SMTP id h4csp1961002imn; Thu, 29 Mar 2018 14:32:06 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+HhfyyDee7cCVc+Ez2BfeqJVEgeJK+rlZ/oBB2D5NMv/9bAukL8R6HT1sNtMAjdk4sqTJ8 X-Received: by 10.98.214.218 with SMTP id a87mr7727359pfl.124.1522359126516; Thu, 29 Mar 2018 14:32:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522359126; cv=none; d=google.com; s=arc-20160816; b=ogtxEOaVAMFOhDM8Zf0f1wclJV5x68lubn3qCaYlQhJIKvLX2erKqDKpZEknFRucCH xJlTrcMhRzhKuT5MnZIrp2RPC4wsixyn3/X3e1xglEtG3t1Rn3pnPbsnUvtRev0Nr7Yv gv+WVTpvD9mZG8MyA6e1wdWGLBp/aZJ3sdywxEQbG8MsgoEp1egaXnOGPaZx/MpXxV42 qRFr7QslkBbJnK4X1s6m/hYuinpTXDZK14DwgCwCO2HIXxJZlvou6J5XvWnI567yK3iw Hs4EVevI42iKEjI01gCqCf2c3axcvebCBLC4WXwF9ZITLSbfBxsz9oxJ3BKX+pgf1DnC B6ug== 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:message-id:date :subject:cc:to:from:dmarc-filter:dkim-signature:dkim-signature :arc-authentication-results; bh=OZcfKv0HEDBxbgIiA+5rPYX08qypbKQakhuOqTAfnNY=; b=dp1+tzDQtILYIKOHgwKDu8AY7Q4FrRthtXpxu17G4iNlmQqkgT6/vzoMEfLc2fG6q2 0zYSLbnICjZLE+21JvTBJx7HdW6TyG+6JA5hTJcmgrB00NJu2DXJoDQCj8fGFiu7RIi6 5eRRST56Z9L6CXg376QDHiLCZ4YQFzB9pMsdXKUDXbLwrpr4gTLL0TJVAYvZoiRlTC+9 YOFtBC1Gh1joHQV9cmErED6pSkTREYo+1w/dugjmikvvRBBjOL94R2W5p6bjd+8VawyG 12UjwYlk1h4OVcRU2s4I5fSnGX/HGD4Y5yvZ+IjH+gNHuQz9cTz5mqpRWlrmtbv1zgKL jKGw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=RCBBrHTl; dkim=pass header.i=@codeaurora.org header.s=default header.b=RDchJbKR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o11si4562246pgn.554.2018.03.29.14.31.52; Thu, 29 Mar 2018 14:32:06 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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=@codeaurora.org header.s=default header.b=RCBBrHTl; dkim=pass header.i=@codeaurora.org header.s=default header.b=RDchJbKR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752548AbeC2V1q (ORCPT + 99 others); Thu, 29 Mar 2018 17:27:46 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:34338 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751189AbeC2V1n (ORCPT ); Thu, 29 Mar 2018 17:27:43 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id CCC4A60FF0; Thu, 29 Mar 2018 21:27:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1522358861; bh=8vbCGJXVzh+0qm7ObeCQvLCP1S+SCg4vm2dCzFK11E4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RCBBrHTlH8mD4LVO8V2Uncv/wcPL9PtqkvtUk1+bOhlrxvDJgH8SYBfbk7zYHpdXA ZewDYMBPE0B/rhkd2n/n7xHny3qdjENlb9rALPvxyFYWhdZ8nBj7sM7NnoVeIrs+jB voE2uzi6Xebk+IcMoBIKep0CMevUIZZ9q0hNfmhs= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from lx-ilial.mea.qualcomm.com (unknown [185.23.60.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: ilialin@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 99E6B60AFB; Thu, 29 Mar 2018 21:27:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1522358853; bh=8vbCGJXVzh+0qm7ObeCQvLCP1S+SCg4vm2dCzFK11E4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RDchJbKRGPD21yZcg5HtxWs1wOfGD7xM3fP843af8JNhbhrNEoBrciHinUIZxhLMo dISCpVs5s2Il0VA2LFUHxHim4Yqrb4uoT/mNOqE7aY8JtdZqoW9cX0p9dJ7bwY6OGQ hfK2vbRAl5JVPutTQiGbyjFlxm8bXmASN2N6aIYA= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 99E6B60AFB Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=ilialin@codeaurora.org From: Ilia Lin To: mturquette@baylibre.com, sboyd@kernel.org, robh@kernel.org, mark.rutland@arm.com, rjw@rjwysocki.net, viresh.kumar@linaro.org, lgirdwood@gmail.com, broonie@kernel.org, andy.gross@linaro.org, david.brown@linaro.org, catalin.marinas@arm.com, will.deacon@arm.com, linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: rnayak@codeaurora.org, ilialin@codeaurora.org, amit.kucheria@linaro.org, nicolas.dechesne@linaro.org, celster@codeaurora.org, tfinkel@codeaurora.org Subject: [PATCH v4 06/14] clk: qcom: cpu-8996: Add support to switch below 600Mhz Date: Fri, 30 Mar 2018 00:26:39 +0300 Message-Id: <1522358807-10413-7-git-send-email-ilialin@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1522358807-10413-1-git-send-email-ilialin@codeaurora.org> References: <1522358807-10413-1-git-send-email-ilialin@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Rajendra Nayak The CPU clock controller's primary PLL operates on a single VCO range, between 600MHz and 3GHz. However the CPUs do support OPPs with frequencies between 300MHz and 600MHz. In order to support running the CPUs at those frequencies we end up having to lock the PLL at twice the rate and drive the CPU clk via the PLL/2 output and SMUX. So for frequencies above 600MHz we follow the following path Primary PLL --> PLL_EARLY --> PMUX(1) --> CPU clk and for frequencies between 300MHz and 600MHz we follow Primary PLL --> PLL/2 --> SMUX(1) --> PMUX(0) --> CPU clk Signed-off-by: Rajendra Nayak Signed-off-by: Ilia Lin Conflicts: drivers/clk/qcom/clk-cpu-8996.c --- drivers/clk/qcom/clk-cpu-8996.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c index 12585b1..064a3fe 100644 --- a/drivers/clk/qcom/clk-cpu-8996.c +++ b/drivers/clk/qcom/clk-cpu-8996.c @@ -78,6 +78,8 @@ enum _pmux_input { NUM_OF_PMUX_INPUTS }; +#define DIV_2_THRESHOLD 600000000 + static const u8 prim_pll_regs[PLL_OFF_MAX_REGS] = { [PLL_OFF_L_VAL] = 0x04, [PLL_OFF_ALPHA_VAL] = 0x08, @@ -105,10 +107,11 @@ enum _pmux_input { static const struct alpha_pll_config hfpll_config = { .l = 60, - .config_ctl_val = 0x200d4828, + .config_ctl_val = 0x200d4aa8, .config_ctl_hi_val = 0x006, .pre_div_mask = BIT(12), .post_div_mask = 0x3 << 8, + .post_div_val = 0x1 << 8, .main_output_mask = BIT(0), .early_output_mask = BIT(3), }; @@ -150,7 +153,7 @@ enum _pmux_input { .vco_mask = 0x3 << 20, .config_ctl_val = 0x4001051b, .post_div_mask = 0x3 << 8, - .post_div_val = 0x1, + .post_div_val = 0x1 << 8, .main_output_mask = BIT(0), .early_output_mask = BIT(3), }; @@ -191,6 +194,7 @@ struct clk_cpu_8996_mux { u8 width; struct notifier_block nb; struct clk_hw *pll; + struct clk_hw *pll_div_2; struct clk_regmap clkr; }; @@ -236,6 +240,13 @@ static int clk_cpu_8996_mux_set_parent(struct clk_hw *hw, u8 index) struct clk_cpu_8996_mux *cpuclk = to_clk_cpu_8996_mux_hw(hw); struct clk_hw *parent = cpuclk->pll; + if (cpuclk->pll_div_2 && req->rate < DIV_2_THRESHOLD) { + if (req->rate < (DIV_2_THRESHOLD / 2)) + return -EINVAL; + + parent = cpuclk->pll_div_2; + } + req->best_parent_rate = clk_hw_round_rate(parent, req->rate); req->best_parent_hw = parent; @@ -247,13 +258,19 @@ int cpu_clk_notifier_cb(struct notifier_block *nb, unsigned long event, { int ret; struct clk_cpu_8996_mux *cpuclk = to_clk_cpu_8996_mux_nb(nb); + struct clk_notifier_data *cnd = data; switch (event) { case PRE_RATE_CHANGE: ret = clk_cpu_8996_mux_set_parent(&cpuclk->clkr.hw, ALT_INDEX); break; case POST_RATE_CHANGE: - ret = clk_cpu_8996_mux_set_parent(&cpuclk->clkr.hw, PLL_INDEX); + if (cnd->new_rate < DIV_2_THRESHOLD) + ret = clk_cpu_8996_mux_set_parent(&cpuclk->clkr.hw, + DIV_2_INDEX); + else + ret = clk_cpu_8996_mux_set_parent(&cpuclk->clkr.hw, + PLL_INDEX); break; default: ret = 0; @@ -305,6 +322,7 @@ int cpu_clk_notifier_cb(struct notifier_block *nb, unsigned long event, .shift = 0, .width = 2, .pll = &pwrcl_pll.clkr.hw, + .pll_div_2 = &pwrcl_smux.clkr.hw, .nb.notifier_call = cpu_clk_notifier_cb, .clkr.hw.init = &(struct clk_init_data) { .name = "pwrcl_pmux", @@ -325,6 +343,7 @@ int cpu_clk_notifier_cb(struct notifier_block *nb, unsigned long event, .shift = 0, .width = 2, .pll = &perfcl_pll.clkr.hw, + .pll_div_2 = &perfcl_smux.clkr.hw, .nb.notifier_call = cpu_clk_notifier_cb, .clkr.hw.init = &(struct clk_init_data) { .name = "perfcl_pmux", -- 1.9.1