diff options
| -rw-r--r-- | drivers/clk/msm/clock-local2.c | 14 | ||||
| -rw-r--r-- | include/linux/clk/msm-clock-generic.h | 7 |
2 files changed, 17 insertions, 4 deletions
diff --git a/drivers/clk/msm/clock-local2.c b/drivers/clk/msm/clock-local2.c index 934219df53ef..56ee6d0d7c89 100644 --- a/drivers/clk/msm/clock-local2.c +++ b/drivers/clk/msm/clock-local2.c @@ -1023,18 +1023,20 @@ unsigned long measure_get_rate(struct clk *c) u64 raw_count_short, raw_count_full; unsigned ret; u32 sample_ticks = 0x10000; - u32 multiplier = 0x1; + u32 multiplier = to_mux_clk(c)->post_div + 1; struct measure_clk_data *data = to_mux_clk(c)->priv; regval = readl_relaxed(MUX_REG(to_mux_clk(c))); - /* clear post divider bits */ + /* clear and set post divider bits */ regval &= ~BM(15, 12); + regval |= BVAL(15, 12, to_mux_clk(c)->post_div); writel_relaxed(regval, MUX_REG(to_mux_clk(c))); ret = clk_prepare_enable(data->cxo); if (ret) { pr_warn("CXO clock failed to enable. Can't measure\n"); - return 0; + ret = 0; + goto fail; } spin_lock_irqsave(&local_clock_reg_lock, flags); @@ -1076,6 +1078,12 @@ unsigned long measure_get_rate(struct clk *c) clk_disable_unprepare(data->cxo); +fail: + regval = readl_relaxed(MUX_REG(to_mux_clk(c))); + /* clear post divider bits */ + regval &= ~BM(15, 12); + writel_relaxed(regval, MUX_REG(to_mux_clk(c))); + return ret; } diff --git a/include/linux/clk/msm-clock-generic.h b/include/linux/clk/msm-clock-generic.h index 6d5468acf744..d7186a363a3f 100644 --- a/include/linux/clk/msm-clock-generic.h +++ b/include/linux/clk/msm-clock-generic.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -81,6 +81,11 @@ struct mux_clk { u32 mask; u32 shift; u32 en_mask; + /* + * Set post divider for debug mux in order to divide the clock + * by post_div + 1. + */ + u32 post_div; int low_power_sel; void *priv; |
