summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-03-13 10:15:30 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2014-03-28 21:03:15 +0100
commitb1cc0d7fc6728acbed7360b315593c3535ce7d75 (patch)
tree987efe1306f5657daac1a03d548dd32983cbf313 /drivers
parentd043e162bbc78d254a7d2295f6f75116399f3fab (diff)
downloadbarebox-b1cc0d7fc6728acbed7360b315593c3535ce7d75.tar.gz
barebox-b1cc0d7fc6728acbed7360b315593c3535ce7d75.tar.xz
clk: clk-fixed-factor: add set_rate/round_rate callbacks
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/clk-fixed-factor.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c
index df0d2f345c..cb531b146b 100644
--- a/drivers/clk/clk-fixed-factor.c
+++ b/drivers/clk/clk-fixed-factor.c
@@ -35,7 +35,37 @@ static unsigned long clk_fixed_factor_recalc_rate(struct clk *clk,
return (parent_rate / f->div) * f->mult;
}
+static long clk_factor_round_rate(struct clk *clk, unsigned long rate,
+ unsigned long *prate)
+{
+ struct clk_fixed_factor *fix = container_of(clk, struct clk_fixed_factor, clk);
+
+ if (clk->flags & CLK_SET_RATE_PARENT) {
+ unsigned long best_parent;
+
+ best_parent = (rate / fix->mult) * fix->div;
+ *prate = clk_round_rate(clk_get_parent(clk), best_parent);
+ }
+
+ return (*prate / fix->div) * fix->mult;
+}
+
+static int clk_factor_set_rate(struct clk *clk, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct clk_fixed_factor *fix = container_of(clk, struct clk_fixed_factor, clk);
+
+ if (clk->flags & CLK_SET_RATE_PARENT) {
+ printk("%s: %ld -> parent %ld\n", __func__, rate, rate * fix->div / fix->mult);
+ return clk_set_rate(clk_get_parent(clk), rate * fix->div / fix->mult);
+ }
+
+ return 0;
+}
+
static struct clk_ops clk_fixed_factor_ops = {
+ .set_rate = clk_factor_set_rate,
+ .round_rate = clk_factor_round_rate,
.recalc_rate = clk_fixed_factor_recalc_rate,
};