linux/drivers/clk/imx
Ahmad Fatoum dd9241fc4b clk: imx: composite-8m: fix clock pauses when set_rate would be a no-op
[ Upstream commit 4dd432d985 ]

Reconfiguring the clock divider to the exact same value is observed
on an i.MX8MN to often cause a longer than usual clock pause, probably
because the divider restarts counting whenever the register is rewritten.

This issue doesn't show up normally, because the clock framework will
take care to not call set_rate when the clock rate is the same.
However, when we reconfigure an upstream clock, the common code will
call set_rate with the newly calculated rate on all children, e.g.:

  - sai5 is running normally and divides Audio PLL out by 16.
  - Audio PLL rate is increased by 32Hz (glitch-free kdiv change)
  - rates for children are recalculated and rates are set recursively
  - imx8m_clk_composite_divider_set_rate(sai5) is called with
    32/16 = 2Hz more
  - imx8m_clk_composite_divider_set_rate computes same divider as before
  - divider register is written, so it restarts counting from zero and
    MCLK is briefly paused, so instead of e.g. 40ns, MCLK is low for 120ns.

Some external clock consumers can be upset by such unexpected clock pauses,
so let's make sure we only rewrite the divider value when the value to be
written is actually different.

Fixes: d3ff972813 ("clk: imx: Add imx composite clock")
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
Link: https://lore.kernel.org/r/20230807082201.2332746-1-a.fatoum@pengutronix.de
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2023-09-13 09:42:47 +02:00
..
clk-busy.c clk: imx: Explicitly include bits.h 2020-08-22 20:36:57 +08:00
clk-composite-7ulp.c clk: imx: Fix the build break when clk-imx8ulp build as module 2021-10-01 10:15:42 +03:00
clk-composite-8m.c clk: imx: composite-8m: fix clock pauses when set_rate would be a no-op 2023-09-13 09:42:47 +02:00
clk-composite-93.c clk: imx: clk-composite-93: check white_list 2022-09-19 13:06:45 +03:00
clk-cpu.c clk: imx: Support building i.MX common clock driver as module 2020-08-22 12:38:20 +08:00
clk-divider-gate.c clk: imx: clk-divider-gate: Switch to clk_divider.determine_rate 2021-08-24 16:09:07 +03:00
clk-fixup-div.c clk: imx: drop redundant initialization 2020-02-17 14:32:32 +08:00
clk-fixup-mux.c clk: imx: Explicitly include bits.h 2020-08-22 20:36:57 +08:00
clk-frac-pll.c clk: imx: Support building i.MX common clock driver as module 2020-08-22 12:38:20 +08:00
clk-fracn-gppll.c clk: imx: fracn-gppll: disable hardware select control 2023-05-11 23:03:34 +09:00
clk-gate-93.c clk: imx: add i.MX93 clk gate 2022-09-19 13:06:45 +03:00
clk-gate-exclusive.c This round of clk driver and framework updates is heavy on the driver update 2019-07-17 10:07:48 -07:00
clk-gate2.c clk: imx: gate2: Remove unused variable ret 2020-11-10 09:08:03 +08:00
clk-imx1.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 336 2019-06-05 17:37:07 +02:00
clk-imx5.c clk: imx: Fix reparenting of UARTs not associated with stdout 2021-04-04 22:39:04 +03:00
clk-imx6q.c clk: imx6q: fix uart earlycon unwork 2021-08-05 18:12:23 -07:00
clk-imx6sl.c clk: imx: Fix reparenting of UARTs not associated with stdout 2021-04-04 22:39:04 +03:00
clk-imx6sll.c clk: imx: Fix reparenting of UARTs not associated with stdout 2021-04-04 22:39:04 +03:00
clk-imx6sx.c clk: imx: imx6sx: remove the SET_RATE_PARENT flag for QSPI clocks 2022-09-28 13:26:16 -07:00
clk-imx6ul.c clk: imx: imx6ul: Fix csi clk gate register 2021-10-01 10:15:51 +03:00
clk-imx7d.c clk: imx: Remove the snvs clock 2022-04-12 13:52:58 +03:00
clk-imx7ulp.c clk: imx: Update the pfdv2 for 8ulp specific support 2021-09-30 16:22:56 +03:00
clk-imx8dxl-rsrc.c clk: imx: Add imx8dxl clk driver 2022-01-29 15:12:07 +02:00
clk-imx8mm.c clk: imx: Remove the snvs clock 2022-04-12 13:52:58 +03:00
clk-imx8mn.c clk: imx: clk-imx8mn: fix memory leak in imx8mn_clocks_probe 2023-07-19 16:21:29 +02:00
clk-imx8mp.c clk: imx8mp: fix sai4 clock 2023-09-13 09:42:47 +02:00
clk-imx8mq.c clk: imx: Remove the snvs clock 2022-04-12 13:52:58 +03:00
clk-imx8qm-rsrc.c clk: imx8qm: add clock valid resource checking 2021-06-14 12:33:22 +03:00
clk-imx8qxp-lpcg.c clk: imx: off by one in imx_lpcg_parse_clks_from_dt() 2022-03-04 17:06:29 +02:00
clk-imx8qxp-lpcg.h clk: imx: add imx8qxp lpcg driver 2018-12-14 13:01:14 -08:00
clk-imx8qxp-rsrc.c clk: imx8qxp: add clock valid checking mechnism 2021-06-14 12:33:19 +03:00
clk-imx8qxp.c clk: imx: Add imx8dxl clk driver 2022-01-29 15:12:07 +02:00
clk-imx8ulp.c clk: imx: imx8ulp: update SPLL2 type 2023-09-13 09:42:47 +02:00
clk-imx25.c clk: imx: Fix reparenting of UARTs not associated with stdout 2021-04-04 22:39:04 +03:00
clk-imx27.c clk: imx: Fix reparenting of UARTs not associated with stdout 2021-04-04 22:39:04 +03:00
clk-imx31.c clk: imx: clk-imx31: Remove unused static const table 'uart_clks' 2021-01-29 21:31:52 +08:00
clk-imx35.c clk: imx: Fix reparenting of UARTs not associated with stdout 2021-04-04 22:39:04 +03:00
clk-imx93.c clk: imx93: Propagate correct error in imx93_clocks_probe() 2023-08-11 12:08:22 +02:00
clk-imxrt1050.c clk: imx: clk-imxrt1050: fix memory leak in imxrt1050_clocks_probe 2023-07-19 16:21:29 +02:00
clk-lpcg-scu.c clk: imx: Reference preceded by free 2021-04-04 22:39:05 +03:00
clk-pfd.c clk: imx: Fix and update kerneldoc 2020-09-07 11:08:50 +08:00
clk-pfdv2.c clk: imx: Fix the build break when clk-imx8ulp build as module 2021-10-01 10:15:42 +03:00
clk-pll14xx.c clk: imx: pll14xx: Support dynamic rates 2022-03-04 17:06:30 +02:00
clk-pllv1.c clk: imx: pllv1: fix kernel-doc notation for struct clk_pllv1 2021-12-02 17:26:40 -08:00
clk-pllv2.c clk: imx: pllv2: Switch to clk_hw based API 2019-12-11 19:19:44 +08:00
clk-pllv3.c clk: imx: Use div64_ul instead of do_div 2021-11-22 15:29:23 +02:00
clk-pllv4.c clk: imx: pllv4: Fix SPLL2 MULT range 2023-09-13 09:42:47 +02:00
clk-scu.c clk: imx: scu: use _safe list iterator to avoid a use after free 2023-07-19 16:21:19 +02:00
clk-scu.h clk: imx: Add imx8dxl clk driver 2022-01-29 15:12:07 +02:00
clk-sscg-pll.c clk: imx: remove redundant re-assignment of pll->base 2022-03-09 10:39:25 -08:00
clk-vf610.c clk: imx: vf610: Add CRC clock 2020-08-23 10:08:35 +08:00
clk.c clk: imx: Add check for kcalloc 2022-04-12 14:00:20 +03:00
clk.h clk: imx: pllv4: Fix SPLL2 MULT range 2023-09-13 09:42:47 +02:00
Kconfig clk: imx: Select MXC_CLK for i.MX93 clock driver 2022-03-15 14:44:46 -07:00
Makefile clk: imx: add i.MX93 clk gate 2022-09-19 13:06:45 +03:00