Index: head/sys/arm/allwinner/clkng/aw_clk_nm.c =================================================================== --- head/sys/arm/allwinner/clkng/aw_clk_nm.c +++ head/sys/arm/allwinner/clkng/aw_clk_nm.c @@ -153,7 +153,8 @@ for (m = min_m; m <= max_m; ) { for (n = min_n; n <= max_n; ) { cur = fparent / n / m; - if (abs(*fout - cur) < abs(*fout - best)) { + if (clk_freq_diff(*fout, cur) < + clk_freq_diff(*fout, best)) { best = cur; *factor_n = n; *factor_m = m; @@ -196,7 +197,8 @@ clknode_get_freq(p_clk, &fparent); cur = aw_clk_nm_find_best(sc, fparent, fout, &n, &m); - if (abs((*fout - cur)) < abs((*fout - best))) { + if (clk_freq_diff(*fout, cur) < + clk_freq_diff(*fout, best)) { best = cur; best_parent = p_idx; best_n = n; Index: head/sys/dev/extres/clk/clk.h =================================================================== --- head/sys/dev/extres/clk/clk.h +++ head/sys/dev/extres/clk/clk.h @@ -135,6 +135,12 @@ int clk_set_parent_by_clk(clk_t clk, clk_t parent); const char *clk_get_name(clk_t clk); +static inline uint64_t +clk_freq_diff(uint64_t x, uint64_t y) +{ + return (x >= y ? x - y : y - x); +} + #ifdef FDT int clk_set_assigned(device_t dev, phandle_t node); int clk_get_by_ofw_index(device_t dev, phandle_t node, int idx, clk_t *clk);