Commit afa54fe7c23f729cc8c3e13b14715e53cd6464b4
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] " |