Received: by 10.192.165.148 with SMTP id m20csp1747897imm; Thu, 3 May 2018 04:56:45 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoGPrvH/rjozGEHw0ncRlXQcrJvO+GYR8RAf8Wh+Ax6EhOps3hbt3YC5h5kP8RcYJnTkbVb X-Received: by 2002:a63:af4b:: with SMTP id s11-v6mr3418091pgo.346.1525348605149; Thu, 03 May 2018 04:56:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525348605; cv=none; d=google.com; s=arc-20160816; b=tYac/AXIjbDggKBvV7doL6gMZWoNIjo5vBTHh2zyUwDL4W+fd+Z3nqdZ85mgqzo9c7 VmT6DgcWPpQDmHxlM6vRr/36NZas1Qoan5oKPqCTKbF9Ttap6FQmVX1NWpzlrE4YwE+6 f1J3hcqK+76eZA/NswVzdGx8rb7ce/9MAY1qT4Gs4vKQkE3bVT2MLKomSiY/4NFm66rw +mfm1089U44e1rS4Z4h//TkGYfXazspr0Pa+v70kym/gVKBOwFZTI+1h4pkPycucVxfU 4mcT5q9cUGG89QtQ32vI89EJtouWOkt6N1XvflvOWK3A8Ea+UBZeHqibLT3ktfLos0qG 4q5w== 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=ofm1rjYy+3kvlT955HCLVn5QezrJPR/dtBEJLjAU0Xs=; b=qyGhu4f8y2jhENDHl0jZiFuxn2PkbQP3JtIIIploeCWCwhmyeFqscXliP8d8OFVv+w oINLTBpESqlf7eZ0KKmib2C4t93dTEluOqyZuDvAZSeU/OUvmn4TL7AIRPZo475lx6bP J0p2vj0sJXfCA8raVvEP2wPh2eWpBayBOXyIb0SlDVglE5/3dZgO82XgF1LrN7goJVW2 RHFfMUd9Qy2l+PpvoHTXm7kM1LbPhG/lcxC4ZZuz+ZQQDvfnbTm1wCImSxAPab4rac59 eJRQEQuH0ebeeYnW/00msy/o8RSKpue0YzHArZL9+XN+7iruc11+y1391zYZNuCxRm2g XKBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=PVeM+3Df; dkim=pass header.i=@codeaurora.org header.s=default header.b=VzC16y3G; 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 85si13841255pfh.176.2018.05.03.04.56.31; Thu, 03 May 2018 04:56:45 -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=PVeM+3Df; dkim=pass header.i=@codeaurora.org header.s=default header.b=VzC16y3G; 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 S1751940AbeECLz6 (ORCPT + 99 others); Thu, 3 May 2018 07:55:58 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:34226 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751855AbeECLxT (ORCPT ); Thu, 3 May 2018 07:53:19 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 5DDC960F5F; Thu, 3 May 2018 11:53:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1525348398; bh=x6E7yG/TzCnUEqbNoMz1kfMxleQ+9V3mEq31rT0I64w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PVeM+3DfBwtQhmjpwG2avZ5ogFUbMxXvDggZ9W2Pu3fAnyqT4vfAZWxTXoDS4kpnO qGhFduXRYBfWeQZnHbawlH9SX3nroZcpKRUCKjPZWfPkSYdVbVFecwvkjyhJg+16IP iTzI8orpG+w3l+s6d0Vq5qbrYYDZcK3irSXQlJ1w= 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 EFAE060AD4; Thu, 3 May 2018 11:53:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1525348397; bh=x6E7yG/TzCnUEqbNoMz1kfMxleQ+9V3mEq31rT0I64w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VzC16y3GSSp8No1y9+wDN3bUaacu8wioKrXjUL1Eifi3Yl343wigTojVk3BI7IHer PRzZ8tZ1B4NW88dIhJsKKLv3UrbAEIZuhuv9tTIi94kRcSCrE3j2r+NDg/X0DcZmLR 6s3oalmjytlRpbyk9juGx906l+IXTXZwLIEa5N7E= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org EFAE060AD4 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 Cc: 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, rnayak@codeaurora.org, ilialin@codeaurora.org, amit.kucheria@linaro.org, nicolas.dechesne@linaro.org, celster@codeaurora.org, tfinkel@codeaurora.org Subject: [PATCH v5 06/14] clk: qcom: cpu-8996: Add support to switch below 600Mhz Date: Thu, 3 May 2018 14:52:27 +0300 Message-Id: <1525348355-25471-7-git-send-email-ilialin@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1525348355-25471-1-git-send-email-ilialin@codeaurora.org> References: <1525348355-25471-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 390b369..3ea0446 100644 --- a/drivers/clk/qcom/clk-cpu-8996.c +++ b/drivers/clk/qcom/clk-cpu-8996.c @@ -77,6 +77,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, @@ -104,10 +106,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), }; @@ -149,7 +152,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), }; @@ -190,6 +193,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; }; @@ -235,6 +239,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; @@ -246,13 +257,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; @@ -304,6 +321,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", @@ -324,6 +342,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