Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp802450imm; Wed, 23 May 2018 05:54:22 -0700 (PDT) X-Google-Smtp-Source: AB8JxZr7zHP9P4yJh1rkiMUwuKfe9RDI7Fs5BZkmfetpsTC0lrddrlze0MIQLRfv0IRXniKKMDgh X-Received: by 2002:a17:902:da4:: with SMTP id 33-v6mr2835425plv.169.1527080062115; Wed, 23 May 2018 05:54:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527080062; cv=none; d=google.com; s=arc-20160816; b=Isa/xxaNIOi5CUJRntRlHqi7x3nqABLWXyPNy1epqgQ5Cs+Mip6ImQ3pVw4n/etzeJ xbSvTnqzSvzmPtT+fbpvHrpE5zYL7MQa3p5rzlQDFxtB+avsnFLgvy5b8Gt3mOSYdWws +X6O9r6dc1KH9OGQXCXJUdbhLk8P240RrdM2ricVy9iNohPbVdJMWSEX1q5J8+PYUN3l T8qSfas+lEB5GWLb0Knlbui1XymNkJsbXrwgPaWHHTRxw8A8sj0LEI4fKRdxBXoM39Bj 4IeimiosxQXyncxJXqulKt13/gh4rWX3GuQVUuoR3IarbZLVFD7wsTDkI5c+evf7e2FT F8lg== 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=UKFiy4T6kJIZzjlqol7F57KqNMa6sI0BSmxMPzbMphk=; b=K1N9hIXny5CprNMY9eVxCnUhjqdpMCYJ/zjjmKuh9Vp7x7StgN4tNVTUnI+atNDoji W8nW9nElPOriy54cWJJ2wo3uCLKnsK22hSTiIp1fbFZeopOv0OtuMoJ9+Q3fHGynvphP 4XxMG3xuljyq9SvD7kQBzPOjAg4NvPJdl16g6iB0ea0ipmQOWx7i+XON5TzWIav25PH5 jsDDipOH6o0e9X2Njs2nqIuYo2rVnLLRVhrL0PNa9ZcsKjB5KSVIm55AFqbFfqVD1JMZ YirNaq7WNZ2A8PjJ1GAKpRMafTdXQy1wlPMpYT8VSk5OHEe2wdQ5ruojTkhW5ywb5rDt mo9Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=DAczEPvz; dkim=pass header.i=@codeaurora.org header.s=default header.b=UTdiZELJ; 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 v69-v6si18589547pfd.341.2018.05.23.05.54.07; Wed, 23 May 2018 05:54:22 -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=DAczEPvz; dkim=pass header.i=@codeaurora.org header.s=default header.b=UTdiZELJ; 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 S933009AbeEWMxn (ORCPT + 99 others); Wed, 23 May 2018 08:53:43 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:56666 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932848AbeEWMxf (ORCPT ); Wed, 23 May 2018 08:53:35 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id DDF036090E; Wed, 23 May 2018 12:53:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1527080014; bh=RLeKw+yUITeByQPqgWNTo/ziCo4iAaputZTsrtN9p1M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DAczEPvzrw+sl5vXG6rMnWa1W2JsYKWd5qFOONbdwRLSuQLzjsgUVfTewoC2xygmz MGctlvNEfb4v8KFfmIM312spkpdDSrW/ACZA+m7WRJ1EyqdwJPow9n858lSbOsR1Y5 VUkfev1955GYB6BxZqgvuJnAgZhcJyBd2S7vsrvE= 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 ACEC460F61; Wed, 23 May 2018 12:53:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1527080013; bh=RLeKw+yUITeByQPqgWNTo/ziCo4iAaputZTsrtN9p1M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UTdiZELJAgTYVcl3mAcyf4OMNGhoqsGyoMg9I8t5uheZ0pVJQAuwO67W0Gis7gWvA iOoUlxfCAxBH95CGRRIKF7+Gbiue/Tm785Vk37Hsj0cqZ75Q0DnRtVppMymYk1TyAR yBWtXEVjzTN3+k6IpUNaAKRA/jeVfviTmsX84TZY= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org ACEC460F61 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, andy.gross@linaro.org, david.brown@linaro.org, will.deacon@arm.com Cc: linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, vireshk@kernel.org, ilialin@codeaurora.org, Rajendra Nayak Subject: [PATCH v11 7/8] clk: qcom: cpu-8996: Add support to switch below 600Mhz Date: Wed, 23 May 2018 15:53:00 +0300 Message-Id: <1527079981-11179-8-git-send-email-ilialin@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1527079981-11179-1-git-send-email-ilialin@codeaurora.org> References: <1527079981-11179-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 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 --- 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 620fdc2..ff5c0a5 100644 --- a/drivers/clk/qcom/clk-cpu-8996.c +++ b/drivers/clk/qcom/clk-cpu-8996.c @@ -68,6 +68,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, @@ -95,10 +97,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), }; @@ -140,7 +143,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), }; @@ -181,6 +184,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; }; @@ -226,6 +230,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; @@ -237,13 +248,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; @@ -295,6 +312,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", @@ -315,6 +333,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