diff --git a/arch/arm/mach-mxs/clock-mx28.c b/arch/arm/mach-mxs/clock-mx28.c
index 5d68e41..a058b99 100644
--- a/arch/arm/mach-mxs/clock-mx28.c
+++ b/arch/arm/mach-mxs/clock-mx28.c
@@ -354,19 +354,15 @@ static int name##_set_rate(struct clk *clk, unsigned long rate)		\
 		}							\
 		for (d = 1; d <= div_max; d++) {			\
 			f = parent_rate * 18 / d / rate;		\
-			if ((parent_rate * 18 / d) % rate)		\
-				f++;					\
 			if (f < 18 || f > 35)				\
 				continue;				\
 									\
 			calc_rate = parent_rate * 18 / f / d;		\
-			if (calc_rate > rate)				\
-				continue;				\
 									\
-			if (rate - calc_rate < diff) {			\
+			if (abs(rate - calc_rate) < diff) {		\
 				frac = f;				\
 				div = d;				\
-				diff = rate - calc_rate;		\
+				diff = abs(rate - calc_rate);		\
 			}						\
 									\
 			if (diff == 0)					\
