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@...>
drivers/clk/rockchip/clk-pll.c | 91 ++++++++++++++++++++++++++++--------------
1 file changed, 61 insertions(+), 30 deletions(-)
@@ -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 = {