return (unsigned long)rate;
 }
 
-static long si5351_pll_round_rate(struct clk_hw *hw, unsigned long rate,
-                                 unsigned long *parent_rate)
+static int si5351_pll_determine_rate(struct clk_hw *hw,
+                                    struct clk_rate_request *req)
 {
        struct si5351_hw_data *hwdata =
                container_of(hw, struct si5351_hw_data, hw);
+       unsigned long rate = req->rate;
        unsigned long rfrac, denom, a, b, c;
        unsigned long long lltmp;
 
                rate = SI5351_PLL_VCO_MAX;
 
        /* determine integer part of feedback equation */
-       a = rate / *parent_rate;
+       a = rate / req->best_parent_rate;
 
        if (a < SI5351_PLL_A_MIN)
-               rate = *parent_rate * SI5351_PLL_A_MIN;
+               rate = req->best_parent_rate * SI5351_PLL_A_MIN;
        if (a > SI5351_PLL_A_MAX)
-               rate = *parent_rate * SI5351_PLL_A_MAX;
+               rate = req->best_parent_rate * SI5351_PLL_A_MAX;
 
        /* find best approximation for b/c = fVCO mod fIN */
        denom = 1000 * 1000;
-       lltmp = rate % (*parent_rate);
+       lltmp = rate % (req->best_parent_rate);
        lltmp *= denom;
-       do_div(lltmp, *parent_rate);
+       do_div(lltmp, req->best_parent_rate);
        rfrac = (unsigned long)lltmp;
 
        b = 0;
        hwdata->params.p1 -= 512;
 
        /* recalculate rate by fIN * (a + b/c) */
-       lltmp  = *parent_rate;
+       lltmp  = req->best_parent_rate;
        lltmp *= b;
        do_div(lltmp, c);
 
        rate  = (unsigned long)lltmp;
-       rate += *parent_rate * a;
+       rate += req->best_parent_rate * a;
 
        dev_dbg(&hwdata->drvdata->client->dev,
                "%s - %s: a = %lu, b = %lu, c = %lu, parent_rate = %lu, rate = %lu\n",
                __func__, clk_hw_get_name(hw), a, b, c,
-               *parent_rate, rate);
+               req->best_parent_rate, rate);
 
-       return rate;
+       req->rate = rate;
+       return 0;
 }
 
 static int si5351_pll_set_rate(struct clk_hw *hw, unsigned long rate,
        .set_parent = si5351_pll_set_parent,
        .get_parent = si5351_pll_get_parent,
        .recalc_rate = si5351_pll_recalc_rate,
-       .round_rate = si5351_pll_round_rate,
+       .determine_rate = si5351_pll_determine_rate,
        .set_rate = si5351_pll_set_rate,
 };