i.MX clock changes for 7.1

- Add optional ENET reference pad clock inputs for i.MX6Q/UL.
 - Fix debug output in PLL14xx driver to use unsigned format specifier.
 - Add 333.333 MHz and 477.4 MHz support to fracn-gppll for display use cases.
 - Fix device node reference leaks in i.MX6 driver.
 - Fix device node reference leak in of_assigned_ldb_sels().
 - Fix ACM clock flags on i.MX8 to prevent SAI sysclk failures.
 - Move VF610_CLK_END define into the driver.
 - Add VF610 Ethernet switch clock support.
 - Correct CSI PHY parent clock selection on i.MX8MQ.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEETvPuEU56jyrKp9G4G19EyQCVFVYFAmnOcAEACgkQG19EyQCV
 FVbQjw/9HyOgC6B8IdrXBcWA/NnPgYTjrYwXEZnS1YCfqvj36jcSmldp6QwpDR2m
 8LedEWn/AW7Qle1nSQcCAP1WBE8Acb/FWWuMVAngAJJ2lTXUiP7LL5kCvSzrKjC6
 ioS7up49Fb2QgXIy1wMgdxT8WC8slNqPwq++k85vWyto8kvjOXMeDl9EWk/y1Vi4
 93dVZT9sFLrmEh95pqJT5+gxslH/847xeuncCO9+Ej7ilaBgDkY07QUE9cubxF0n
 cEErY50wcaq0CCQPOVF16FsO7K1/+Kd19FXNNcGztHjbJjXXwm8xcW1dxCAjdAY8
 0uelk7hhxcK6Me/6LGxYYGQWN4EmmjsiaQtYrQBSqea1bWbOh9jCKajSLOylln4n
 U+2X9eI7duZSIdEj+CVy4qIlNoTsNNsMIpG4fmNkiqMRl9o/S5bRJgwfSY+g/i6b
 aqjkGqespVxohpRorFzL6KjyLLxBDfUyH36SHwOcxwcXRYF0CO78JLzpmuxYQ5R4
 /9n+ezw2i977w2IxsgH5nhzkfZqCSq/g7P10XJKevzZfmWcl/3L2DA1xNBX56hSk
 R4WT6BXRzPApX0PeSzERS53KP994TAGARMQHA3retj7reYXR9ahAhYwb6bLVK6WN
 p6dcUhmAGkdNncjfZz6mEyTxvdv8PD0v0C2eo88DzA7kgWeYHMg=
 =wlXT
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQJIBAABCAAyFiEE9L57QeeUxqYDyoaDrQKIl8bklSUFAmna1lwUHHN3Ym95ZEBj
 aHJvbWl1bS5vcmcACgkQrQKIl8bklSWgYw/9HxHt2ROKW+3Mhp7mVzDIUnRcOS34
 ZX+u/7S+OAeaXcKmzS4HMX2Lqy3Xc/rrCk5LQk0H1oIMEsQsx3uGXJN5teU7XbOj
 tgXy1p8/J4Cceb14pq66QcLxcCg1oeYi4KSLBRr+atHHuTIndID3dYqPNGmklzbb
 FziJG7biTL5U2JCLfbJwTHwjo6XqGZfT7evwYcuQntJj9JHyb9eqpHHqcvNUHK3F
 cXV7Or8pfnz6pXTUdPoceyYu/VJYarg7igdrY3TweigAVA+cWCe05VEwqkE7thN8
 Ou4PYEUlDkKm5aM+pU28qO57qnogvZlLSLi+eF5+ntXTqpRGipBOG6+QVE3V/pCi
 6NkmCMzyg+ihCTOzKk9zTunT/V0BNSXiHQ2MoiQgMWEqUSntxa6j5H1JLQUoM9ft
 Re4r9aX9CuFs1IFm+APrNwpPUl+V7VCQDQHEY+vNhHZlbTnSKCPewG8q9bd24mB/
 LgZ0rgtGO7IQA3J8Af6nuLzBljnLtFxTze5X4BYqUebiVrVXfeb0WlI1A3SdBZN+
 vHjHRctOaFehAwk8TZNWgRJie+pH31EclO3XLOYiJHzYGAjE4ePpsoxyMBonJB3M
 Vp613vbJwa1mdBwS7cIkDen4vjEl62Wk34k6LsfGiGycvFeelLvu6fTFn740XqnL
 blb4oRviOBbfquw=
 =M1uL
 -----END PGP SIGNATURE-----

