From patchwork Fri May 26 07:58:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bogdan Purcareata X-Patchwork-Id: 767293 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3wYz7Q1Y14z9s8V for ; Fri, 26 May 2017 17:59:46 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1947246AbdEZH7L (ORCPT ); Fri, 26 May 2017 03:59:11 -0400 Received: from mail-co1nam03on0083.outbound.protection.outlook.com ([104.47.40.83]:32680 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1163811AbdEZH6r (ORCPT ); Fri, 26 May 2017 03:58:47 -0400 Received: from DM2PR03CA0032.namprd03.prod.outlook.com (10.141.96.31) by BLUPR03MB165.namprd03.prod.outlook.com (10.255.212.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1124.9; Fri, 26 May 2017 07:58:45 +0000 Received: from BY2FFO11FD028.protection.gbl (2a01:111:f400:7c0c::150) by DM2PR03CA0032.outlook.office365.com (2a01:111:e400:2428::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1124.9 via Frontend Transport; Fri, 26 May 2017 07:58:44 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11FD028.mail.protection.outlook.com (10.1.15.217) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1075.5 via Frontend Transport; Fri, 26 May 2017 07:58:43 +0000 Received: from localhost.localdomain (fsr-ub1464-106.ea.freescale.net [10.171.72.224]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v4Q7wd5o002399; Fri, 26 May 2017 00:58:42 -0700 From: Bogdan Purcareata To: , , , , Subject: [PATCH v3 1/2] net: phy: Add Cortina CS4340 driver Date: Fri, 26 May 2017 07:58:38 +0000 Message-ID: <1495785519-1468-2-git-send-email-bogdan.purcareata@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1495785519-1468-1-git-send-email-bogdan.purcareata@nxp.com> References: <1495785519-1468-1-git-send-email-bogdan.purcareata@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131402591241706808; (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)(336005)(39840400002)(39450400003)(39860400002)(39400400002)(39850400002)(39380400002)(39410400002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(9170700003)(8936002)(76176999)(50986999)(39060400002)(356003)(50466002)(49486002)(81156014)(5003940100001)(8676002)(81166006)(2906002)(85426001)(36756003)(104016004)(189998001)(50226002)(53936002)(48376002)(106466001)(575784001)(305945005)(86362001)(77096006)(2201001)(498600001)(33646002)(105606002)(47776003)(38730400002)(6666003)(2950100002)(5660300001)(2004002); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR03MB165; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; MLV:ovrnspm; MX:1; A:1; PTR:InfoDomainNonexistent; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD028; 1:Av0zRjZQ5Kcvd4pQroRUSEcXLTUdF6GA0sz+EvFq2r3Xpx9QOb/QUDdVdnDJvWZJZ3YM3ybGBvZzZfLIjfGskxyoqWGLl8tQ1DMzMOJtteMvvJTIlmIeKE3VCFA4zqSPLpysYQeBr0fRuvxO3flB4gkbHFlo59SsRxoDaWLDTgAvDYMVJ9IceIjB05VMED8RsECQJ4NKpEWr6VMe8Klmj+CayUcZwOC5TJWNEGzY2Jixcimj4bVPlelXHICTrAAFdFIYSNFwlMrlzlsm3Y/kBWc2+kE679PUM0wLmz4gxT6Ic7PqG6Q6tIjGx8LstMV/QLPWue4dRdPGSy4Pfxa4Uxkl8jb8a+cPYmaYOnkGxORl14cxqCu/6wHWmyEGXriJert5QcfmmlUgQP0pC/nb0aocl/Jpwb8xRnvvF3SZe8WVoFm7fXJWgGE6OgQEI+GGk9kgb0YLB0+xeaa4+q1ukS+fNJEqmTz/e5fG29rG/fIghZO62fWSZ14spCLY0+dOn5WzAKZOxb34PV7hMyApMq+Hs7rLoz6iumI8n6lxrKLAlAgofy6U7sw/v1nhwLZ/ MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BLUPR03MB165: X-MS-Office365-Filtering-Correlation-Id: af2bbb60-1a16-4273-1230-08d4a40d07eb X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131430075)(201703131517081); SRVR:BLUPR03MB165; X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB165; 3:J0CuxghCOLHmkJPEc0WxYHngq9OzU/GNulEDjQWHDxUqcN5uZViq4eERCxJ+GU/l/9iUbn0Camgpe3Mp2CXZFJJ6RXah+byzA1yWGN+fABsWxLw6qhZM02ExuhAPGI7+iQlc6zsrc6ZdJrb1g8QxUmzPvBjbLFKoylsvehSpLWxd4KhWNCkR11GFRQxuJkgEbQB5aguqHzCNP52J4EsWReovdVFG50n9x0AwHp9iKMoLkdT2rLfFPRjDpeEDpyo3vUJEckB8RzIdxpm/0PaMvcri1+kUhdXrp4UqAbciAEojJOimudqZXB4vgpPPXbPkPXLrHhvwRD8+HRZQKJo9v3PkGY6NwO+CHFDKFGKYXjPe+FubsDGk8ygrtubmswN8UmPQhkmTeJE5xXGQo7Mctu7PRZZ4ZfxzUL8cRuKzwTcuRtGBZt60/htYU46WcQKf; 25:MCHLbzpkSSk/GGCT0x1dFJls9W+WT3kw3sV4f8ISIRtqThcyvhBPC+JaqQaxcO1q7p2WRvLIpqKf78vFdviB1XfW6Be60ZUYNQtePLrltzRHaDSc2GIbxfw14dKeqRXF5sYXX5rb0Nha3xwLXDcf4A0iQuD2gaDeeky6xhtRqDb9n1UVhu3H/OurTY1EQ8RJqjw5my42lz7eC5oxbdgr2yo4wpKwWAvX0uQdVMdqfGh7QVXVQDdmh3dX1CoL0iEu8cnyzGlTg+RFDZ3h1NWuN3Qpw7Q7cHQo3N0rm5L8HtivnRwDDWyzXWt+hLnC271NuX0idbFFwPTxYlsYf8jNss06GZaZx2z1b622MYJUw7hIAplv4q/PEpM0RpIZU8l1aWVVSK2wgv3ov44V1Ikn+ksXRFq716puHKH+n1Kq4so1HaUiQeVVY/aiZezsIVAg7eSIPo+09p0dm7Du37cLofDP5BCn69kjpevOnkgL9bU= X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB165; 31:6lYLDNDYloRBMY/fA/wP4W30EwnZXTb610nDcFt1DHZWHx14FcXk9/At4rl6kxNXYGcJ0FZF7UzAqRHJowDxjL3gXzwxTXFChcEBjP8hmNyOb/Vus1JQHLi31YKyzB4mC/FZN/34YaZAIptzzz4G0BeL/6E/rNpt5xVQR19Z9MTcxnG5hXpOzyOGeRr+YnEFjj1SgsHe5XeF9+9fefo0YSVtxb+TMSDkiw3rAmZwfdxXi/TmO8MUOkXhmJsj2Z2U7mcIfoxv8WNVnivwC2e1vw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(601004)(2401047)(8121501046)(5005006)(13018025)(13016025)(10201501046)(3002001)(93006095)(93001095)(6055026)(6096035)(20161123556025)(20161123561025)(20161123563025)(20161123565025)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(20161123559100); SRVR:BLUPR03MB165; BCL:0; PCL:0; RULEID:(400006); SRVR:BLUPR03MB165; X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB165; 4:IKw9t1F3u0QqevyqxJeNUPxJO58krgpx/cD3gXsJSG4DucMfy6dtyKSfZrgBAO/N7EeDtqLFRdm/yI6nmz1AQf8JVUtvGYoIx6I184hjjjZsl2qD3QZZ55KSNNynVFyN3At9y9IIGFrFSIY+EJvILHWuSnBeOWIcsml15v8ydJ7YE45dDtBcM3YN6bg8c2s3VmWQxwhCa3nayNw8r3/mp6xIIMGlODnZcHou9xEP55TT/VPdL92jo0v9KjeIGeZVSoyPaGm29BW579cQ0mPiWSWi35FVJ58VjzVU9FWejJr6NGpvW0B4i+toj75DV5XV226+JhOwd3PEM1aZKpdFrz4U6iXaUh/jGFpyG76CmM5Nwp25yLsTK8JlsuEqAXNJhK8nIx/YSm7SA0zt4s7wb1fyOBm1yJg/+q0cnoeD/OwKHPpwakF/e4YssvXid3l6HKNq9hyotzpwcWdCZU5pGKdORRZnjbNX+PF7+ihGm4N0oqgsxtyxmoHw269KePnu7gvoeWLdFJNiH3/IK5jiGxXIBgiEDPTLbZR2l9vb8UHzjPPrJkNZ8efDijfcuQdGIw6tJs8loPnX1Vg56O6mzvAWO/z6ruOb1o83Wyk6Yfo7KunYA3t5wxeBiIuCwEJ4hFc4qVmLtYUV3R03ROlWl5hmHtvpVWZRkGG5ZJcZ+lHfdDeT+/ZHpmZ+bTt775coNdKm6fW71hg1ISl+e2TwbeHuCnZAp1kCA44BR6eZ1BYC+fz6jnhyMVgjmvZLJFXG7jjrDC7uuU4Y5DErFaIQb80BtLJ2r0eqeaWqiW2LxCVg3LmZnbvg93r+GiYQTGKCyUOf7asL7UCuAUD+5T58T36ZWwb/yJmcjmh9OADYznnlvPecdfsWtE9nAVvYGXnYt1/oLhzpMziefe7SNb1EXw== X-Forefront-PRVS: 031996B7EF X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR03MB165; 23:D60GZgO91hmqWQCpYzRyEHgIMovpkd/rl2Vy/74Eel?= =?us-ascii?Q?wI8jO+BHwftru60c846U0zMGdW9l7e60c0LfvcE8/c0fSCKjvERXV6t3Fh+8?= =?us-ascii?Q?fwnX+QkPbwUkgHCxXymgVBQGwIKStz7AWXkw5aQK4QgpHeLQzpZDiDiX+xsz?= =?us-ascii?Q?DSpqs6/93w/Tr7xIC9D/lWhBuuJFMsUY/77JmOlepNX1+t1qtXlJxzpTVzMM?= =?us-ascii?Q?1NhiQiBu+RT8lz1oXwINCfPm+EygUeF2070jLsME1GZTfU2HMYqvzSQquO6d?= =?us-ascii?Q?UZEKmrLz2p9tzZnkcvriAm3a/nR66OPwUQZeSNZINWGdcyfmMfNSTD4I+Ns/?= =?us-ascii?Q?xTwk/kaaMHi9xnw6T/k6x/dQr2vSvlRqwXyqbyYUJuU5pQ/K7HrGre7h9GDd?= =?us-ascii?Q?1DN6SggFYKkL6c7vN6dMEfrsaLI6NVIZxlOnaptetJNt3Nc11/90yoZm+UeB?= =?us-ascii?Q?JXNHMGSO64lhTi6d7zKoM1afSgfWIxgsn5qRpnZi+s0/xtSMvVHhjRxBLTuA?= =?us-ascii?Q?fIavlUO1T1sF5DUWQgLzMnMs/6SF1dGoDWT8IZQvbrLkoxtYOOMlpmkgbUk4?= =?us-ascii?Q?J5d22V036aaPKMBAQbW6Y3Tfi+IzpJGeKIAkV500PgZUcoPMKN93HUnVlwMt?= =?us-ascii?Q?HgtbKHTHO7ekSMcUhPzWaTWYv4XWtYHKRPgJ9SCrl98mgREwOKjphF7w1rcM?= =?us-ascii?Q?zv5l/iu/HVruSd70HRWqssTwYl7v8NOUIMD5V3VYBs9zMNsfroF0Oq3TWmI2?= =?us-ascii?Q?cWTj1XFrj+AORLTe9F5Lif6/s6aOvsFGhzmYVqi68xWA8YCevCj5P0GkVb4r?= =?us-ascii?Q?wPgJq7SQlpY8nR3HaalIrBapQsbaI8UNyFuZ/NCNJdmSY0Tiay3WOu78cBFQ?= =?us-ascii?Q?dfS7E+OEPvmyBYxsCgjSxiqGjhdEdrrHLicAwU7zvEMimYPPL5q+dh7x6mvk?= =?us-ascii?Q?DtJ1ikK6y86o3DTGAu7ptgwaRf2vpewJdACajGO69uqXzbtlwjCz8VsiBU+W?= =?us-ascii?Q?TxdATNG2Drqid7vVT55LYBt+EJ/YoTt/Dlr8Fx+LDU7HJwad9WEbRQvfMZYR?= =?us-ascii?Q?02LK97gcg7k3yFW6TU7KSes8ziIU+mtoDdLzBCAp0iZACs/evjt786l8x7Gw?= =?us-ascii?Q?3o8YySAc505lePKfgdIvUlQf4mj98gyVdg97XlffS46kvOSkyjnLxyeq9VDp?= =?us-ascii?Q?hKCJ5AYOWl6mc8Zs/Jbf2jmal+EjhSMxdEUNFyis4L7ohZGeFYFaBKMBWGSa?= =?us-ascii?Q?PDvqD9r7zD8OCOahc=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB165; 6:SKGa3tQ2ceMpQdGCrDZqu7zbPNltSkxKw4afVomCwMdj4eMijIjxuEayroXeszbZ1A5BDn9GsgbxWh7HGc9PM3hkOFyOFvwgyleRD7Q1EZ5KcV5VC2NFWFCZ/mM8GPr8bj7vG4vyzk1b7zVp09oM+zx7FQmhNUWHMxQKyGZ9tK6uWh2KrVA5WeDQ5xkkUDCNSQao6ekyLZaieyY5myEnGnB8NtvNcgURncrSM1iLQTy1RSNAM7WjzF0mDLXU2ybd6xc7RXrNSaLKi86XIPUpXKpeIhB8DmO2KNnA6SljhCY/1778/MtkVrAnrS+tMBzwvBRgUtrQPLRb8RG1ftMlHQxNvEf0uKnCUxfABfci8DrdbeC7ni8blCtqjqT/Ex2aN8hoBluECgZWVgOXFa73VPRxHU24cX8mX9P/0LP7111gUAq1Ef2ABI0cI+lPSShx9WVLChgRKsVJaX2mxVt4iwkcQNHtp0mGFSuJ1WuG+4WmvwjbhseMcLQAhw5me6DTSVcQa+luwnUCrMC7a5JbBQ==; 5:4BK52CQ3y8Z4bl/zaWgw/8eE5sGv28jsDp74IA0XLvJ9sF6oWafcwANkfycM1T2YyTWI51TD7v2vlGxb/LnIp1c0k6jJEzVaS83TvltT1v8D8cSaoPhk+E9qStuaJywWeVFra8IPT7nnsAEStKrUR2WQhivVAtO/RzxKG8Vduz/1JLRfopTdi1hBytbAkXfV; 24:KSWOdjlFSP+iBG5KJNLAfdGGrJebOIT+v6tkd5I5DF/OTC4BZXSh7NJSNs0SrFtT/T2VN9PX0AXxgh80hTHlLfrKgiufD5khnjq3pLlPCA4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB165; 7:OWadeKD5EkiJqsjH3QwFlSUm+FtwcCyRRKBHZq9ngOPn/MHm3QEl2kwK5qR361w96eN9GSMFfoHDdj8HVtrlGUxq7dKYn2CVP6IKA/8cYtM4Fkbexy6cNeoyLurU/LsFnJpI8yaSVjMmAJ7KSSnJuzrZngPY05B9qdaRhhXKXRJPayrJV65U7UnQuNdK2JhZh7fRtEDvUykGzlL9tC55GjqztqT12RlusYZ8A6hL4iuesRRGjA4nyKV5GBiCzXHQibQAXIOmvSqhl1yWRKsrTPWB9C77JkFilYjUVdvWwLcExUuBwzL/xcn+7A8O7CaVPaN9dsQ6Qog+xX9eNz11fg== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 May 2017 07:58:43.8586 (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: BLUPR03MB165 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add basic support for Cortina PHY drivers. Support only CS4340 for now. The phys are not compatible with IEEE 802.3 clause 22/45 registers. Implement proper read_status support. The generic 10G phy driver causes bus register access errors. The driver should be described using the "ethernet-phy-id" device tree compatible. Signed-off-by: Bogdan Purcareata --- v2 -> v3: - Add probe function to check the device we're talking with is the same as the one described in the device tree. - Change the link status (GPIO interrupt status) register and validate that the read is done from the right place (cable plug-in / plug-out). - Some functions + Kconfig entry renaming. v1 -> v2: - Rename "mdio-cortina.c" to "cortina.c" since it's a phy driver. - Test probing based on the "ethernet-phy-id" compatible. In the previous version, getting the phy_id via get_phy_c45_ids() involved an additional hack. Drop that approach and document probing in the commit message. drivers/net/phy/Kconfig | 5 ++ drivers/net/phy/Makefile | 1 + drivers/net/phy/cortina.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 drivers/net/phy/cortina.c diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 22dea7f..8cd7a0e 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -240,6 +240,11 @@ config CICADA_PHY ---help--- Currently supports the cis8204 +config CORTINA_PHY + tristate "Cortina EDC CDR 10G Ethernet PHY" + ---help--- + Currently supports the CS4340 phy. + config DAVICOM_PHY tristate "Davicom PHYs" ---help--- diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index 79365be..0de3e20 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -47,6 +47,7 @@ obj-$(CONFIG_BCM_CYGNUS_PHY) += bcm-cygnus.o obj-$(CONFIG_BCM_NET_PHYLIB) += bcm-phy-lib.o obj-$(CONFIG_BROADCOM_PHY) += broadcom.o obj-$(CONFIG_CICADA_PHY) += cicada.o +obj-$(CONFIG_CORTINA_PHY) += cortina.o obj-$(CONFIG_DAVICOM_PHY) += davicom.o obj-$(CONFIG_DP83640_PHY) += dp83640.o obj-$(CONFIG_DP83848_PHY) += dp83848.o diff --git a/drivers/net/phy/cortina.c b/drivers/net/phy/cortina.c new file mode 100644 index 0000000..209c022 --- /dev/null +++ b/drivers/net/phy/cortina.c @@ -0,0 +1,115 @@ +/* + * Copyright 2017 NXP + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include +#include + +#define PHY_ID_CS4340 0x13e51002 + +#define VILLA_GLOBAL_CHIP_ID_LSB 0x0 +#define VILLA_GLOBAL_CHIP_ID_MSB 0x1 + +#define VILLA_GLOBAL_GPIO_1_INTS 0x017 + +static int cortina_read_reg(struct phy_device *phydev, u16 regnum) +{ + return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, + MII_ADDR_C45 | regnum); +} + +static int cortina_config_aneg(struct phy_device *phydev) +{ + phydev->supported = SUPPORTED_10000baseT_Full; + phydev->advertising = SUPPORTED_10000baseT_Full; + + return 0; +} + +static int cortina_read_status(struct phy_device *phydev) +{ + int gpio_int_status, ret = 0; + + gpio_int_status = cortina_read_reg(phydev, VILLA_GLOBAL_GPIO_1_INTS); + if (gpio_int_status < 0) { + ret = gpio_int_status; + goto err; + } + + if (gpio_int_status & 0x8) { + /* up when edc_convergedS set */ + phydev->speed = SPEED_10000; + phydev->duplex = DUPLEX_FULL; + phydev->link = 1; + } else { + phydev->link = 0; + } + +err: + return ret; +} + +static int cortina_soft_reset(struct phy_device *phydev) +{ + return 0; +} + +static int cortina_probe(struct phy_device *phydev) +{ + u32 phy_id = 0, id_lsb, id_msb; + + /* Read device id from phy registers. */ + id_lsb = cortina_read_reg(phydev, VILLA_GLOBAL_CHIP_ID_LSB); + if (id_lsb < 0) + return -ENXIO; + + phy_id = id_lsb << 16; + + id_msb = cortina_read_reg(phydev, VILLA_GLOBAL_CHIP_ID_MSB); + if (id_msb < 0) + return -ENXIO; + + phy_id |= id_msb; + + /* Make sure the device tree binding matched the driver with the + * right device. + */ + if (phy_id != phydev->drv->phy_id) { + phydev_err(phydev, "Error matching phy with %s driver\n", + phydev->drv->name); + return -ENODEV; + } + + return 0; +} + +static struct phy_driver cortina_driver[] = { +{ + .phy_id = PHY_ID_CS4340, + .phy_id_mask = 0xffffffff, + .name = "Cortina CS4340", + .config_aneg = cortina_config_aneg, + .read_status = cortina_read_status, + .soft_reset = cortina_soft_reset, + .probe = cortina_probe, +}, +}; + +module_phy_driver(cortina_driver); + +static struct mdio_device_id __maybe_unused cortina_tbl[] = { + { PHY_ID_CS4340, 0xffffffff}, + {}, +}; + +MODULE_DEVICE_TABLE(mdio, cortina_tbl);