|
@@ -234,6 +234,7 @@ static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
unsigned long max_rate = parent_rate * 54;
|
|
unsigned long max_rate = parent_rate * 54;
|
|
u32 div;
|
|
u32 div;
|
|
u32 mfn, mfd = 1000000;
|
|
u32 mfn, mfd = 1000000;
|
|
|
|
+ u32 max_mfd = 0x3FFFFFFF;
|
|
u64 temp64;
|
|
u64 temp64;
|
|
|
|
|
|
if (rate > max_rate)
|
|
if (rate > max_rate)
|
|
@@ -241,6 +242,9 @@ static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
else if (rate < min_rate)
|
|
else if (rate < min_rate)
|
|
rate = min_rate;
|
|
rate = min_rate;
|
|
|
|
|
|
|
|
+ if (parent_rate <= max_mfd)
|
|
|
|
+ mfd = parent_rate;
|
|
|
|
+
|
|
div = rate / parent_rate;
|
|
div = rate / parent_rate;
|
|
temp64 = (u64) (rate - div * parent_rate);
|
|
temp64 = (u64) (rate - div * parent_rate);
|
|
temp64 *= mfd;
|
|
temp64 *= mfd;
|
|
@@ -262,11 +266,15 @@ static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,
|
|
unsigned long max_rate = parent_rate * 54;
|
|
unsigned long max_rate = parent_rate * 54;
|
|
u32 val, div;
|
|
u32 val, div;
|
|
u32 mfn, mfd = 1000000;
|
|
u32 mfn, mfd = 1000000;
|
|
|
|
+ u32 max_mfd = 0x3FFFFFFF;
|
|
u64 temp64;
|
|
u64 temp64;
|
|
|
|
|
|
if (rate < min_rate || rate > max_rate)
|
|
if (rate < min_rate || rate > max_rate)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
+ if (parent_rate <= max_mfd)
|
|
|
|
+ mfd = parent_rate;
|
|
|
|
+
|
|
div = rate / parent_rate;
|
|
div = rate / parent_rate;
|
|
temp64 = (u64) (rate - div * parent_rate);
|
|
temp64 = (u64) (rate - div * parent_rate);
|
|
temp64 *= mfd;
|
|
temp64 *= mfd;
|