Merge tag 'clk-imx-7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux into clk-imx

Pull i.MX clock driver updates from Abel Vesa:

 - Add optional ENET reference pad clock inputs for i.MX6Q/UL
 - Fix debug output in PLL14xx driver to use unsigned format specifier
 - Add 333.333 MHz and 477.4 MHz support to fracn-gppll for display use cases
 - Fix device node reference leaks in i.MX6 driver
 - Fix device node reference leak in of_assigned_ldb_sels()
 - Fix ACM clock flags on i.MX8 to prevent SAI sysclk failures
 - Move VF610_CLK_END define into the driver
 - Add VF610 Ethernet switch clock support
 - Correct CSI PHY parent clock selection on i.MX8MQ

* tag 'clk-imx-7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux:
  clk: imx8mq: Correct the CSI PHY sels
  clk: vf610: Add support for the Ethernet switch clocks
  dt-bindings: clock: vf610: Add definitions for MTIP L2 switch
  dt-bindings: clock: vf610: Drop VF610_CLK_END define
  clk: vf610: Move VF610_CLK_END define to clk-vf610 driver
  clk: imx: imx8-acm: fix flags for acm clocks
  clk: imx: imx6q: Fix device node reference leak in of_assigned_ldb_sels()
  clk: imx: imx6q: Fix device node reference leak in pll6_bypassed()
  clk: imx: fracn-gppll: Add 477.4MHz support
  clk: imx: fracn-gppll: Add 333.333333 MHz support
  clk: imx: pll14xx: Use unsigned format specifier
  dt-bindings: clock: imx6q[ul]-clock: add optional clock enet[1]_ref_pad
master
Stephen Boyd 2026-04-11 16:16:10 -07:00
commit 6e42454d90
9 changed files with 45 additions and 8 deletions

View File

@ -29,20 +29,24 @@ properties:
const: 1
clocks:
minItems: 5
items:
- description: 24m osc
- description: 32k osc
- description: ckih1 clock input
- description: anaclk1 clock input
- description: anaclk2 clock input
- description: clock input from enet ref pad
clock-names:
minItems: 5
items:
- const: osc
- const: ckil
- const: ckih1
- const: anaclk1
- const: anaclk2
- const: enet_ref_pad
fsl,pmic-stby-poweroff:
$ref: /schemas/types.yaml#/definitions/flag

View File

@ -29,18 +29,22 @@ properties:
const: 1
clocks:
minItems: 4
items:
- description: 32k osc
- description: 24m osc
- description: ipp_di0 clock input
- description: ipp_di1 clock input
- description: clock input from enet1 ref pad
clock-names:
minItems: 4
items:
- const: ckil
- const: osc
- const: ipp_di0
- const: ipp_di1
- const: enet1_ref_pad
required:
- compatible

View File

