linux_dsm_epyc7002/drivers/clk
Emil Lundmark c5a8045a55 clk: imx: improve precision of AV PLL to 1 Hz
The audio and video PLLs are designed to have a precision of 1 Hz if some
conditions are met. The current implementation only allows a precision that
depends on the rate of the parent clock. E.g., if the parent clock is 24
MHz, the precision will be 24 Hz; or more generally the precision will be

    p / 10^6 Hz

where p is the parent clock rate. This comes down to how the register
values for the PLL's fractional loop divider are chosen.

The clock rate calculation for the PLL is

    PLL output frequency = Fref * (DIV_SELECT + NUM / DENOM)

or with a shorter notation

    r = p * (d + a / b)

In addition to all variables being integers, we also have the following
conditions:

    27 <= d <= 54

    -2^29 <= a <= 2^29-1
     0    <  b <= 2^30-1
    |a| < b

Here, d, a and b are register values for the fractional loop divider. We
want to chose d, a and b such that f(p, r) = p, i.e. f is our round_rate
function. Currently, d and b are chosen as

    d = r / p
    b = 10^6

hence we get the poor precision. And a is defined in terms of r, d, p and
b:

    a = (r - d * p) * b / p

I propose that if p <= 2^30-1 (i.e., the max value for b), we chose b as

    b = p

We can do this since

    |a| < b

    |(r - d * p) * b / p| < b

    |r - d * p| < p

Which have two solutions, one of them is when p < 0, so we can skip that
one. The other is when p > 0 and

    p * (d - 1) < r < p * (d + 1)

Substitute d = r / p:

    (r - p) < r < (r + p)  <=>  p > 0

So, as long as p > 0, we can chose b = p. This is a good choise for b since

    a = (r - d * p) * b / p
      = (r - d * p) * p / p
      = r - d * p

    r = p * (d + a / b)
      = p * d + p * a / b
      = p * d + p * a / p
      = p * d + a

and if d = r / p:

    a = r - d * p
      = r - r / p * p
      = 0

    r = p * d + a
      = p * d + 0
      = p * r / p
      = r

I reckon this is the intention by the design of the clock rate formula.

