| xj | b04a402 | 2021-11-25 15:01:52 +0800 | [diff] [blame^] | 1 | /* | 
|  | 2 | * Copyright (C) 2012 ST Microelectronics | 
|  | 3 | * Viresh Kumar <vireshk@kernel.org> | 
|  | 4 | * | 
|  | 5 | * This file is licensed under the terms of the GNU General Public | 
|  | 6 | * License version 2. This program is licensed "as is" without any | 
|  | 7 | * warranty of any kind, whether express or implied. | 
|  | 8 | * | 
|  | 9 | * SPEAr clk - Common routines | 
|  | 10 | */ | 
|  | 11 |  | 
|  | 12 | #include <linux/clk-provider.h> | 
|  | 13 | #include <linux/types.h> | 
|  | 14 | #include "clk.h" | 
|  | 15 |  | 
|  | 16 | long clk_round_rate_index(struct clk_hw *hw, unsigned long drate, | 
|  | 17 | unsigned long parent_rate, clk_calc_rate calc_rate, u8 rtbl_cnt, | 
|  | 18 | int *index) | 
|  | 19 | { | 
|  | 20 | unsigned long prev_rate, rate = 0; | 
|  | 21 |  | 
|  | 22 | for (*index = 0; *index < rtbl_cnt; (*index)++) { | 
|  | 23 | prev_rate = rate; | 
|  | 24 | rate = calc_rate(hw, parent_rate, *index); | 
|  | 25 | if (drate < rate) { | 
|  | 26 | /* previous clock was best */ | 
|  | 27 | if (*index) { | 
|  | 28 | rate = prev_rate; | 
|  | 29 | (*index)--; | 
|  | 30 | } | 
|  | 31 | break; | 
|  | 32 | } | 
|  | 33 | } | 
|  | 34 |  | 
|  | 35 | if ((*index) == rtbl_cnt) | 
|  | 36 | (*index)--; | 
|  | 37 |  | 
|  | 38 | return rate; | 
|  | 39 | } |