(gck->range.max && min_rate > gck->range.max))
                        continue;
 
-               for (div = 1; div < GENERATED_MAX_DIV + 2; div++) {
-                       tmp_rate = DIV_ROUND_CLOSEST(parent_rate, div);
-                       tmp_diff = abs(req->rate - tmp_rate);
-
-                       if (best_diff < 0 || best_diff > tmp_diff) {
-                               best_rate = tmp_rate;
-                               best_diff = tmp_diff;
-                               req->best_parent_rate = parent_rate;
-                               req->best_parent_hw = parent;
-                       }
-
-                       if (!best_diff || tmp_rate < req->rate)
-                               break;
+               div = DIV_ROUND_CLOSEST(parent_rate, req->rate);
+               if (!div)
+                       tmp_rate = parent_rate;
+               else
+                       tmp_rate = parent_rate / div;
+               tmp_diff = abs(req->rate - tmp_rate);
+
+               if (best_diff < 0 || best_diff > tmp_diff) {
+                       best_rate = tmp_rate;
+                       best_diff = tmp_diff;
+                       req->best_parent_rate = parent_rate;
+                       req->best_parent_hw = parent;
                }
 
                if (!best_diff)