37 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (C) 2012 ST Microelectronics4 * Viresh Kumar <vireshk@kernel.org>5 *6 * SPEAr clk - Common routines7 */8 9#include <linux/clk-provider.h>10#include <linux/types.h>11#include "clk.h"12 13long clk_round_rate_index(struct clk_hw *hw, unsigned long drate,14 unsigned long parent_rate, clk_calc_rate calc_rate, u8 rtbl_cnt,15 int *index)16{17 unsigned long prev_rate, rate = 0;18 19 for (*index = 0; *index < rtbl_cnt; (*index)++) {20 prev_rate = rate;21 rate = calc_rate(hw, parent_rate, *index);22 if (drate < rate) {23 /* previous clock was best */24 if (*index) {25 rate = prev_rate;26 (*index)--;27 }28 break;29 }30 }31 32 if ((*index) == rtbl_cnt)33 (*index)--;34 35 return rate;36}37