1 From 2beaa601c849e72683a2dd0fe6fd77763f19f051 Mon Sep 17 00:00:00 2001
2 From: Maxime Ripard <maxime.ripard@free-electrons.com>
3 Date: Fri, 30 Sep 2016 22:16:51 +0200
4 Subject: clk: sunxi-ng: Implement minimum for multipliers
6 Allow the CCU drivers to specify a multiplier for their clocks.
8 Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
9 Acked-by: Chen-Yu Tsai <wens@csie.org>
11 drivers/clk/sunxi-ng/ccu_mult.c | 2 +-
12 drivers/clk/sunxi-ng/ccu_mult.h | 13 +++++++++----
13 drivers/clk/sunxi-ng/ccu_nk.c | 8 ++++----
14 drivers/clk/sunxi-ng/ccu_nkm.c | 8 ++++----
15 drivers/clk/sunxi-ng/ccu_nkmp.c | 4 ++--
16 drivers/clk/sunxi-ng/ccu_nm.c | 2 +-
17 6 files changed, 21 insertions(+), 16 deletions(-)
19 --- a/drivers/clk/sunxi-ng/ccu_mult.c
20 +++ b/drivers/clk/sunxi-ng/ccu_mult.c
21 @@ -105,7 +105,7 @@ static int ccu_mult_set_rate(struct clk_
22 ccu_mux_helper_adjust_parent_for_prediv(&cm->common, &cm->mux, -1,
26 + _cm.min = cm->mult.min;
27 _cm.max = 1 << cm->mult.width;
28 ccu_mult_find_best(parent_rate, rate, &_cm);
30 --- a/drivers/clk/sunxi-ng/ccu_mult.h
31 +++ b/drivers/clk/sunxi-ng/ccu_mult.h
33 struct ccu_mult_internal {
39 -#define _SUNXI_CCU_MULT(_shift, _width) \
43 +#define _SUNXI_CCU_MULT_MIN(_shift, _width, _min) \
50 +#define _SUNXI_CCU_MULT(_shift, _width) \
51 + _SUNXI_CCU_MULT_MIN(_shift, _width, 1)
56 --- a/drivers/clk/sunxi-ng/ccu_nk.c
57 +++ b/drivers/clk/sunxi-ng/ccu_nk.c
58 @@ -97,9 +97,9 @@ static long ccu_nk_round_rate(struct clk
59 if (nk->common.features & CCU_FEATURE_FIXED_POSTDIV)
60 rate *= nk->fixed_post_div;
63 + _nk.min_n = nk->n.min;
64 _nk.max_n = 1 << nk->n.width;
66 + _nk.min_k = nk->k.min;
67 _nk.max_k = 1 << nk->k.width;
69 ccu_nk_find_best(*parent_rate, rate, &_nk);
70 @@ -122,9 +122,9 @@ static int ccu_nk_set_rate(struct clk_hw
71 if (nk->common.features & CCU_FEATURE_FIXED_POSTDIV)
72 rate = rate * nk->fixed_post_div;
75 + _nk.min_n = nk->n.min;
76 _nk.max_n = 1 << nk->n.width;
78 + _nk.min_k = nk->k.min;
79 _nk.max_k = 1 << nk->k.width;
81 ccu_nk_find_best(parent_rate, rate, &_nk);
82 --- a/drivers/clk/sunxi-ng/ccu_nkm.c
83 +++ b/drivers/clk/sunxi-ng/ccu_nkm.c
84 @@ -100,9 +100,9 @@ static unsigned long ccu_nkm_round_rate(
85 struct ccu_nkm *nkm = data;
89 + _nkm.min_n = nkm->n.min;
90 _nkm.max_n = 1 << nkm->n.width;
92 + _nkm.min_k = nkm->k.min;
93 _nkm.max_k = 1 << nkm->k.width;
95 _nkm.max_m = nkm->m.max ?: 1 << nkm->m.width;
96 @@ -129,9 +129,9 @@ static int ccu_nkm_set_rate(struct clk_h
101 + _nkm.min_n = nkm->n.min;
102 _nkm.max_n = 1 << nkm->n.width;
104 + _nkm.min_k = nkm->k.min;
105 _nkm.max_k = 1 << nkm->k.width;
107 _nkm.max_m = nkm->m.max ?: 1 << nkm->m.width;
108 --- a/drivers/clk/sunxi-ng/ccu_nkmp.c
109 +++ b/drivers/clk/sunxi-ng/ccu_nkmp.c
110 @@ -107,9 +107,9 @@ static long ccu_nkmp_round_rate(struct c
111 struct ccu_nkmp *nkmp = hw_to_ccu_nkmp(hw);
112 struct _ccu_nkmp _nkmp;
115 + _nkmp.min_n = nkmp->n.min;
116 _nkmp.max_n = 1 << nkmp->n.width;
118 + _nkmp.min_k = nkmp->k.min;
119 _nkmp.max_k = 1 << nkmp->k.width;
121 _nkmp.max_m = nkmp->m.max ?: 1 << nkmp->m.width;
122 --- a/drivers/clk/sunxi-ng/ccu_nm.c
123 +++ b/drivers/clk/sunxi-ng/ccu_nm.c
124 @@ -93,7 +93,7 @@ static long ccu_nm_round_rate(struct clk
125 struct ccu_nm *nm = hw_to_ccu_nm(hw);
129 + _nm.min_n = nm->n.min;
130 _nm.max_n = 1 << nm->n.width;
132 _nm.max_m = nm->m.max ?: 1 << nm->m.width;