linux/arch/arm
Linus Walleij 5070fb14a0 ARM: 8517/1: ICST: avoid arithmetic overflow in icst_hz()
When trying to set the ICST 307 clock to 25174000 Hz I ran into
this arithmetic error: the icst_hz_to_vco() correctly figure out
DIVIDE=2, RDW=100 and VDW=99 yielding a frequency of
25174000 Hz out of the VCO. (I replicated the icst_hz() function
in a spreadsheet to verify this.)

However, when I called icst_hz() on these VCO settings it would
instead return 4122709 Hz. This causes an error in the common
clock driver for ICST as the common clock framework will call
.round_rate() on the clock which will utilize icst_hz_to_vco()
followed by icst_hz() suggesting the erroneous frequency, and
then the clock gets set to this.

The error did not manifest in the old clock framework since
this high frequency was only used by the CLCD, which calls
clk_set_rate() without first calling clk_round_rate() and since
the old clock framework would not call clk_round_rate() before
setting the frequency, the correct values propagated into
the VCO.

After some experimenting I figured out that it was due to a simple
arithmetic overflow: the divisor for 24Mhz reference frequency
as reference becomes 24000000*2*(99+8)=0x132212400 and the "1"
in bit 32 overflows and is lost.

But introducing an explicit 64-by-32 bit do_div() and casting
the divisor into (u64) we get the right frequency back, and the
right frequency gets set.

Tested on the ARM Versatile.

Cc: stable@vger.kernel.org
Cc: linux-clk@vger.kernel.org
Cc: Pawel Moll <pawel.moll@arm.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2016-02-08 16:40:36 +00:00
..
boot ARM: 8500/1: fix atags_to_fdt with stack-protector-strong 2016-01-26 23:49:26 +00:00
common ARM: 8517/1: ICST: avoid arithmetic overflow in icst_hz() 2016-02-08 16:40:36 +00:00
configs ARM: SoC defconfig updates for v4.5 2016-01-20 18:29:13 -08:00
crypto
firmware
include ARM: wire up copy_file_range() syscall 2016-01-27 18:14:46 +00:00
kernel ARM: wire up copy_file_range() syscall 2016-01-27 18:14:46 +00:00
kvm kvm: rename pfn_t to kvm_pfn_t 2016-01-15 17:56:32 -08:00
lib arm, thp: remove infrastructure for handling splitting PMDs 2016-01-15 17:56:32 -08:00
mach-alpine
mach-asm9260
mach-at91 ARM: SoC cleanups for v4.5 2016-01-20 17:55:20 -08:00
mach-axxia
mach-bcm Merge tag 'bcm2835-soc-next-2015-12-28' of http://github.com/anholt/linux into next/soc 2015-12-31 17:37:12 +01:00
mach-berlin
mach-clps711x gpio: generic: factor into gpio_chip struct 2016-01-05 11:21:00 +01:00
mach-cns3xxx
mach-davinci ARM: SoC multiplatform code changes for v4.5 2016-01-20 18:03:56 -08:00
mach-digicolor
mach-dove
mach-ebsa110
mach-efm32
mach-ep93xx
mach-exynos ARM: SoC platform updates for v4.5 2016-01-20 18:10:05 -08:00
mach-footbridge ARM: debug-ll: rework footbridge handling 2015-12-15 23:43:29 +01:00
mach-gemini
mach-highbank
mach-hisi
mach-imx ARM: SoC platform updates for v4.5 2016-01-20 18:10:05 -08:00
mach-integrator Merge branch 'treewide/cleanup' into next/multiplatform 2015-12-18 17:07:52 +01:00
mach-iop13xx
mach-iop32x
mach-iop33x
mach-ixp4xx MTD updates for v4.5: 2016-01-13 11:25:54 -08:00
mach-keystone
mach-ks8695
mach-lpc18xx
mach-lpc32xx
mach-mediatek ARM: DT updates for v4.5 2016-01-20 18:16:29 -08:00
mach-meson
mach-mmp
mach-moxart
mach-mv78xx0
mach-mvebu mvebu cleanup for 4.5 (part 1) 2015-12-15 17:36:20 +01:00
mach-mxs
mach-netx
mach-nomadik
mach-nspire
mach-omap1 ARM: SoC platform updates for v4.5 2016-01-20 18:10:05 -08:00
mach-omap2 More power management and ACPI updates for v4.5-rc1 2016-01-20 19:06:49 -08:00
mach-orion5x ARM: SoC multiplatform code changes for v4.5 2016-01-20 18:03:56 -08:00
mach-picoxcell
mach-prima2
mach-pxa ARM: SoC multiplatform code changes for v4.5 2016-01-20 18:03:56 -08:00
mach-qcom
mach-realview ARM: realview: fix device tree build 2016-01-21 13:16:17 +01:00
mach-rockchip Merge branch 'treewide/cleanup' into next/soc 2015-12-22 13:10:00 -08:00
mach-rpc
mach-s3c24xx ARM: s3c: simplify s3c_irqwake_{e,}intallow definition 2015-12-31 17:26:18 +01:00
mach-s3c64xx ARM: SoC multiplatform code changes for v4.5 2016-01-20 18:03:56 -08:00
mach-s5pv210
mach-sa1100 ARM: sa1100/simpad: Be sure to clamp return value 2015-12-22 14:57:50 -08:00
mach-shmobile
mach-socfpga
mach-spear
mach-sti ARM: SoC cleanups for v4.5 2016-01-20 17:55:20 -08:00
mach-stm32
mach-sunxi
mach-tango ARM: tango: Fix UP build issues 2016-01-07 06:33:41 +01:00
mach-tegra ARM: tegra: Core SoC changes for v4.5-rc1 2016-01-12 10:14:52 -08:00
mach-u300
mach-uniphier Merge branch 'treewide/cleanup' into next/soc 2015-12-22 13:10:00 -08:00
mach-ux500 ARM: SoC cleanups for v4.5 2016-01-20 17:55:20 -08:00
mach-versatile ARM: versatile: convert to multi-platform 2015-12-15 23:54:48 +01:00
mach-vexpress
mach-vt8500
mach-w90x900
mach-zx
mach-zynq Merge branch 'treewide/cleanup' into next/soc 2015-12-22 13:10:00 -08:00
mm tree wide: use kvfree() than conditional kfree()/vfree() 2016-01-22 17:02:18 -08:00
net ARM: net: bpf: fix zero right shift 2016-01-06 01:32:09 -05:00
nwfpe
oprofile
plat-iop
plat-omap
plat-orion
plat-pxa
plat-samsung ARM: SoC multiplatform code changes for v4.5 2016-01-20 18:03:56 -08:00
plat-versatile
probes
tools
vdso
vfp
xen xen/arm: set the system time in Xen via the XENPF_settime64 hypercall 2015-12-21 14:40:58 +00:00
Kconfig Merge branch 'akpm' (patches from Andrew) 2016-01-21 12:32:08 -08:00
Kconfig-nommu
Kconfig.debug ARM: SoC fixes for v4.5 merge window 2016-01-22 17:26:00 -08:00
Makefile ARM: SoC defconfig updates for v4.5 2016-01-20 18:29:13 -08:00