linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Maxime Ripard <maxime.ripard@free-electrons.com>
To: Chen-Yu Tsai <wens@csie.org>,
	Maxime Ripard <maxime.ripard@free-electrons.com>,
	Mike Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@codeaurora.org>
Cc: Daniel Vetter <daniel.vetter@intel.com>,
	David Airlie <airlied@linux.ie>,
	dri-devel@lists.freedesktop.org, linux-clk@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Subject: [PATCH v3 07/21] clk: sunxi-ng: mux: Re-adjust parent rate
Date: Wed, 17 May 2017 09:40:36 +0200	[thread overview]
Message-ID: <d7558de4acfd568ea9f3d185c9530c9b0c311bbc.1495006350.git-series.maxime.ripard@free-electrons.com> (raw)
In-Reply-To: <cover.463df61c38224ecbfb5bf1cf192deeb63718b693.1495006350.git-series.maxime.ripard@free-electrons.com>
In-Reply-To: <cover.463df61c38224ecbfb5bf1cf192deeb63718b693.1495006350.git-series.maxime.ripard@free-electrons.com>

Currently, the parent rate given back to the clock framework in our
request is the original parent rate we calculated before trying to round
the rate of our clock.

This works fine unless our clock also changes its parent rate, in which
case we will simply ignore that change and still use the previous parent
rate.

Create a new function to re-adjust the parent rate to take the pre-dividers
into account, and give that back to the clock framework.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Acked-by: Chen-Yu Tsai <wens@csie.org>
---
 drivers/clk/sunxi-ng/ccu_mux.c | 33 ++++++++++++++++++++++++++++-----
 1 file changed, 28 insertions(+), 5 deletions(-)

diff --git a/drivers/clk/sunxi-ng/ccu_mux.c b/drivers/clk/sunxi-ng/ccu_mux.c
index c33210972581..748b172f9193 100644
--- a/drivers/clk/sunxi-ng/ccu_mux.c
+++ b/drivers/clk/sunxi-ng/ccu_mux.c
@@ -64,6 +64,14 @@ unsigned long ccu_mux_helper_apply_prediv(struct ccu_common *common,
 	return parent_rate / ccu_mux_get_prediv(common, cm, parent_index);
 }
 
+unsigned long ccu_mux_helper_unapply_prediv(struct ccu_common *common,
+					    struct ccu_mux_internal *cm,
+					    int parent_index,
+					    unsigned long parent_rate)
+{
+	return parent_rate * ccu_mux_get_prediv(common, cm, parent_index);
+}
+
 int ccu_mux_helper_determine_rate(struct ccu_common *common,
 				  struct ccu_mux_internal *cm,
 				  struct clk_rate_request *req,
@@ -89,22 +97,37 @@ int ccu_mux_helper_determine_rate(struct ccu_common *common,
 		best_rate = round(cm, best_parent, &adj_parent_rate,
 				  req->rate, data);
 
+		/*
+		 * adj_parent_rate might have been modified by our clock.
+		 * Unapply the pre-divider if there's one, and give
+		 * the actual frequency the parent needs to run at.
+		 */
+		best_parent_rate = ccu_mux_helper_unapply_prediv(common, cm, -1,
+								 adj_parent_rate);
+
 		goto out;
 	}
 
 	for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
-		unsigned long tmp_rate, parent_rate, adj_parent_rate;
+		unsigned long tmp_rate, parent_rate;
 		struct clk_hw *parent;
 
 		parent = clk_hw_get_parent_by_index(hw, i);
 		if (!parent)
 			continue;
 
-		parent_rate = clk_hw_get_rate(parent);
-		adj_parent_rate = ccu_mux_helper_apply_prediv(common, cm, i,
-							      parent_rate);
+		parent_rate = ccu_mux_helper_apply_prediv(common, cm, i,
+							  clk_hw_get_rate(parent));
+
+		tmp_rate = round(cm, parent, &parent_rate, req->rate, data);
 
-		tmp_rate = round(cm, parent, &adj_parent_rate, req->rate, data);
+		/*
+		 * parent_rate might have been modified by our clock.
+		 * Unapply the pre-divider if there's one, and give
+		 * the actual frequency the parent needs to run at.
+		 */
+		parent_rate = ccu_mux_helper_unapply_prediv(common, cm, i,
+							    parent_rate);
 		if (tmp_rate == req->rate) {
 			best_parent = parent;
 			best_parent_rate = parent_rate;
-- 
git-series 0.9.1

  parent reply	other threads:[~2017-05-17  7:45 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-17  7:40 [PATCH v3 00/21] drm: sun4i: Add support for the HDMI controller Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 01/21] clk: divider: Make divider_round_rate take the parent clock Maxime Ripard
2017-05-19  1:54   ` Stephen Boyd
2017-05-17  7:40 ` [PATCH v3 02/21] clk: sunxi-ng: Pass the parent and a pointer to the clocks round rate Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 03/21] clk: sunxi-ng: div: Switch to divider_round_rate Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 04/21] clk: sunxi-ng: mux: Don't just rely on the parent for CLK_SET_RATE_PARENT Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 05/21] clk: sunxi-ng: mux: split out the pre-divider computation code Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 06/21] clk: sunxi-ng: mux: Change pre-divider application function prototype Maxime Ripard
2017-05-17  7:40 ` Maxime Ripard [this message]
2017-05-17  7:40 ` [PATCH v3 08/21] clk: sunxi-ng: sun5i: Export video PLLs Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 09/21] drm/sun4i: tcon: Add channel debug Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 10/21] drm/sun4i: tcon: Move the muxing out of the mode set function Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 11/21] drm/sun4i: tcon: Switch mux on only for composite Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 12/21] drm/sun4i: tcon: Fix tcon channel 1 backporch calculation Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 13/21] drm/sun4i: tcon: Change vertical total size computation inconsistency Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 14/21] drm/sun4i: tcon: multiply the vtotal when not in interlace Maxime Ripard
2017-05-17  9:50   ` Chen-Yu Tsai
2017-05-18  7:51     ` Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 15/21] drm/sun4i: Ignore the generic connectors for components Maxime Ripard
2017-05-17  9:00   ` Chen-Yu Tsai
2017-05-17  7:40 ` [PATCH v3 16/21] dt-bindings: display: sun4i: Add HDMI display bindings Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 17/21] dt-bindings: display: sun4i: Add allwinner,tcon-channel property Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 18/21] drm/sun4i: Add HDMI support Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 19/21] drm/sun4i: Add compatible for the A10s pipeline Maxime Ripard
2017-05-17  9:00   ` Chen-Yu Tsai
2017-05-23  0:33   ` Rob Herring
2017-05-17  7:40 ` [PATCH v3 20/21] ARM: sun5i: a10s: Add the HDMI controller node Maxime Ripard
2017-05-17  7:40 ` [PATCH v3 21/21] ARM: sun5i: a10s-olinuxino: Enable HDMI Maxime Ripard
2017-05-19  7:34 ` [PATCH v3 00/21] drm: sun4i: Add support for the HDMI controller Chen-Yu Tsai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d7558de4acfd568ea9f3d185c9530c9b0c311bbc.1495006350.git-series.maxime.ripard@free-electrons.com \
    --to=maxime.ripard@free-electrons.com \
    --cc=airlied@linux.ie \
    --cc=daniel.vetter@intel.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mturquette@baylibre.com \
    --cc=sboyd@codeaurora.org \
    --cc=thomas.petazzoni@free-electrons.com \
    --cc=wens@csie.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).