summaryrefslogtreecommitdiff
path: root/arch/arm/mach-imx
diff options
context:
space:
mode:
authorMax Krummenacher <max.krummenacher@toradex.com>2016-03-01 16:05:30 +0100
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2018-12-13 10:22:56 +0100
commitb309df81e26a6ca144429706603a2f4e9880f618 (patch)
treeb9da31e5ac88e579a4677450b03b339d77a6a72c /arch/arm/mach-imx
parent7b115b100eefdcf224f6f4b0cf8ee7c0f1f66ae1 (diff)
mach-imx7d.c: use enet_out clk to decide on PHY clock
The i.MX 7 can provide a reference clock to the PHY or use a reference clock from an external circuit. If the device-tree node with compatible "fsl,imx7d-fec" has a clock named enet_out then provide the clock from the i.MX 7, if such a clock is missing use a clock provided from an external circuit. Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com> Signed-off-by: Stefan Agner <stefan.agner@toradex.com> (cherry picked from commit 73c06d69321c45b69ffc864cbaaa7143da87d186) (cherry picked from commit d46df0826a9f948f05b71da80aa9397cb9337537)
Diffstat (limited to 'arch/arm/mach-imx')
-rw-r--r--arch/arm/mach-imx/mach-imx7d.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/arch/arm/mach-imx/mach-imx7d.c b/arch/arm/mach-imx/mach-imx7d.c
index cfdef8a09aee..36d5954fc353 100644
--- a/arch/arm/mach-imx/mach-imx7d.c
+++ b/arch/arm/mach-imx/mach-imx7d.c
@@ -5,6 +5,7 @@
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
+#include <linux/clk.h>
#include <linux/irqchip.h>
#include <linux/mfd/syscon.h>
#include <linux/mfd/syscon/imx7-iomuxc-gpr.h>
@@ -93,15 +94,38 @@ static void __init imx7d_enet_mdio_fixup(void)
static void __init imx7d_enet_clk_sel(void)
{
+ struct device_node *np;
+ struct clk *enet_out_clk;
struct regmap *gpr;
+ np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-fec");
+ if (!np) {
+ pr_warn("%s: failed to find fec node\n", __func__);
+ return;
+ }
+
+ enet_out_clk = of_clk_get_by_name(np, "enet_out");
+
gpr = syscon_regmap_lookup_by_compatible("fsl,imx7d-iomuxc-gpr");
+
if (!IS_ERR(gpr)) {
- regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_TX_CLK_SEL_MASK, 0);
- regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_CLK_DIR_MASK, IMX7D_GPR1_ENET1_CLK_DIR_MASK);
+ if (IS_ERR(enet_out_clk)) {
+ pr_info("%s: failed to get enet_out clock, assuming ext. clock source\n", __func__);
+ /* use external clock for PHY */
+ regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_TX_CLK_SEL_MASK, IMX7D_GPR1_ENET_TX_CLK_SEL_MASK);
+ regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_CLK_DIR_MASK, 0);
+ } else {
+ pr_info("%s: found enet_out clock, assuming internal clock source\n", __func__);
+ /* use internal clock generation and output it to PHY */
+ regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_TX_CLK_SEL_MASK, 0);
+ regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_CLK_DIR_MASK, IMX7D_GPR1_ENET1_CLK_DIR_MASK);
+ clk_put(enet_out_clk);
+
+ }
} else {
pr_err("failed to find fsl,imx7d-iomux-gpr regmap\n");
}
+ of_node_put(np);
}
static inline void imx7d_enet_init(void)