@ -85,9 +85,11 @@ static const struct imx_fracn_gppll_rate_table fracn_tbl[] = {
PLL_FRACN_GP(519750000U, 173, 25, 100, 1, 8),
PLL_FRACN_GP(498000000U, 166, 0, 1, 0, 8),
PLL_FRACN_GP(484000000U, 121, 0, 1, 0, 6),
PLL_FRACN_GP(477400000U, 119, 35, 100, 0, 6),
PLL_FRACN_GP(445333333U, 167, 0, 1, 0, 9),
PLL_FRACN_GP(400000000U, 200, 0, 1, 0, 12),
PLL_FRACN_GP(393216000U, 163, 84, 100, 0, 10),
PLL_FRACN_GP(333333333U, 125, 0, 1, 1, 9),
PLL_FRACN_GP(332600000U, 138, 584, 1000, 0, 10),
PLL_FRACN_GP(300000000U, 150, 0, 1, 0, 12),
PLL_FRACN_GP(241900000U, 201, 584, 1000, 0, 20),

View File

@ -188,9 +188,11 @@ static void of_assigned_ldb_sels(struct device_node *node,
}
if (clkspec.np != node || clkspec.args[0] >= IMX6QDL_CLK_END) {
pr_err("ccm: parent clock %d not in ccm\n", index);
of_node_put(clkspec.np);
return;
}
parent = clkspec.args[0];
of_node_put(clkspec.np);
rc = of_parse_phandle_with_args(node, "assigned-clocks",
"#clock-cells", index, &clkspec);
@ -198,9 +200,11 @@ static void of_assigned_ldb_sels(struct device_node *node,
return;
if (clkspec.np != node || clkspec.args[0] >= IMX6QDL_CLK_END) {
pr_err("ccm: child clock %d not in ccm\n", index);
of_node_put(clkspec.np);
return;
}
child = clkspec.args[0];
of_node_put(clkspec.np);
if (child != IMX6QDL_CLK_LDB_DI0_SEL &&
child != IMX6QDL_CLK_LDB_DI1_SEL)
@ -238,8 +242,11 @@ static bool pll6_bypassed(struct device_node *node)
return false;
if (clkspec.np == node &&
clkspec.args[0] == IMX6QDL_PLL6_BYPASS)
clkspec.args[0] == IMX6QDL_PLL6_BYPASS) {
of_node_put(clkspec.np);
break;
}
of_node_put(clkspec.np);
}
/* PLL6 bypass is not part of the assigned clock list */
@ -249,6 +256,9 @@ static bool pll6_bypassed(struct device_node *node)
ret = of_parse_phandle_with_args(node, "assigned-clock-parents",
"#clock-cells", index, &clkspec);
if (!ret)
of_node_put(clkspec.np);
if (clkspec.args[0] != IMX6QDL_CLK_PLL6)
return true;

View File