Signed-off-by: Emil Lundmark <emil@limesaudio.com>
Reviewed-by: Fabio Estevam <fabio.estevam@nxp.com>
Acked-by: Shawn Guo <shawnguo@kernel.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
2016-11-01 17:12:50 -07:00
..
at91 clk: at91: Fix a return value in case of error 2016-10-20 16:37:56 -07:00
axis clk: axis: Use new macro CLK_OF_DECLARE_DRIVER 2016-08-12 18:00:37 -07:00
axs10x
bcm clk: bcm2835: Clamp the PLL's requested rate to the hardware limits. 2016-10-17 15:34:36 -07:00
berlin clk: berlin: Migrate to clk_hw based registration and OF APIs 2016-08-18 11:30:01 -07:00
h8300 clk: h8300: Migrate to clk_hw based registration APIs 2016-08-24 17:37:10 -07:00
hisilicon clk: hi6220: use CLK_OF_DECLARE_DRIVER for sysctrl and mediactrl clock init 2016-10-17 15:42:58 -07:00
imx clk: imx: improve precision of AV PLL to 1 Hz 2016-11-01 17:12:50 -07:00
ingenic
keystone
loongson1 CLK: Add Loongson1C clock support 2016-09-23 14:49:21 -07:00
mediatek clk: mediatek: Add hardware dependency 2016-10-17 15:22:26 -07:00
meson ARM: SoC: late DT updates for v4.9 2016-10-07 21:34:49 -07:00
microchip clk: microchip: Initialize SOSC clock rate for PIC32MZDA. 2016-08-24 16:05:24 -07:00
mmp clk: mmp: add missing header dependencies 2016-09-14 11:16:59 -07:00
mvebu clk: mvebu: armada-37xx-periph: Fix the clock gate flag 2016-10-17 15:35:10 -07:00
mxs
nxp clk: nxp: clk-lpc32xx: Unmap region obtained by of_iomap 2016-09-21 13:46:21 -07:00
pistachio
pxa
qcom clk: Add USB3 PHY reset lines 2016-09-16 16:19:50 -07:00
renesas clk/Renesas-MSTP: Use kmalloc_array() in cpg_mstp_clocks_init() 2016-09-16 16:13:09 -07:00
rockchip clk: rockchip: don't return NULL when failing to register ddrclk branch 2016-10-16 02:39:58 +02:00
samsung clk/samsung: Use CLK_OF_DECLARE_DRIVER initialization method for CLKOUT 2016-10-27 17:26:54 -07:00
sirf
socfpga
spear
st drivers: clk: st: Handle clk synchronous mode for video clocks 2016-09-16 16:01:41 -07:00
sunxi Merge branch 'clk-fixes' into clk-next 2016-09-08 12:57:10 -07:00
sunxi-ng clk: sunxi-ng: Fix reset offset for the A23 and A33 2016-09-20 17:04:31 -07:00
tegra clk: tegra: remove TEGRA_PLL_USE_LOCK for PLLD/PLLD2 2016-08-24 10:54:17 -07:00
ti
uniphier clk: uniphier: rename MIO clock to SD clock for Pro5, PXs2, LD20 SoCs 2016-10-19 13:15:05 -07:00
ux500
versatile clk: versatile/icst: support for AP baseboard clocks 2016-08-29 11:38:51 -07:00
x86
zte clk: zx296718: register driver earlier with core_initcall 2016-09-23 14:42:13 -07:00
zynq
clk-asm9260.c clk: asm9260: Migrate to clk_hw based registration and OF APIs 2016-08-24 16:08:33 -07:00
clk-axi-clkgen.c clk: axi-clkgen: Migrate to clk_hw based OF and registration APIs 2016-08-24 16:10:31 -07:00
clk-axm5516.c clk: axm5516: Migrate to clk_hw based OF and registration APIs 2016-08-24 16:11:07 -07:00
clk-cdce706.c clk: cdce: Migrate to clk_hw based OF and registration APIs 2016-08-24 16:12:38 -07:00
clk-cdce925.c clk: cdce925: Migrate to clk_hw based OF and provider APIs 2016-08-24 17:18:13 -07:00
clk-clps711x.c clk: clps711x: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:19:26 -07:00
clk-composite.c
clk-conf.c
clk-cs2000-cp.c clk: cs2000: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:20:31 -07:00
clk-devres.c
clk-divider.c clk: divider: Fix clk_divider_round_rate() to use clk_readl() 2016-08-12 17:33:09 -07:00
clk-efm32gg.c clk: efm32gg: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:21:48 -07:00
clk-fixed-factor.c clk: fixed-factor: Remove export symbol on setup function 2016-08-15 15:08:03 -07:00
clk-fixed-rate.c clk: fixed-rate: Remove export symbol on setup function 2016-08-15 15:08:06 -07:00
clk-fractional-divider.c
clk-gate.c
clk-gpio.c
clk-highbank.c
clk-max77686.c clk: max77686: fix number of clocks setup for clk_hw based registration 2016-10-17 15:31:59 -07:00
clk-mb86s7x.c clk: mb86s7x: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:23:01 -07:00
clk-moxart.c clk: moxart: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:23:20 -07:00
clk-multiplier.c
clk-mux.c
clk-nomadik.c
clk-nspire.c clk: nspire: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:23:21 -07:00
clk-oxnas.c clk: oxnas: Add OX820 Gate clocks 2016-10-23 10:18:45 -07:00
clk-palmas.c clk: palmas: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:23:23 -07:00
clk-pwm.c clk: pwm: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:23:27 -07:00
clk-qoriq.c clk: qoriq: fix a register offset error 2016-08-18 16:52:24 -07:00
clk-rk808.c clk: rk808: Pass the right pointer as the get_hw context 2016-09-09 11:07:07 -07:00
clk-s2mps11.c
clk-scpi.c clk: scpi: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:29:58 -07:00
clk-si514.c clk: si514: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:29:59 -07:00
clk-si570.c clk: si570: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:30:01 -07:00
clk-si5351.c clk: si5351: Migrate to clk_hw based OF and registration APIs 2016-08-24 17:30:00 -07:00
clk-si5351.h
clk-stm32f4.c clk: stm32f469: Add QSPI clock 2016-10-27 18:40:40 -07:00
clk-tango4.c
clk-twl6040.c clk: twl6040: Migrate to clk_hw based registration APIs 2016-08-24 17:34:11 -07:00
clk-u300.c
clk-vt8500.c clk: vt8500: Migrate to clk_hw based registration APIs 2016-08-24 17:35:48 -07:00
clk-wm831x.c clk: wm831x: Migrate to clk_hw based registration APIs 2016-08-24 17:35:53 -07:00
clk-xgene.c clk: xgene: Don't call __pa on ioremaped address 2016-10-28 11:03:47 -07:00
clk.c clk: core: Force setting the phase delay when no change 2016-08-30 14:52:26 -07:00
clk.h
clkdev.c
Kconfig clk: uniphier: add core support code for UniPhier clock driver 2016-09-16 16:31:33 -07:00
Makefile clk: Loongson1: Refactor Loongson1 clock 2016-09-23 14:48:56 -07:00