aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-06-19 13:36:50 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-06-19 13:36:50 -0400
commitbb16140a2cab5415ffcbb23594da9e495df1bab7 (patch)
treeec3cf77fb983d50c10da53c75ab03b9bc84a1ecd
parent9a10758c4475ea9576a62828b6097dcf79f6d3e2 (diff)
parent909aa10e6d6a9524f95dadb6b3ded1c38ec34e11 (diff)
Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
Pull clk fixes from Michael Turquette: "Very late clk regression fixes for the ARM-based AT91 platform. These went unnoticed by me until recently, hence the late pull request" * tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: clk: at91: fix h32mx prototype inclusion in pmc header clk: at91: trivial: typo in peripheral clock description clk: at91: fix PERIPHERAL_MAX_SHIFT definition clk: at91: pll: fix input range validity check
-rw-r--r--Documentation/devicetree/bindings/clock/at91-clock.txt2
-rw-r--r--drivers/clk/at91/clk-peripheral.c8
-rw-r--r--drivers/clk/at91/clk-pll.c12
-rw-r--r--drivers/clk/at91/pmc.h2
4 files changed, 16 insertions, 8 deletions
diff --git a/Documentation/devicetree/bindings/clock/at91-clock.txt b/Documentation/devicetree/bindings/clock/at91-clock.txt
index 7a4d4926f44e..5ba6450693b9 100644
--- a/Documentation/devicetree/bindings/clock/at91-clock.txt
+++ b/Documentation/devicetree/bindings/clock/at91-clock.txt
@@ -248,7 +248,7 @@ Required properties for peripheral clocks:
248- #address-cells : shall be 1 (reg is used to encode clk id). 248- #address-cells : shall be 1 (reg is used to encode clk id).
249- clocks : shall be the master clock phandle. 249- clocks : shall be the master clock phandle.
250 e.g. clocks = <&mck>; 250 e.g. clocks = <&mck>;
251- name: device tree node describing a specific system clock. 251- name: device tree node describing a specific peripheral clock.
252 * #clock-cells : from common clock binding; shall be set to 0. 252 * #clock-cells : from common clock binding; shall be set to 0.
253 * reg: peripheral id. See Atmel's datasheets to get a full 253 * reg: peripheral id. See Atmel's datasheets to get a full
254 list of peripheral ids. 254 list of peripheral ids.
diff --git a/drivers/clk/at91/clk-peripheral.c b/drivers/clk/at91/clk-peripheral.c
index 597fed423d7d..df2c1afa52b4 100644
--- a/drivers/clk/at91/clk-peripheral.c
+++ b/drivers/clk/at91/clk-peripheral.c
@@ -29,7 +29,7 @@
29#define PERIPHERAL_RSHIFT_MASK 0x3 29#define PERIPHERAL_RSHIFT_MASK 0x3
30#define PERIPHERAL_RSHIFT(val) (((val) >> 16) & PERIPHERAL_RSHIFT_MASK) 30#define PERIPHERAL_RSHIFT(val) (((val) >> 16) & PERIPHERAL_RSHIFT_MASK)
31 31
32#define PERIPHERAL_MAX_SHIFT 4 32#define PERIPHERAL_MAX_SHIFT 3
33 33
34struct clk_peripheral { 34struct clk_peripheral {
35 struct clk_hw hw; 35 struct clk_hw hw;
@@ -242,7 +242,7 @@ static long clk_sam9x5_peripheral_round_rate(struct clk_hw *hw,
242 return *parent_rate; 242 return *parent_rate;
243 243
244 if (periph->range.max) { 244 if (periph->range.max) {
245 for (; shift < PERIPHERAL_MAX_SHIFT; shift++) { 245 for (; shift <= PERIPHERAL_MAX_SHIFT; shift++) {
246 cur_rate = *parent_rate >> shift; 246 cur_rate = *parent_rate >> shift;
247 if (cur_rate <= periph->range.max) 247 if (cur_rate <= periph->range.max)
248 break; 248 break;
@@ -254,7 +254,7 @@ static long clk_sam9x5_peripheral_round_rate(struct clk_hw *hw,
254 254
255 best_diff = cur_rate - rate; 255 best_diff = cur_rate - rate;
256 best_rate = cur_rate; 256 best_rate = cur_rate;
257 for (; shift < PERIPHERAL_MAX_SHIFT; shift++) { 257 for (; shift <= PERIPHERAL_MAX_SHIFT; shift++) {
258 cur_rate = *parent_rate >> shift; 258 cur_rate = *parent_rate >> shift;
259 if (cur_rate < rate) 259 if (cur_rate < rate)
260 cur_diff = rate - cur_rate; 260 cur_diff = rate - cur_rate;
@@ -289,7 +289,7 @@ static int clk_sam9x5_peripheral_set_rate(struct clk_hw *hw,
289 if (periph->range.max && rate > periph->range.max) 289 if (periph->range.max && rate > periph->range.max)
290 return -EINVAL; 290 return -EINVAL;
291 291
292 for (shift = 0; shift < PERIPHERAL_MAX_SHIFT; shift++) { 292 for (shift = 0; shift <= PERIPHERAL_MAX_SHIFT; shift++) {
293 if (parent_rate >> shift == rate) { 293 if (parent_rate >> shift == rate) {
294 periph->auto_div = false; 294 periph->auto_div = false;
295 periph->div = shift; 295 periph->div = shift;
diff --git a/drivers/clk/at91/clk-pll.c b/drivers/clk/at91/clk-pll.c
index 6ec79dbc0840..cbbe40377ad6 100644
--- a/drivers/clk/at91/clk-pll.c
+++ b/drivers/clk/at91/clk-pll.c
@@ -173,8 +173,7 @@ static long clk_pll_get_best_div_mul(struct clk_pll *pll, unsigned long rate,
173 int i = 0; 173 int i = 0;
174 174
175 /* Check if parent_rate is a valid input rate */ 175 /* Check if parent_rate is a valid input rate */
176 if (parent_rate < characteristics->input.min || 176 if (parent_rate < characteristics->input.min)
177 parent_rate > characteristics->input.max)
178 return -ERANGE; 177 return -ERANGE;
179 178
180 /* 179 /*
@@ -187,6 +186,15 @@ static long clk_pll_get_best_div_mul(struct clk_pll *pll, unsigned long rate,
187 if (!mindiv) 186 if (!mindiv)
188 mindiv = 1; 187 mindiv = 1;
189 188
189 if (parent_rate > characteristics->input.max) {
190 tmpdiv = DIV_ROUND_UP(parent_rate, characteristics->input.max);
191 if (tmpdiv > PLL_DIV_MAX)
192 return -ERANGE;
193
194 if (tmpdiv > mindiv)
195 mindiv = tmpdiv;
196 }
197
190 /* 198 /*
191 * Calculate the maximum divider which is limited by PLL register 199 * Calculate the maximum divider which is limited by PLL register
192 * layout (limited by the MUL or DIV field size). 200 * layout (limited by the MUL or DIV field size).
diff --git a/drivers/clk/at91/pmc.h b/drivers/clk/at91/pmc.h
index 69abb08cf146..eb8e5dc9076d 100644
--- a/drivers/clk/at91/pmc.h
+++ b/drivers/clk/at91/pmc.h
@@ -121,7 +121,7 @@ extern void __init of_at91sam9x5_clk_smd_setup(struct device_node *np,
121 struct at91_pmc *pmc); 121 struct at91_pmc *pmc);
122#endif 122#endif
123 123
124#if defined(CONFIG_HAVE_AT91_SMD) 124#if defined(CONFIG_HAVE_AT91_H32MX)
125extern void __init of_sama5d4_clk_h32mx_setup(struct device_node *np, 125extern void __init of_sama5d4_clk_h32mx_setup(struct device_node *np,
126 struct at91_pmc *pmc); 126 struct at91_pmc *pmc);
127#endif 127#endif