tegra: clk: correct divider algo
Negative divider_ux1 values previously were resolved by extra checks and caused undefined behavior with div1_5_not_allowed
This commit is contained in:
@@ -12,11 +12,11 @@
|
|||||||
int div_frac_get(unsigned long rate, unsigned parent_rate, u8 width,
|
int div_frac_get(unsigned long rate, unsigned parent_rate, u8 width,
|
||||||
u8 frac_width, u8 flags)
|
u8 frac_width, u8 flags)
|
||||||
{
|
{
|
||||||
u64 divider_ux1 = parent_rate;
|
s64 divider_ux1 = parent_rate;
|
||||||
int mul;
|
int mul;
|
||||||
|
|
||||||
if (!rate)
|
if (!rate)
|
||||||
return 0;
|
return div_mask(width);
|
||||||
|
|
||||||
mul = 1 << frac_width;
|
mul = 1 << frac_width;
|
||||||
|
|
||||||
@@ -31,9 +31,6 @@ int div_frac_get(unsigned long rate, unsigned parent_rate, u8 width,
|
|||||||
if (flags & TEGRA_DIVIDER_INT)
|
if (flags & TEGRA_DIVIDER_INT)
|
||||||
divider_ux1 *= mul;
|
divider_ux1 *= mul;
|
||||||
|
|
||||||
if (!div1_5_not_allowed && divider_ux1 < mul)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
divider_ux1 -= mul;
|
divider_ux1 -= mul;
|
||||||
|
|
||||||
if (divider_ux1 > div_mask(width))
|
if (divider_ux1 > div_mask(width))
|
||||||
|
|||||||
Reference in New Issue
Block a user