@ -371,7 +371,8 @@ static int imx8_acm_clk_probe(struct platform_device *pdev)
for (i = 0; i < priv->soc_data->num_sels; i++) {
hws[sels[i].clkid] = devm_clk_hw_register_mux_parent_data_table(dev,
sels[i].name, sels[i].parents,
sels[i].num_parents, 0,
sels[i].num_parents,
CLK_SET_RATE_NO_REPARENT,
base + sels[i].reg,
sels[i].shift, sels[i].width,
0, NULL, NULL);

View File

@ -237,7 +237,7 @@ static const char * const imx8mq_dsi_esc_sels[] = {"osc_25m", "sys2_pll_100m", "
static const char * const imx8mq_csi1_core_sels[] = {"osc_25m", "sys1_pll_266m", "sys2_pll_250m", "sys1_pll_800m",
"sys2_pll_1000m", "sys3_pll_out", "audio_pll2_out", "video_pll1_out", };
static const char * const imx8mq_csi1_phy_sels[] = {"osc_25m", "sys2_pll_125m", "sys2_pll_100m", "sys1_pll_800m",
static const char * const imx8mq_csi1_phy_sels[] = {"osc_25m", "sys2_pll_333m", "sys2_pll_100m", "sys1_pll_800m",
"sys2_pll_1000m", "clk_ext2", "audio_pll2_out", "video_pll1_out", };
static const char * const imx8mq_csi1_esc_sels[] = {"osc_25m", "sys2_pll_100m", "sys1_pll_80m", "sys1_pll_800m",
@ -246,7 +246,7 @@ static const char * const imx8mq_csi1_esc_sels[] = {"osc_25m", "sys2_pll_100m",
static const char * const imx8mq_csi2_core_sels[] = {"osc_25m", "sys1_pll_266m", "sys2_pll_250m", "sys1_pll_800m",
"sys2_pll_1000m", "sys3_pll_out", "audio_pll2_out", "video_pll1_out", };
static const char * const imx8mq_csi2_phy_sels[] = {"osc_25m", "sys2_pll_125m", "sys2_pll_100m", "sys1_pll_800m",
static const char * const imx8mq_csi2_phy_sels[] = {"osc_25m", "sys2_pll_333m", "sys2_pll_100m", "sys1_pll_800m",
"sys2_pll_1000m", "clk_ext2", "audio_pll2_out", "video_pll1_out", };
static const char * const imx8mq_csi2_esc_sels[] = {"osc_25m", "sys2_pll_100m", "sys1_pll_80m", "sys1_pll_800m",

View File

@ -151,7 +151,7 @@ static void imx_pll14xx_calc_settings(struct clk_pll14xx *pll, unsigned long rat
/* First try if we can get the desired rate from one of the static entries */
tt = imx_get_pll_settings(pll, rate);
if (tt) {
pr_debug("%s: in=%ld, want=%ld, Using PLL setting from table\n",
pr_debug("%s: in=%lu, want=%lu, Using PLL setting from table\n",
clk_hw_get_name(&pll->hw), prate, rate);
t->rate = tt->rate;
t->mdiv = tt->mdiv;
@ -173,7 +173,7 @@ static void imx_pll14xx_calc_settings(struct clk_pll14xx *pll, unsigned long rat
if (rate >= rate_min && rate <= rate_max) {
kdiv = pll1443x_calc_kdiv(mdiv, pdiv, sdiv, rate, prate);
pr_debug("%s: in=%ld, want=%ld Only adjust kdiv %ld -> %d\n",
pr_debug("%s: in=%lu, want=%lu Only adjust kdiv %ld -> %d\n",
clk_hw_get_name(&pll->hw), prate, rate,
FIELD_GET(KDIV_MASK, pll_div_ctl1), kdiv);
fout = pll14xx_calc_rate(pll, mdiv, pdiv, sdiv, kdiv, prate);
@ -211,7 +211,7 @@ static void imx_pll14xx_calc_settings(struct clk_pll14xx *pll, unsigned long rat
}
}
found:
pr_debug("%s: in=%ld, want=%ld got=%d (pdiv=%d sdiv=%d mdiv=%d kdiv=%d)\n",
pr_debug("%s: in=%lu, want=%lu got=%u (pdiv=%d sdiv=%d mdiv=%d kdiv=%d)\n",
clk_hw_get_name(&pll->hw), prate, rate, t->rate, t->pdiv, t->sdiv,
t->mdiv, t->kdiv);
}

View File

@ -11,6 +11,13 @@
#include "clk.h"
/*
* The VF610_CLK_END corresponds to ones defined in
* include/dt-bindings/clock/vf610-clock.h
* It shall be the value of the last defined clock +1
*/
#define VF610_CLK_END 196
#define CCM_CCR (ccm_base + 0x00)
#define CCM_CSR (ccm_base + 0x04)
#define CCM_CCSR (ccm_base + 0x08)
@ -313,6 +320,11 @@ static void __init vf610_clocks_init(struct device_node *ccm_node)
clk[VF610_CLK_ENET_TS] = imx_clk_gate("enet_ts", "enet_ts_sel", CCM_CSCDR1, 23);
clk[VF610_CLK_ENET0] = imx_clk_gate2("enet0", "ipg_bus", CCM_CCGR9, CCM_CCGRx_CGn(0));
clk[VF610_CLK_ENET1] = imx_clk_gate2("enet1", "ipg_bus", CCM_CCGR9, CCM_CCGRx_CGn(1));
clk[VF610_CLK_ESW] = imx_clk_gate2("esw", "ipg_bus", CCM_CCGR10, CCM_CCGRx_CGn(8));
clk[VF610_CLK_ESW_MAC_TAB0] = imx_clk_gate2("esw_tab0", "ipg_bus", CCM_CCGR10, CCM_CCGRx_CGn(12));
clk[VF610_CLK_ESW_MAC_TAB1] = imx_clk_gate2("esw_tab1", "ipg_bus", CCM_CCGR10, CCM_CCGRx_CGn(13));
clk[VF610_CLK_ESW_MAC_TAB2] = imx_clk_gate2("esw_tab2", "ipg_bus", CCM_CCGR10, CCM_CCGRx_CGn(14));
clk[VF610_CLK_ESW_MAC_TAB3] = imx_clk_gate2("esw_tab3", "ipg_bus", CCM_CCGR10, CCM_CCGRx_CGn(15));
clk[VF610_CLK_PIT] = imx_clk_gate2("pit", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(7));

View File

@ -197,6 +197,10 @@
#define VF610_CLK_TCON1 188
#define VF610_CLK_CAAM 189
#define VF610_CLK_CRC 190
#define VF610_CLK_END 191
#define VF610_CLK_ESW 191
#define VF610_CLK_ESW_MAC_TAB0 192
#define VF610_CLK_ESW_MAC_TAB1 193
#define VF610_CLK_ESW_MAC_TAB2 194
#define VF610_CLK_ESW_MAC_TAB3 195
#endif /* __DT_BINDINGS_CLOCK_VF610_H */