linux/drivers/clk
Maxime Ripard b07387c476 clk: Enforce that disjoints limits are invalid
[ Upstream commit 10c46f2ea9 ]

If we were to have two users of the same clock, doing something like:

clk_set_rate_range(user1, 1000, 2000);
clk_set_rate_range(user2, 3000, 4000);

The second call would fail with -EINVAL, preventing from getting in a
situation where we end up with impossible limits.

However, this is never explicitly checked against and enforced, and
works by relying on an undocumented behaviour of clk_set_rate().

Indeed, on the first clk_set_rate_range will make sure the current clock
rate is within the new range, so it will be between 1000 and 2000Hz. On
the second clk_set_rate_range(), it will consider (rightfully), that our
current clock is outside of the 3000-4000Hz range, and will call
clk_core_set_rate_nolock() to set it to 3000Hz.

clk_core_set_rate_nolock() will then call clk_calc_new_rates() that will
eventually check that our rate 3000Hz rate is outside the min 3000Hz max
2000Hz range, will bail out, the error will propagate and we'll
eventually return -EINVAL.

This solely relies on the fact that clk_calc_new_rates(), and in
particular clk_core_determine_round_nolock(), won't modify the new rate
allowing the error to be reported. That assumption won't be true for all
drivers, and most importantly we'll break that assumption in a later
patch.

It can also be argued that we shouldn't even reach the point where we're
calling clk_core_set_rate_nolock().

