linux/drivers/clk/spear/clk.c
<<
>>
Prefs
   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
  16long 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}
  40