linux_dsm_epyc7002/drivers/clk
Katsuhiro Suzuki d13501a2be clk: fractional-divider: check parent rate only if flag is set
Custom approximation of fractional-divider may not need parent clock
rate checking. For example Rockchip SoCs work fine using grand parent
clock rate even if target rate is greater than parent.

This patch checks parent clock rate only if CLK_SET_RATE_PARENT flag
is set.

For detailed example, clock tree of Rockchip I2S audio hardware.
  - Clock rate of CPLL is 1.2GHz, GPLL is 491.52MHz.
  - i2s1_div is integer divider can divide N (N is 1~128).
    Input clock is CPLL or GPLL. Initial divider value is N = 1.
    Ex) PLL = CPLL, N = 10, i2s1_div output rate is
      CPLL / 10 = 1.2GHz / 10 = 120MHz
  - i2s1_frac is fractional divider can divide input to x/y, x and
    y are 16bit integer.

CPLL --> | selector | ---> i2s1_div -+--> | selector | --> I2S1 MCLK
GPLL --> |          | ,--------------'    |          |
                      `--> i2s1_frac ---> |          |

Clock mux system try to choose suitable one from i2s1_div and
i2s1_frac for master clock (MCLK) of I2S1.

Bad scenario as follows:
  - Try to set MCLK to 8.192MHz (32kHz audio replay)
    Candidate setting is
    - i2s1_div: GPLL / 60 = 8.192MHz
    i2s1_div candidate is exactly same as target clock rate, so mux
    choose this clock source. i2s1_div output rate is changed
    491.52MHz -> 8.192MHz

  - After that try to set to 11.2896MHz (44.1kHz audio replay)
    Candidate settings are
    - i2s1_div : CPLL / 107 = 11.214945MHz
    - i2s1_frac: i2s1_div   = 8.192MHz
      This is because clk_fd_round_rate() thinks target rate
      (11.2896MHz) is higher than parent rate (i2s1_div = 8.192MHz)
      and returns parent clock rate.

Above is current upstreamed behavior. Clock mux system choose
i2s1_div, but this clock rate is not acceptable for I2S driver, so
users cannot replay audio.

Expected behavior is:
  - Try to set master clock to 11.2896MHz (44.1kHz audio replay)
    Candidate settings are
    - i2s1_div : CPLL / 107          = 11.214945MHz
    - i2s1_frac: i2s1_div * 147/6400 = 11.2896MHz
                 Change i2s1_div to GPLL / 1 = 491.52MHz at same
                 time.

If apply this commit, clk_fd_round_rate() calls custom approximate
function of Rockchip even if target rate is higher than parent.
Custom function changes both grand parent (i2s1_div) and parent
(i2s_frac) settings at same time. Clock mux system can choose
i2s1_frac and audio works fine.

Signed-off-by: Katsuhiro Suzuki <katsuhiro@katsuster.net>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
[sboyd@kernel.org: Make function into a macro instead]
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
2019-02-22 00:11:47 -08:00
..
actions clk: actions: Add Actions Semi S900 SoC Reset Management Unit support 2018-10-16 14:41:53 -07:00
at91 Merge branches 'clk-actions-reset', 'clk-imx7-init-critical', 'clk-mmp2-ids' and 'clk-at91-pmc-rework' into clk-next 2018-10-18 15:43:48 -07:00
axis
axs10x clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
bcm Merge branches 'clk-managed-registration', 'clk-spdx', 'clk-remove-basic' and 'clk-ops-const' into clk-next 2018-12-14 13:33:44 -08:00
berlin This time we have a good set of changes to the core framework that do some 2018-06-09 12:06:24 -07:00
davinci clk: davinci: kill davinci_clk_reset_assert/deassert() 2018-10-02 08:54:14 -07:00
h8300 clk: h8300: Remove usage of CLK_IS_BASIC 2018-12-10 14:43:21 -08:00
hisilicon clk: hisilicon: Remove usage of CLK_IS_BASIC 2018-12-10 14:43:21 -08:00
imgtec clk: boston: unregister clks on failure in clk_boston_setup() 2018-11-08 10:14:41 -08:00
imx clk: imx8qxp: make the name of clock ID generic 2018-12-28 10:43:57 -08:00
ingenic clk: Add Ingenic jz4725b CGU driver 2018-10-16 15:19:48 -07:00
keystone Merge branch 'clk-k3-tisci' into clk-next 2018-10-18 15:40:10 -07:00
loongson1 clk: Loongson1: Remove usage of CLK_IS_BASIC 2018-12-10 14:44:08 -08:00
mediatek clk: mediatek: fix the PCIe MAC clock parent 2018-12-05 12:30:30 -08:00
meson Merge branch 'clk-fixes' into clk-next 2018-12-14 13:42:08 -08:00
microchip
mmp Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input 2019-01-02 18:56:59 -08:00
mvebu clk: mvebu: Off by one bugs in cp110_of_clk_get() 2018-12-03 09:54:48 -08:00
mxs
nxp clk: lpc32xx: Set name of regmap_config 2018-03-19 14:35:16 -07:00
pistachio clk: pistachio: constify clk_ops structures 2018-11-06 09:41:49 -08:00
pxa clk: pxa: constify clk_ops structures 2018-11-06 09:41:57 -08:00
qcom Merge branch 'clk-fixes' into clk-next 2018-12-14 13:42:08 -08:00
renesas Merge branch 'clk-of' into clk-next 2018-12-14 14:02:55 -08:00
rockchip clk: rockchip: add clock-id to gate of ACODEC for rk3328 2018-11-26 14:22:12 +01:00
samsung clk: samsung: s3c2410: Remove usage of CLK_IS_BASIC 2018-12-10 14:44:08 -08:00
sirf
socfpga clk: socfpga: stratix10: fix the sdmmc_free_clk mux 2018-07-06 11:08:02 -07:00
spear clk: spear: fix WDT clock definition on SPEAr600 2018-04-06 13:45:34 -07:00
sprd clk: sprd: add RTC gate for SC9860 2018-03-16 15:53:30 -07:00
st clk: st: Remove usage of CLK_IS_BASIC 2018-12-10 14:43:20 -08:00
sunxi clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
sunxi-ng clk: sunxi-ng: a64: Allow parent change for VE clock 2018-12-10 11:19:26 -08:00
tegra Merge branches 'clk-renesas', 'clk-allwinner', 'clk-tegra', 'clk-meson' and 'clk-rockchip' into clk-next 2018-12-14 13:34:00 -08:00
ti clk: Use of_node_name_eq for node name comparisons 2018-12-14 13:52:41 -08:00
uniphier clk: uniphier: add clock frequency support for SPI 2018-07-25 16:26:18 -07:00
ux500 clk: Use of_node_name_eq for node name comparisons 2018-12-14 13:52:41 -08:00
versatile clk: versatile: sp810: Remove usage of CLK_IS_BASIC 2018-12-10 14:44:05 -08:00
x86 clk: x86: Stop marking clocks as CLK_IS_CRITICAL 2018-09-17 18:47:58 -07:00
zte
zynq clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
zynqmp clk: zynqmp: Off by one in zynqmp_is_valid_clock() 2018-12-03 09:54:48 -08:00
clk-asm9260.c clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
clk-aspeed.c The new and exciting feature this time around is in the clk core. 2018-08-15 21:41:21 -07:00
clk-axi-clkgen.c clk: axi-clkgen: Round closest in round_rate() and recalc_rate() 2017-12-21 18:07:53 -08:00
clk-axm5516.c clk: axm5516: Remove usage of CLK_IS_BASIC 2018-12-10 14:43:21 -08:00
clk-bd718x7.c clk: bd718x7: Initial support for ROHM bd71837/bd71847 PMIC clock 2018-12-10 12:44:03 -08:00
clk-bulk.c clk: Tag clk core files with SPDX 2018-12-11 09:57:47 -08:00
clk-cdce706.c
clk-cdce925.c Merge branches 'clk-dt-name', 'clk-ti-of-node' and 'clk-sa' into clk-next 2018-10-18 15:33:52 -07:00
clk-clps711x.c treewide: Use struct_size() for kmalloc()-family 2018-06-06 11:15:43 -07:00
clk-composite.c clk: Tag basic clk types with SPDX 2018-12-11 09:57:48 -08:00
clk-conf.c clk: Tag clk core files with SPDX 2018-12-11 09:57:47 -08:00
clk-cs2000-cp.c clk: cs2000-cp: convert to SPDX identifiers 2018-08-02 13:55:00 -07:00
clk-devres.c clk: Tag clk core files with SPDX 2018-12-11 09:57:47 -08:00
clk-divider.c clk: Tag basic clk types with SPDX 2018-12-11 09:57:48 -08:00
clk-efm32gg.c treewide: Use struct_size() for kmalloc()-family 2018-06-06 11:15:43 -07:00
clk-fixed-factor.c Merge branch 'clk-fixes' into clk-next 2018-12-14 13:42:08 -08:00
clk-fixed-rate.c clk: Tag basic clk types with SPDX 2018-12-11 09:57:48 -08:00
clk-fractional-divider.c clk: fractional-divider: check parent rate only if flag is set 2019-02-22 00:11:47 -08:00
clk-gate.c clk: Tag basic clk types with SPDX 2018-12-11 09:57:48 -08:00
clk-gemini.c treewide: Use struct_size() for kmalloc()-family 2018-06-06 11:15:43 -07:00
clk-gpio.c clk: Tag basic clk types with SPDX 2018-12-11 09:57:48 -08:00
clk-hi655x.c clk: clk-hi655x: Free of_provider at remove 2018-12-05 09:20:29 -08:00
clk-highbank.c
clk-hsdk-pll.c clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
clk-max9485.c clk: Add driver for MAX9485 2018-07-06 13:44:06 -07:00
clk-max77686.c clk: max77686: constify clk_ops structure 2018-11-06 09:41:29 -08:00
clk-moxart.c
clk-multiplier.c clk: Tag basic clk types with SPDX 2018-12-11 09:57:48 -08:00
clk-mux.c clk: Tag basic clk types with SPDX 2018-12-11 09:57:48 -08:00
clk-nomadik.c clk: nomadik: Change to use DEFINE_SHOW_ATTRIBUTE macro 2018-11-28 14:13:18 -08:00
clk-npcm7xx.c This time it looks like a quieter release cycle in the clk tree. I guess that's 2018-10-31 11:08:30 -07:00
clk-nspire.c
clk-oxnas.c clk: oxnas: Add OX820 Gate clocks 2016-10-23 10:18:45 -07:00
clk-palmas.c clk: palmas: constify clk_ops structure 2018-11-06 09:41:44 -08:00
clk-pwm.c
clk-qoriq.c clk: qoriq: add more chips support 2018-11-08 10:29:44 -08:00
clk-rk808.c clk: rk808: use managed version of of_provider registration 2018-12-05 09:20:35 -08:00
clk-s2mps11.c clk: s2mps11: constify clk_ops structure 2018-11-06 09:42:12 -08:00
clk-scmi.c clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
clk-scpi.c clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
clk-si514.c clk-si514, clk-si544: Implement prepare/unprepare/is_prepared operations 2018-06-29 10:59:40 -07:00
clk-si544.c clk-si514, clk-si544: Implement prepare/unprepare/is_prepared operations 2018-06-29 10:59:40 -07:00
clk-si570.c
clk-si5351.c clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
clk-si5351.h
clk-stm32f4.c clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
clk-stm32h7.c clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
clk-stm32mp1.c clk: stm32mp1: drop pointless static qualifier in stm32_register_hw_clk() 2018-11-29 23:12:35 -08:00
clk-tango4.c clk: Convert to using %pOFn instead of device_node.name 2018-08-30 09:50:20 -07:00
clk-twl6040.c clk: clk-twl6040: Free of_provider at remove 2018-12-05 09:20:43 -08:00
clk-u300.c
clk-versaclock5.c clk: vc5: Add suspend/resume support 2018-12-14 13:43:04 -08:00
clk-vt8500.c
clk-wm831x.c
clk-xgene.c
clk.c Merge branches 'clk-managed-registration', 'clk-spdx', 'clk-remove-basic' and 'clk-ops-const' into clk-next 2018-12-14 13:33:44 -08:00
clk.h clk: Tag clk core files with SPDX 2018-12-11 09:57:47 -08:00
clkdev.c ARM: 8778/1: clkdev: don't call __of_clk_get_by_name() unnecessarily from clk_get() 2018-08-13 16:27:52 +01:00
Kconfig Merge branches 'clk-imx7ulp', 'clk-imx6-fixes', 'clk-imx-fixes', 'clk-imx8qxp' and 'clk-imx8mq' into clk-next 2018-12-14 13:34:47 -08:00
Makefile Merge branches 'clk-imx7ulp', 'clk-imx6-fixes', 'clk-imx-fixes', 'clk-imx8qxp' and 'clk-imx8mq' into clk-next 2018-12-14 13:34:47 -08:00