return ds3231_clk_sqw_rates[rate_sel];
 }
 
-static long ds3231_clk_sqw_round_rate(struct clk_hw *hw, unsigned long rate,
-                                     unsigned long *prate)
+static int ds3231_clk_sqw_determine_rate(struct clk_hw *hw,
+                                        struct clk_rate_request *req)
 {
        int i;
 
        for (i = ARRAY_SIZE(ds3231_clk_sqw_rates) - 1; i >= 0; i--) {
-               if (ds3231_clk_sqw_rates[i] <= rate)
-                       return ds3231_clk_sqw_rates[i];
+               if (ds3231_clk_sqw_rates[i] <= req->rate) {
+                       req->rate = ds3231_clk_sqw_rates[i];
+
+                       return 0;
+               }
        }
 
-       return ds3231_clk_sqw_rates[ARRAY_SIZE(ds3231_clk_sqw_rates) - 1];
+       req->rate = ds3231_clk_sqw_rates[ARRAY_SIZE(ds3231_clk_sqw_rates) - 1];
+
+       return 0;
 }
 
 static int ds3231_clk_sqw_set_rate(struct clk_hw *hw, unsigned long rate,
        .unprepare = ds3231_clk_sqw_unprepare,
        .is_prepared = ds3231_clk_sqw_is_prepared,
        .recalc_rate = ds3231_clk_sqw_recalc_rate,
-       .round_rate = ds3231_clk_sqw_round_rate,
+       .determine_rate = ds3231_clk_sqw_determine_rate,
        .set_rate = ds3231_clk_sqw_set_rate,
 };