Commit afa54fe7c23f729cc8c3e13b14715e53cd6464b4

Authored by Rajendra Nayak
Committed by Afzal Mohammed
1 parent 54d8f4c298
Exists in master

OMAP: OPP: Do a round_rate before adding into OPP table

Most clock rates can vary to some extent based on the exact
 M/N values used to lock a dpll.
 Do a round_rate before updating the rates into the OPP table
 so that the 'exact' rates appear and a subsequent clk_set_rate
 works without issues.

 Signed-off-by: Rajendra Nayak <rnayak@ti.com>
 Signed-off-by: Nishanth Menon <nm@ti.com>
[vaibhav.bedia@ti.com: Pull in for AM33xx]
Signed-off-by: Vaibhav Bedia <vaibhav.bedia@ti.com>
Signed-off-by: Afzal Mohammed <afzal@ti.com>

Showing 1 changed file with 19 additions and 0 deletions Side-by-side Diff

arch/arm/mach-omap2/opp.c
... ... @@ -18,9 +18,11 @@
18 18 */
19 19 #include <linux/module.h>
20 20 #include <linux/opp.h>
  21 +#include <linux/clk.h>
21 22  
22 23 #include <plat/omap_device.h>
23 24 #include <plat/dvfs.h>
  25 +#include <plat/clock.h>
24 26  
25 27 #include "omap_opp_data.h"
26 28  
... ... @@ -39,6 +41,8 @@
39 41 u32 opp_def_size)
40 42 {
41 43 int i, r;
  44 + struct clk *clk;
  45 + long round_rate;
42 46  
43 47 if (!opp_def || !opp_def_size) {
44 48 pr_err("%s: invalid params!\n", __func__);
... ... @@ -72,6 +76,21 @@
72 76 }
73 77 dev = &oh->od->pdev->dev;
74 78  
  79 + clk = omap_clk_get_by_name(opp_def->clk_name);
  80 + if (clk) {
  81 + round_rate = clk_round_rate(clk, opp_def->freq);
  82 + if (round_rate > 0) {
  83 + opp_def->freq = round_rate;
  84 + } else {
  85 + WARN(1, "%s: round_rate for clock %s failed\n",
  86 + __func__, opp_def->clk_name);
  87 + goto next; /* skip Bad OPP */
  88 + }
  89 + } else {
  90 + WARN(1, "%s: No clock by name %s found\n", __func__,
  91 + opp_def->clk_name);
  92 + goto next; /* skip Bad OPP */
  93 + }
75 94 r = opp_add(dev, opp_def->freq, opp_def->u_volt);
76 95 if (r) {
77 96 dev_err(dev, "%s: add OPP %ld failed for %s [%d] "