From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754710AbcJUIyD (ORCPT ); Fri, 21 Oct 2016 04:54:03 -0400 Received: from mail-by2nam01on0076.outbound.protection.outlook.com ([104.47.34.76]:60960 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932308AbcJUIxz (ORCPT ); Fri, 21 Oct 2016 04:53:55 -0400 X-Greylist: delayed 3628 seconds by postgrey-1.27 at vger.kernel.org; Fri, 21 Oct 2016 04:53:55 EDT Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; From: Octavian Purdila To: CC: Shawn Guo , Sascha Hauer , Fabio Estevam , , Fugang Duan , Fugang Duan , Octavian Purdila Subject: [PATCH 2/2] ARM: imx: init enet MAC address from ocotp Date: Fri, 21 Oct 2016 10:18:21 +0300 Message-ID: <1477034301-26579-3-git-send-email-octavian.purdila@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1477034301-26579-1-git-send-email-octavian.purdila@nxp.com> References: <1477034301-26579-1-git-send-email-octavian.purdila@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131215080661694190;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(5003940100001)(11100500001)(92566002)(6916009)(33646002)(68736007)(48376002)(50466002)(104016004)(8936002)(50226002)(85426001)(87936001)(97736004)(77096005)(50986999)(586003)(2950100002)(36756003)(106466001)(81156014)(81166006)(19580395003)(575784001)(6666003)(8676002)(626004)(2351001)(47776003)(76176999)(4326007)(105606002)(356003)(8666005)(305945005)(86362001)(5660300001)(19580405001)(7846002)(189998001)(2906002)(110136003)(229853001)(7059030);DIR:OUT;SFP:1101;SCL:1;SRVR:BY2PR0301MB1624;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11OLC001;1:EGLDTgcBcHXiQRypud6/V0e/8E0PQhdPRnbDh2Z2Owr8bCnbDpdooq2GGsmPU4e+SYPwhhnoSSX9Ht7dR2EdZLZFAvUpNLJuwkmSq9j+AtMMC3Bjod3oi9kqSI63pJXSKaEv62DE0aj53NWZVea8pjUNM8SEyFNbmwky00Z++Zgc3IcAHsW1DL5HilLo2M1Hg6TBdjbWRkTqM2Vv/J7WZAwapM1Cmn/hvJXpm5Le4DHwfgphI+Ut4qmwv114lwC0o/PBI6qjBC217xs+j3YgPLCuGvHOrWNOmZivkQzW33sP8ozd+92SuqpFfAFM8n+Lq4PZstdG/eL1kRfePvDCbqLMfFATzEs3lVtWJY4ORtKLm5sAPXRFclpIFcPnfOlMofsr4B+Ts2gYcplngj7z7Z7t8/d/adO/lG8JdxOprlyoaah4HoFGc/b2WtbRzBVjhkmaRHI5E4ZllJVs/wLrg3wHLRlAYgEbEfeMFsjGn3NNs4Fe5D4OSS7+0h6NIaTpbTavRBTSYbLj/bLQgMC95meypm9CFxTr5GoqiETHpbgqc/uUhx/D0k1+X6t8UMNCZGg3jxusEjBx0R4f6wJ+GlDrcjUDsLS1/jh2PGIe5I3Z6L96FzcKLqphUO2tukP7nMawxHfvhfZelKGzbA+MDF0IUcTNk2Nprgof/LkGrKdnQObNRho6O9KThQlBwz1lPDjWlEA91fJSdAsJPv7uftCXKw1fQF4zm1QgHXbw5NA= MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: dbcb7533-8554-48d0-558f-08d3f982d278 X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB1624;2:qe1ZCS+v0618fX4W45nodl1ng3LzISIMcoMwxtE0l7gv1ufs9ntP0tBMYDDArZmnlMbh3UKctIGr7cvHSmElY2b+iLFPq27cseiM2khef1uS3sQkgbL35SDISNSEV8WfpNJI+r02IMjOrtLjATcnz8xa9rahGscctvTm99Xyw1mo8LFIjtWCF/j77X3HoUQhRtAsx0q89eFbHf3L4Rwghw==;3:GMlodCSd2ZARoQX/fSSsJwhid7c8SzZ6BcPV2Dp3B9fc69p8oFP//A88GRIIcbGxJFknTbzAv2RMdk0mGdAArLvUtxpX4Kmy0wo/eNvEh4jsuCyDuCSn5laj2WdJZbFPhCAVvjKea84a4Hcj+ZtjjmBlcL8yWBfZAy6UV0V1bdN7fWJt+yIfC5+hyIG04m1B4gKQ7ffSygIRCd7JTVVLeesrbB87Th+/H+u+Yd3LGXwR47Pi8WviidNWP4fwbJBq X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR0301MB1624; X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB1624;25:dC42d8Dl+Tk/1foNHanwC8WbeopqdkdlRNxsAffZJVU1d6ApDyDrl5DGAOadJvFEz4ffVGP8YcImIV8+zvBcPaaaBy0XWxF2SV3cDaSMrQ/Ce5JNAVh3u3jDkiX/mY2qXQ2RXsSZr9/9F19DLR5BAZZg5SCFb2bHnpOMEfHXF+XEJctVuCo6ZWr5CATGDTHpgrs4PkNHbKREjX9KAcNPAHTtE4Z0pRLtuw1rfDcvdVzZszAbVvFe1In3A5rSv2ZC9I8dXMyBQdQZ6pe9hNdmc+7jtjvDp8wVX5R0plcBxXBROL76sIgOhnB5gfTskjF5ZclsWhVZmHY1dlJ6R7/YSmrYJao1lQJXrc5wuCTzvxF7r4yZ01CBCeSzsd64J2GjzF6U7MxyIcugGkuK6ruc7Iqe1r+XJ/uvEOQQ5aZt/bAfnrOF3ThRovaD8a37AD7IQA13Onh0WmtKI8ToX0/N1S17g8f7V7grn3bzltm9BbwqnkRmSC0Bh6077xXOUiaHmXvbiNbM4mLgg78O9rJGG6nalZmTLLej3iBAOd+SNSwFyJ+um+ch2ZaquB3Ss9fVpjK7fWwqLgDAX9LWEwehEfAelnEg4JVChnnImMs49Gwo8Mdro6IP0BUhhQzq64vl6hVIaPRd3bQbN+5xQb/eUk58v6BiWU7lwafy61ibxit9hAItYKIGsZmyAxBKUXbFFSweYnogtuigVpkr5c/2WPuODqnYfoR8tPfZ3qn+BSNjVUqUKbwM0Sr/JyTr97ht48clwBb9ZJmAWnU7UcbMrg== X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB1624;31:Aank7UmEB6svUeMXVGuwTn+obmRw6Y2ybVziM4EwD7gSsHGUw9m+3hxzlvpn2i9FLrxKIoJqB+BzpcvK6KSwM1SFTpuwMj20PI7xH2MVM39bmwpAWYE7JIzqpsnXPQxOOUquoYMulqMb+7ySCrKOe7en3FDTGp560MUOqOWDs48zwIUNH1mNvFhSxioelIvTeGvDy9VnrvL+1JezlKvpIxrf3V8r1n1qHyuF5cxsSosI+VZAR3mXBsltCiTk0ZmmS+Ouc/RrT81og/ZDFxLt0w==;4:0K+R3Dn+gyEuYuQ8PyTQV9i9WpGDcqC4bFE4xFZeJemE6JlZgtRV8V203w4JEt2FfDLMZNU2qk8urPEH6vK7Fkx98XDQzLi23aJdsT50jBjM3FY+pX0K17YKjOpY5cpl4kUD+2b0fRfzeU3DdxM69ZZAyg9lUI7nHvhun5k24/tdk1jQHBTEJ2uBqyQDttBDP3+dgiwc/tjWUMeXRj2J6lsJliKeZ0Vng3UR9b73iGUVeM8LTDxhPIGPv+A2E3U2Th05mjGbGH7FFEBJbMueBymLgdGzxRQ7Un6FNwZlRosjSQFfRuymHqeUS+5JDED8LjIK0yqFaSig1TAuWtXzggbqTkXFbS5+wjvsHWgMjTRrQAtOgvDwGIYBkZlqqdY3CfkQ9+Ywc3Y3A6BSZkTt7TKwiiCwwIPA3ecR1KGF/2dlb/V07ocaP3DxYBfTR+nyFQxloorabY280Vk18caVeiDE8UUeyDvw+d9E0MiA5bIRsvdVRUmBLiLAIFBzP5wFHkulzwASKhdnxtJDEitkagcAsRPFMxQMy5R8KFuGOKEFxV8uocGFvIxJEq+64SgkNrp9CyrnUUfKyyIzZ0KTsg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(13023025)(13018025)(13017025)(13024025)(13015025)(3002001)(10201501046)(6055026);SRVR:BY2PR0301MB1624;BCL:0;PCL:0;RULEID:(400006);SRVR:BY2PR0301MB1624; X-Forefront-PRVS: 01026E1310 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR0301MB1624;23:QyCLiMeyZ3WpnmXOSPhIgx4bKylMpYvjb0zEpuh?= =?us-ascii?Q?Ull0PycWq43sEJAmVzauJHy7efayOxF2WAiyzyWyF+W7RTwjItSJRvRaPJvX?= =?us-ascii?Q?GkHMEWG1wAmQUHBhpyZicCkPP7FICmnMC3E34VthzaVbZSGJh/DLn4HYFMYh?= =?us-ascii?Q?3oNuNYT5V0lPZGkKNc+g0d+WDeouvI2HIx5C4iwzXc2kIUNis6QJiZGWK7IO?= =?us-ascii?Q?/Mz6zJmQmzvbrsmjluKBcg4BmYSozJEIWhguSFYQe3/Z1SSG2jkLrf3WgGA1?= =?us-ascii?Q?6QuKy0MPeGcmfi3x26Guuxyh+MxW2DnMlHvSNgF2zndHJ6Ht6KJx0BxqRZIh?= =?us-ascii?Q?SZ0/UKCHru8BkkWR9Z9C5dMLHXLdgLRw/dy5oHrYNj6/yot16Trf/2MrrLLK?= =?us-ascii?Q?6dND42t71Iwe3La6R/PXD7cuN7pICDSjdXYjdmT3yRdkvPFPLKvtdp6zVuU7?= =?us-ascii?Q?frFWldQHEHTx9PlQt0c0cANlna+5qvXySuptDzxLvdlYdZkmwkuAMxAUonp5?= =?us-ascii?Q?85DMj4XmiCXDuyFwX+AKTMmHlAnrfNFD1p7vEm5f/4ptr5uYBtwiEZFfkvau?= =?us-ascii?Q?me8Qqm6lm9oF+j2DbwvQloXSB8VeFbyNlF/rvrV/l5bPQE2fi13+hPA7qFbs?= =?us-ascii?Q?jZ4OIqv/6BQMA7YsEAULg52XSGI85PsOV2er8mWcEr7SVlgcTDXOAxwuaSzC?= =?us-ascii?Q?u0gr93ZZURYPHvE2lzTc3e7YGUG3jici+y4tMpjtnyTMki+y9mn0nNXLAJE4?= =?us-ascii?Q?PmiS7w8r6KQe/Cw5xP/w3h/SM7XNrgr7W0W7l3Q6peSvlu6OC9nTpEyqRhKs?= =?us-ascii?Q?zc9Qc8eWgwZaRv+a+nh1QF/yFYXXbMJNuvuY/eXpiIPpXonPTJvsdhx12YRG?= =?us-ascii?Q?rAycNU4qxdEYrytRT4Zrpnnbt1IkMhfanL8bCnPOvskRHAWo4WBvFItZotJl?= =?us-ascii?Q?BgkPZrQvsSocqk0VnKknD6gUEshV5CA3Zlw4lUImHuIdD4/PpwlOF4dNQYZk?= =?us-ascii?Q?evtkiU07xtZ2LpybXXU2RiiM2JTOabtHvJY8rQ5oewlJ9OG8sp+MYgYGAg39?= =?us-ascii?Q?Q27UBCiGoNW8Q8YoigWa7vQ6YOU5X7+Zj5Jfd9xrCFo9QWtYZp4o4vWAvurD?= =?us-ascii?Q?ga6F1mD+4fEdg1o5SAsCqvntwjuqxAA1mWo0sqAMSsxKWUKqYPAfWJyMwwYH?= =?us-ascii?Q?Ejsb6uTPko7bQEA0JVRU3piMw7u64zma1Iq454xVNxkQ+24ULmIIz+RcdpA?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB1624;6:xBLlbCetyiWR1yHoA7g+rXoM9pClByyhuGLb0NfaMD7VTXuEg3YcwqWyz4qq0XE52AiMNMOGjF8CQxgCkCl3OLwGdAceA0qeuvoT7lUy1rieWFtDUuaojL3AD7GDX+1u0I6hb1DWHRUCURM7nmEo7yaNQS2WvLZukpw7Zs7Gwymr6/qTNmoj9tht3zk4Ci29obyxcKHwoPqtCihydzejG6l9VFzH3anNNtLQgkiOSf4L6qi78N4x15AutwFpIQEJKhWswZlo9bsKCSvqSMo/0LeJsl3n25BALQ+0VBHJWSXxphYYkO5GD10EPPC68/X0;5:NcYegAg6Lo2Sdu0nn6ni9wGzhVCtai5I6eQpFGFFo/lqrG4gN5iIBYH+UyZ6qB37B8w9aHQDt7VKNniajkLKMZusSpeyKmWHhVPWBQ7j6Z4vduC/U7mDE97oVSMyAoIXpsmYSWFQP4jufB4EGELF+ia6YPf7Uleufm878xF9b+qGtSwVfSo5tisSkGBY24xV;24:VyENQTnhFGhHhjcvOFLTZlOag+ZlqLzrxGyHJErrsjgJiLxMnwGJXn4iSdn1YlOX1yd8PIDMIaWITnWN8uESlsyKMAmREwaATphlJAxoYuo= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB1624;7:0wrIIChSbwTXembrTLJLc518Ndgli9B9en0tyZLrJ0lYRIaSlRHuMQiIvlnBiGibRBiAlQC9Z7oMFRyGHfmtiJpGDfcLu6ymgjjg2Bnv3Xhwy4FeY0kdmXQlS0dTOcDnM1UySJgtcJ6AUnSIObgS6ZqWKHoNn2f54f4bPJxXoKznUbMkLno8IgZrWTYM0dM0LiDpqveOzu3sc1PvfxqYblp9ygM/YJtajTs6vnFYpFaMef53SmL1XxUWkg+nYcQYwKGwtmbDK/HMXvmR/ruDms8zo8y+iNSLFgXNv53z5XF0dVD+/r32KRD0cfmpM5zIkhRCeTRjwoL9a7ErbXvR3ufQvmIKuLKS8MJdQRL7FNc= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Oct 2016 07:21:05.9354 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR0301MB1624 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Fugang Duan The FEC driver advertises the following order of getting it's MAC address: module parameters or kernel command line first, then device tree, then fuse / flash, then mac registers set by bootloader, then random MAC address. This patch add support for fuse MAC address for imx6/7 by updating the device tree fec entry with a MAC address from OCOTP, if none is set. Signed-off-by: Fugang Duan [Octavian: move to ocotp file, squash imx7d fix] Signed-off-by: Octavian Purdila --- arch/arm/mach-imx/common.h | 1 + arch/arm/mach-imx/mach-imx6q.c | 12 +++++-- arch/arm/mach-imx/mach-imx6sl.c | 11 +++++-- arch/arm/mach-imx/mach-imx6sx.c | 1 + arch/arm/mach-imx/mach-imx7d.c | 1 + arch/arm/mach-imx/ocotp.c | 73 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 6 deletions(-) diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index fc78d4d0..7609dfe 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -108,6 +108,7 @@ u32 imx_ocotp_read(u32 offset); int imx6_set_lpm(enum mxc_cpu_pwr_mode mode); void imx6_set_int_mem_clk_lpm(bool enable); void imx6sl_set_wait_clk(bool enter); +void ocotp_enet_mac_init(const char *enet_compat); int imx_mmdc_get_ddr_type(void); void imx_cpu_die(unsigned int cpu); diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 51f6c19..823b5ba 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -262,6 +263,13 @@ static void __init imx6q_axi_init(void) } } +static inline void imx6q_enet_init(void) +{ + ocotp_enet_mac_init("fsl,imx6q-fec"); + imx6q_enet_phy_init(); + imx6q_1588_init(); +} + static void __init imx6q_init_machine(void) { struct device *parent; @@ -276,14 +284,12 @@ static void __init imx6q_init_machine(void) if (parent == NULL) pr_warn("failed to initialize soc device\n"); - imx6q_enet_phy_init(); - of_platform_default_populate(NULL, NULL, parent); imx_ocotp_init("fsl,imx6q-ocotp"); + imx6q_enet_init(); imx_anatop_init(); cpu_is_imx6q() ? imx6q_pm_init() : imx6dl_pm_init(); - imx6q_1588_init(); imx6q_axi_init(); } diff --git a/arch/arm/mach-imx/mach-imx6sl.c b/arch/arm/mach-imx/mach-imx6sl.c index 01558df..1c2863f 100644 --- a/arch/arm/mach-imx/mach-imx6sl.c +++ b/arch/arm/mach-imx/mach-imx6sl.c @@ -19,7 +19,7 @@ #include "common.h" #include "cpuidle.h" -static void __init imx6sl_fec_init(void) +static void __init imx6sl_fec_clk_init(void) { struct regmap *gpr; @@ -30,9 +30,14 @@ static void __init imx6sl_fec_init(void) IMX6SL_GPR1_FEC_CLOCK_MUX2_SEL_MASK, 0); regmap_update_bits(gpr, IOMUXC_GPR1, IMX6SL_GPR1_FEC_CLOCK_MUX1_SEL_MASK, 0); - } else { + } else pr_err("failed to find fsl,imx6sl-iomux-gpr regmap\n"); - } +} + +static inline void imx6sl_fec_init(void) +{ + imx6sl_fec_clk_init(); + ocotp_enet_mac_init("fsl,imx6sl-fec"); } static void __init imx6sl_init_late(void) diff --git a/arch/arm/mach-imx/mach-imx6sx.c b/arch/arm/mach-imx/mach-imx6sx.c index acb73c1..e502b55 100644 --- a/arch/arm/mach-imx/mach-imx6sx.c +++ b/arch/arm/mach-imx/mach-imx6sx.c @@ -60,6 +60,7 @@ static void __init imx6sx_enet_clk_sel(void) static inline void imx6sx_enet_init(void) { + ocotp_enet_mac_init("fsl,imx6sx-fec"); imx6sx_enet_phy_init(); imx6sx_enet_clk_sel(); } diff --git a/arch/arm/mach-imx/mach-imx7d.c b/arch/arm/mach-imx/mach-imx7d.c index c29c771..29cde14 100644 --- a/arch/arm/mach-imx/mach-imx7d.c +++ b/arch/arm/mach-imx/mach-imx7d.c @@ -81,6 +81,7 @@ static void __init imx7d_enet_clk_sel(void) static inline void imx7d_enet_init(void) { + ocotp_enet_mac_init("fsl,imx7d-fec"); imx7d_enet_phy_init(); imx7d_enet_clk_sel(); } diff --git a/arch/arm/mach-imx/ocotp.c b/arch/arm/mach-imx/ocotp.c index e73f0e8..5c5806a 100644 --- a/arch/arm/mach-imx/ocotp.c +++ b/arch/arm/mach-imx/ocotp.c @@ -11,6 +11,10 @@ #include #include #include +#include +#include + +#include "hardware.h" static void __iomem *ocotp_base; @@ -38,3 +42,72 @@ u32 imx_ocotp_read(u32 offset) return readl_relaxed(ocotp_base + offset); } + +#define OCOTP_MAC_OFF (cpu_is_imx7d() ? 0x640 : 0x620) +#define OCOTP_MACn(n) (OCOTP_MAC_OFF + (n) * 0x10) + +void __init ocotp_enet_mac_init(const char *enet_compat) +{ + struct device_node *enet_np, *from = NULL; + struct property *newmac; + u32 macaddr_low; + u32 macaddr_high = 0; + u32 macaddr1_high = 0; + u8 *macaddr; + int i, id; + + for (i = 0; i < 2; i++) { + enet_np = of_find_compatible_node(from, NULL, enet_compat); + if (!enet_np) + return; + + from = enet_np; + + if (of_get_mac_address(enet_np)) + goto put_enet_node; + + id = of_alias_get_id(enet_np, "ethernet"); + if (id < 0) + id = i; + + macaddr_low = imx_ocotp_read(OCOTP_MACn(1)); + if (id) + macaddr1_high = imx_ocotp_read(OCOTP_MACn(2)); + else + macaddr_high = imx_ocotp_read(OCOTP_MACn(0)); + + newmac = kzalloc(sizeof(*newmac) + 6, GFP_KERNEL); + if (!newmac) + goto put_enet_node; + + newmac->value = newmac + 1; + newmac->length = 6; + newmac->name = kstrdup("local-mac-address", GFP_KERNEL); + if (!newmac->name) { + kfree(newmac); + goto put_enet_node; + } + + macaddr = newmac->value; + if (id) { + macaddr[5] = (macaddr_low >> 16) & 0xff; + macaddr[4] = (macaddr_low >> 24) & 0xff; + macaddr[3] = macaddr1_high & 0xff; + macaddr[2] = (macaddr1_high >> 8) & 0xff; + macaddr[1] = (macaddr1_high >> 16) & 0xff; + macaddr[0] = (macaddr1_high >> 24) & 0xff; + } else { + macaddr[5] = macaddr_high & 0xff; + macaddr[4] = (macaddr_high >> 8) & 0xff; + macaddr[3] = (macaddr_high >> 16) & 0xff; + macaddr[2] = (macaddr_high >> 24) & 0xff; + macaddr[1] = macaddr_low & 0xff; + macaddr[0] = (macaddr_low >> 8) & 0xff; + } + + of_update_property(enet_np, newmac); + +put_enet_node: + of_node_put(enet_np); + } +} -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: octavian.purdila@nxp.com (Octavian Purdila) Date: Fri, 21 Oct 2016 10:18:21 +0300 Subject: [PATCH 2/2] ARM: imx: init enet MAC address from ocotp In-Reply-To: <1477034301-26579-1-git-send-email-octavian.purdila@nxp.com> References: <1477034301-26579-1-git-send-email-octavian.purdila@nxp.com> Message-ID: <1477034301-26579-3-git-send-email-octavian.purdila@nxp.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org From: Fugang Duan The FEC driver advertises the following order of getting it's MAC address: module parameters or kernel command line first, then device tree, then fuse / flash, then mac registers set by bootloader, then random MAC address. This patch add support for fuse MAC address for imx6/7 by updating the device tree fec entry with a MAC address from OCOTP, if none is set. Signed-off-by: Fugang Duan [Octavian: move to ocotp file, squash imx7d fix] Signed-off-by: Octavian Purdila --- arch/arm/mach-imx/common.h | 1 + arch/arm/mach-imx/mach-imx6q.c | 12 +++++-- arch/arm/mach-imx/mach-imx6sl.c | 11 +++++-- arch/arm/mach-imx/mach-imx6sx.c | 1 + arch/arm/mach-imx/mach-imx7d.c | 1 + arch/arm/mach-imx/ocotp.c | 73 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 6 deletions(-) diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index fc78d4d0..7609dfe 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -108,6 +108,7 @@ u32 imx_ocotp_read(u32 offset); int imx6_set_lpm(enum mxc_cpu_pwr_mode mode); void imx6_set_int_mem_clk_lpm(bool enable); void imx6sl_set_wait_clk(bool enter); +void ocotp_enet_mac_init(const char *enet_compat); int imx_mmdc_get_ddr_type(void); void imx_cpu_die(unsigned int cpu); diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 51f6c19..823b5ba 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -262,6 +263,13 @@ static void __init imx6q_axi_init(void) } } +static inline void imx6q_enet_init(void) +{ + ocotp_enet_mac_init("fsl,imx6q-fec"); + imx6q_enet_phy_init(); + imx6q_1588_init(); +} + static void __init imx6q_init_machine(void) { struct device *parent; @@ -276,14 +284,12 @@ static void __init imx6q_init_machine(void) if (parent == NULL) pr_warn("failed to initialize soc device\n"); - imx6q_enet_phy_init(); - of_platform_default_populate(NULL, NULL, parent); imx_ocotp_init("fsl,imx6q-ocotp"); + imx6q_enet_init(); imx_anatop_init(); cpu_is_imx6q() ? imx6q_pm_init() : imx6dl_pm_init(); - imx6q_1588_init(); imx6q_axi_init(); } diff --git a/arch/arm/mach-imx/mach-imx6sl.c b/arch/arm/mach-imx/mach-imx6sl.c index 01558df..1c2863f 100644 --- a/arch/arm/mach-imx/mach-imx6sl.c +++ b/arch/arm/mach-imx/mach-imx6sl.c @@ -19,7 +19,7 @@ #include "common.h" #include "cpuidle.h" -static void __init imx6sl_fec_init(void) +static void __init imx6sl_fec_clk_init(void) { struct regmap *gpr; @@ -30,9 +30,14 @@ static void __init imx6sl_fec_init(void) IMX6SL_GPR1_FEC_CLOCK_MUX2_SEL_MASK, 0); regmap_update_bits(gpr, IOMUXC_GPR1, IMX6SL_GPR1_FEC_CLOCK_MUX1_SEL_MASK, 0); - } else { + } else pr_err("failed to find fsl,imx6sl-iomux-gpr regmap\n"); - } +} + +static inline void imx6sl_fec_init(void) +{ + imx6sl_fec_clk_init(); + ocotp_enet_mac_init("fsl,imx6sl-fec"); } static void __init imx6sl_init_late(void) diff --git a/arch/arm/mach-imx/mach-imx6sx.c b/arch/arm/mach-imx/mach-imx6sx.c index acb73c1..e502b55 100644 --- a/arch/arm/mach-imx/mach-imx6sx.c +++ b/arch/arm/mach-imx/mach-imx6sx.c @@ -60,6 +60,7 @@ static void __init imx6sx_enet_clk_sel(void) static inline void imx6sx_enet_init(void) { + ocotp_enet_mac_init("fsl,imx6sx-fec"); imx6sx_enet_phy_init(); imx6sx_enet_clk_sel(); } diff --git a/arch/arm/mach-imx/mach-imx7d.c b/arch/arm/mach-imx/mach-imx7d.c index c29c771..29cde14 100644 --- a/arch/arm/mach-imx/mach-imx7d.c +++ b/arch/arm/mach-imx/mach-imx7d.c @@ -81,6 +81,7 @@ static void __init imx7d_enet_clk_sel(void) static inline void imx7d_enet_init(void) { + ocotp_enet_mac_init("fsl,imx7d-fec"); imx7d_enet_phy_init(); imx7d_enet_clk_sel(); } diff --git a/arch/arm/mach-imx/ocotp.c b/arch/arm/mach-imx/ocotp.c index e73f0e8..5c5806a 100644 --- a/arch/arm/mach-imx/ocotp.c +++ b/arch/arm/mach-imx/ocotp.c @@ -11,6 +11,10 @@ #include #include #include +#include +#include + +#include "hardware.h" static void __iomem *ocotp_base; @@ -38,3 +42,72 @@ u32 imx_ocotp_read(u32 offset) return readl_relaxed(ocotp_base + offset); } + +#define OCOTP_MAC_OFF (cpu_is_imx7d() ? 0x640 : 0x620) +#define OCOTP_MACn(n) (OCOTP_MAC_OFF + (n) * 0x10) + +void __init ocotp_enet_mac_init(const char *enet_compat) +{ + struct device_node *enet_np, *from = NULL; + struct property *newmac; + u32 macaddr_low; + u32 macaddr_high = 0; + u32 macaddr1_high = 0; + u8 *macaddr; + int i, id; + + for (i = 0; i < 2; i++) { + enet_np = of_find_compatible_node(from, NULL, enet_compat); + if (!enet_np) + return; + + from = enet_np; + + if (of_get_mac_address(enet_np)) + goto put_enet_node; + + id = of_alias_get_id(enet_np, "ethernet"); + if (id < 0) + id = i; + + macaddr_low = imx_ocotp_read(OCOTP_MACn(1)); + if (id) + macaddr1_high = imx_ocotp_read(OCOTP_MACn(2)); + else + macaddr_high = imx_ocotp_read(OCOTP_MACn(0)); + + newmac = kzalloc(sizeof(*newmac) + 6, GFP_KERNEL); + if (!newmac) + goto put_enet_node; + + newmac->value = newmac + 1; + newmac->length = 6; + newmac->name = kstrdup("local-mac-address", GFP_KERNEL); + if (!newmac->name) { + kfree(newmac); + goto put_enet_node; + } + + macaddr = newmac->value; + if (id) { + macaddr[5] = (macaddr_low >> 16) & 0xff; + macaddr[4] = (macaddr_low >> 24) & 0xff; + macaddr[3] = macaddr1_high & 0xff; + macaddr[2] = (macaddr1_high >> 8) & 0xff; + macaddr[1] = (macaddr1_high >> 16) & 0xff; + macaddr[0] = (macaddr1_high >> 24) & 0xff; + } else { + macaddr[5] = macaddr_high & 0xff; + macaddr[4] = (macaddr_high >> 8) & 0xff; + macaddr[3] = (macaddr_high >> 16) & 0xff; + macaddr[2] = (macaddr_high >> 24) & 0xff; + macaddr[1] = macaddr_low & 0xff; + macaddr[0] = (macaddr_low >> 8) & 0xff; + } + + of_update_property(enet_np, newmac); + +put_enet_node: + of_node_put(enet_np); + } +} -- 2.7.4