1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2012 ST Microelectronics
4 * Viresh Kumar <vireshk@kernel.org>
5 *
6 * SPEAr clk - Common routines
7 */
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