static int sun4i_tmds_determine_rate(struct clk_hw *hw,
                                     struct clk_rate_request *req)
 {
-       struct clk_hw *parent;
+       struct clk_hw *parent = NULL;
        unsigned long best_parent = 0;
        unsigned long rate = req->rate;
        int best_div = 1, best_half = 1;
-       int i, j;
+       int i, j, p;
 
        /*
         * We only consider PLL3, since the TCON is very likely to be
         * clock, so we should not need to do anything.
         */
 
-       parent = clk_hw_get_parent_by_index(hw, 0);
-       if (!parent)
-               return -EINVAL;
-
-       for (i = 1; i < 3; i++) {
-               for (j = 1; j < 16; j++) {
-                       unsigned long ideal = rate * i * j;
-                       unsigned long rounded;
-
-                       rounded = clk_hw_round_rate(parent, ideal);
-
-                       if (rounded == ideal) {
-                               best_parent = rounded;
-                               best_half = i;
-                               best_div = j;
-                               goto out;
-                       }
-
-                       if (abs(rate - rounded / i) <
-                           abs(rate - best_parent / best_div)) {
-                               best_parent = rounded;
-                               best_div = i;
+       for (p = 0; p < clk_hw_get_num_parents(hw); p++) {
+               parent = clk_hw_get_parent_by_index(hw, p);
+               if (!parent)
+                       continue;
+
+               for (i = 1; i < 3; i++) {
+                       for (j = 1; j < 16; j++) {
+                               unsigned long ideal = rate * i * j;
+                               unsigned long rounded;
+
+                               rounded = clk_hw_round_rate(parent, ideal);
+
+                               if (rounded == ideal) {
+                                       best_parent = rounded;
+                                       best_half = i;
+                                       best_div = j;
+                                       goto out;
+                               }
+
+                               if (abs(rate - rounded / i) <
+                                   abs(rate - best_parent / best_div)) {
+                                       best_parent = rounded;
+                                       best_div = i;
+                               }
                        }
                }
        }
 
+       if (!parent)
+               return -EINVAL;
+
 out:
        req->rate = best_parent / best_half / best_div;
        req->best_parent_rate = best_parent;