Commit 86e4404a authored by Boris Brezillon's avatar Boris Brezillon

clk: at91: fix PERIPHERAL_MAX_SHIFT definition

Fix the PERIPHERAL_MAX_SHIFT definition (3 instead of 4) and adapt the
round_rate and set_rate logic accordingly.
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
Reported-by: default avatar"Wu, Songjun" <Songjun.Wu@atmel.com>
parent 6c7b03e1
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#define PERIPHERAL_RSHIFT_MASK 0x3 #define PERIPHERAL_RSHIFT_MASK 0x3
#define PERIPHERAL_RSHIFT(val) (((val) >> 16) & PERIPHERAL_RSHIFT_MASK) #define PERIPHERAL_RSHIFT(val) (((val) >> 16) & PERIPHERAL_RSHIFT_MASK)
#define PERIPHERAL_MAX_SHIFT 4 #define PERIPHERAL_MAX_SHIFT 3
struct clk_peripheral { struct clk_peripheral {
struct clk_hw hw; struct clk_hw hw;
...@@ -242,7 +242,7 @@ static long clk_sam9x5_peripheral_round_rate(struct clk_hw *hw, ...@@ -242,7 +242,7 @@ static long clk_sam9x5_peripheral_round_rate(struct clk_hw *hw,
return *parent_rate; return *parent_rate;
if (periph->range.max) { if (periph->range.max) {
for (; shift < PERIPHERAL_MAX_SHIFT; shift++) { for (; shift <= PERIPHERAL_MAX_SHIFT; shift++) {
cur_rate = *parent_rate >> shift; cur_rate = *parent_rate >> shift;
if (cur_rate <= periph->range.max) if (cur_rate <= periph->range.max)
break; break;
...@@ -254,7 +254,7 @@ static long clk_sam9x5_peripheral_round_rate(struct clk_hw *hw, ...@@ -254,7 +254,7 @@ static long clk_sam9x5_peripheral_round_rate(struct clk_hw *hw,
best_diff = cur_rate - rate; best_diff = cur_rate - rate;
best_rate = cur_rate; best_rate = cur_rate;
for (; shift < PERIPHERAL_MAX_SHIFT; shift++) { for (; shift <= PERIPHERAL_MAX_SHIFT; shift++) {
cur_rate = *parent_rate >> shift; cur_rate = *parent_rate >> shift;
if (cur_rate < rate) if (cur_rate < rate)
cur_diff = rate - cur_rate; cur_diff = rate - cur_rate;
...@@ -289,7 +289,7 @@ static int clk_sam9x5_peripheral_set_rate(struct clk_hw *hw, ...@@ -289,7 +289,7 @@ static int clk_sam9x5_peripheral_set_rate(struct clk_hw *hw,
if (periph->range.max && rate > periph->range.max) if (periph->range.max && rate > periph->range.max)
return -EINVAL; return -EINVAL;
for (shift = 0; shift < PERIPHERAL_MAX_SHIFT; shift++) { for (shift = 0; shift <= PERIPHERAL_MAX_SHIFT; shift++) {
if (parent_rate >> shift == rate) { if (parent_rate >> shift == rate) {
periph->auto_div = false; periph->auto_div = false;
periph->div = shift; periph->div = shift;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment