linux/drivers/clk
Tomi Valkeinen b11d282dbe clk: divider: fix rate calculation for fractional rates
clk-divider.c does not calculate the rates consistently at the moment.

As an example, on OMAP3 we have a clock divider with a source clock of
864000000 Hz. With dividers 6, 7 and 8 the theoretical rates are:

6: 144000000
7: 123428571.428571...
8: 108000000

Calling clk_round_rate() with the rate in the first column will give the
rate in the second column:

144000000 -> 144000000
143999999 -> 123428571
123428572 -> 123428571
123428571 -> 108000000

Note how clk_round_rate() returns 123428571 for rates from 123428572 to
143999999, which is mathematically correct, but when clk_round_rate() is
called with 123428571, the returned value is surprisingly 108000000.

This means that the following code works a bit oddly:

rate = clk_round_rate(clk, 123428572);
clk_set_rate(clk, rate);

As clk_set_rate() also does clock rate rounding, the result is that the
clock is set to the rate of 108000000, not 123428571 returned by the
clk_round_rate.

This patch changes the clk-divider.c to use DIV_ROUND_UP when
calculating the rate. This gives the following behavior which fixes the
inconsistency:

144000000 -> 144000000
143999999 -> 123428572
123428572 -> 123428572
123428571 -> 108000000

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
2014-02-26 18:23:46 -08:00
..
at91 Second cleanup pull-request for 3.14: 2014-01-14 15:41:57 -08:00
hisilicon clk: hisilicon: add hi3620_mmc_clks 2014-02-26 16:03:56 -08:00
keystone clk: keystone: gate: fix clk_init_data initialization 2014-02-10 15:17:43 -05:00
mmp clk: add CLK_SET_RATE_NO_REPARENT flag 2013-08-19 12:27:17 -07:00
mvebu Merge branch 'clk-fixes' into clk-next 2014-02-24 23:07:53 -08:00
mxs ARM: mxs: remove custom .init_time hook 2013-09-29 21:09:34 +02:00
qcom clk: qcom: Fix modular build 2014-01-17 13:39:42 -08:00
rockchip clk: add support for Rockchip gate clocks 2013-06-20 15:58:27 -07:00
samsung The second half of the clock framework pull requeust for 3.14 is 2014-01-28 18:44:53 -08:00
shmobile clk: shmobile: div6: use proper description in kernel doc 2014-02-25 00:26:37 -08:00
sirf clk: sirf: re-arch to make the codes support both prima2 and atlas6 2014-01-16 12:00:53 -08:00
socfpga clk: socfpga: Support multiple parents for the pll clocks 2014-02-26 12:23:40 -08:00
spear clk: SPEAr: Staticize clk_frac_ops 2013-12-19 11:45:17 -08:00
sunxi clk: sunxi: fix overflow when setting up divided factors 2014-01-27 12:28:23 -08:00
tegra Merge branch 'clk-fixes' into clk-next 2014-02-24 23:07:53 -08:00
ti clk: ti: am335x: remove unecessary cpu0 clk node 2014-02-24 22:56:38 -08:00
ux500 clk: ux500: Staticize ux500_twocell_get 2014-02-23 15:04:40 -08:00
versatile The first half of the clk framework pull request is made up almost 2014-01-23 18:56:08 -08:00
x86 ACPI / LPSS: add support for Intel BayTrail 2013-06-19 01:08:47 +02:00
zynq clk: zynq: Use clk_readl/clk_writel helper function 2014-02-25 14:08:48 -08:00
clk-axi-clkgen.c clk: axi-clkgen: Add support for v2 2014-02-26 17:02:29 -08:00
clk-bcm2835.c ARM: bcm2835: remove custom .init_time hook 2013-09-29 21:09:24 +02:00
clk-composite.c clk: composite: pass mux_hw into determine_rate 2014-01-15 07:48:03 -08:00
clk-devres.c ARM: 7537/1: clk: Fix release in devm_clk_put() 2012-09-19 21:51:27 +01:00
clk-divider.c clk: divider: fix rate calculation for fractional rates 2014-02-26 18:23:46 -08:00
clk-efm32gg.c clk: new driver for efm32 SoC 2013-11-04 12:23:18 -08:00
clk-fixed-factor.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2013-11-15 16:47:22 -08:00
clk-fixed-rate.c clk: add accuracy support for fixed clock 2013-12-22 23:14:28 -08:00
clk-gate.c clk: wrap I/O access for improved portability 2013-08-27 17:50:38 -07:00
clk-highbank.c ARM: highbank: remove custom .init_time hook 2013-09-29 21:09:29 +02:00
clk-ls1x.c
clk-max77686.c clk: max77686: Register OF clock provider 2014-01-08 09:57:07 -08:00
clk-mux.c clk: wrap I/O access for improved portability 2013-08-27 17:50:38 -07:00
clk-nomadik.c clk: nomadik: fix missing __init on nomadik_src_init 2013-10-07 11:41:21 -07:00
clk-nspire.c clk: Add TI-Nspire clock drivers 2013-05-31 12:07:45 -07:00
clk-ppc-corenet.c powerpc: add missing explicit OF includes for ppc 2013-11-11 09:10:50 -06:00
clk-s2mps11.c mfd: s2mps11: Fix build after regmap field rename in sec-core.c 2013-12-16 11:30:39 +00:00
clk-si570.c clk: si570: Remove redundant of_match_ptr helper 2013-12-22 22:46:52 -08:00
clk-si5351.c The second half of the clock framework pull requeust for 3.14 is 2014-01-28 18:44:53 -08:00
clk-si5351.h clk: si5351: remove variant from platform_data 2014-01-27 11:20:22 -08:00
clk-twl6040.c clk: use platform_{get,set}_drvdata() 2013-05-30 18:19:34 -07:00
clk-u300.c clk: u300: Fix incorrect placement of __initconst 2013-08-27 18:34:09 -07:00
clk-vt8500.c clk: vt8500: Staticize vtwm_pll_ops 2013-12-19 17:47:32 -08:00
clk-wm831x.c clk: wm831x: get rid of the implementation of remove function 2013-10-02 01:23:34 -07:00
clk-xgene.c clk: Add APM X-Gene SoC clock driver 2013-10-07 11:22:15 -07:00
clk.c Merge branch 'clk-fixes' into clk-next 2014-02-24 23:07:53 -08:00
clk.h clk: Provide not locked variant of of_clk_get_from_provider() 2013-12-04 17:19:30 +01:00
clkdev.c clk: return probe defer when DT clock not yet ready 2014-02-24 17:14:56 -08:00
Kconfig clk: qcom: Add a regmap type clock struct 2014-01-16 12:00:58 -08:00
Makefile The second half of the clock framework pull requeust for 3.14 is 2014-01-28 18:44:53 -08:00