Let's make an explicit check for disjoints range before we're doing
anything.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://lore.kernel.org/r/20220225143534.405820-4-maxime@cerno.tech
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-04-13 20:59:12 +02:00
..
actions clk: actions: Terminate clk_div_table with sentinel element 2022-04-08 14:23:48 +02:00
analogbits Merge branch 'akpm' (patches from Andrew) 2021-07-02 12:08:10 -07:00
at91 clk: at91: sama7g5: fix parents of PDMCs' GCLK 2022-04-08 14:23:47 +02:00
axis
axs10x
baikal-t1
bcm clk: bcm-2835: Remove rounding up the dividers 2022-01-27 11:03:03 +01:00
berlin
davinci
h8300
hisilicon clk: hisilicon: Terminate clk_div_table with sentinel element 2022-04-08 14:23:48 +02:00
imgtec
imx clk: imx: off by one in imx_lpcg_parse_clks_from_dt() 2022-04-08 14:23:47 +02:00
ingenic clk: jz4725b: fix mmc0 clock gating 2022-03-02 11:47:48 +01:00
keystone clk: keystone: syscon-clk: Add support for AM64 specific epwm-tbclk 2021-06-22 14:18:26 -07:00
loongson1 clk: loongson1: Terminate clk_div_table with sentinel element 2022-04-08 14:23:48 +02:00
mediatek clk: mediatek: make COMMON_CLK_MT8167* depend on COMMON_CLK_MT8167 2021-07-27 11:46:27 -07:00
meson clk: meson: gxbb: Fix the SDM_EN bit for MPLL0 on GXBB 2022-01-27 11:04:58 +01:00
microchip
mmp
mstar
mvebu clk: mvebu: ap-cpu-clk: Fix a memory leak in error handling paths 2021-11-18 19:16:46 +01:00
mxs
nxp
pistachio clk: pistachio: Make it selectable for generic MIPS kernel 2021-08-12 16:01:49 +02:00
pxa
qcom clk: qcom: gcc-msm8994: Fix gpll4 width 2022-04-08 14:23:51 +02:00
ralink clk: ralink: avoid to set 'CLK_IS_CRITICAL' flag for gates 2021-08-28 22:24:06 -07:00
renesas clk: renesas: rzg2l: propagate return value of_genpd_add_provider_simple() 2022-01-27 11:04:06 +01:00
rockchip clk: rockchip: drop CLK_SET_RATE_PARENT from dclk_vop* on rk3568 2022-04-13 20:59:11 +02:00
samsung clk: samsung: Remove redundant dev_err calls 2021-04-08 19:35:26 +02:00
sifive clk: sifive: Fix kernel-doc 2021-06-01 23:39:15 -07:00
socfpga clk: socfpga: agilex: fix duplicate s2f_user0_clk 2021-09-24 16:03:08 -07:00
spear
sprd
st clk: st: clkgen-fsyn: embed soc clock outputs within compatible data 2021-06-27 19:53:40 -07:00
sunxi
sunxi-ng clk: sunxi-ng: Unregister clocks/resets when unbinding 2021-11-25 09:48:23 +01:00
tegra clk: tegra: tegra124-emc: Fix missing put_device() call in emc_ensure_emc_driver 2022-04-08 14:23:48 +02:00
ti clk: ti: Preserve node in ti_dt_clocks_register() 2022-04-13 20:59:12 +02:00
uniphier clk: uniphier: Fix fixed-rate initialization 2022-04-08 14:22:50 +02:00
ux500 mfd: db8500-prcmu: Handle missing FW variant 2021-08-09 09:33:29 +01:00
versatile clk: versatile: Depend on HAS_IOMEM 2021-06-04 12:23:28 -07:00
x86 clk: x86: Rename clk-lpt to more specific clk-lpss-atom 2021-07-27 14:03:47 -07:00
xilinx
zynq
zynqmp Merge branches 'clk-kirkwood', 'clk-imx', 'clk-doc', 'clk-zynq' and 'clk-ralink' into clk-next 2021-09-01 15:27:07 -07:00
clk-asm9260.c
clk-aspeed.c
clk-aspeed.h
clk-ast2600.c clk/ast2600: Fix soc revision for AHB 2021-11-25 09:48:32 +01:00
clk-axi-clkgen.c
clk-axm5516.c
clk-bd718x7.c clk: bd718xx: Drop BD70528 support 2021-06-27 18:42:45 -07:00
clk-bm1880.c clk: bm1880: remove kfrees on static allocations 2022-01-27 11:04:20 +01:00
clk-bulk.c
clk-cdce706.c
clk-cdce925.c
clk-clps711x.c clk: clps711x: Terminate clk_div_table with sentinel element 2022-04-08 14:23:48 +02:00
clk-composite.c clk: composite: Also consider .determine_rate for rate + mux composites 2021-10-18 12:59:42 -07:00
clk-conf.c
clk-cs2000-cp.c
clk-devres.c clk: fix leak on devm_clk_bulk_get_all() unwind 2021-07-31 00:53:38 -07:00
clk-divider.c clk: divider: Implement and wire up .determine_rate by default 2021-08-05 17:35:58 -07:00
clk-fixed-factor.c
clk-fixed-mmio.c
clk-fixed-rate.c
clk-fractional-divider.c clk: fractional-divider: Document the arithmetics used behind the code 2021-08-12 12:42:00 -07:00
clk-fractional-divider.h clk: fractional-divider: Hide clk_fractional_divider_ops from wide audience 2021-08-12 12:42:00 -07:00
clk-fsl-flexspi.c
clk-fsl-sai.c
clk-gate.c
clk-gemini.c
clk-gpio.c
clk-hi655x.c
clk-highbank.c
clk-hsdk-pll.c
clk-k210.c clk: k210: Fix k210_clk_set_parent() 2021-06-30 11:34:36 -07:00
clk-lmk04832.c clk: lmk04832: drop redundant fallthrough statements 2021-07-27 11:52:30 -07:00
clk-lochnagar.c
clk-max9485.c
clk-max77686.c
clk-milbeaut.c
clk-moxart.c
clk-multiplier.c
clk-mux.c
clk-nomadik.c
clk-npcm7xx.c
clk-nspire.c
clk-oxnas.c
clk-palmas.c clk: palmas: Add a missing SPDX license header 2021-08-05 17:34:30 -07:00
clk-plldig.c
clk-pwm.c
clk-qoriq.c
clk-rk808.c
clk-s2mps11.c
clk-scmi.c
clk-scpi.c
clk-si514.c
clk-si544.c
clk-si570.c
clk-si5341.c clk: si5341: fix reported clk_rate when output divider is 2 2022-04-13 20:59:10 +02:00
clk-si5351.c
clk-si5351.h
clk-sparx5.c
clk-stm32f4.c clk: stm32: Fix ltdc's clock turn off by clk_disable_unused() after system enter shell 2022-01-27 11:04:12 +01:00
clk-stm32h7.c clk: stm32h7: Switch to clk_divider.determine_rate 2021-08-05 17:36:10 -07:00
clk-stm32mp1.c clk: stm32mp1: Switch to clk_divider.determine_rate 2021-08-05 17:36:10 -07:00
clk-twl6040.c
clk-versaclock5.c clk: vc5: Add properties for configuring SD/OE behavior 2021-08-28 23:46:21 -07:00
clk-vt8500.c
clk-wm831x.c
clk-xgene.c
clk.c clk: Enforce that disjoints limits are invalid 2022-04-13 20:59:12 +02:00
clk.h
clkdev.c clkdev: remove unused clkdev_alloc() interfaces 2021-06-08 17:00:09 +02:00
Kconfig clk: pistachio: Make it selectable for generic MIPS kernel 2021-08-12 16:01:49 +02:00
Makefile clk: pistachio: Make it selectable for generic MIPS kernel 2021-08-12 16:01:49 +02:00