|
@@ -24,7 +24,7 @@
|
|
|
* Traits of this clock:
|
|
|
* prepare - clk_prepare only ensures that parents are prepared
|
|
|
* enable - clk_enable only ensures that parents are enabled
|
|
|
- * rate - rate is adjustable. clk->rate = DIV_ROUND_UP(parent->rate / divisor)
|
|
|
+ * rate - rate is adjustable. clk->rate = ceiling(parent->rate / divisor)
|
|
|
* parent - fixed parent. No clk_set_parent support
|
|
|
*/
|
|
|
|
|
@@ -132,7 +132,7 @@ unsigned long divider_recalc_rate(struct clk_hw *hw, unsigned long parent_rate,
|
|
|
return parent_rate;
|
|
|
}
|
|
|
|
|
|
- return DIV_ROUND_UP(parent_rate, div);
|
|
|
+ return DIV_ROUND_UP_ULL((u64)parent_rate, div);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(divider_recalc_rate);
|
|
|
|
|
@@ -210,7 +210,7 @@ static int _div_round_up(const struct clk_div_table *table,
|
|
|
unsigned long parent_rate, unsigned long rate,
|
|
|
unsigned long flags)
|
|
|
{
|
|
|
- int div = DIV_ROUND_UP(parent_rate, rate);
|
|
|
+ int div = DIV_ROUND_UP_ULL((u64)parent_rate, rate);
|
|
|
|
|
|
if (flags & CLK_DIVIDER_POWER_OF_TWO)
|
|
|
div = __roundup_pow_of_two(div);
|
|
@@ -227,7 +227,7 @@ static int _div_round_closest(const struct clk_div_table *table,
|
|
|
int up, down;
|
|
|
unsigned long up_rate, down_rate;
|
|
|
|
|
|
- up = DIV_ROUND_UP(parent_rate, rate);
|
|
|
+ up = DIV_ROUND_UP_ULL((u64)parent_rate, rate);
|
|
|
down = parent_rate / rate;
|
|
|
|
|
|
if (flags & CLK_DIVIDER_POWER_OF_TWO) {
|
|
@@ -238,8 +238,8 @@ static int _div_round_closest(const struct clk_div_table *table,
|
|
|
down = _round_down_table(table, down);
|
|
|
}
|
|
|
|
|
|
- up_rate = DIV_ROUND_UP(parent_rate, up);
|
|
|
- down_rate = DIV_ROUND_UP(parent_rate, down);
|
|
|
+ up_rate = DIV_ROUND_UP_ULL((u64)parent_rate, up);
|
|
|
+ down_rate = DIV_ROUND_UP_ULL((u64)parent_rate, down);
|
|
|
|
|
|
return (rate - up_rate) <= (down_rate - rate) ? up : down;
|
|
|
}
|
|
@@ -318,7 +318,7 @@ static int clk_divider_bestdiv(struct clk_hw *hw, unsigned long rate,
|
|
|
}
|
|
|
parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw),
|
|
|
rate * i);
|
|
|
- now = DIV_ROUND_UP(parent_rate, i);
|
|
|
+ now = DIV_ROUND_UP_ULL((u64)parent_rate, i);
|
|
|
if (_is_best_div(rate, now, best, flags)) {
|
|
|
bestdiv = i;
|
|
|
best = now;
|
|
@@ -342,7 +342,7 @@ long divider_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
|
|
|
|
div = clk_divider_bestdiv(hw, rate, prate, table, width, flags);
|
|
|
|
|
|
- return DIV_ROUND_UP(*prate, div);
|
|
|
+ return DIV_ROUND_UP_ULL((u64)*prate, div);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(divider_round_rate);
|
|
|
|
|
@@ -358,7 +358,7 @@ static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
|
bestdiv &= div_mask(divider->width);
|
|
|
bestdiv = _get_div(divider->table, bestdiv, divider->flags,
|
|
|
divider->width);
|
|
|
- return DIV_ROUND_UP(*prate, bestdiv);
|
|
|
+ return DIV_ROUND_UP_ULL((u64)*prate, bestdiv);
|
|
|
}
|
|
|
|
|
|
return divider_round_rate(hw, rate, prate, divider->table,
|
|
@@ -371,7 +371,7 @@ int divider_get_val(unsigned long rate, unsigned long parent_rate,
|
|
|
{
|
|
|
unsigned int div, value;
|
|
|
|
|
|
- div = DIV_ROUND_UP(parent_rate, rate);
|
|
|
+ div = DIV_ROUND_UP_ULL((u64)parent_rate, rate);
|
|
|
|
|
|
if (!_is_valid_div(table, div, flags))
|
|
|
return -EINVAL;
|