|
@@ -426,16 +426,16 @@ ingenic_clk_round_rate(struct clk_hw *hw, unsigned long req_rate,
|
|
|
struct ingenic_clk *ingenic_clk = to_ingenic_clk(hw);
|
|
struct ingenic_clk *ingenic_clk = to_ingenic_clk(hw);
|
|
|
struct ingenic_cgu *cgu = ingenic_clk->cgu;
|
|
struct ingenic_cgu *cgu = ingenic_clk->cgu;
|
|
|
const struct ingenic_cgu_clk_info *clk_info;
|
|
const struct ingenic_cgu_clk_info *clk_info;
|
|
|
- long rate = *parent_rate;
|
|
|
|
|
|
|
+ unsigned int div = 1;
|
|
|
|
|
|
|
|
clk_info = &cgu->clock_info[ingenic_clk->idx];
|
|
clk_info = &cgu->clock_info[ingenic_clk->idx];
|
|
|
|
|
|
|
|
if (clk_info->type & CGU_CLK_DIV)
|
|
if (clk_info->type & CGU_CLK_DIV)
|
|
|
- rate /= ingenic_clk_calc_div(clk_info, *parent_rate, req_rate);
|
|
|
|
|
|
|
+ div = ingenic_clk_calc_div(clk_info, *parent_rate, req_rate);
|
|
|
else if (clk_info->type & CGU_CLK_FIXDIV)
|
|
else if (clk_info->type & CGU_CLK_FIXDIV)
|
|
|
- rate /= clk_info->fixdiv.div;
|
|
|
|
|
|
|
+ div = clk_info->fixdiv.div;
|
|
|
|
|
|
|
|
- return rate;
|
|
|
|
|
|
|
+ return DIV_ROUND_UP(*parent_rate, div);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
static int
|
|
@@ -455,7 +455,7 @@ ingenic_clk_set_rate(struct clk_hw *hw, unsigned long req_rate,
|
|
|
|
|
|
|
|
if (clk_info->type & CGU_CLK_DIV) {
|
|
if (clk_info->type & CGU_CLK_DIV) {
|
|
|
div = ingenic_clk_calc_div(clk_info, parent_rate, req_rate);
|
|
div = ingenic_clk_calc_div(clk_info, parent_rate, req_rate);
|
|
|
- rate = parent_rate / div;
|
|
|
|
|
|
|
+ rate = DIV_ROUND_UP(parent_rate, div);
|
|
|
|
|
|
|
|
if (rate != req_rate)
|
|
if (rate != req_rate)
|
|
|
return -EINVAL;
|
|
return -EINVAL;
|