From: Heiko Stuebner <heiko@sntech.de>
To: mturquette@baylibre.com, sboyd@codeaurora.org
Cc: linux-clk@vger.kernel.org, linux-rockchip@lists.infradead.org,
Heiko Stuebner <heiko@sntech.de>
Subject: [PATCH 6/7] clk: rockchip: move pll rate-comparison into a callable function
Date: Thu, 28 Apr 2016 15:11:14 +0200 [thread overview]
Message-ID: <1461849075-8310-7-git-send-email-heiko@sntech.de> (raw)
In-Reply-To: <1461849075-8310-1-git-send-email-heiko@sntech.de>
The init callback in our pll clk_ops allows us to re-set the same rate
of a pll with different parameters if these became updated with more
suitable values over time.
The init mechanism is similar over all pll types with the exception of
the comparison of old and new parameters. So move these out to callbable
functions to allow us to fold the generic init-handling into one.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
---
drivers/clk/rockchip/clk-pll.c | 91 ++++++++++++++++++++++++++++--------------
1 file changed, 61 insertions(+), 30 deletions(-)
diff --git a/drivers/clk/rockchip/clk-pll.c b/drivers/clk/rockchip/clk-pll.c
index 081713c..5bd0545 100644
--- a/drivers/clk/rockchip/clk-pll.c
+++ b/drivers/clk/rockchip/clk-pll.c
@@ -36,6 +36,9 @@ struct rockchip_pll_data {
struct rockchip_pll_rate_table *rate);
int (*set_params)(struct rockchip_clk_pll *pll,
const struct rockchip_pll_rate_table *rate);
+ int (*compare_params)(struct rockchip_clk_pll *pll,
+ const struct rockchip_pll_rate_table *rate,
+ const struct rockchip_pll_rate_table *cur);
};
struct rockchip_clk_pll {
@@ -271,6 +274,25 @@ static int rockchip_rk3036_pll_set_params(struct rockchip_clk_pll *pll,
return ret;
}
+static int rockchip_rk3036_pll_compare_params(struct rockchip_clk_pll *pll,
+ const struct rockchip_pll_rate_table *rate,
+ const struct rockchip_pll_rate_table *cur)
+{
+ const struct clk_hw *hw = &pll->hw;
+
+ pr_debug("%s: pll %s\n", __func__, clk_hw_get_name(hw));
+ pr_debug("old - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n",
+ cur->fbdiv, cur->postdiv1, cur->refdiv, cur->postdiv2,
+ cur->dsmpd, cur->frac);
+ pr_debug("new - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n",
+ rate->fbdiv, rate->postdiv1, rate->refdiv, rate->postdiv2,
+ rate->dsmpd, rate->frac);
+
+ return (rate->fbdiv == cur->fbdiv && rate->postdiv1 == cur->postdiv1 &&
+ rate->refdiv == cur->refdiv && rate->postdiv2 == cur->postdiv2 &&
+ rate->dsmpd == cur->dsmpd && rate->frac == cur->frac);
+}
+
static int rockchip_rk3036_pll_enable(struct clk_hw *hw)
{
struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw);
@@ -316,19 +338,7 @@ static void rockchip_rk3036_pll_init(struct clk_hw *hw)
return;
pll->data->get_params(pll, &cur);
-
- pr_debug("%s: pll %s@%lu: Hz\n", __func__, __clk_get_name(hw->clk),
- drate);
- pr_debug("old - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n",
- cur.fbdiv, cur.postdiv1, cur.refdiv, cur.postdiv2,
- cur.dsmpd, cur.frac);
- pr_debug("new - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n",
- rate->fbdiv, rate->postdiv1, rate->refdiv, rate->postdiv2,
- rate->dsmpd, rate->frac);
-
- if (rate->fbdiv != cur.fbdiv || rate->postdiv1 != cur.postdiv1 ||
- rate->refdiv != cur.refdiv || rate->postdiv2 != cur.postdiv2 ||
- rate->dsmpd != cur.dsmpd || rate->frac != cur.frac) {
+ if (!pll->data->compare_params(pll, rate, &cur)) {
struct clk *parent = clk_get_parent(hw->clk);
if (!parent) {
@@ -346,6 +356,7 @@ static void rockchip_rk3036_pll_init(struct clk_hw *hw)
static const struct rockchip_pll_data rockchip_rk3036_pll_data = {
.get_params = rockchip_rk3036_pll_get_params,
.set_params = rockchip_rk3036_pll_set_params,
+ .compare_params = rockchip_rk3036_pll_compare_params,
};
static const struct clk_ops rockchip_rk3036_pll_clk_norate_ops = {
@@ -487,6 +498,20 @@ static int rockchip_rk3066_pll_set_params(struct rockchip_clk_pll *pll,
return ret;
}
+static int rockchip_rk3066_pll_compare_params(struct rockchip_clk_pll *pll,
+ const struct rockchip_pll_rate_table *rate,
+ const struct rockchip_pll_rate_table *cur)
+{
+ const struct clk_hw *hw = &pll->hw;
+
+ pr_debug("%s: pll %s: nr (%d:%d); no (%d:%d); nf(%d:%d), nb(%d:%d)\n",
+ __func__, clk_hw_get_name(hw), rate->nr, cur->nr,
+ rate->no, cur->no, rate->nf, cur->nf, rate->nb, cur->nb);
+
+ return (rate->nr == cur->nr && rate->no == cur->no &&
+ rate->nf == cur->nf && rate->nb == cur->nb);
+}
+
static int rockchip_rk3066_pll_enable(struct clk_hw *hw)
{
struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw);
@@ -533,11 +558,7 @@ static void rockchip_rk3066_pll_init(struct clk_hw *hw)
pll->data->get_params(pll, &cur);
- pr_debug("%s: pll %s@%lu: nr (%d:%d); no (%d:%d); nf(%d:%d), nb(%d:%d)\n",
- __func__, clk_hw_get_name(hw), drate, rate->nr, cur.nr,
- rate->no, cur.no, rate->nf, cur.nf, rate->nb, cur.nb);
- if (rate->nr != cur.nr || rate->no != cur.no || rate->nf != cur.nf
- || rate->nb != cur.nb) {
+ if (!pll->data->compare_params(pll, rate, &cur)) {
pr_debug("%s: pll %s: rate params do not match rate table, adjusting\n",
__func__, clk_hw_get_name(hw));
pll->data->set_params(pll, rate);
@@ -547,6 +568,7 @@ static void rockchip_rk3066_pll_init(struct clk_hw *hw)
static const struct rockchip_pll_data rockchip_rk3066_pll_data = {
.get_params = rockchip_rk3066_pll_get_params,
.set_params = rockchip_rk3066_pll_set_params,
+ .compare_params = rockchip_rk3066_pll_compare_params,
};
static const struct clk_ops rockchip_rk3066_pll_clk_norate_ops = {
@@ -717,6 +739,25 @@ static int rockchip_rk3399_pll_set_params(struct rockchip_clk_pll *pll,
return ret;
}
+static int rockchip_rk3399_pll_compare_params(struct rockchip_clk_pll *pll,
+ const struct rockchip_pll_rate_table *rate,
+ const struct rockchip_pll_rate_table *cur)
+{
+ const struct clk_hw *hw = &pll->hw;
+
+ pr_debug("%s: pll %s: Hz\n", __func__, __clk_get_name(hw->clk));
+ pr_debug("old - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n",
+ cur->fbdiv, cur->postdiv1, cur->refdiv, cur->postdiv2,
+ cur->dsmpd, cur->frac);
+ pr_debug("new - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n",
+ rate->fbdiv, rate->postdiv1, rate->refdiv, rate->postdiv2,
+ rate->dsmpd, rate->frac);
+
+ return (rate->fbdiv == cur->fbdiv && rate->postdiv1 == cur->postdiv1 &&
+ rate->refdiv == cur->refdiv && rate->postdiv2 == cur->postdiv2 &&
+ rate->dsmpd == cur->dsmpd && rate->frac == cur->frac);
+}
+
static int rockchip_rk3399_pll_enable(struct clk_hw *hw)
{
struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw);
@@ -763,18 +804,7 @@ static void rockchip_rk3399_pll_init(struct clk_hw *hw)
pll->data->get_params(pll, &cur);
- pr_debug("%s: pll %s@%lu: Hz\n", __func__, __clk_get_name(hw->clk),
- drate);
- pr_debug("old - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n",
- cur.fbdiv, cur.postdiv1, cur.refdiv, cur.postdiv2,
- cur.dsmpd, cur.frac);
- pr_debug("new - fbdiv: %d, postdiv1: %d, refdiv: %d, postdiv2: %d, dsmpd: %d, frac: %d\n",
- rate->fbdiv, rate->postdiv1, rate->refdiv, rate->postdiv2,
- rate->dsmpd, rate->frac);
-
- if (rate->fbdiv != cur.fbdiv || rate->postdiv1 != cur.postdiv1 ||
- rate->refdiv != cur.refdiv || rate->postdiv2 != cur.postdiv2 ||
- rate->dsmpd != cur.dsmpd || rate->frac != cur.frac) {
+ if (!pll->data->compare_params(pll, rate, &cur)) {
struct clk *parent = clk_get_parent(hw->clk);
if (!parent) {
@@ -792,6 +822,7 @@ static void rockchip_rk3399_pll_init(struct clk_hw *hw)
static const struct rockchip_pll_data rockchip_rk3399_pll_data = {
.get_params = rockchip_rk3399_pll_get_params,
.set_params = rockchip_rk3399_pll_set_params,
+ .compare_params = rockchip_rk3399_pll_compare_params,
};
static const struct clk_ops rockchip_rk3399_pll_clk_norate_ops = {
--
2.6.4
next prev parent reply other threads:[~2016-04-28 13:11 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-28 13:11 [PATCH 0/7] clk: rockchip: cleanup some code duplication Heiko Stuebner
2016-04-28 13:11 ` [PATCH 1/7] clk: rockchip: lookup General Register Files in rockchip_clk_init Heiko Stuebner
2016-04-28 13:11 ` [PATCH 2/7] clk: rockchip: simplify GRF handling in pll clocks Heiko Stuebner
2016-04-28 13:11 ` [PATCH 3/7] clk: rockchip: drop old_rate calculation on pll rate changes Heiko Stuebner
2016-04-28 13:11 ` [PATCH 4/7] clk: rockchip: abstract pll get-params and set-params operations Heiko Stuebner
2016-05-06 22:55 ` Stephen Boyd
2016-05-08 20:24 ` Heiko Stuebner
2016-05-09 23:03 ` Stephen Boyd
2016-04-28 13:11 ` [PATCH 5/7] clk: rockchip: generalize pll set-rate operation Heiko Stuebner
2016-04-28 13:11 ` Heiko Stuebner [this message]
2016-04-28 13:11 ` [PATCH 7/7] clk: rockchip: fold pll init functions into a common one Heiko Stuebner
2016-05-06 22:56 ` [PATCH 0/7] clk: rockchip: cleanup some code duplication Stephen Boyd
2016-05-09 14:28 ` Heiko Stuebner
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=1461849075-8310-7-git-send-email-heiko@sntech.de \
--to=heiko@sntech.de \
--cc=linux-clk@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=mturquette@baylibre.com \
--cc=sboyd@codeaurora.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