From: Laurent Pinchart laurent.pinchart@ideasonboard.com
[ Upstream commit 65673c6e33cf46f220cc5774166b373b3c087739 ]
The imx-mipi-csis driver sets the rate of the wrap clock to the value specified in the device tree's "clock-frequency" property, and defaults to 166 MHz otherwise. This is a historical mistake, as clock rate selection should have been left to the assigned-clock-rates property.
Honouring the clock-frequency property can't be removed without breaking backwards compatibility, and the corresponding code isn't very intrusive. The 166 MHz default, on the other hand, prevents configuration of the clock rate through assigned-clock-rates, as the driver immediately overwrites the rate. This behaviour is confusing and has cost debugging time.
There is little value in a 166 MHz default. All mainline device tree sources that enable the CSIS specify a clock-frequency explicitly, and the default wrap clock configuration on supported platforms is at least as high as 166 MHz. Drop the default, and only set the clock rate manually when the clock-frequency property is specified.
Link: https://lore.kernel.org/r/20250822002734.23516-10-laurent.pinchart@ideasonbo... Signed-off-by: Laurent Pinchart laurent.pinchart@ideasonboard.com Reviewed-by: Frank Li Frank.Li@nxp.com Signed-off-by: Hans Verkuil hverkuil+cisco@kernel.org Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
YES
Why this is a bug fix - The driver unconditionally forced the wrap clock to 166 MHz when the DT lacked a clock-frequency property, which overrides DT-assigned clock rates. That breaks the expected DT model where `assigned-clock- rates` controls rates, leading to misconfiguration and hard-to-debug behavior. - This change stops overriding the clock unless the DT explicitly requests it, restoring correct DT semantics.
What changed (code references) - Set rate only when explicitly requested: - `drivers/media/platform/nxp/imx-mipi-csis.c:744` now guards `clk_set_rate()` with `if (csis->clk_frequency) { ... }`, meaning the driver only sets the rate when the DT provided `clock- frequency`. - Drop the 166 MHz fallback: - `drivers/media/platform/nxp/imx-mipi-csis.c:1483` now reads `clock- frequency` without assigning a default if the property is absent, removing the prior implicit 166 MHz default. - The removal of the default macro and fallback behavior eliminates the unconditional override while preserving backward compatibility for DTs that do specify `clock-frequency`.
Why it matters (user impact) - Systems using `assigned-clock-rates` in DT were previously ignored by the driver due to the unconditional 166 MHz set, causing unexpected clock rates and potential functional issues. - With this patch, DT-provided assigned rates take effect unless a legacy DT explicitly uses `clock-frequency`, which is retained for compatibility.
Risk and compatibility - Scope is small and contained to one driver; no core or architectural changes. - Backward compatibility is preserved for legacy DTs that specify `clock-frequency` (the driver still sets the rate in that case). - For DTs without `clock-frequency`, the driver no longer forces 166 MHz and leaves the rate to the clock framework/DT assignments. The commit rationale notes that all mainline DTs enabling CSIS already specify `clock-frequency`, and default platform wrap clock configurations are at least as high as 166 MHz, reducing regression risk. - The only functional behavior change is the removal of an incorrect default that masked DT configuration.
Stable criteria assessment - Fixes a real misbehavior that affects users (DT `assigned-clock-rates` ignored). - Minimal, well-contained change in a single driver file. - No new features or architectural changes. - Low regression risk with explicit consideration for legacy DT compatibility. - No explicit “Cc: stable” or “Fixes” tag, but technically aligns with stable policy as a correctness fix that removes a problematic default override.
Conclusion - This is a clear, low-risk bug fix that restores proper DT semantics and prevents the driver from clobbering assigned clock rates. It should be backported to stable.
drivers/media/platform/nxp/imx-mipi-csis.c | 23 +++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c index 2beb5f43c2c01..cea017a2b14ec 100644 --- a/drivers/media/platform/nxp/imx-mipi-csis.c +++ b/drivers/media/platform/nxp/imx-mipi-csis.c @@ -228,8 +228,6 @@ #define MIPI_CSIS_PKTDATA_EVEN 0x3000 #define MIPI_CSIS_PKTDATA_SIZE SZ_4K
-#define DEFAULT_SCLK_CSIS_FREQ 166000000UL - struct mipi_csis_event { bool debug; u32 mask; @@ -704,12 +702,17 @@ static int mipi_csis_clk_get(struct mipi_csis_device *csis) if (ret < 0) return ret;
- /* Set clock rate */ - ret = clk_set_rate(csis->clks[MIPI_CSIS_CLK_WRAP].clk, - csis->clk_frequency); - if (ret < 0) - dev_err(csis->dev, "set rate=%d failed: %d\n", - csis->clk_frequency, ret); + if (csis->clk_frequency) { + /* + * Set the clock rate. This is deprecated, for backward + * compatibility with old device trees. + */ + ret = clk_set_rate(csis->clks[MIPI_CSIS_CLK_WRAP].clk, + csis->clk_frequency); + if (ret < 0) + dev_err(csis->dev, "set rate=%d failed: %d\n", + csis->clk_frequency, ret); + }
return ret; } @@ -1413,9 +1416,7 @@ static int mipi_csis_parse_dt(struct mipi_csis_device *csis) { struct device_node *node = csis->dev->of_node;
- if (of_property_read_u32(node, "clock-frequency", - &csis->clk_frequency)) - csis->clk_frequency = DEFAULT_SCLK_CSIS_FREQ; + of_property_read_u32(node, "clock-frequency", &csis->clk_frequency);
return 0; }