static int clk_rcg2_dp_determine_rate(struct clk_hw *hw,
                                struct clk_rate_request *req)
 {
-       struct clk_rate_request parent_req = *req;
-       int ret;
+       struct clk_rcg2 *rcg = to_clk_rcg2(hw);
+       unsigned long num, den;
+       u64 tmp;
 
-       ret = __clk_determine_rate(clk_hw_get_parent(hw), &parent_req);
-       if (ret)
-               return ret;
+       /* Parent rate is a fixed phy link rate */
+       rational_best_approximation(req->best_parent_rate, req->rate,
+                       GENMASK(rcg->mnd_width - 1, 0),
+                       GENMASK(rcg->mnd_width - 1, 0), &den, &num);
+
+       if (!num || !den)
+               return -EINVAL;
 
-       req->best_parent_rate = parent_req.rate;
+       tmp = req->best_parent_rate * num;
+       do_div(tmp, den);
+       req->rate = tmp;
 
        return 0;
 }
 
                .name = "disp_cc_mdss_dp_crypto_clk_src",
                .parent_data = disp_cc_parent_data_1,
                .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
-               .flags = CLK_SET_RATE_PARENT,
                .ops = &clk_byte2_ops,
        },
 };
                .name = "disp_cc_mdss_dp_link_clk_src",
                .parent_data = disp_cc_parent_data_1,
                .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
-               .flags = CLK_SET_RATE_PARENT,
                .ops = &clk_byte2_ops,
        },
 };
                .name = "disp_cc_mdss_dp_pixel_clk_src",
                .parent_data = disp_cc_parent_data_1,
                .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
-               .flags = CLK_SET_RATE_PARENT,
                .ops = &clk_dp_ops,
        },
 };