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_padmaster
commit
6e42454d90
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue