From nobody Mon Jun 8 14:52:06 2026 Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11010055.outbound.protection.outlook.com [52.101.69.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B304437F002 for ; Fri, 29 May 2026 17:15:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.69.55 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074921; cv=fail; b=HTD7l3/HCvN14gKu3Hpfz2TdbgnOyi03rXDOeueGNptV8qjujpK9/YME/KbuwqtNT/3VGA25A+zeWyKGseUTRwjnA1NChWg9gP6yKCjvHx5chz0kLbh7iw2U3o4opYf6PErqdeYVs+dzWsgk8ko1j5PWEbMHsSJW750SG4W4ahc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074921; c=relaxed/simple; bh=zy9t8nIlkLk3szbtiO0VPNWE37Y9rASYL9/vHVb7AA8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=V7hdL3SB3sE+35m1BXdqDrXI4IuwZTsOqNGrzoFM4QRLHonape1Z/Dj86p6J/EgjyRmplXw2pCWh0HVYQfxcB4eMC/TzQqGvmQm7BJPeav5aEobgk3hHFyfmPKM/W3IK5ISNEc9WCB9SsWzBaiR+wya5F/5L5q7kpcvEiPkWFgA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=fxSVzlvK; arc=fail smtp.client-ip=52.101.69.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="fxSVzlvK" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KEfpsDR2kkhiB/KLHjc7j0Mmwc2x7R2O9DoM7NxqtL2nCaBdxH1FFWcgG72XIldEGFxJLIn6O5mTf6OXS9DpVFSsHMCYnZeTgbjRkKLhbz5iY6yO1jMI/lia0K+UrvPZr4bqKsgksHCPUW5LKEFVLouGA3LitIEkNnR982irSYnKiJf0SVjmT7Q3tWe1SSQv3gDXznljPC/UmP+Nmy9GIjik4F18LBTdpEYh6XKMNDFtNfUIJPrQijIMkBrmZiuxOJ4EFPps2un/Zu0T5jKqhVoxMwG97HHY1dRA7KBCkjsDr75oh5HQshb2ZJJ0mm1uqoMGojxxR3RnUCiKgXX1Ew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=zKseQGEkgCPgdYBHwSXHoEnFwp/GuTI8Mim0lX1QuGM=; b=bp35DbOHDVO2dETSFFjWOLLmVGY+mVnz4km3xvN7egvfAbRVX6w60OwHvm9iDMghmF9rGbAOZedD/6K4xSEoiohIRvi0OeQnqX6Au2b9HnVZdQE1ZJw29Km+fnubabOojh0pMGz504E1rkKqsqzno/gD24vF7BBQzHJuPbxTzdnHdL7eaf+muEy6kfmemIEkyvfPSB+suVesWb7VxV/gyGtXkIcg/i8nHL7lRDad/0jYSo8vNG0qFDGhftNUCiVEgTI/vzFA/Sdxz0HPV2mUdMBQHPOL7sdfr43sgCi1iKL6OpDZutE9pJ0WksAwwKl0tpecm2AHLSF3z6+h//e9+g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zKseQGEkgCPgdYBHwSXHoEnFwp/GuTI8Mim0lX1QuGM=; b=fxSVzlvKKws1trrbICVuIavdK2fHA6E4JSVYPncDFh5XM0Md3LjrfRNTvKnSk7vCup5RrUlaGk0NC6ydX+1yYy7vb/NSS1QaxO7a53pwJEjoiKHdxEAbOjPCpap2IChFUCdP18ud7kV3Z1ZfwLb4K0j9H6L5HTaIAT1LQLB67fLAxYPZBbK9clPLgemqIuZaParmDU6/7shv77uppCk6EHzHh45kYPDARY6yKtsfN3PsGLbeeC0fkJwC0ZGASvPFMOP3I8ojUmWXJff7cFtNrtyfyx37xhZz8Vi5m9aJUkbimY3N63LeoGBTQt8/S2/NjSgZqRJ8gDeBkpi/LcxnHg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:16 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:16 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 01/15] phy: lynx-28g: reject probing on devices with unsupported OF nodes Date: Fri, 29 May 2026 20:14:55 +0300 Message-Id: <20260529171509.1163787-2-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4P190CA0020.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:5d0::8) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: 861600d3-3f24-4a8b-ba6e-08debda5da17 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|6133799003|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: sLPIiyYupL62JM6/1fJYmEUTMfgCpBMm1BVW9EKsNtMkElTdggy3cfWtSseVGmBeECTZkDHrwZjiAUUiQeMdihSDLeYdhlUKZAmbQG8RTQDQXCbfy6k6H2l8NBOzcqScP6DdB/NcHSdTsEz6AvwuLF3KByDkMaQGcD5zDk7G5lhk3HHsgrIJcljDh4E45AWsiNCRa4v+KVHzAEEOSIJnI1/b3vsn/+xP+iEqybFN4CrpuvahcggyDRQOtFTIAzXCuyQe9xezzxsrv+5zjWUkv4FEo3PuhMyKxXVJbDox5bihY1nvj+xVQGnzjtjVEVwjE+ikqX6Cej2qTKtwpjPPAOUrBI1TQGT6c8krDv1MZqmLM8qgEGRZUV13QQZAmEMHhFRK0jR797GPItfYZoA+RXYD0GDTBb1HJU23sSUMyMTzhmAM0d65OG196ESjWK3NTfNc6L2oJiuIPUIWzol8b6+l6d/mu4jTZ01Yyap+AksImhTqrvOj3qylmMFsnPC+fJfOj8zQTKdHeNvF4AZf9Us1N2oaSSRPcFTmsYp7jJTpljcRxDGouUQmngl2rAFVshFtVMKFQrx+CuyiSzJV8HtmuSnu1EQeGe9vsa2gICqscHnkVJ1kti1PK+9oSYFPdztlerMUybQ+XKFTJYM92GKfvikmJkII8AT99iope3RjWJWO67DBnSD9wwgnvpue X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(6133799003)(56012099006)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?VSM7nbdqOzYizGxGM5uQ5mT3/GoU4GCLi7rEZ+HOo8JglYynbW/h1FrgGQ/x?= =?us-ascii?Q?fOkrzIKVwzz+mVqP93hp3Wvx1FReV4CdHvHvrQMOhqrst0NUvlFI5mhm5sgI?= =?us-ascii?Q?ICS6z8W6Wq7+AC6iQ2vuVO9KNq+X7WoI/ivc3gD6vSG4fSpXLv1txwYGpYtX?= =?us-ascii?Q?HdWOxkliKONXN0w8M5PgBfqZyle9vZrVZM0p38mJL73+tcbdf98VsdDCw7Hg?= =?us-ascii?Q?HwvragYnREA4sk9ppoTt/SHAvKYBXXInGZaIhggGA6h0qZyXPHIDjlBMwSEe?= =?us-ascii?Q?1AacY8ksvWcjAqItLg1rRYBzYmfXluABtDcmqXBd8fIJNpxNG6isABNrBpnn?= =?us-ascii?Q?H9KnPNz55n/L2xjKHfjZI2tQaZqD0CVPqPPLPx2FJ2C8zatbUcNrF+ptpXiO?= =?us-ascii?Q?Z5sGDeb/7nVoJY0vkV2itR2ISO98KZBbF5M8cLyR1UTVSf+fOGo/U1rohjtS?= =?us-ascii?Q?eB3wJ+eFhghlyUwi10AEi0qAO4Jbu7Z0W0mpD545MSwdQdNrt2UCUlvjmupS?= =?us-ascii?Q?inwFZRMhMevyVGTHkCho9xJyfhbAloaoXLlUjadagPi3XXK+NGMpk1Td9m8w?= =?us-ascii?Q?aPjlugUv4sE4KtXdVumYUdTCL0qsF5m0Qxyl5W2LXQJafkgoJBG7gZlWoB/+?= =?us-ascii?Q?+qeYz+OL2mVg2iMDN+02JHMcHLsZYIHgoJaawsmuB4pcBbeq94LjI3ObWSl6?= =?us-ascii?Q?LSO974FM6P56CxnDoQjpNHGBOnigTEziG13jDoh7amsg9hh/N30xHJ1Tcui7?= =?us-ascii?Q?h4ddfgQUnBzdfcUfs45TvCXE2NvPLhFK9RY5sVBmZDN6w6WFUeC9OPPaIE7q?= =?us-ascii?Q?/Txyjog6ZQK8tWTwHcfWcRRqODcNcxbmYjjOLZNa4D/DcfkYfnl7jxnd1Iyu?= =?us-ascii?Q?V0WEddKVwBUmxDvZr1ifEu4as/UeMwmqU/nydZfyMXpe2ESTbU+9hmCUjWW1?= =?us-ascii?Q?rOmIrxUZm5tSePlLCN8sgDGG2t9EE5wf9CrQ/3xvdmTClFxCTzk6vCA/dMvm?= =?us-ascii?Q?z76cNI537j9/LdZjHhxTf35Fvi4ECZAQCDflhaa4sE44HucpD8sCXs414dt1?= =?us-ascii?Q?+l7HWMywRIp2uebjFuf7J03dP93ZBOjyjSfrXImp6faHhGjfxuAtZYPrEg9W?= =?us-ascii?Q?1EgRwPI6U6cn3Xmpw7Y8V0g0miDlrnzjXfNEWhlAkw7HnPNHlz/QUOQVt9sT?= =?us-ascii?Q?/jjMuA1wnGFh9zBS161iDYrMa9jBL9amzS5KewRMcO0ZRgfHAhc6Z5B5yy/U?= =?us-ascii?Q?mQOic8CMN/oRJ/wfwfOnNHVdtLdIKsygMQ4DZnrGa/q25kFbXgNwD3BJLqGG?= =?us-ascii?Q?W8oE9y6xmlsnVQAEqW2orsbPD1x7hBaHwxQZZPmYD1LCHBYrBsSc8MGw0fKO?= =?us-ascii?Q?HAxlzKyuawGnu/x6oqobQUSnOAr/iI4TACNPvasdG2jltPUoBfnle4o50WTU?= =?us-ascii?Q?HNpaLe5cg1crPiL9f89q2Q5kiEifZVqQvLFu+9btPe9jhPTuvsZiZqLf0dCd?= =?us-ascii?Q?/Fx0Av4ku1ecHYtVVNTqfy6ZJrQSclPm65uUZiiTuADAnY4uV45cvbePl5oY?= =?us-ascii?Q?l80NCWjF80lkLzVACXIgLcU8m4yWwBwQEMbebw1IcRhew3Gwt3cOc2FwIXpH?= =?us-ascii?Q?2dWGDpIDjyiHxlKqxap608o6eN1CdRLPGW+W3UE42YavhK6431SGDgoQ92Is?= =?us-ascii?Q?EOqm22KOaNaR9bXJBJSqMzNbPt2kY6UHm5l+GGx2nXYTQ0RPcrolQSa4X6ON?= =?us-ascii?Q?w/8id5jB61tP9P0sIYg4vUA5QemfQ4OH/+7oE4UiRWhis7ISf62d?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 861600d3-3f24-4a8b-ba6e-08debda5da17 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:16.0608 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Ma+apvg4450BawUq+N6suxZrd/NuOl8+QcRI7gWEr2UisJQt+FxbeZz29Oy+vBGv54IKPsjhDRVhaTThKco6rQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" It is possible to bind the lynx-28g driver to an arbitrary device with an OF node, using the driver_override mechanism that is available for the platform bus, and trigger a crash this way: $ echo 1ea0000.serdes > /sys/bus/platform/drivers/lynx-10g/unbind $ echo lynx-28g > /sys/bus/platform/devices/1ea0000.serdes/driver_override $ echo 1ea0000.serdes > /sys/bus/platform/drivers/lynx-28g/bind Internal error: Oops: 0000000096000004 [#1] SMP Hardware name: LS1028A RDB Board (DT) pc : lynx_probe+0x118/0x4fc lr : lynx_probe+0x110/0x4fc Call trace: lynx_probe+0x118/0x4fc (P) lynx_28g_probe+0x54/0x7c platform_probe+0x68/0xa4 really_probe+0x14c/0x2ec __driver_probe_device+0xc8/0x170 device_driver_attach+0x58/0xa8 bind_store+0xd8/0x118 drv_attr_store+0x24/0x38 The crash is caused by the fact that of_device_get_match_data() returns NULL (the bound device has a different compatible string) and this is not checked. There was a previous attempt to avoid this in commit c9d80e861034 ("phy: lynx-28g: require an OF node to probe"), but the mechanism was not fully understood and it only covered the case where the driver was bound to a device with no OF node. The issue was found during Sashiko review. Elevated privilege is required to override the driver for a device, so the real life impact of the issue should not be very high. Signed-off-by: Vladimir Oltean --- v1->v2: patch is new --- drivers/phy/freescale/phy-fsl-lynx-28g.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/phy/freescale/phy-fsl-lynx-28g.c b/drivers/phy/freesca= le/phy-fsl-lynx-28g.c index 92bfc5f65e0b..4461b47a16ad 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-28g.c +++ b/drivers/phy/freescale/phy-fsl-lynx-28g.c @@ -1477,6 +1477,9 @@ static int lynx_28g_probe(struct platform_device *pde= v) =20 priv->dev =3D dev; priv->info =3D of_device_get_match_data(dev); + if (!priv->info) + return -ENODEV; + dev_set_drvdata(dev, priv); spin_lock_init(&priv->pcc_lock); INIT_DELAYED_WORK(&priv->cdr_check, lynx_28g_cdr_lock_check); --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11010055.outbound.protection.outlook.com [52.101.69.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7461637FF56 for ; Fri, 29 May 2026 17:15:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.69.55 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074923; cv=fail; b=WVfTWyA7MtiTs/kJ2jn363imjtD5J7oEBKfwHKJ/P8flzhXk2abxyRJOyja5WSrO9vdCKGS2H45rEgQQm6RZqsIK9/YN5VMKTr5l5EoNpc+JQseoDd5E3P4MB/dXG10NW0Xbh8LCMpD0o6b9r23RrZ3G8NwBeA2V5C3I552owfc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074923; c=relaxed/simple; bh=cR721rsIIjuHSCVnojyzoSxpzLzkPnA0/q3MMhwfGSo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=tqUrQBuGHskcefqW677RRzTy7VM8XYIn7V/ROGNcrfOeBjyMnVMnrmSvTcVLk4QwhWODcbeGNrxxyZ4WveJpOHoqj364b6/LibRAyFk6HOT+w1buchey6kv4RHgsO/W48FuvJzdDPYRkLJbzi/OD3/NoqjubovGMNbRNkaTys4M= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=Plj0i2Is; arc=fail smtp.client-ip=52.101.69.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="Plj0i2Is" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=O/ZLa+po9mbB02pCIUbOOGr45Vev6xvL7jikThV4gdYGCA9YAhNgcHr/tFazMrcikjuZsz7vZRrrfQOh+7fu9Vw3ebn9A+7G5F82MHMyAECqnZ1OS9VBgP2rvnaS1KPBkDCAPc7IjQiTUhghWMXF6kYv+hAC8UxRRxpBTXnHoaHMRPBX1trqOXwaDLwp9JzG86djKRj11EiFXBq06pMKTg4qIex9FMed6i+0Hy7cKBd3ROpE4LhA/x5R77M+lOBefytlM2kKc+94e3bfjNc5TQP36e77wWg4V4ddYB+CWjcEM2fhmw3JlsLr6x5ZIIXEuKmxFkuhh9ifJTJHsA6HyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=B3Muzfxd4BkjwVKUt4iyKtT63Zx+p+6Hg4MDT4go8pc=; b=SmxUKtA86qV0qiCZxq26XlxV4aHHHEqQlplLkwqfifbbNclDxJW2N2QF58HgNXLsYiv2qT99P7BlJoAkwKHooNpN81diKu+unot9VewI0BgZtQj16VmwaDcKzjdop6PeJ5RKfsQ74TlKsgHcZkxFRBfvhM09N/VMjU+eqPuZL8JINdtBz78GsS4rPCK+oiu9TBwSUoSvXicfVhiKstT5wWiNb9yAdz419JHrcHkeKSLGSn4HQcewhDhQItTEUpIRlOgKbNlilJexOwc43y3XlBT8N2EQicrsM+QNRX/KLgZgvy9LSU2Y+f+knZc9wcQr6jvF6G93YHlUpTIC9qh+/A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=B3Muzfxd4BkjwVKUt4iyKtT63Zx+p+6Hg4MDT4go8pc=; b=Plj0i2IsQXvC0DeU2O5f4idlABggNMZFOl15FVuAoPvdP+c/boG70ZQFrSE7i8z63iSl4Lpnn/riz0mvQPHbCTVrBn/VmToMNYoryxHKdA3Cj2V/HTfaUhBkC2NXdb3qzK1LLC1x1kosJ+CUc4Rj48vB/cjqYsA1y5tSNloxdes99M0tXOI9p9u1EDK54IguqGUYGR9Ybb/OcceQ8Lf6ncTrayrAPovCBSKzuPyFBo2bBxvgTZeFPIg/A0rwDHLdd5hfz+WZIuFlSDzB56S/lsy0Ea9udMvHyZaQ71cv5V4oYXSyIvWEmWt58/BPxcRS1TMhbXAAzwOq2k+CDVMk4A== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:17 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:17 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 02/15] phy: lynx-28g: move lane mode helpers to new core module Date: Fri, 29 May 2026 20:14:56 +0300 Message-Id: <20260529171509.1163787-3-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4PR10CA0022.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5d8::6) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: 1708c27e-b3a1-424d-c774-08debda5db09 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|5023799004|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: bUK57c84GG0n6Z2FYmgKgpm5wS0o9xj2EKFrBOX/3hIwZd2iNR+24AZzionTBLGBX0xtyKvP2DVWcjOQwRd7VwHboQgQMYuefchbSWfzhl+1itTmsinkcCmDxVaebrUphSOmOwQf5y4vSpDNwKC4sBhppGMnNzEyD7BHnZSVpZnQjz6Agngu1UKPBliKmAKCujym6yVEhgMN0gil+wZyIiEpp47hpLI8T4iSiAgAJ6Y/cBbgB1g3xy8m8eRHqF25JM8y2Szo1IVwy56KseWmqh3rc+914MGN6Z68EfWEsAssp4UvwpVqQFcOofqwDa3MoQMOwK4AMLcO/qUzuUNQ2cLkrao7B60AwaF3zqrTy4S2Bgh8z5WJaK/agHSdL7gY41aKg6W2pBhqSwaizXm4+MKfrLiYeIWLApxIv2UopdOAxoKUklBAquS5Es3li0KeMIZhvs/gBDo0gtI1XfKiUCKQSBFrL3eZi53mQ+SkL0azQRnp/WpLz1iPw1Osi6Ilf3yrWseJtUN4yE4JEDT2lWN9DRYdItKH6v0emLGodqBn7UtvM0gtiiyr1Dn0fy8CMCKNyQZHltVr2xGua+LBePkAPw+9SuatPwq+fo9TOPV0twUHNWBudjyfYHZKiKtsBSiqtDwDW+yvjlm+OXXzbNtFEP/4nYY1SqbKgPt76binam+dnvDWh5qYVA9BJvwT X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(5023799004)(56012099006)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?8IJr/F6g7cbnFQUZmJXXEGnnFS6UK7TCA6YnJ9g/qBprkQteynr5ekvgMuSH?= =?us-ascii?Q?Sb5vkYC/4VNdEQi3k0Dpnt58b+ko5VqO1qEDQVbxP1HFiER3RLo7cDRRXULO?= =?us-ascii?Q?OphZEV3mrBZV7dINM8eColf9ZTNFuBoX+Q3fPRh4ATRep/47DbF7prAdMBdv?= =?us-ascii?Q?vOdOa6iGPLyr9/9RGBLQHYanBRy3aSn1KCuEbnY2GWbJaxWbgniU391qRoNr?= =?us-ascii?Q?lOvDwk+7Q0VJt6KtncbukYTvON5FXywNG9IUAavqjuTNMIWKqhFrv0AZLCbb?= =?us-ascii?Q?zlchtxBgGsryFmnnuy+qfoEDwve5s1e008KKrnHw6Hr+uRYk0EK7RFA0qtfO?= =?us-ascii?Q?/CC9BD24VzF7880ICFzStfx3OtB0ZdS8rV1QBm+UmIF2OpSqvt1zAIF7+8fE?= =?us-ascii?Q?7ChCTmzT/C5L3eW7gTwtfGV3tc19WtJTF/vkscscWEvzO2cxDsPXoo8gm7+F?= =?us-ascii?Q?wzG2jdWjWkSJtlwob1Q9rV4OaasxOJAyYnk0l3W3+4euKnxkUZA+uuc3dsE+?= =?us-ascii?Q?W2sWyS1Jk9dI+xtvKljef1eYZF/pt6CISdpgjgRCYHqZ9AIhrKq6aCXEz2ME?= =?us-ascii?Q?Ue+wAxe2rekf4n8cv0yAxk4rhcovL4dmO4LJ75ve3VlLJ8pKvIISGvOrErP2?= =?us-ascii?Q?AjZMsf9KUlK3TBQ6336yy0QF0w3kDQZ/nerIjItpOM+we9MPwPTugGi3xdmL?= =?us-ascii?Q?rZUvZLcXfqpi4pLVi0XCz9iu023HnZpxJR3Xk5eaNFtrypdfu6LRaghhOt7v?= =?us-ascii?Q?scragmBPWgkD1vHlAdPYSZLDHt3rngLlvqm201pyDHZxvP9VmnK4NUk/8Hsc?= =?us-ascii?Q?3jRcpCA/O3l0fZROwh6wZBsoZ4xCAZgVy3G7quF0K8iR3YfH7vK7jv/Rqelu?= =?us-ascii?Q?VGwUAdmz9sSjcMeSWQXgD9dGu/PLhcDGj+zpovIMEHq3uDi4dhuPLp4xwhsk?= =?us-ascii?Q?D6aGKrZ5IlxbsAr/WsQivnx5OqcERzDgQF3rMXgJTUbVnCu3NLCjvMG2ufjh?= =?us-ascii?Q?EyKqn2QfGfE7prMlFkdDkZ6FCMueJulKJ9cY79OffOuv2zVSGp2akCxF/bfC?= =?us-ascii?Q?YTRIIl8HSOQojy5CBa1/5hOGoH8yx3t5Pt457e7V7GYin3c2Xwn1Au/zYQwj?= =?us-ascii?Q?zhVgiq/CcitXJBnkAZrun14Hr8Wcmmznv9o+WSyt/1T5p4ZPqnjicogT5U4A?= =?us-ascii?Q?DDKQ8FANOKOjB1Gr4MstPFLVOHqpfkDq+8H62Hc0H/P9xQFr7dOuzLgDaXDa?= =?us-ascii?Q?+zbwHURwFN29KbtblATL0XzpxpwFVWwbulnBCYNJH3SIikO7r7TjPef+frIj?= =?us-ascii?Q?kW7tq15NbJ0B2simVcG16gkrdDqTxIaPfHeW+frSDW3kKxq5AbekKfXOz0d2?= =?us-ascii?Q?Agsh/MboFoB+OF4WRTjt6EVnqesROtdG8vZKN4OAUUCNVG3b+5oLZdPV7XnC?= =?us-ascii?Q?Q1K8SkstZjavEjr2leM9kvg5AUURJ6/bbzIj6vvpWjDtb+o8iOd5JmqEWTyC?= =?us-ascii?Q?TGR49Xo2qSyEl2DtQQ9hNPh+vl/KSX/PT1cPsQDAs4/DmGXO6ZlxGVxnN60N?= =?us-ascii?Q?9nl/dadEk2CjdNT147AnTMIo8QrYCS3pSz1IsbvKAQ2ZCo5KvTXREgvlXRum?= =?us-ascii?Q?3klTYvZN1RGtm7tuwza1hcAfz7peDDanhLcfRGYfF0B6/o8OF8cB2R3ips2K?= =?us-ascii?Q?nFGMmlIpPp6QSoqy9aCv4GazTL/rLWM+5a8iW2PKBLCwNqHY3/xWANUV9yFQ?= =?us-ascii?Q?j+1WDCiqgrG16VfnRTYFA4pmJKbeEdPO7W74mvTNMbxnd0UrIzOx?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1708c27e-b3a1-424d-c774-08debda5db09 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:17.6499 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: d099snSy9ZsY1l9TMmiVA3XB8M0GuHyr6lDIhQKbfL28pxXC4FNdZGsFegupFmD+dnLy3HkP0Uu0fRUHkwJFUg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" Do some preparation work for the introduction of the lynx-10g driver, which will share a common backbone with the 28G Lynx SerDes. This is just trivial stuff which can be moved without any surgery, and is easy to follow but otherwise pollutes more serious changes. The lane modes themselves are exported to a public header, because on the 10G Lynx, the hardware requires implementing a procedure called "RCW override". This requires coordination with drivers/soc/fsl/guts.c to tell it that a SerDes lane needs to be switched to a different protocol (enum lynx_lane_mode). Signed-off-by: Vladimir Oltean --- v1->v2: none --- drivers/phy/freescale/Kconfig | 7 +++ drivers/phy/freescale/Makefile | 1 + drivers/phy/freescale/phy-fsl-lynx-28g.c | 56 ++--------------------- drivers/phy/freescale/phy-fsl-lynx-core.c | 44 ++++++++++++++++++ drivers/phy/freescale/phy-fsl-lynx-core.h | 24 ++++++++++ include/soc/fsl/phy-fsl-lynx.h | 16 +++++++ 6 files changed, 95 insertions(+), 53 deletions(-) create mode 100644 drivers/phy/freescale/phy-fsl-lynx-core.c create mode 100644 drivers/phy/freescale/phy-fsl-lynx-core.h create mode 100644 include/soc/fsl/phy-fsl-lynx.h diff --git a/drivers/phy/freescale/Kconfig b/drivers/phy/freescale/Kconfig index 81f53564ee15..a87429f634ea 100644 --- a/drivers/phy/freescale/Kconfig +++ b/drivers/phy/freescale/Kconfig @@ -51,11 +51,18 @@ config PHY_FSL_SAMSUNG_HDMI_PHY Enable this to add support for the Samsung HDMI PHY in i.MX8MP. endif =20 +config PHY_FSL_LYNX_CORE + tristate + help + Enable this to add common support code for NXP Lynx 10G and Lynx 28G + SerDes blocks. + config PHY_FSL_LYNX_28G tristate "Freescale Layerscape Lynx 28G SerDes PHY support" depends on OF depends on ARCH_LAYERSCAPE || COMPILE_TEST select GENERIC_PHY + select PHY_FSL_LYNX_CORE help Enable this to add support for the Lynx SerDes 28G PHY as found on NXP's Layerscape platforms such as LX2160A. diff --git a/drivers/phy/freescale/Makefile b/drivers/phy/freescale/Makefile index 658eac7d0a62..d7aa62cdeb39 100644 --- a/drivers/phy/freescale/Makefile +++ b/drivers/phy/freescale/Makefile @@ -4,5 +4,6 @@ obj-$(CONFIG_PHY_MIXEL_LVDS_PHY) +=3D phy-fsl-imx8qm-lvds-p= hy.o obj-$(CONFIG_PHY_MIXEL_MIPI_DPHY) +=3D phy-fsl-imx8-mipi-dphy.o obj-$(CONFIG_PHY_FSL_IMX8M_PCIE) +=3D phy-fsl-imx8m-pcie.o obj-$(CONFIG_PHY_FSL_IMX8QM_HSIO) +=3D phy-fsl-imx8qm-hsio.o +obj-$(CONFIG_PHY_FSL_LYNX_CORE) +=3D phy-fsl-lynx-core.o obj-$(CONFIG_PHY_FSL_LYNX_28G) +=3D phy-fsl-lynx-28g.o obj-$(CONFIG_PHY_FSL_SAMSUNG_HDMI_PHY) +=3D phy-fsl-samsung-hdmi.o diff --git a/drivers/phy/freescale/phy-fsl-lynx-28g.c b/drivers/phy/freesca= le/phy-fsl-lynx-28g.c index 4461b47a16ad..27587ad87f22 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-28g.c +++ b/drivers/phy/freescale/phy-fsl-lynx-28g.c @@ -9,6 +9,8 @@ #include #include =20 +#include "phy-fsl-lynx-core.h" + #define LYNX_28G_NUM_LANE 8 #define LYNX_28G_NUM_PLL 2 =20 @@ -282,15 +284,6 @@ enum lynx_28g_proto_sel { PROTO_SEL_25G_50G_100G =3D 0x1a, }; =20 -enum lynx_lane_mode { - LANE_MODE_UNKNOWN, - LANE_MODE_1000BASEX_SGMII, - LANE_MODE_10GBASER, - LANE_MODE_USXGMII, - LANE_MODE_25GBASER, - LANE_MODE_MAX, -}; - struct lynx_28g_proto_conf { /* LNaGCR0 */ int proto_sel; @@ -463,12 +456,6 @@ static const struct lynx_28g_proto_conf lynx_28g_proto= _conf[LANE_MODE_MAX] =3D { }, }; =20 -struct lynx_pccr { - int offset; - int width; - int shift; -}; - struct lynx_28g_priv; =20 struct lynx_28g_pll { @@ -487,11 +474,6 @@ struct lynx_28g_lane { enum lynx_lane_mode mode; }; =20 -struct lynx_info { - bool (*lane_supports_mode)(int lane, enum lynx_lane_mode mode); - int first_lane; -}; - struct lynx_28g_priv { void __iomem *base; struct device *dev; @@ -531,39 +513,6 @@ static void lynx_28g_rmw(struct lynx_28g_priv *priv, u= nsigned long off, #define lynx_28g_pll_read(pll, reg) \ ioread32((pll)->priv->base + reg((pll)->id)) =20 -static const char *lynx_lane_mode_str(enum lynx_lane_mode lane_mode) -{ - switch (lane_mode) { - case LANE_MODE_1000BASEX_SGMII: - return "1000Base-X/SGMII"; - case LANE_MODE_10GBASER: - return "10GBase-R"; - case LANE_MODE_USXGMII: - return "USXGMII"; - case LANE_MODE_25GBASER: - return "25GBase-R"; - default: - return "unknown"; - } -} - -static enum lynx_lane_mode phy_interface_to_lane_mode(phy_interface_t intf) -{ - switch (intf) { - case PHY_INTERFACE_MODE_SGMII: - case PHY_INTERFACE_MODE_1000BASEX: - return LANE_MODE_1000BASEX_SGMII; - case PHY_INTERFACE_MODE_10GBASER: - return LANE_MODE_10GBASER; - case PHY_INTERFACE_MODE_USXGMII: - return LANE_MODE_USXGMII; - case PHY_INTERFACE_MODE_25GBASER: - return LANE_MODE_25GBASER; - default: - return LANE_MODE_UNKNOWN; - } -} - /* A lane mode is supported if we have a PLL that can provide its required * clock net, and if there is a protocol converter for that mode on that l= ane. */ @@ -1572,6 +1521,7 @@ static struct platform_driver lynx_28g_driver =3D { }; module_platform_driver(lynx_28g_driver); =20 +MODULE_IMPORT_NS("PHY_FSL_LYNX"); MODULE_AUTHOR("Ioana Ciornei "); MODULE_DESCRIPTION("Lynx 28G SerDes PHY driver for Layerscape SoCs"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.c b/drivers/phy/freesc= ale/phy-fsl-lynx-core.c new file mode 100644 index 000000000000..d56f189c162d --- /dev/null +++ b/drivers/phy/freescale/phy-fsl-lynx-core.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* Copyright 2025-2026 NXP */ + +#include + +#include "phy-fsl-lynx-core.h" + +const char *lynx_lane_mode_str(enum lynx_lane_mode lane_mode) +{ + switch (lane_mode) { + case LANE_MODE_1000BASEX_SGMII: + return "1000Base-X/SGMII"; + case LANE_MODE_10GBASER: + return "10GBase-R"; + case LANE_MODE_USXGMII: + return "USXGMII"; + case LANE_MODE_25GBASER: + return "25GBase-R"; + default: + return "unknown"; + } +} +EXPORT_SYMBOL_NS_GPL(lynx_lane_mode_str, "PHY_FSL_LYNX"); + +enum lynx_lane_mode phy_interface_to_lane_mode(phy_interface_t intf) +{ + switch (intf) { + case PHY_INTERFACE_MODE_SGMII: + case PHY_INTERFACE_MODE_1000BASEX: + return LANE_MODE_1000BASEX_SGMII; + case PHY_INTERFACE_MODE_10GBASER: + return LANE_MODE_10GBASER; + case PHY_INTERFACE_MODE_USXGMII: + return LANE_MODE_USXGMII; + case PHY_INTERFACE_MODE_25GBASER: + return LANE_MODE_25GBASER; + default: + return LANE_MODE_UNKNOWN; + } +} +EXPORT_SYMBOL_NS_GPL(phy_interface_to_lane_mode, "PHY_FSL_LYNX"); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Freescale Lynx SerDes core functionality"); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.h b/drivers/phy/freesc= ale/phy-fsl-lynx-core.h new file mode 100644 index 000000000000..fe15986482b0 --- /dev/null +++ b/drivers/phy/freescale/phy-fsl-lynx-core.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* Copyright 2025-2026 NXP */ + +#ifndef _PHY_FSL_LYNX_CORE_H +#define _PHY_FSL_LYNX_CORE_H + +#include +#include + +struct lynx_pccr { + int offset; + int width; + int shift; +}; + +struct lynx_info { + bool (*lane_supports_mode)(int lane, enum lynx_lane_mode mode); + int first_lane; +}; + +const char *lynx_lane_mode_str(enum lynx_lane_mode lane_mode); +enum lynx_lane_mode phy_interface_to_lane_mode(phy_interface_t intf); + +#endif diff --git a/include/soc/fsl/phy-fsl-lynx.h b/include/soc/fsl/phy-fsl-lynx.h new file mode 100644 index 000000000000..92e8272d5ae1 --- /dev/null +++ b/include/soc/fsl/phy-fsl-lynx.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* Copyright 2023-2026 NXP */ + +#ifndef __PHY_FSL_LYNX_H_ +#define __PHY_FSL_LYNX_H_ + +enum lynx_lane_mode { + LANE_MODE_UNKNOWN, + LANE_MODE_1000BASEX_SGMII, + LANE_MODE_10GBASER, + LANE_MODE_USXGMII, + LANE_MODE_25GBASER, + LANE_MODE_MAX, +}; + +#endif /* __PHY_FSL_LYNX_H_ */ --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB6A9380FC2 for ; Fri, 29 May 2026 17:15:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074928; cv=fail; b=dnytg0tNlkj8R1Cr5OHjm9xc4IOh24mcVU8qyumYV4FfJsEuOBTkNTmwW62q9Er7qWj5bbGKJiVBkYJONfA5HePB1jYuk4BsP6yc2lgHYwkv5/qalvzZEQ7ZZWhxTB2wvN7U7b74U/p2P3hPpIg4SrGZdFx9fsJG6VVwRt2QPmg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074928; c=relaxed/simple; bh=o5y8qQDIvnztk8K6KaFL7Ibc6CP5fNXZKJFuNWPqrfY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=hMupx6aN02CVE8yuoW85cmoy2zMZ49yNUpoQtsQNn7LhiFufy0mJkhv7up6uyA+UHrY1iFS318nm0x93lLNtEBm5PoTkRTe1oXoNdRHlGHr3U0lRnuZtsI6WBxtPd0HD5aZ99mkQB0KuLIDacNOIv8iwcVJJhvFQgrk1VrlBC/I= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=mKPltXHe; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="mKPltXHe" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FgzGvqsU26ZE+6Z7PNFGGg9T34+r6wTwoHmOEwlj7Uqc1MKSU0qilkczjG5wtLVqEwEpiP1Mu5jgECllLuh8++da9wQqFQP3aiNNy2DN9UlL7Llptm4hm7MKuKtcPgd0ke5ieB+wI6CuZcxCR7nvPwJu8x+O3HIq44EQCiwVeTOF/aGJ6+i0uWz2qsJ/0VyaE5XNeERIOHYm35VVseFIWW+hglmVZ9/JJk6+zv8dwOp/bppxTe66EoWWI5dye5hQq6EFG4OcZR+qOuNXTDH+R7JSV2PcyNnNMDroh1q2ZqzYeCYuo/siol8PhP80OQj3y4xPX47WovYOeAgjzREERg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=rMRRUffJ0HgSiHPUrMAktU0/asuZqEaDzynkMY0of7U=; b=nawrl75rKcwmb9YRrwW2XlU9W0AhGt7GnbMc+Za+a1vyV38Fbc4duOjZPjKpx12XX0OXHXNreKpgxz9ZZRuaaljV9a83l+liP5F53t1/k1JcPZaO6TC9ByysGFiu7citE59QO9W6ue1s//wnIALQhZlGOeHOrXnMPCdaSlAiTdPHDQUFhEbA/0sT2J4LGqm3GjwzfSyxS7YCGwsk+UE2eBJuK6Aw1TR+v17UOuHa1H+PbFyap2RDlSCxd2mtO6Kj5dVYzMsWC2WiPjp26C7BITZd/5smcD+3B9pMbeqDtkY8NwETJHImJItgg+6Olo4OX1q864HElbwdLu2q+W4CTg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rMRRUffJ0HgSiHPUrMAktU0/asuZqEaDzynkMY0of7U=; b=mKPltXHe+S+pwmNuOUOU68QTKwex/rHEUh1S4VPomiCrD2FNLB7Z+Ik4OVPFfN4O7lEFefOD5sYu6ogPLacS8vxVg63sKdmreUnwI9ipWWULBK0tqMAdNSTbecTSNBKRFz1h5U3cTOvvYRwzOPK8RpTPGRKw1pBA9trnsQtr0JhozH+JafB4T3ZkkK+DcR1QJeZ/GtXgm3pkaWsILwbtyDiLD4PPiLcPRBZWU0pjZC0EnrmBDxHsZoI+fgxpsCcqXrrKWJa+UTFsKlL9+u++BL70tdckMHc+vcRccZZu7GwWU2gwofRSXcVmFp3AvdbWAB1c4CN+vChDvMitNuRHNQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:19 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:19 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 03/15] phy: lynx-28g: move data structures to core Date: Fri, 29 May 2026 20:14:57 +0300 Message-Id: <20260529171509.1163787-4-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4PR10CA0017.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5d8::7) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: cea6dd6a-1978-4f5c-bdee-08debda5dbee X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|6133799003|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: PKuSDgNyAatpAe+A/ijF/IYUk6Tub5Zdx3SRLoUJ8IJAHUh16QPKktzSEVsZFOaRZKZgWGAv+q0ul3/Uc0BPdcNK0s52jrI16MPIT71gUIA/9ZwFKSMVi51KQq4aM+yjISUUHshiqPwoXLhfmVRr8ITKLytDmWL0pamwYbQOQi00AY5p+auTFmezLl0YJNW+ySALfrHBcHBrcl0399nKScphjP5v0D2/aZmB4a+V2R/Tl8ENLDNIrFeZnl8cha2epPdB4/2gQHPznha3i+Hd0hjdmgg8kB4VzoEDhRdwU+h3ZPS6tCE4Ii17fqKEFjsizMnBDb3oHypRQWu+5WROgmM9J3d3TNEpi6+eCs7ou2gU7YFumZ7HsHwNSRnwEink4fyXxSUCXjGh7bd6qCFNSjVm3Su8YAPqVgLnn4XE8LSbzXqCCPjnP3tNzXmAjSheo2Kkspn5vdqNTL4Aujhft5CV4iiUaPr0GqXlykTGaeROpkYP7Wwp2OkWLA3G7wgyCcDA/GkDcQ91LuMb9Y1JEVlumWLwA5Xt3p0DHel+myhrsaHo58ZjJlmT9w3b/Yb6fZeVuvwRlXrukZeVrfiHu1w0PwRBPw0D+Ovrd1dL70NuZovLxZaP3nbm0WmFJJd4/Iet3WpIJNSEzSffkVOuVQ3ahkMKW2qiS18VIUdscswa6kl02+aASxWlOD7FOCC5 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(6133799003)(56012099006)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?R4agE4dJ+4qmA82Ae/Z6yDHfl2cWAqlRhco+OjQYhOAOHhMcn/oM3d902L0X?= =?us-ascii?Q?p661Dj4BTc9zNEucd7+nl24shtXQLW0kmkiaYRsU+DRFNdj2kFQpYWPMrOD2?= =?us-ascii?Q?u0Ip6jI2X4vFPpds/b+M5AKgr4gHPnFKHxqL/2CemtmyZBq1MkLLbh421Asg?= =?us-ascii?Q?xeo+QB25sa+lgCpwvnyv80a8p8qLiPCJJ3TF1kto7UVZSV6DDJBVH6JwmcvW?= =?us-ascii?Q?Dblln5Ucvs2mpZW0rdOKlva0hLUfj8/sRenm/daMlBrTtcSKsxkK5fSgDPme?= =?us-ascii?Q?gzKjwiec86CehP2AknPok/dJYavkc5mvKXmL7Znhh5B+IMRVjiagHuTVCTJN?= =?us-ascii?Q?vKCeGpjNJatdOa4lkbV36uwoFUYtdhxY8RTu9KbiiQHdzMNm0Ff3ZSpJt+tT?= =?us-ascii?Q?ENvJDOicnAGlFZPvQmgNpZ+/sW1VE42lA+DhJK8IxXTxTHoFF81S6V54yEZl?= =?us-ascii?Q?aOfO9umpgAIhoUFMQN1oWO+lN6+zZnv91CSdSzt6JcRapGOv+Lr7XomElpwf?= =?us-ascii?Q?j3n3gqUOf8+/OVpM7sDKLLqWNTrnN/rOB2uBuB6Q95E9NpCDtm4Oc6mmW0uK?= =?us-ascii?Q?PmNrEU8jsygpBb0NopZBtDcj1Fbwxonj6K38a36JHQ6ukRqAcQRBFlAD1rIg?= =?us-ascii?Q?7lRSXRyhfkaiB8Rfs/KxxgTnMtdscCxUO77MXGIGZboVxlFVbXoH7zlNS2IX?= =?us-ascii?Q?KrvDmi3LIYjVUbPvhfssH1cpenOXahn0SD45eAbQBYximFrx5v1H4WOV6msP?= =?us-ascii?Q?IT8Yuyg1iP7xPKOx3CH85GLjKssSElCICDMDWl6jEBcEVXJEhYksMuaJq8qk?= =?us-ascii?Q?6/rnNTfhVXSdTwry4lQsKe/N7J6fGltNOfHPtAr00fW834qRWJUmkoFOdpLc?= =?us-ascii?Q?SbtYlom5hUUUp5IYHqfNoZgSsYb4B6vEojwxrFGjSZY3QFbdm0ci/A3OL06P?= =?us-ascii?Q?gY294HqEsDPu/NByNLoWp01OQvguMYyF7YKE3MYLE5PuiGjDIv6xb4qNys6a?= =?us-ascii?Q?88bp8m1OytWyZ5c7/IfG7dcQJzkblg2NKnpoIt8dlDz2m2tcQMRcjLyIQ069?= =?us-ascii?Q?nrb83pds+ZT8jLZJ3mvnD16uQniZgz67/bbfW384z/5V8DEbWjuDZ1xEbjmk?= =?us-ascii?Q?W6ZSCUk3XKGRzrud95BrRMTsfJBdg90YDNprh1w9LO4O/weV38Nqnr/ATHkN?= =?us-ascii?Q?pNk3Ao2mbDP/IPguTXFvlMfXnPCzqN+1qgP4PDb0S8kqGc4iDkrrUNzR/CST?= =?us-ascii?Q?gHfFKQCeZvDht8g6LhGyhhxuHJRu0iLUi+pAPs6Ma2s2r4+hjujnkMY5pgd7?= =?us-ascii?Q?hUyW9v25qBvS8xvp4iAwvKUgCTl/3IGeDQn4g9ksJwZnS3MM1ix4weTS65a/?= =?us-ascii?Q?uU8nI0xZ1FCaURz/D9cUtNVohXNs9Aafn6XRs/gjQogeyPJHIViwzfV2A73T?= =?us-ascii?Q?UjMcF7DtwiDitqUoOP/i2roFtODBmriiKpSJH4LatqVrwezva0jHwuFntpHG?= =?us-ascii?Q?UFugupXRDfydAbyqCeIZ8OHZv+yrxXqz/CYtCEKviP3daD4k/YgCoWWzqsTL?= =?us-ascii?Q?ymJZY3+82dPUv58268LQVr/xo4TY1c18CBkiSStAYPZYfqhJ+v3oAxTAwOB/?= =?us-ascii?Q?T8dW2cedlPZMapBoHfnIPj0Vd0NigFki3omlKwEs1L43SRWgIIYg37xP2Aai?= =?us-ascii?Q?ie8rOkcH/grttJI6ED8H+8lSr6FfWmofOcgEeT+h8Tjhv5VIxJ//+kPtRTZG?= =?us-ascii?Q?YM1muWtj27yZjKXHyoJnTveKqx4uw42kG0xjBJamboEVfJYpxscz?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: cea6dd6a-1978-4f5c-bdee-08debda5dbee X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:19.1532 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Z5UcmvWPiiQOokJ90MMqdA1FzGHmwg+R/hsYTYGkx1cAXxdOiWnE0YMAd41UcC3IWEl8WOu0je3xNApdauYDPQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" The goal is to avoid duplicating the core data structures when introducing the new lynx-10g driver. We move the following to phy-fsl-lynx-core: - struct lynx_28g_pll -> struct lynx_pll. This has some hardware-specific register fields which need to become hardware agnostic (the PLL register layout is different for Lynx 10G), So: - PLLnRSTCTL_DIS(pll->rstctl) becomes !pll->enabled - PLLnRSTCTL_LOCK(pll->rstctl) becomes pll->locked - FIELD_GET(PLLnCR1_FRATE_SEL, pll->cr1) becomes pll->frate_sel - FIELD_GET(PLLnCR0_REFCLK_SEL, pll->cr0) becomes pll->refclk_sel - struct lynx_28g_lane -> struct lynx_lane - struct lynx_28g_priv -> struct lynx_priv - field lane[LYNX_28G_NUM_LANE] has to be dynamically allocated. Not all Lynx 10G SerDes blocks have 8 lanes. - LYNX_28G_NUM_PLL -> LYNX_NUM_PLL. This is an architectural constant which is the same for Lynx 10G as well. To avoid major noise in the lynx-28g driver, we keep compatibility shims (for now) where the old lynx_28g names are preserved, but translate to the common data structures. Signed-off-by: Vladimir Oltean --- v1->v2: none --- drivers/phy/freescale/phy-fsl-lynx-28g.c | 135 +++++++--------------- drivers/phy/freescale/phy-fsl-lynx-core.c | 23 ++++ drivers/phy/freescale/phy-fsl-lynx-core.h | 64 ++++++++++ 3 files changed, 129 insertions(+), 93 deletions(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-28g.c b/drivers/phy/freesca= le/phy-fsl-lynx-28g.c index 27587ad87f22..482c5d8fdc6a 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-28g.c +++ b/drivers/phy/freescale/phy-fsl-lynx-28g.c @@ -12,7 +12,7 @@ #include "phy-fsl-lynx-core.h" =20 #define LYNX_28G_NUM_LANE 8 -#define LYNX_28G_NUM_PLL 2 +#define LYNX_28G_NUM_PLL LYNX_NUM_PLL =20 /* SoC IP wrapper for protocol converters */ #define PCC8 0x10a0 @@ -43,8 +43,8 @@ =20 /* Per PLL registers */ #define PLLnRSTCTL(pll) (0x400 + (pll) * 0x100 + 0x0) -#define PLLnRSTCTL_DIS(rstctl) (((rstctl) & BIT(24)) >> 24) -#define PLLnRSTCTL_LOCK(rstctl) (((rstctl) & BIT(23)) >> 23) +#define PLLnRSTCTL_DIS BIT(24) +#define PLLnRSTCTL_LOCK BIT(23) =20 #define PLLnCR0(pll) (0x400 + (pll) * 0x100 + 0x4) #define PLLnCR0_REFCLK_SEL GENMASK(20, 16) @@ -269,6 +269,17 @@ #define LYNX_28G_LANE_STOP_SLEEP_US 100 #define LYNX_28G_LANE_STOP_TIMEOUT_US 1000000 =20 +#define lynx_28g_read lynx_read +#define lynx_28g_write lynx_write +#define lynx_28g_lane_rmw lynx_lane_rmw +#define lynx_28g_lane_read lynx_lane_read +#define lynx_28g_lane_write lynx_lane_write +#define lynx_28g_pll_read lynx_pll_read + +#define lynx_28g_priv lynx_priv +#define lynx_28g_lane lynx_lane +#define lynx_28g_pll lynx_pll + enum lynx_28g_eq_type { EQ_TYPE_NO_EQ =3D 0, EQ_TYPE_2TAP =3D 1, @@ -456,86 +467,6 @@ static const struct lynx_28g_proto_conf lynx_28g_proto= _conf[LANE_MODE_MAX] =3D { }, }; =20 -struct lynx_28g_priv; - -struct lynx_28g_pll { - struct lynx_28g_priv *priv; - u32 rstctl, cr0, cr1; - int id; - DECLARE_BITMAP(supported, LANE_MODE_MAX); -}; - -struct lynx_28g_lane { - struct lynx_28g_priv *priv; - struct phy *phy; - bool powered_up; - bool init; - unsigned int id; - enum lynx_lane_mode mode; -}; - -struct lynx_28g_priv { - void __iomem *base; - struct device *dev; - const struct lynx_info *info; - /* Serialize concurrent access to registers shared between lanes, - * like PCCn - */ - spinlock_t pcc_lock; - struct lynx_28g_pll pll[LYNX_28G_NUM_PLL]; - struct lynx_28g_lane lane[LYNX_28G_NUM_LANE]; - - struct delayed_work cdr_check; -}; - -static void lynx_28g_rmw(struct lynx_28g_priv *priv, unsigned long off, - u32 val, u32 mask) -{ - void __iomem *reg =3D priv->base + off; - u32 orig, tmp; - - orig =3D ioread32(reg); - tmp =3D orig & ~mask; - tmp |=3D val; - iowrite32(tmp, reg); -} - -#define lynx_28g_read(priv, off) \ - ioread32((priv)->base + (off)) -#define lynx_28g_write(priv, off, val) \ - iowrite32(val, (priv)->base + (off)) -#define lynx_28g_lane_rmw(lane, reg, val, mask) \ - lynx_28g_rmw((lane)->priv, reg(lane->id), val, mask) -#define lynx_28g_lane_read(lane, reg) \ - ioread32((lane)->priv->base + reg((lane)->id)) -#define lynx_28g_lane_write(lane, reg, val) \ - iowrite32(val, (lane)->priv->base + reg((lane)->id)) -#define lynx_28g_pll_read(pll, reg) \ - ioread32((pll)->priv->base + reg((pll)->id)) - -/* A lane mode is supported if we have a PLL that can provide its required - * clock net, and if there is a protocol converter for that mode on that l= ane. - */ -static bool lynx_28g_supports_lane_mode(struct lynx_28g_lane *lane, - enum lynx_lane_mode mode) -{ - struct lynx_28g_priv *priv =3D lane->priv; - int i; - - if (!priv->info->lane_supports_mode(lane->id, mode)) - return false; - - for (i =3D 0; i < LYNX_28G_NUM_PLL; i++) { - if (PLLnRSTCTL_DIS(priv->pll[i].rstctl)) - continue; - - if (test_bit(mode, priv->pll[i].supported)) - return true; - } - - return false; -} - static struct lynx_28g_pll *lynx_28g_pll_get(struct lynx_28g_priv *priv, enum lynx_lane_mode mode) { @@ -545,7 +476,7 @@ static struct lynx_28g_pll *lynx_28g_pll_get(struct lyn= x_28g_priv *priv, for (i =3D 0; i < LYNX_28G_NUM_PLL; i++) { pll =3D &priv->pll[i]; =20 - if (PLLnRSTCTL_DIS(pll->rstctl)) + if (!pll->enabled) continue; =20 if (test_bit(mode, pll->supported)) @@ -553,7 +484,7 @@ static struct lynx_28g_pll *lynx_28g_pll_get(struct lyn= x_28g_priv *priv, } =20 /* no pll supports requested mode, either caller forgot to check - * lynx_28g_supports_lane_mode, or this is a bug. + * lynx_lane_supports_mode(), or this is a bug. */ dev_WARN_ONCE(priv->dev, 1, "no pll for lane mode %s\n", lynx_lane_mode_str(mode)); @@ -564,7 +495,7 @@ static void lynx_28g_lane_set_nrate(struct lynx_28g_lan= e *lane, struct lynx_28g_pll *pll, enum lynx_lane_mode lane_mode) { - switch (FIELD_GET(PLLnCR1_FRATE_SEL, pll->cr1)) { + switch (pll->frate_sel) { case PLLnCR1_FRATE_5G_10GVCO: case PLLnCR1_FRATE_5G_25GVCO: switch (lane_mode) { @@ -879,27 +810,33 @@ static bool lynx_28g_compat_lane_supports_mode(int la= ne, =20 static const struct lynx_info lynx_info_compat =3D { .lane_supports_mode =3D lynx_28g_compat_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2160a_serdes1 =3D { .lane_supports_mode =3D lx2160a_serdes1_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2160a_serdes2 =3D { .lane_supports_mode =3D lx2160a_serdes2_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2160a_serdes3 =3D { .lane_supports_mode =3D lx2160a_serdes3_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2162a_serdes1 =3D { .lane_supports_mode =3D lx2162a_serdes1_lane_supports_mode, .first_lane =3D 4, + .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2162a_serdes2 =3D { .lane_supports_mode =3D lx2162a_serdes2_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static int lynx_pccr_read(struct lynx_28g_lane *lane, enum lynx_lane_mode = mode, @@ -1168,7 +1105,7 @@ static int lynx_28g_set_mode(struct phy *phy, enum ph= y_mode mode, int submode) return -EOPNOTSUPP; =20 lane_mode =3D phy_interface_to_lane_mode(submode); - if (!lynx_28g_supports_lane_mode(lane, lane_mode)) + if (!lynx_lane_supports_mode(lane, lane_mode)) return -EOPNOTSUPP; =20 if (lane_mode =3D=3D lane->mode) @@ -1210,7 +1147,7 @@ static int lynx_28g_validate(struct phy *phy, enum ph= y_mode mode, int submode, return -EOPNOTSUPP; =20 lane_mode =3D phy_interface_to_lane_mode(submode); - if (!lynx_28g_supports_lane_mode(lane, lane_mode)) + if (!lynx_lane_supports_mode(lane, lane_mode)) return -EOPNOTSUPP; =20 return 0; @@ -1262,6 +1199,7 @@ static const struct phy_ops lynx_28g_ops =3D { static void lynx_28g_pll_read_configuration(struct lynx_28g_priv *priv) { struct lynx_28g_pll *pll; + u32 val; int i; =20 for (i =3D 0; i < LYNX_28G_NUM_PLL; i++) { @@ -1269,14 +1207,20 @@ static void lynx_28g_pll_read_configuration(struct = lynx_28g_priv *priv) pll->priv =3D priv; pll->id =3D i; =20 - pll->rstctl =3D lynx_28g_pll_read(pll, PLLnRSTCTL); - pll->cr0 =3D lynx_28g_pll_read(pll, PLLnCR0); - pll->cr1 =3D lynx_28g_pll_read(pll, PLLnCR1); + val =3D lynx_28g_pll_read(pll, PLLnRSTCTL); + pll->enabled =3D !(val & PLLnRSTCTL_DIS); + pll->locked =3D !!(val & PLLnRSTCTL_LOCK); =20 - if (PLLnRSTCTL_DIS(pll->rstctl)) + val =3D lynx_28g_pll_read(pll, PLLnCR0); + pll->refclk_sel =3D FIELD_GET(PLLnCR0_REFCLK_SEL, val); + + val =3D lynx_28g_pll_read(pll, PLLnCR1); + pll->frate_sel =3D FIELD_GET(PLLnCR1_FRATE_SEL, val); + + if (!pll->enabled) continue; =20 - switch (FIELD_GET(PLLnCR1_FRATE_SEL, pll->cr1)) { + switch (pll->frate_sel) { case PLLnCR1_FRATE_5G_10GVCO: case PLLnCR1_FRATE_5G_25GVCO: /* 5GHz clock net */ @@ -1440,6 +1384,11 @@ static int lynx_28g_probe(struct platform_device *pd= ev) if (priv->info =3D=3D &lynx_info_compat) dev_warn(dev, "Please update device tree to use per-device compatible st= rings\n"); =20 + priv->lane =3D devm_kcalloc(dev, priv->info->num_lanes, + sizeof(*priv->lane), GFP_KERNEL); + if (!priv->lane) + return -ENOMEM; + priv->base =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(priv->base)) return PTR_ERR(priv->base); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.c b/drivers/phy/freesc= ale/phy-fsl-lynx-core.c index d56f189c162d..de45b14d3fb6 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.c +++ b/drivers/phy/freescale/phy-fsl-lynx-core.c @@ -40,5 +40,28 @@ enum lynx_lane_mode phy_interface_to_lane_mode(phy_inter= face_t intf) } EXPORT_SYMBOL_NS_GPL(phy_interface_to_lane_mode, "PHY_FSL_LYNX"); =20 +/* A lane mode is supported if we have a PLL that can provide its required + * clock net, and if there is a protocol converter for that mode on that l= ane. + */ +bool lynx_lane_supports_mode(struct lynx_lane *lane, enum lynx_lane_mode m= ode) +{ + struct lynx_priv *priv =3D lane->priv; + int i; + + if (!priv->info->lane_supports_mode(lane->id, mode)) + return false; + + for (i =3D 0; i < LYNX_NUM_PLL; i++) { + if (!priv->pll[i].enabled) + continue; + + if (test_bit(mode, priv->pll[i].supported)) + return true; + } + + return false; +} +EXPORT_SYMBOL_NS_GPL(lynx_lane_supports_mode, "PHY_FSL_LYNX"); + MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Freescale Lynx SerDes core functionality"); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.h b/drivers/phy/freesc= ale/phy-fsl-lynx-core.h index fe15986482b0..f0cb3e805235 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.h +++ b/drivers/phy/freescale/phy-fsl-lynx-core.h @@ -7,18 +7,82 @@ #include #include =20 +#define LYNX_NUM_PLL 2 + struct lynx_pccr { int offset; int width; int shift; }; =20 +struct lynx_priv; + +struct lynx_pll { + struct lynx_priv *priv; + int id; + int refclk_sel; + int frate_sel; + bool enabled; + bool locked; + DECLARE_BITMAP(supported, LANE_MODE_MAX); +}; + +struct lynx_lane { + struct lynx_priv *priv; + struct phy *phy; + bool powered_up; + bool init; + unsigned int id; + enum lynx_lane_mode mode; +}; + struct lynx_info { bool (*lane_supports_mode)(int lane, enum lynx_lane_mode mode); int first_lane; + int num_lanes; }; =20 +struct lynx_priv { + void __iomem *base; + struct device *dev; + const struct lynx_info *info; + /* Serialize concurrent access to registers shared between lanes, + * like PCCn + */ + spinlock_t pcc_lock; + struct lynx_pll pll[LYNX_NUM_PLL]; + struct lynx_lane *lane; + + struct delayed_work cdr_check; +}; + +static inline void lynx_rmw(struct lynx_priv *priv, unsigned long off, u32= val, + u32 mask) +{ + void __iomem *reg =3D priv->base + off; + u32 orig, tmp; + + orig =3D ioread32(reg); + tmp =3D orig & ~mask; + tmp |=3D val; + iowrite32(tmp, reg); +} + +#define lynx_read(priv, off) \ + ioread32((priv)->base + (off)) +#define lynx_write(priv, off, val) \ + iowrite32(val, (priv)->base + (off)) +#define lynx_lane_rmw(lane, reg, val, mask) \ + lynx_rmw((lane)->priv, reg(lane->id), val, mask) +#define lynx_lane_read(lane, reg) \ + ioread32((lane)->priv->base + reg((lane)->id)) +#define lynx_lane_write(lane, reg, val) \ + iowrite32(val, (lane)->priv->base + reg((lane)->id)) +#define lynx_pll_read(pll, reg) \ + ioread32((pll)->priv->base + reg((pll)->id)) + const char *lynx_lane_mode_str(enum lynx_lane_mode lane_mode); enum lynx_lane_mode phy_interface_to_lane_mode(phy_interface_t intf); +bool lynx_lane_supports_mode(struct lynx_lane *lane, enum lynx_lane_mode m= ode); =20 #endif --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E32B2380FDD for ; Fri, 29 May 2026 17:15:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074926; cv=fail; b=cibqNavByGkWGyCyTu240FLsdMUYBkFTWSY72H1HgSIZVwTkGSYmN6A8/td3aRj1We6sq1e6watF62Kg1HJtHgHybuKBhAvnmSWARZKgPS8lVlAZcyReNLqlJ9FsiNni2J/LerQmF0qd9CDJ5bM07tBVfKv2NuV0XGu6QZKKN9w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074926; c=relaxed/simple; bh=bOBdZrh6DJcUSf+W50uXd4GD1I5HWYQwdb/M/5IhV1E=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=rQl+K9Nvn4jZOQ16NF6hPRdUvyhyprHzDt53cZffqHaiHBZmAboBaDfl1aks1y0Af/I6tUjs73TSJMiCDoZ/YeHDMZadII5wJ3u+fd3pHYOWf1qBal2v82AKOiF+ximyPTVG44X9EsrlzWj3grJOvEs32zJ9GVTd+DMD/uIh2Ag= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=jAtgfzTh; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="jAtgfzTh" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KURLyVHPexScP+jRANIJaBiDhQ3O+e88bMXRG6ScWPGcY/wrRwudBaHqtYW9zsLQIGcuGwSvz5P8dwt5eGmgdT0eafNdplLdvKT2sOYFlZJklp/SUCMnmK03ZVrBXUrEh+a9zvTnJZcn5Nuss2uilHiKban9BnPYK912bGLC03Z16wM8hKmR/EWGxM63+Aj4f8am/Zq+NeeLVEPTY3Rwzt7T7e3wH9pcwm7yYVSiebZEthWtad33omwtLjPgtYH/jO+5BCNEJo4EmJcqHq+bltlurf0+2fBnZhNeSDjRL5kxoLa14qwJ86zIjChTioKM4LjSJvlzc4C8H4RCF7qVGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=T6iuXxU3BOSVbYNYc/TjM3jvPLzaIcvrBZp6VdkHrb4=; b=wlQIPw0ipzGF++ZtAdvmWgJRXmvDuW2GxtKVcBEZcMysvU0+XFlqjt6oJA3E2V9oaoPuQtndKUoPHtJZsgR2iqIu+fv1FkFpz5a2StdMjugzMqyboksN5twl/q2FZYHTPk8k+qWzc8huUd1qgVsMPOAuyrVLcRLXKzFn3Br5OEBmYqWJvfI2NdhJ70Spk+AL80gBP5hSiEyW0WfLxG5NySo/+wFUWinS5qQaM+8bx4gToOykp847usooZvDHXOlcKxjifK/KYAdZvELT1hUCg4SruskY6+ECJZ+yob6OaFKDNPl3arepXVSBFuHiqFKoEvhNMlNZCN42LLqacBvMLg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=T6iuXxU3BOSVbYNYc/TjM3jvPLzaIcvrBZp6VdkHrb4=; b=jAtgfzThNdzGoPxuOZkYTjXeZC7rkvdJRf616+AzxOG6HFZ9RNpVeHPTwn33LmqTzGfSRtKSDJZkgt9L0zQHDkvm0bAEtfJaDZtJOki0m8B++5pEQoKbTMzUFxC+F9mIgdMVEtnY9uR4DLmtQF0MVTU+noZYZYWwAWv6JwSs15SzdNU82Ty3NpBjzbMeKwmlt1a4A8x0a3z9XrwAjfNuOuohubjQB6Ext0wOqJ+9PpW+AjRQlW6WiyHmdDVAeoeEovO8M9rRbCqQJ9IawvhsKW4kPZEQVF4Ex/5+82DViHz9NlZXFd3fdY5VbvSDXAvfbpyDl5UJdqR9koflzJV6Sg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:20 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:20 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 04/15] phy: lynx-28g: common lynx_pll_get() Date: Fri, 29 May 2026 20:14:58 +0300 Message-Id: <20260529171509.1163787-5-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4PR10CA0017.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5d8::7) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: 830c6a2b-1d6e-47d1-92aa-08debda5dcdd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|6133799003|56012099006; X-Microsoft-Antispam-Message-Info: CLbXAaK2v/I5Pe0/OBmSaUDZ+UMsfTuN8BKRM+MNfXvmZ48XaTUyj0hty8fiv/9fBZzcnRLHQ6vUqQCBnUZ3lx0XB9uDY5IKNmDKBl0gPElU28Ygm++2BCnhlk7BIHfd5D9i/1e72mEqfWAQ35qILuj6HXsRAysGZoTlrK0NIPY01GGNsdw6FaMh3eQZcKZ+8c6C4bFD3p9Evnx0F9x/a1BBY59LQAQQvV04nKkZb1iLtsV7U8fpmFKqMxqkqBfyyA4un+twCQUGnkZBL0B5xbjgikVOGXDbV5Mk+6O5Ug5alxV1geMXAmthDzhEHyx0n7qaIU6v0UL34wgfC4UdJzqD5byMIZdXIK/aCiLKg4UsN5ovMFfJNdeR40xKFK9mgf8Iw5kqP4mSrkMX/WhBrMxseyf1XFSX6iPoRyoZgGSwVe1N5yJpCe8rx706qmS+CWbzw7XPHrJfZ/bJhjy2HM77x6X1LF+RbYyUHixQ4/ilN5B9xBYZ5tLTKrZLOQOlhkm1+nkGup7xrfeAT65Xy+NapqxQK+aU66N7STXM7YF9OdWuMl6NZBCDcfolnb69FWjNgtrdQWGqKgIO4JT3LBWSTmLIVLFFdCIyE/ZBjT0Fq60SIx7fwLg1cu5LneVuvlKMVHChaF3iyA18m3qrJ/XbrAOTAwISyToX+XFWXI2PXL/6V7Awn2FQRfhnxV0+ X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(6133799003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?fK5OjOD/S7MJUFvwAK4krJ2bYbWFQUVypWbUOJQC1AiFNzjS41qR/uEwAuyh?= =?us-ascii?Q?uov6KP7y8/OyPINUFRkPO280WrI794J0HcEQEKZirZAZE4xA3Ka6W+Eh4kBG?= =?us-ascii?Q?mh11Vrta+cC2AiHFihnniBG6WzSLPl0bnlNqlLgddL+H5kV3HRCurUGSWnT8?= =?us-ascii?Q?gE/WuBf8r4BVyxYNZf30Da45eDv1xvliuUhWLIz9oemCmAN37tzZJLsBNziU?= =?us-ascii?Q?iZhFeiaJxgyyaxkWri3A+GcRHkRh/hwj3JXN1ZpMR2GCIG8svn6CdR5OZ1JH?= =?us-ascii?Q?yUw2957tTAqkVNaMi4PDMx5zyX+CVi43Sv7HbtyQqrd3WxmsXc3ZXSe2j9hG?= =?us-ascii?Q?0nrKZT4DGhvFUqvKlGpTiPH8d2hsXj7NuB05zMG+6B2OhmI6JI3FIqS1LMdt?= =?us-ascii?Q?E8i0aFaNoF5pu3PCwDpN0rOvLOcbalfNcNw+qgdDTiuQj/Docis+MgYAH7vI?= =?us-ascii?Q?Fk23yTzjjLBXBCqz7HzvD+zOA176lJEoJhj+DgI+Y3fkF9DbGNkDvxiZMzdF?= =?us-ascii?Q?FRLAXV/bCqPZkp6GU2icG1bnVJD6Fh2t4QcfAUsWPaGjHIiOK04Qgq0nhTRM?= =?us-ascii?Q?pfrIh9ns5pX8NXyWjln/rul6KF5gTa3DMNTqkZWdwFCyY70HGjgn7kU6Najm?= =?us-ascii?Q?ClAVSSo7MYtwkU4oyQRzMsBTXyMVxweIpI8riyALMlvm/bczS/ojK9bMQdQr?= =?us-ascii?Q?6oDda9AveOjjVDGNDYFhEIineKa8uZiHyOwZtCInvgXA3JqZUkTaur4e+bys?= =?us-ascii?Q?hErBkkrYfwFZfS7K7fGe5hYpvfD7+HenMfrRRVapyh2yqUsi/DUWm9bAmBEs?= =?us-ascii?Q?9O+1MVQKFbB3VdaRXeLTmiZMsWR9WfA2WzZSzJViYQy9S/2LfRcRK5axkiVU?= =?us-ascii?Q?0u95S1oa4X2DfTe47qkMJFa/yeQQjFQRuN1Q+50riOVPMPKuKHjPHcQjwLqv?= =?us-ascii?Q?9HB1VFeBWySRaYQ769duprIeFrD97g1a7U1SLkvoFwqvG1NSHZ/W8ziQTtMG?= =?us-ascii?Q?Wl19EUPUCu9JnxHravQxX27/nbU7QxGg29Oa1O3HbjieZX3NcieqbaiTOOTz?= =?us-ascii?Q?mO6s8YKpFaF80vhN6qPWfjSoTmyq/eUPUBPEJyKbUPsev+ir3htqAe6uxRmO?= =?us-ascii?Q?ozCuMVB+vNpQJYfEsNI7jx4+SLU4jUufEU5idykn3ACh8I1lZFBymTtthbi7?= =?us-ascii?Q?uny+kJanu8YEQiaRck0hGglk7d6TFgwuOd5dY9/cJgnkaIhYCv0z4ytGwY44?= =?us-ascii?Q?7B7xwkZTIMV7itG8zRI1iyp3URbNz7IdZRLidVylOTrRybuZTz2LEXYICqOn?= =?us-ascii?Q?v0xzvw1S0ipnnO1zKbrBK0xX9CdJQYQ6ibuaJzoc8C57MZs2cQTHFJqZJjOP?= =?us-ascii?Q?A11hoNWVUT/G9eSDKWMRLF8TZmWon/48AxgVcKF6V85Ws/8cLy1CyPON5Kk+?= =?us-ascii?Q?sWsjSXVgOlcJJqGPUcApK1WAi9ff0ZJMDTlPgNqV0Cw+BEPj5nmbQw6URVuj?= =?us-ascii?Q?ZHpNJghZF/yEGRMyPevvlIr/Y7ftmrF+l0L+Pagam+A9gEjoOGuKoqqx8idr?= =?us-ascii?Q?8ecLljAuJksZlMA9MQqDBjf2ttNa7LIRsR3YOLVgnL6qc0zpatdmO7lIEBoC?= =?us-ascii?Q?r4rs5AvFRWX/ELmsqduJXrFRT8JXAWDwSa4hPMbDawdQMktqOCpVpeZG9HIv?= =?us-ascii?Q?jzmx228vFXMY465FkfQgTgFcEieXTMT4YeZRczT+s/6b02oI1LZwSMVD9vwN?= =?us-ascii?Q?YLI+PvdSuYnVCKaIBroEJn2QxzNVfe5lDGTNiDa2g94fH4Bys3Q6?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 830c6a2b-1d6e-47d1-92aa-08debda5dcdd X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:20.7232 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: pmgTUwQkTSIXmfCnSNIx7x0sC/CTLAT9d88n1iAXSPNe795WyjBQXFyC4YHUeIBVLDQHhkh5YL9z1v2OS4RiFw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" The logic should be absolutely unchanged in the new 10G Lynx SerDes driver, so let's move this to phy-fsl-lynx-core.c and update the 28G Lynx driver to use the common variant. While at it, update the call site, lynx_28g_lane_remap_pll(), to use the new data structures, and refactor the NULL pll pointer check (the current form triggers a checkpatch CHECK). Signed-off-by: Vladimir Oltean --- v1->v2: add the drive-by refactoring --- drivers/phy/freescale/phy-fsl-lynx-28g.c | 34 ++++------------------- drivers/phy/freescale/phy-fsl-lynx-core.c | 24 ++++++++++++++++ drivers/phy/freescale/phy-fsl-lynx-core.h | 2 ++ 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-28g.c b/drivers/phy/freesca= le/phy-fsl-lynx-28g.c index 482c5d8fdc6a..504d03ac8a0f 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-28g.c +++ b/drivers/phy/freescale/phy-fsl-lynx-28g.c @@ -467,30 +467,6 @@ static const struct lynx_28g_proto_conf lynx_28g_proto= _conf[LANE_MODE_MAX] =3D { }, }; =20 -static struct lynx_28g_pll *lynx_28g_pll_get(struct lynx_28g_priv *priv, - enum lynx_lane_mode mode) -{ - struct lynx_28g_pll *pll; - int i; - - for (i =3D 0; i < LYNX_28G_NUM_PLL; i++) { - pll =3D &priv->pll[i]; - - if (!pll->enabled) - continue; - - if (test_bit(mode, pll->supported)) - return pll; - } - - /* no pll supports requested mode, either caller forgot to check - * lynx_lane_supports_mode(), or this is a bug. - */ - dev_WARN_ONCE(priv->dev, 1, "no pll for lane mode %s\n", - lynx_lane_mode_str(mode)); - return NULL; -} - static void lynx_28g_lane_set_nrate(struct lynx_28g_lane *lane, struct lynx_28g_pll *pll, enum lynx_lane_mode lane_mode) @@ -927,15 +903,15 @@ static int lynx_pcvt_rmw(struct lynx_28g_lane *lane, return lynx_pcvt_write(lane, lane_mode, cr, tmp); } =20 -static void lynx_28g_lane_remap_pll(struct lynx_28g_lane *lane, +static void lynx_28g_lane_remap_pll(struct lynx_lane *lane, enum lynx_lane_mode lane_mode) { - struct lynx_28g_priv *priv =3D lane->priv; - struct lynx_28g_pll *pll; + struct lynx_priv *priv =3D lane->priv; + struct lynx_pll *pll; =20 /* Switch to the PLL that works with this interface type */ - pll =3D lynx_28g_pll_get(priv, lane_mode); - if (unlikely(pll =3D=3D NULL)) + pll =3D lynx_pll_get(priv, lane_mode); + if (unlikely(!pll)) return; =20 lynx_28g_lane_set_pll(lane, pll); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.c b/drivers/phy/freesc= ale/phy-fsl-lynx-core.c index de45b14d3fb6..5e5bcaa54d09 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.c +++ b/drivers/phy/freescale/phy-fsl-lynx-core.c @@ -63,5 +63,29 @@ bool lynx_lane_supports_mode(struct lynx_lane *lane, enu= m lynx_lane_mode mode) } EXPORT_SYMBOL_NS_GPL(lynx_lane_supports_mode, "PHY_FSL_LYNX"); =20 +struct lynx_pll *lynx_pll_get(struct lynx_priv *priv, enum lynx_lane_mode = mode) +{ + struct lynx_pll *pll; + int i; + + for (i =3D 0; i < LYNX_NUM_PLL; i++) { + pll =3D &priv->pll[i]; + + if (!pll->enabled) + continue; + + if (test_bit(mode, pll->supported)) + return pll; + } + + /* no pll supports requested mode, either caller forgot to check + * lynx_lane_supports_mode(), or this is a bug. + */ + dev_WARN_ONCE(priv->dev, 1, "no pll for lane mode %s\n", + lynx_lane_mode_str(mode)); + return NULL; +} +EXPORT_SYMBOL_NS_GPL(lynx_pll_get, "PHY_FSL_LYNX"); + MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Freescale Lynx SerDes core functionality"); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.h b/drivers/phy/freesc= ale/phy-fsl-lynx-core.h index f0cb3e805235..b726ff21972b 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.h +++ b/drivers/phy/freescale/phy-fsl-lynx-core.h @@ -85,4 +85,6 @@ const char *lynx_lane_mode_str(enum lynx_lane_mode lane_m= ode); enum lynx_lane_mode phy_interface_to_lane_mode(phy_interface_t intf); bool lynx_lane_supports_mode(struct lynx_lane *lane, enum lynx_lane_mode m= ode); =20 +struct lynx_pll *lynx_pll_get(struct lynx_priv *priv, enum lynx_lane_mode = mode); + #endif --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AD2293815CC for ; Fri, 29 May 2026 17:15:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074930; cv=fail; b=rAe+56Wf9QFhSDQafQDEHDnZ4AdkC1R1yKDnwFjuPmN2nMpdhaWJxnrDlcY92afZMjeUIP3s8AXK7RrgNvTFM33Fa2P1dpqSLq4PHLTfX0rfkjb+OGvr6CpkFNhjZtYbW3m5Xw8CE/fXfs+IZlcD7Tpc/V2vKjeUoDX3/z5iSXk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074930; c=relaxed/simple; bh=+XeSuXTxiSgAUz2Z4LeCtTkpWxmz9ADfaaWy87kHjq4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=I/apar/IGqRIR6hXyrF7gXiM9M7bOqkvfV7TggK629o1ab1zZ7GasOjpOHgejznwwMqljKs/Oe4IWIQuV1wxobWNq7bi6abWNm7Aai8vmIuQS1TOA4oCvB9PgfXYy4FYw0h8C9npwFaKsR8n6RPz9bj2n2r7Lg8M1LtwLc3mfd0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=BsUWtdf7; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="BsUWtdf7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gg0Sp08mCa004M9V4YkeDHzY0JxYcb5Bl0ICMSdjctma0wxRViAzRWJFwmIxX0Cdm4n5gs5ChkhH0nN6f2KWEJYZVgS/sDpd6BvBh0MiWmTuBmAlLWHU9EMog5Grv+yFMzOTnFwtZnpya/bdrHfMkaK2iGtp2hYbEnOQbcJvgaQ4WHZE8Kk6O14vy5qJtcFh9YPmNKsWLWJT5OcWaxW2M40Afi7r7W7xxXSMGeQekCD1gM9KsmkUmdgrdZsuVtE9Dp+uQ/PLqpXNONo6hLGRLdIyBIlxvarq1q2H3XBS2amzXj8Z+SNiYUVqlt5VQSs3VdBiAGayYztCAcpp+mydGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=WBM+93PR1JRz4KjLlDU8A/KFDVN6QseaCfA8wjNoO04=; b=DjQTi7zSGzIzPG3NwT7Xd1K9m5Lur4L6VETqqjsR2pfEAsgxdfHp0+6NkPITejid6UeX52NJNguobrwPmBrtRYawue5perRG9gGjvgDJAAztqG/czrHlFJkP5E48QVIpzBxmr9JCtN/uGjfS0dTtc1SgqnqqT+1/u/PBRLaixpXTv08tZtOUhDWuHe7HjA3VT94c+F1VjznxmQdWgBM0uePa4ulUKvEzq5Gpgb629+JOXpdZMbTMrCPtIOCNx/cbWveJyNZkV2JE9YsViOj5NLnoEzByqmOSUgCX2sFLbeuhLOVxxfFp0TAlOMzIfmLb6kwW+9VWRhcXLMBBcNmPrQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WBM+93PR1JRz4KjLlDU8A/KFDVN6QseaCfA8wjNoO04=; b=BsUWtdf71gTiUQnMfawbi2M0jvSEukomNoirf2hEwz+3MbscNVjWxPAxPkjbxbUKVizhUVVC0kA/jxbKgGsL2FTEMTRQwcwl4XzhB29WMpMwGKvE81BagtU0EmimCBhQZn2FdUgPO3bR2EVr3+O7KSFlbeIRig3zDne13EoojDtcpYNCYSl8yLbRNL4og71FldLXjZOEMJuecQ3XNUbl2q3BUHtgd/OVfHq0jt0Vmqt9MInWlnGwMzaT/7HhnieGPbCTTgz6gdqb4KpL89TkP4XG12xL5jkpIBKQc6KQ0xsM4+jlsvP3k2Q2NJt0BflIatQrqug3vWr/G6kRPtZyAQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:22 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:22 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 05/15] phy: lynx-28g: generalize protocol converter accessors Date: Fri, 29 May 2026 20:14:59 +0300 Message-Id: <20260529171509.1163787-6-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4PR10CA0029.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5d8::18) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: 1a9b5268-bb59-40f6-3eea-08debda5ddde X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: g2U41w7NkwioR7TW58DZ6KVYZZfCAeYk754RSyCbaf2hdcUipDSHcCnKDIrQlmlm9IHPKQ0TzrVTfDTwgHj0rDQxT24TW/3eIxMPBPsOlV/S6mj07YnrbiXvlxJqvKWy5/se6apw/3eYs/upq3zgrOH0/rW/ptFzWirFwRhwKTg6gEfEUFG+J5/WVww2RTHQgfPrqxpVseM6Yyd3YUm8X5taCYeULGaSGn/iw3Du6nBbqRJAu/U2V94Ndq3jMPV1Ral87SEU2JDQAIikWKnMA06G2ebbnhF2mRHnkzdDmVGJynOZkf1D9yISh8rFZ7U4m3E8Ubn09Evb6QVnamOmLYxLqhkBeYvIrm+ZTCucfdS303pYyjNI/nDg2EunIcnYgoIMEkPKsbxsAhfN9CdlDvs7NDlKOGtanBMQFhPxgG7Sugco9ClRjmJq4T2tZ7lLFFCQCrWcfTOLuD+NrrmTekVaIdXnI9sioUVLssklS4GOPFdCCuTulvUFMbTxlMu6HEIll4jMdTHB8Zj7vneTFIlCTGnG2GV3+w92kVgX1ZJbG0XYV1CUmV18NzKJJ6GNl6AB59pSCK5C/3Ryl6/ZHLIlX9EFXfw+P+SoPIj0tKYFRYNyrlNzWC0en4z6AfffZutdVei1GnL+Oib+MFl7j9w3g9O/AC9BSVeVBYPKezf6+nZel+xQMMVchZUh1BId X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(56012099006)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?AvoNx/qBxQbTFccbuDgTHntWUgCNoKPSw34HvQeFmm4NJ9Yd62cDVAc8CPWD?= =?us-ascii?Q?S6DCpKwV3lezJz8G3Dukp46ZgzCnvgXvcOBTO03q1lSU3gEQmYqko2wnfwQl?= =?us-ascii?Q?oK6SLKbv7n3Kg6Qtp0pV6deyEFRFdLUzMM+grZGBC2wwHumrOmwxmuWFuofz?= =?us-ascii?Q?6mVV1yc0hLgudVx8H9zX43UNMSXYtYqNzihs8KHY5Rbu0zSYD5ZcROnvIg83?= =?us-ascii?Q?vH4ySF487JJzBKpvXG89OU2U6svJaIAH8Sj7xS9s0fogFJeNiKWxxen1/VMH?= =?us-ascii?Q?Mdx0i3y/qR5TRRKAnSWWVStJ/fBFxiGUBEPkpVEAENmu6aSpnE37eODNBuTv?= =?us-ascii?Q?dc7a5rMLOQrwLLebBxtCcORANPvSb3fFFrjxCb/xQHjz+1S0kquOHmmH/V5+?= =?us-ascii?Q?W7k8Rj69zCh8033kcluul0mo5TSNl070UiQ+b2rTApU3XYmSMqNJ6gQkNYZb?= =?us-ascii?Q?iv2SoQzgmYUXUMud2CYZT+f1+foQaREc/xjRBDh53eurQIO9PteoVO4FXWDi?= =?us-ascii?Q?rGl4sJNa9SE6Z6SAYY+P8ETLuZNktKYiakO4owXPHNmSGwqHucHHPOyjFK3J?= =?us-ascii?Q?xaUFJ4p2yEZirNR8+mZkQa0wJwB6SMGfVW0TNW5P9uUTIkdhrbkuaZHB3H97?= =?us-ascii?Q?fRHkd1eTherb1DFSzXXrsyf0kSeBv4OyLXBfgeDcoqwHJKTuISwghnArYw4M?= =?us-ascii?Q?onZ3kNoM9FCZOwtpaRRwt/+YwhFtGv/u9eCMqCQbYd4hhFof3dOtDM3yM6Sa?= =?us-ascii?Q?rrMmK8wGrkN7IwdefY7b939zUWhJViDueXk4DnREuSbiNqgSiHDmx/CX0PW+?= =?us-ascii?Q?LbSl1tOOCE4U3GVy2olTzOGjtrukBuv1GxXatEBfgFo3nWtBZeGzYGgnV417?= =?us-ascii?Q?6kExvD9g1PnJyHxAhworpJ7ka6m1nCZdCzmiWiBlRhShrA7Sx/lMRnXueHkh?= =?us-ascii?Q?AtvU5ih7AMKdhprai4Zpv3fETfHjUQpelL+VduVpdlsa9YG0ogKSn9W7kTeV?= =?us-ascii?Q?M7+tS6AalVjD9dX/H/VXIRoJJNTpwUfgv7kCIopdIlCkHmA/7iK9b6cnA8kL?= =?us-ascii?Q?k50KvR2tTHkJQuwr3pqMG2S7y10yd4veeXVlTOU7pk3vuoTsj7ZA72CcxF/J?= =?us-ascii?Q?MgdMPw0umgSFjaSS1uy7jHx67alaxJ2xURAmereZBuIPrAC9A5grb1BN9Qgs?= =?us-ascii?Q?Mb7PQfy0Ufqd22kQYJtBAvkdGk5ffK4Js49B20hnmqkbQjhB7OQEmisTEOwH?= =?us-ascii?Q?W3EP34+7tsFWCPNnrprZosQ1+qsdEAjqTewBpEKCabRO99YAlwXDhklJ4NwE?= =?us-ascii?Q?rNdprnLqr/Eh08wkwxb7xmW7Zgqv9JoAKAGiHI2EJoZOav02UiaSZMhZGPNE?= =?us-ascii?Q?tohICmFeW/Z2J8zSpJXRNPYQOPaMZp3mzaDKlgDWRPWnJTkY1bHhVoKrIDCx?= =?us-ascii?Q?LupI7rVzx/IWtZnYCL7rh/VyLlP8LQOtD59Q1pByPeZk6eNBQcqbIcyjAwBw?= =?us-ascii?Q?k/6bH2lm/dcyfEbofL8MPazSfTrdCorwQ/OKoafgm6szI6RSgsYF+x5Qw1k9?= =?us-ascii?Q?nA5CbVFAf6bey6EddaEFkQSJ9iPGQS0uGP2UIX4oRWNiIpWHMa7UpR52rlQ+?= =?us-ascii?Q?C9YBFYPw3Bt/1cWoYKKGINmUwSvfUgcAMpKmMqcZnS7c2TEHKSCyJtwQrS3D?= =?us-ascii?Q?eiUfWu/8lJabTap6vx4e+y455HsVoJN2R6eIIao2a6DMynAmqdrUHKqntne3?= =?us-ascii?Q?CQKF7Fl1btqJq5Z9/WgAB7e3P1lETODhnor1Q8aQ/Y3L68bDGsJh?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1a9b5268-bb59-40f6-3eea-08debda5ddde X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:22.4415 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: bAP/8PEBhTVMSCe74NkozLIO4Omt0NVdW387uuWE7+QsfsiZBkRYfJsD4jS2cxs7WXY2KpaGU+cWbu1GliABWg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" The protocol converters on the 10G Lynx are architecturally similar, but different in layout from the 28G Lynx ones. Move lynx_pccr_read(), lynx_pccr_write(), lynx_pcvt_read() and lynx_pcvt_write() from the 28G Lynx driver to the common module, and permit each SerDes driver to provide just its own bits in order to use this common API. Currently, that just means that the direct calls to lynx_28g_get_pcvt_offset() are modified to go through the lynx->info->get_pcvt_offset() indirect function call, and similarly, lynx_28g_get_pccr() through lynx->info->get_pccr(). Signed-off-by: Vladimir Oltean --- v1->v2: adapt to lynx_28g_lane_remap_pll() prototype change in context --- drivers/phy/freescale/phy-fsl-lynx-28g.c | 102 +++------------------- drivers/phy/freescale/phy-fsl-lynx-core.c | 90 +++++++++++++++++++ drivers/phy/freescale/phy-fsl-lynx-core.h | 13 +++ 3 files changed, 115 insertions(+), 90 deletions(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-28g.c b/drivers/phy/freesca= le/phy-fsl-lynx-28g.c index 504d03ac8a0f..5e914c810505 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-28g.c +++ b/drivers/phy/freescale/phy-fsl-lynx-28g.c @@ -269,8 +269,6 @@ #define LYNX_28G_LANE_STOP_SLEEP_US 100 #define LYNX_28G_LANE_STOP_TIMEOUT_US 1000000 =20 -#define lynx_28g_read lynx_read -#define lynx_28g_write lynx_write #define lynx_28g_lane_rmw lynx_lane_rmw #define lynx_28g_lane_read lynx_lane_read #define lynx_28g_lane_write lynx_lane_write @@ -785,124 +783,48 @@ static bool lynx_28g_compat_lane_supports_mode(int l= ane, } =20 static const struct lynx_info lynx_info_compat =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lynx_28g_compat_lane_supports_mode, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2160a_serdes1 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2160a_serdes1_lane_supports_mode, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2160a_serdes2 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2160a_serdes2_lane_supports_mode, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2160a_serdes3 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2160a_serdes3_lane_supports_mode, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2162a_serdes1 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2162a_serdes1_lane_supports_mode, .first_lane =3D 4, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static const struct lynx_info lynx_info_lx2162a_serdes2 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2162a_serdes2_lane_supports_mode, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 -static int lynx_pccr_read(struct lynx_28g_lane *lane, enum lynx_lane_mode = mode, - u32 *val) -{ - struct lynx_28g_priv *priv =3D lane->priv; - struct lynx_pccr pccr; - u32 tmp; - int err; - - err =3D lynx_28g_get_pccr(mode, lane->id, &pccr); - if (err) - return err; - - tmp =3D lynx_28g_read(priv, pccr.offset); - *val =3D (tmp >> pccr.shift) & GENMASK(pccr.width - 1, 0); - - return 0; -} - -static int lynx_pccr_write(struct lynx_28g_lane *lane, - enum lynx_lane_mode lane_mode, u32 val) -{ - struct lynx_28g_priv *priv =3D lane->priv; - struct lynx_pccr pccr; - u32 old, tmp, mask; - int err; - - err =3D lynx_28g_get_pccr(lane_mode, lane->id, &pccr); - if (err) - return err; - - old =3D lynx_28g_read(priv, pccr.offset); - mask =3D GENMASK(pccr.width - 1, 0) << pccr.shift; - tmp =3D (old & ~mask) | (val << pccr.shift); - lynx_28g_write(priv, pccr.offset, tmp); - - dev_dbg(&lane->phy->dev, "PCCR@0x%x: 0x%x -> 0x%x\n", - pccr.offset, old, tmp); - - return 0; -} - -static int lynx_pcvt_read(struct lynx_28g_lane *lane, - enum lynx_lane_mode lane_mode, int cr, u32 *val) -{ - struct lynx_28g_priv *priv =3D lane->priv; - int offset; - - offset =3D lynx_28g_get_pcvt_offset(lane->id, lane_mode); - if (offset < 0) - return offset; - - *val =3D lynx_28g_read(priv, offset + cr); - - return 0; -} - -static int lynx_pcvt_write(struct lynx_28g_lane *lane, - enum lynx_lane_mode lane_mode, int cr, u32 val) -{ - struct lynx_28g_priv *priv =3D lane->priv; - int offset; - - offset =3D lynx_28g_get_pcvt_offset(lane->id, lane_mode); - if (offset < 0) - return offset; - - lynx_28g_write(priv, offset + cr, val); - - return 0; -} - -static int lynx_pcvt_rmw(struct lynx_28g_lane *lane, - enum lynx_lane_mode lane_mode, - int cr, u32 val, u32 mask) -{ - int err; - u32 tmp; - - err =3D lynx_pcvt_read(lane, lane_mode, cr, &tmp); - if (err) - return err; - - tmp &=3D ~mask; - tmp |=3D val; - - return lynx_pcvt_write(lane, lane_mode, cr, tmp); -} - static void lynx_28g_lane_remap_pll(struct lynx_lane *lane, enum lynx_lane_mode lane_mode) { diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.c b/drivers/phy/freesc= ale/phy-fsl-lynx-core.c index 5e5bcaa54d09..f49d594622cb 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.c +++ b/drivers/phy/freescale/phy-fsl-lynx-core.c @@ -87,5 +87,95 @@ struct lynx_pll *lynx_pll_get(struct lynx_priv *priv, en= um lynx_lane_mode mode) } EXPORT_SYMBOL_NS_GPL(lynx_pll_get, "PHY_FSL_LYNX"); =20 +int lynx_pccr_read(struct lynx_lane *lane, enum lynx_lane_mode mode, u32 *= val) +{ + struct lynx_priv *priv =3D lane->priv; + struct lynx_pccr pccr; + u32 tmp; + int err; + + err =3D priv->info->get_pccr(mode, lane->id, &pccr); + if (err) + return err; + + tmp =3D lynx_read(priv, pccr.offset); + *val =3D (tmp >> pccr.shift) & GENMASK(pccr.width - 1, 0); + + return 0; +} +EXPORT_SYMBOL_NS_GPL(lynx_pccr_read, "PHY_FSL_LYNX"); + +int lynx_pccr_write(struct lynx_lane *lane, enum lynx_lane_mode mode, u32 = val) +{ + struct lynx_priv *priv =3D lane->priv; + struct lynx_pccr pccr; + u32 old, tmp, mask; + int err; + + err =3D priv->info->get_pccr(mode, lane->id, &pccr); + if (err) + return err; + + old =3D lynx_read(priv, pccr.offset); + mask =3D GENMASK(pccr.width - 1, 0) << pccr.shift; + tmp =3D (old & ~mask) | (val << pccr.shift); + lynx_write(priv, pccr.offset, tmp); + + dev_dbg(&lane->phy->dev, "PCCR@0x%x: 0x%x -> 0x%x\n", + pccr.offset, old, tmp); + + return 0; +} +EXPORT_SYMBOL_NS_GPL(lynx_pccr_write, "PHY_FSL_LYNX"); + +int lynx_pcvt_read(struct lynx_lane *lane, enum lynx_lane_mode mode, int c= r, + u32 *val) +{ + struct lynx_priv *priv =3D lane->priv; + int offset; + + offset =3D priv->info->get_pcvt_offset(lane->id, mode); + if (offset < 0) + return offset; + + *val =3D lynx_read(priv, offset + cr); + + return 0; +} +EXPORT_SYMBOL_NS_GPL(lynx_pcvt_read, "PHY_FSL_LYNX"); + +int lynx_pcvt_write(struct lynx_lane *lane, enum lynx_lane_mode mode, int = cr, + u32 val) +{ + struct lynx_priv *priv =3D lane->priv; + int offset; + + offset =3D priv->info->get_pcvt_offset(lane->id, mode); + if (offset < 0) + return offset; + + lynx_write(priv, offset + cr, val); + + return 0; +} +EXPORT_SYMBOL_NS_GPL(lynx_pcvt_write, "PHY_FSL_LYNX"); + +int lynx_pcvt_rmw(struct lynx_lane *lane, enum lynx_lane_mode mode, int cr, + u32 val, u32 mask) +{ + int err; + u32 tmp; + + err =3D lynx_pcvt_read(lane, mode, cr, &tmp); + if (err) + return err; + + tmp &=3D ~mask; + tmp |=3D val; + + return lynx_pcvt_write(lane, mode, cr, tmp); +} +EXPORT_SYMBOL_NS_GPL(lynx_pcvt_rmw, "PHY_FSL_LYNX"); + MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Freescale Lynx SerDes core functionality"); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.h b/drivers/phy/freesc= ale/phy-fsl-lynx-core.h index b726ff21972b..5cd86c9543cb 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.h +++ b/drivers/phy/freescale/phy-fsl-lynx-core.h @@ -4,6 +4,7 @@ #ifndef _PHY_FSL_LYNX_CORE_H #define _PHY_FSL_LYNX_CORE_H =20 +#include #include #include =20 @@ -37,6 +38,9 @@ struct lynx_lane { }; =20 struct lynx_info { + int (*get_pccr)(enum lynx_lane_mode lane_mode, int lane, + struct lynx_pccr *pccr); + int (*get_pcvt_offset)(int lane, enum lynx_lane_mode mode); bool (*lane_supports_mode)(int lane, enum lynx_lane_mode mode); int first_lane; int num_lanes; @@ -87,4 +91,13 @@ bool lynx_lane_supports_mode(struct lynx_lane *lane, enu= m lynx_lane_mode mode); =20 struct lynx_pll *lynx_pll_get(struct lynx_priv *priv, enum lynx_lane_mode = mode); =20 +int lynx_pccr_read(struct lynx_lane *lane, enum lynx_lane_mode mode, u32 *= val); +int lynx_pccr_write(struct lynx_lane *lane, enum lynx_lane_mode mode, u32 = val); +int lynx_pcvt_read(struct lynx_lane *lane, enum lynx_lane_mode mode, int c= r, + u32 *val); +int lynx_pcvt_write(struct lynx_lane *lane, enum lynx_lane_mode mode, int = cr, + u32 val); +int lynx_pcvt_rmw(struct lynx_lane *lane, enum lynx_lane_mode mode, int cr, + u32 val, u32 mask); + #endif --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B4B253815FB for ; Fri, 29 May 2026 17:15:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074932; cv=fail; b=eksnyCxcmgEqYRf++Cq0N27tIIdZKW6c1Hl9zAIf0Qa8gmd7i0Mn4mR16lOmFaEWXK2YQD5IiG4zsIbFNiRVUrMnl83ulESoVvowOizoiIDJ6R2mdAfnNrEon3dvPaLnJJVEeHo6KDqwCRkM0O26A1Gz1CPRvs7A6B90ZrqW908= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074932; c=relaxed/simple; bh=rmPITjvLuxNDNvludn9ga/v2jITT1XG8T8R6DhHsr70=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=pmB/3yo/uQkalPPzdbb8W2j7ksz6qP2mf0yXiDpJIf9WQddWLjADBu3ZYSAqEdyMtmpzaMTmZFrXnvz45rQmBbiRrnCSib+9fuaN2w+M5tZuscIRA+KXfUIOTc1kkfpi35WwAalCQMX2cltks7KewSZC5MHsKH8BabNqh/49Om4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=YQcw5EcA; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="YQcw5EcA" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bkBESfXj8SdmH27S53tIfLfSNYvSH4BiZYCFw0UjvYs9dk789MQ5OAA0g3cqj4Y7jdAwlp693O/acrTqkQIiA5X7mzBPEivLTeSV6mVXIK+T6uU4OXydvLC5Kx9CSrIX3eHA5mVeCZPZXA0V51X4yWT7aZLmG5urf34A54A5btKJsQy5lpuO8yU8le5vD4Qjvmmp3Eblw/qfZwg2NeIne+H46t9vj8kF/ko0okbEQROt76vYPUHSXiE4MjIIXGF6F/F43RhGvrbtuc+GpnNld8dBDozMMv9W06tsKTi+FKBBCEqnBoZpvYu4V1hS26EFw9hWHN7Oh6mDjQ+w8nQ5Kg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=bCmYUYVWgSUv4LoyXg8g7LUMduBR0gotz01xp1jAY/w=; b=raOLajUeyJ27pL3NZvbVtH5YmGrS3Cq8N3ScbTn0e/LVEhE5aD4mTqlYAIyV/Nibv4tQSTshXSeB0NPFi9nOBveeDbiMjyqT7bjoBqf1uumwNDPAOCarMSXcHOFj4h+eoEa1AW/fg6wHQiuARj6NdQ10GZpCrhOChnp32Jd0GZLouxPobrYkxtyXBXstdQIC3Qay03orN12xZgL45aD74whD+UeSTHtU6CxEDS3u6O0ZUYRT7sjUpXR3MJOFtygP5sRaZzy89aNm+yZINJ1FYNNy6yjvKpsZ0eHki/RItNPMUCZn85VTDfThn4qbiqApll9etKfvRWah+3SqHBDzgg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bCmYUYVWgSUv4LoyXg8g7LUMduBR0gotz01xp1jAY/w=; b=YQcw5EcA6JidCNAxHj7AQzFkRuLjpKfxfD0VC0cfRgOfHZsIILTBpt1PAwVtHhcup5zamCX/r2r8+c/VqgCv38O40sF6r9wAj8m7P0LmBOdSSKGcJ5mWrt5giGSdnSLTtMVqHfh1LyXpyitZQRG72SZ40k2RGDAudPwEsZr0PnDwjaXcejt7c3WgzH47Lf0Bsoad6sagVLn2VF5Q/CMU4cgkLChWge0NpkndjJVyZ+X+1T926FDJTAm19o4IA0J6CQR4gIteV4LnpqfS5+QTgYYUahbLZCibcMKlqOUpRvB4ZvEV/qRkzbjyH+PPJNAq3zpsdspBlWdVbWfTFkWZig== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:24 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:23 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 06/15] phy: lynx-28g: provide default lynx_lane_supports_mode() implementation Date: Fri, 29 May 2026 20:15:00 +0300 Message-Id: <20260529171509.1163787-7-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4PR10CA0025.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5d8::14) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: ec1c7102-c8a3-4316-5fd4-08debda5decd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: y/P/sdgex9G6Jz9fj2FxmQnbCMyj27oQAEvEMFoLNF5C6KGUAL1iVI81oyJfS5ge/EAuNspG821D35E6Sl6X2XZwW5u1ORXSWbzkLCiTtzSMpWEmTG6lgyrNzX5gIGl5pnYdSjO1R05afa2+OUUFUIR2t5+Z7LfuCjDJVo3H9sxYRrh+/KMvgt9GvAu00ca9DNB8CfZ8DCAQ9tvjKA+4MXqQF3iOB6GhZe0b15lHktZKEwfzzUjWmxqCzF+owTpF4dcRGvey5FLi2b23ceRXfsG+DYj4HrpKTi5YwwbJTgyBwXjIzRwzDGuICBe0p4CY8DruskhL86npWYDpWToMMd0SwEeRnXSOnPDPvtlYgWYX1e0z/C8ghA0mZfSGvvsVRyWyTPeizpAC2Kx9jcc2SiX0ZIJdaXq3q/XHN69UwLJrvGjeHTMDATY4JfS5f/mz496rcp7ErxJtXyyNZu5TPoAOpuHn70lpvMsHHJq/i0AN68wadscTVA74a79JBCtHZlkp3M3h0i5h1qJyTUJkzqYEpNDxAhLOE4usMfroCBpMYL3rAev7jVeaDhwZoNglhHegUGX9WgwAppo1GwVblxXfN2EyN18188c6txYiLF2ty0tkoGamQMVVXnKet+PinfWa4H0owu7P4Jp/Srkx6q2X9eVttfkNTOq2gGl96HQoInDqhta9ZcpweGy0m46/ X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(56012099006)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?caYTBQMS+/iSlR+aJUbmH6yx+Db3m8wVrBwVS0JeAkl6dB5+1KIgv8AvD8KW?= =?us-ascii?Q?mh6+uPwVxDUVAOEFeUhpnU/TiC16U8WWtBq4dUf+XEoPKxXbdA7hQpOZ6wej?= =?us-ascii?Q?P3WpsO4JUD1SnM5w89PT+yWT6mr0lqd25xzBN9kstuyQRevjv5FwpJ6fkl81?= =?us-ascii?Q?i7CzxJ29HnRHvzmUKVqA9ptkMwQ6kwoGVCBkJg/ALQQkuo+p4Xii/yvCljvl?= =?us-ascii?Q?wPARDuOVIJeDH26EL1QFXGb80bPpIazCEVsBx0E3PsT5q5QfdOot1aH11Ba3?= =?us-ascii?Q?ucGcbvpw3kyDjGNFhBpck0b2GnlgPlNW6oX1BTxgQ/KnftluTFiXptMDpq8R?= =?us-ascii?Q?WjPPUyAPil4OO7qTp8NprN8pom4gTTDhdUl+Seki3Oq8g5Lha225a2F1R20c?= =?us-ascii?Q?vzDu3wreYJjzAM9ez2hCDdQF8PXpKSU4M0GuJyN3oRgfeh4gAAtO2UCoHQvk?= =?us-ascii?Q?RAqoVGR6s8yTJhV+qf12FPXK8LU3/U4hKnekU+Wd1ICfG4D3vknerPQV4JL+?= =?us-ascii?Q?Hol6vTQ1jWrq7VPGs52KbvsC1vYl2pyaf0VNHI3uXriq4ESiVgDHVrVqYzBG?= =?us-ascii?Q?aNlu5UhYa7xZQhmDuRhC2WxIF2TwJfj9Jw4qwe8ujV7XqCinQfo+tHpkjv+i?= =?us-ascii?Q?DMgYa5VtT6kmMqymWwBfNxUljCCYTNVWpI+qj7xJQwPex4fyCtVbsME1S5YB?= =?us-ascii?Q?dQovebFccoG4EMiKAjYCGc3f0qztnG2ilKsPoaBLlPSdndYvU4PzjMGR5Dgy?= =?us-ascii?Q?ZgbMLTKnOYqw9RyBWThMUS0MYsR8DYvn0+H7hg7/oB5RL+DFxvfD2eGLQotn?= =?us-ascii?Q?oUqgtpDR6v8sR30ckmh6LHaIcXCzbZ8/jTc8Db4zbEajKo+4X3dGa19TZQxO?= =?us-ascii?Q?+hEyTAtY1eyk/GaayklTfUjqrrGyBiDm0FykP57qx6Fvo+yhH2XM46ZzmGLn?= =?us-ascii?Q?Hx2Evvrj9b5dY2YLOrf4gXDvojdVFgNYB83kShvmabaNFd4PFK4TAuK+CxX8?= =?us-ascii?Q?7LGGCqThkZDFyel3GX+u7PBTd97BLuABeEG184+Z7GR7KK2Bm8D3AxIvDIAr?= =?us-ascii?Q?zvONEB4UpuAvq6kfnEbLIXWyTm2iwIACu/IGD48PViXBGuNL5lgmGMgIbF2K?= =?us-ascii?Q?d/A/8dIY8Tp3oVccpdR20tbfanIL3pCzo7rzhujQxPTx7dLfgO1N+zmSNvdQ?= =?us-ascii?Q?3RTBIerdyOJZglOLg6pQCeyY400PuiqbklWV4z09og9c5+PgzeoRW52DdjPL?= =?us-ascii?Q?0AxGr69HWtib2n7om5wAk1HMdGgx2Xg69PMZ1ygHQzsI7OnhaNWWFQxDzt+Z?= =?us-ascii?Q?Mr6VnJMaEfa5Ihv6UEbdoir46DwMiWcwgWjlQrKP8D/TEQUzII4QNsTdcwmX?= =?us-ascii?Q?DOZCW0BMFM1RDiRekIfWBky56IYtb1Q3y2wyJpb1EsEMk7hw1wLHJgCQHTFm?= =?us-ascii?Q?zemeOXTnB9heFbp3wDZasNW2hU0JQl5TyZkIXeebZGkf4D8RL2QMdBlbclZS?= =?us-ascii?Q?3muwECteGE6EKNnt7r/ChwHIMPoXn1Ytzv/NS9tkvnAX/B4HKTTtp8zPjFJg?= =?us-ascii?Q?cAvlZdATWSFOy7fvYq1N4yeYMzIWVYWW+MBQS8KJU0koBgPqUGlF36V5bS6t?= =?us-ascii?Q?k8M6Uw7HTAHwMIecKu2MTQcz4RfUd+H3a8DLnL3l65JiEpr4wxNmxxBuz9xd?= =?us-ascii?Q?8Q0rj84CCrEJiThmB99IaCABIDU9RG2ERyifXrbCkolPVJ2uFNqVOBS6TR7E?= =?us-ascii?Q?56ZhT1w3akrmXSJOtZgz714rSB8WcO+CnSryEtzHJGm+nSaZeru/?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: ec1c7102-c8a3-4316-5fd4-08debda5decd X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:23.9676 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: YfhvEvcqnPkMIqyNG/ifkNPupcC0fgTyq2HKoQy5MaI1OJUC00PzozEvI3H27FLSICxdjfB6dFV5iZ8DhY0stg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" For the 28G Lynx, there are situations where a protocol is not supported on a lane despite there being a PCCR register and protocol converter available: - LX2160A SerDes 1: reference manual documents PCCD fields E25GC_CFG and E25GD_CFG and protocol converter registers E25GCCR1..E25GCCR3 / E25GDCR1..E25GDCR3, but nonetheless, Table 289. SerDes 1 protocol mapping shows no RCW[SRDS_PRTCL_S1] value for which lanes C and D support 25G - when using the "fsl,lynx-28g" fallback compatible string, we don't want to offer 25GbE because we don't know if the lane supports it, even though we know how to reach the PCCR and protocol converter registers for it. But for the upcoming 10G Lynx SerDes, the above situations don't exist. There, if we know how to reach the PCCR and protocol converter registers on a lane, we implicitly know that the protocol is supported there, so implementing priv->info->lane_supports_mode() would be redundant. Implement lynx_lane_supports_mode_default() which decides whether a lane mode is supported just based on priv->info->get_pccr() and priv->info->get_pcvt_offset(). Signed-off-by: Vladimir Oltean --- v1->v2: none --- drivers/phy/freescale/phy-fsl-lynx-core.c | 27 ++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.c b/drivers/phy/freesc= ale/phy-fsl-lynx-core.c index f49d594622cb..802e32dc6dca 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.c +++ b/drivers/phy/freescale/phy-fsl-lynx-core.c @@ -40,6 +40,27 @@ enum lynx_lane_mode phy_interface_to_lane_mode(phy_inter= face_t intf) } EXPORT_SYMBOL_NS_GPL(phy_interface_to_lane_mode, "PHY_FSL_LYNX"); =20 +/* By default, assume that if we know how to get the PCCR register and + * protocol converter for a lane, that protocol is supported. + */ +static bool lynx_lane_supports_mode_default(struct lynx_lane *lane, + enum lynx_lane_mode mode) +{ + struct lynx_priv *priv =3D lane->priv; + struct lynx_pccr pccr; + + if (!priv->info->get_pccr || !priv->info->get_pcvt_offset) + return false; + + if (priv->info->get_pccr(mode, lane->id, &pccr) < 0) + return false; + + if (priv->info->get_pcvt_offset(lane->id, mode) < 0) + return false; + + return true; +} + /* A lane mode is supported if we have a PLL that can provide its required * clock net, and if there is a protocol converter for that mode on that l= ane. */ @@ -48,8 +69,12 @@ bool lynx_lane_supports_mode(struct lynx_lane *lane, enu= m lynx_lane_mode mode) struct lynx_priv *priv =3D lane->priv; int i; =20 - if (!priv->info->lane_supports_mode(lane->id, mode)) + if (priv->info->lane_supports_mode) { + if (!priv->info->lane_supports_mode(lane->id, mode)) + return false; + } else if (!lynx_lane_supports_mode_default(lane, mode)) { return false; + } =20 for (i =3D 0; i < LYNX_NUM_PLL; i++) { if (!priv->pll[i].enabled) --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F5F2380FFB for ; Fri, 29 May 2026 17:15:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074933; cv=fail; b=FJF597Nte59eWEGEZ8xbpMfB6dqtOBrawXqK8XktDCmBW+8pn+xmlRGghqC7bc1IjH77rOs+Ev+5fMt1GTr6E1AIw6l0TazLl3mOCHF6dhrtnInyxYvy9MBUxz2iON9/vXb8DI0EVsJ4viO56PzuAy76Hmwxyx3RbgjA/fLvKZI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074933; c=relaxed/simple; bh=j5rD0VBCEQ7xpyP5ma2eUC1YI/I3W9eRIz6AzWsJnd8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=VnXTbWMGjVogX96F+YrK6MM9FUFi4AyvWuhIywyA4LOEfsRR4zYSUDvJByr7Mq6w55X7stpKZbkPrmLepIuCbJq9wqsITz2C2Rh///vAbh2jC65SZ02B55z9PAWkqxPlOYvlugnCjyhlRDID9s6IBZNDKlZqhf9DexdBD5oVjF0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=HvbKb6S6; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="HvbKb6S6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ViMykzb1JEjT+rzwJCZilLFdsY+ZOQKNAT67wJib75CPsNDl4SizZmWqZGkUCU5F3cR3BYhHTR9RmGrIwR2lPpy7hPI5ahRK4h9lPD5frS/Ro6M76AgVL0ttXohtsEjtJaok4xxNktI5aqNnpvtzHZgH6gV+90WPseMJU44tAuzX3AvycepnFRuQ0qI4EiCWMRHA/hWI36vwz/HpETIhX9ReWYEtomupDrAAq03B4PwpeG93pqKENwTash3mbnpzM1dZeusz9hyg3Iqr2qXwdHszwIQlrxaWLXtJNiVh+3nQNpShCLkQt96KmWNozahqJRXxUEzRMSHFret3PZ+5VQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=jKE613ew7TobJgUBLR+T/trT5ipSDYHO0pmJEUxmFAA=; b=UrbzjGeOTu5apjQLRaqOUJ3PtNSrwe3ieWTLGGNSL7+ExMwf1YdMu5ZICPSOMsqD6kVhOK6ZFws10DgWYqQEV1cpGZBl0aFUEElOyf/igkB5+5aYf7Xo9RLu/Uk3/NUG6ucGnmHpCxPKm7pPMV0isVI6RzZtmZ+Gxr4f01LgaElplsfqIup3+7WIr8xU5SsfkhgvlWylUAqbQZ9ENyEOUAxHRZk8Xd08djpy6MueZvfJtSh7JOpCqXgZAXh9Y6Cg3FvR2cRFuvXX5VKHdkU7dO8gFr9oAl7cP876azTjLt0bbJtwt4vWgTA5DatVd+S7vjiuYWGZDASE0cmUTLqyIQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jKE613ew7TobJgUBLR+T/trT5ipSDYHO0pmJEUxmFAA=; b=HvbKb6S6mR++70AY5XB5srvIqnuHZM+56gbF9eNehe2ydaoaaCvL2ZZq2O9eSzioLt0PVF+ZN+yx9qGv0i2nf0JaPixU/R8SU5kzg2DwHq0STTQ+R1K6DzSxNSbiXBv6eXazQNqQNqhnUAIXlmfSWylNUbJ5paFBwEzupKSF8JUj0pFBhs03NUPYwrKawCkMtSCW5O0P7Ui8M+KSvMXIiRvzvXxxRTx035lxGv+Ac/eI9nBdRo/y2+Mr7+F1013mm7oP+2/lTdoQvlMCI4S8igzmmuK0hcTw2LA7sET3V6v09BpQuThJAfnwU/m2KedXjf6YowS9Kh8Beb7ANT7fnA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:25 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:25 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 07/15] phy: lynx-28g: move struct lynx_info definitions downwards Date: Fri, 29 May 2026 20:15:01 +0300 Message-Id: <20260529171509.1163787-8-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4PR10CA0021.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5d8::9) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: 1d68eab5-841d-49f6-e3b7-08debda5dfdc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: zueYCI2EyAURf2Tac9VkHdBOxzr21mYlxzgnK/DFJJZzZRLhAm1+iz005GhXPDx+Bi4evr97Z9Sk3ZjbW3SiEQmDIk1tDFX7IxpLz2IFnT1dm+e4kYI4DUpAByO3/ZZLWANYl9iO7a0SfFsQoDZ7FjG9LxexMepIQuEya1dr1wNqgtwwjfJ3NLb+uFZC+u2sfaeHT7tT9AwEMeDhTqlQcErAjLr9E32JcA4zIB2jAKLmHgvs2IHJn0Iae7TYVjaAiwlnGX3FvEYGvPUGBp3dyj+JVXwZKQe0LbkdYaSpP+9O4Nsa20hlBWhaBViMbDaxVzkQAaH2cG61H6D5BMCvec/0AT9zQ2vXuYzqRoxpwCKNGex4qu/Z9IuHgcW4CWOaZDCR1ye1L0r2zj//gvHg3cAXYLlxOfhAe17A2rqvA4mh7C3WmQQb8XE9MkipEJe6y83RLvCeAORYs2VIhBYkC4eUi9DYIlOunw5+kT2GxoSZavCH2qFRGoUrA1Rn9DeGwRnLZDHB35WsL1b+a/rXc5FudvKfmMk0VETUTVe0YShLcC1hwJhTgU7oYzZjX6JUYcSyaGL2/mC6OLSicpefPKjOUzbNlj/8z9JLOUXfMNSctY2p1jyIWaQ9aNPYkOAFGfUAexTkpnA2gTCp8OVh72tzgiNQycNcaHP/sq6rz56gBFqzQzWUdCdIDbXABGvm X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?0RFsTqLLbntnOwr6P95rg5ThlkWZOaW54OT+6EYah5i7chXO3hPWmsi8yKoI?= =?us-ascii?Q?ZuYJJeFt+pgIJ7Q/kbcMYTduonadR0V/hDYQRvmvMfD/9+JlcWZJmngmNmvl?= =?us-ascii?Q?mxlEbyT4peFCBX/L10mC2RJv5B+dEQjI3sAITlK3vCCKpoarQlSYFEqnPfz+?= =?us-ascii?Q?+lyx0Tzl+jqj/JrqSJe1qQyOt31EzKoB67UFCi2I9sltbAuatyPUUY053cXL?= =?us-ascii?Q?QAhlzaAShnJWnR5tZAO467Gpry4UUxbc4mYZ2G4OOYVJGW5fNj3wCLoFbXnX?= =?us-ascii?Q?orGv1nE3IBXl4FSDuC+o8+HkhjeHC6Ta6e4SxhX7MntXZ32GW7JxXNlhg8hY?= =?us-ascii?Q?F9qYRvMfhucI2s0gE5hSUUBe1m8RJDrRVL1MATaRgy/wIS4LInd9+ok0rf83?= =?us-ascii?Q?kXC3sKUIiZ2mkbzBS4HkALDAI+HjcxAnz/MG3ZiBooOlN8tF4lmyFgdq7gvY?= =?us-ascii?Q?qdr+byBtIGdJRh1ffM2xaum3MBkxhm7ku+Azjsr2qQZOBQ5zV6fxdTUXMzHe?= =?us-ascii?Q?ec+Pk4JxAahtP+73dLaedLV7c/i/GsjGtZXBLgHYMFsUSELzU1u788KqR6R5?= =?us-ascii?Q?w2PlUBihvbvpvYCL4T0fVsW3ht4kMRlBWmEZLEWqnM9Froh2ImDkQm4WHW/Y?= =?us-ascii?Q?DXWpKkQKJ4rM/nscs/+t8SzXlgDZoCtPyHUUGQ4adho8hqKJwwgRptI8LmUc?= =?us-ascii?Q?2jrGNubrRKddbd4G65gv+t00KJdEuqtnD8QW0Iw/neIlNdTQUnVrBI6JnLk/?= =?us-ascii?Q?ZCLUWkCcq2REMYlow1MSoVXmEB075negFNlzGa+eZ3IJMHDgZOSdDGLT60VP?= =?us-ascii?Q?QWgYmYcZY6LU/LeUxv3FrIpTrd+vqMUj4y/45/VeEC6iL0wBenmCA5JD1D8E?= =?us-ascii?Q?wEDEgpGO9J92YSa3A827sGrQ41ldzFGAiNTMqFa3zgdeThhsPNyz4svt0qeQ?= =?us-ascii?Q?Oyt+xLogK98yAba9x8nHy4AVDQWgxyb+rBNInB6ChvVDq2/Usi3mRzr7X2Vq?= =?us-ascii?Q?Zd9Ut7N2ZHUsETEbBwuP1oLFvYi0XxLdsqRmGQr1MTwRmybJqIQA8tGGgx7o?= =?us-ascii?Q?OWhh8fOvscP59zmvmMxYvj2u6Vu430RO7FZfzb/jgSuv3PxDVg4iitOomCkg?= =?us-ascii?Q?K/YUjvCjUX/I6yOMOKAyKDfzjAIAjSwMikCviMdAsfxt8ZmYLsUcdfCHd5H+?= =?us-ascii?Q?dj6Fh/fnn3teQOToe3YacP29CfEC24yuvPMnzi6MbDeloVraMpsvyoLYEyvY?= =?us-ascii?Q?kcPnxUPFEagETtKFioNPqY0TPDw2IkiJ4BRp3UYdnpamLcszXMxwbeNEoQ6/?= =?us-ascii?Q?dlqomSGLe5lidJi9AaICITY0ZFC3YGIgieAnECU+NvjvSjKQabsI4uH2+EfA?= =?us-ascii?Q?vMlc6U1zr06ottqwmcf7XAK7jGAXTDIX97FXx9Ar2kOcNiIiEUd6/zAx8tr7?= =?us-ascii?Q?TvYM3rh+yw0slvioEw88DYTFsDGvvQNnAJm/wxwi3fg9DbwVRlZGPtC7MDLk?= =?us-ascii?Q?nfIFoUyrvoNUWW5XcWeKeSAHJYwrtOhwiBPPlHWZbjX5/jRc9JDXFO8ui4Ya?= =?us-ascii?Q?HEGRtK9XsnzPy1yoXNoY0Mfd51jG85RWJt+Gs0UeG5KvXNWjy7CUqqSI+YBM?= =?us-ascii?Q?HfvEj3u/Xz/MYF2nxY7G3Y/PJpd03WFm9W/svbRluT76+S/sWwKvG3jBiwYM?= =?us-ascii?Q?apvEc+saAuQGom5g1M+GQbSbnPxddw+Ke7G4qKZQS7aIGnNqNWKoCYrysgwY?= =?us-ascii?Q?TZrTcAIIZ/TaPiGdEOdA0YVERxs8+3HdVcULZKyK2hyTHx2nPWu3?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1d68eab5-841d-49f6-e3b7-08debda5dfdc X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:25.7647 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: p+AIxjUI0eV8eokVWrlW00Hcp/ymlhWW9TURCjboXlWV33XShqmLWIJIg1GHuKoRh1D5+14MAbf4uwX/Uam1kQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" We need to be able to reference more function pointers in upcoming patches. The struct lynx_info definitions are currently placed a bit up in lynx-28g.c in order to be able to do that without function prototype forward declarations, so move them downward to avoid that situation. No functional change intended. Signed-off-by: Vladimir Oltean --- v1->v2: adapt to lynx_28g_lane_remap_pll() prototype change in context --- drivers/phy/freescale/phy-fsl-lynx-28g.c | 86 ++++++++++++------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-28g.c b/drivers/phy/freesca= le/phy-fsl-lynx-28g.c index 5e914c810505..0076de537763 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-28g.c +++ b/drivers/phy/freescale/phy-fsl-lynx-28g.c @@ -782,49 +782,6 @@ static bool lynx_28g_compat_lane_supports_mode(int lan= e, } } =20 -static const struct lynx_info lynx_info_compat =3D { - .get_pccr =3D lynx_28g_get_pccr, - .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, - .lane_supports_mode =3D lynx_28g_compat_lane_supports_mode, - .num_lanes =3D LYNX_28G_NUM_LANE, -}; - -static const struct lynx_info lynx_info_lx2160a_serdes1 =3D { - .get_pccr =3D lynx_28g_get_pccr, - .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, - .lane_supports_mode =3D lx2160a_serdes1_lane_supports_mode, - .num_lanes =3D LYNX_28G_NUM_LANE, -}; - -static const struct lynx_info lynx_info_lx2160a_serdes2 =3D { - .get_pccr =3D lynx_28g_get_pccr, - .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, - .lane_supports_mode =3D lx2160a_serdes2_lane_supports_mode, - .num_lanes =3D LYNX_28G_NUM_LANE, -}; - -static const struct lynx_info lynx_info_lx2160a_serdes3 =3D { - .get_pccr =3D lynx_28g_get_pccr, - .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, - .lane_supports_mode =3D lx2160a_serdes3_lane_supports_mode, - .num_lanes =3D LYNX_28G_NUM_LANE, -}; - -static const struct lynx_info lynx_info_lx2162a_serdes1 =3D { - .get_pccr =3D lynx_28g_get_pccr, - .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, - .lane_supports_mode =3D lx2162a_serdes1_lane_supports_mode, - .first_lane =3D 4, - .num_lanes =3D LYNX_28G_NUM_LANE, -}; - -static const struct lynx_info lynx_info_lx2162a_serdes2 =3D { - .get_pccr =3D lynx_28g_get_pccr, - .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, - .lane_supports_mode =3D lx2162a_serdes2_lane_supports_mode, - .num_lanes =3D LYNX_28G_NUM_LANE, -}; - static void lynx_28g_lane_remap_pll(struct lynx_lane *lane, enum lynx_lane_mode lane_mode) { @@ -1248,6 +1205,49 @@ static int lynx_28g_probe_lane(struct lynx_28g_priv = *priv, int id, return 0; } =20 +static const struct lynx_info lynx_info_compat =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, + .lane_supports_mode =3D lynx_28g_compat_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, +}; + +static const struct lynx_info lynx_info_lx2160a_serdes1 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, + .lane_supports_mode =3D lx2160a_serdes1_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, +}; + +static const struct lynx_info lynx_info_lx2160a_serdes2 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, + .lane_supports_mode =3D lx2160a_serdes2_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, +}; + +static const struct lynx_info lynx_info_lx2160a_serdes3 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, + .lane_supports_mode =3D lx2160a_serdes3_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, +}; + +static const struct lynx_info lynx_info_lx2162a_serdes1 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, + .lane_supports_mode =3D lx2162a_serdes1_lane_supports_mode, + .first_lane =3D 4, + .num_lanes =3D LYNX_28G_NUM_LANE, +}; + +static const struct lynx_info lynx_info_lx2162a_serdes2 =3D { + .get_pccr =3D lynx_28g_get_pccr, + .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, + .lane_supports_mode =3D lx2162a_serdes2_lane_supports_mode, + .num_lanes =3D LYNX_28G_NUM_LANE, +}; + static int lynx_28g_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31CCD381AE0 for ; Fri, 29 May 2026 17:15:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074935; cv=fail; b=QTnZjWvcBhP7gRnas+dI3QHq1Bo5pMg4ah0I38YHhv/ZxQecCFBrkoOTHsZZh274EJtYT6rZ/yE+FrEKsXmYxzk3lbhs3O0y9PEjuWSrRr+W2uU2gzf/ZDChVD0D8kR+ANJfB8XRvD9T6SmbmQQyTTWBCKoS3cz9/uztCYEf5k8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074935; c=relaxed/simple; bh=xo+3IatyAPrcdo2H8t2KXl9uFpZzDmjNLRwWB9Nyvtk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=rW4vgrSJmwT46W2PidjFmIY1qCmQoDG3Jlp2w6xIRYhZnJd9dHI2lWcwgm9I/ufoOvHDVn8zTs4XVBstk8NSBP/euVB0z1LJVfWLGE/Q0XgasXIDLvLx7ssSEwypEHuMNKrfNdxRmD6yLnfszUcFyTHhfremZWwji2E2GbT9vys= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=kOd0UUZR; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="kOd0UUZR" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Gqz3OKYbBNTflAZkt5PqfjR/v8BXBG+QQKescdE3w3a2zTzCKT+oQ9734i27LUwcWAWNNqgm+UiiQVibcDJREpVlcpF+z7onSzEaTdpIwf32yoC8pg/O1S8UVe6aMOiv2n8hEjOAmxf5Q0fugtjhcpOFCsDyzop/i4pGV9P88KcqG5KmF2wwsY9pBNxnNmE2oeamw8rvQb/N/7JClFoIDVVg8/ock+FZgehIfl7C8R8ovDwdQoeGeO0MN05w5+kuZug+++fx5wKeOW96JMHM+9QxxACUXmR1nE2K/2aFWoFpE3D7jP2zUJFAdCu+1423b2fFPsdXTZ96lV/FRJJC2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=XtmOM3MW7rFkPSGCo2UXcsMYb8KWb1UwDmlDYD2YqlM=; b=a7xiFMgeMTVsoVula9GrJ7+HyqdG4ekcDn74uvV2yC2k7VCwDrf4F8A/5I7Ojw+vXzEBlxVE8sR6PGdPpxI58JC8pKA+cjelBmv7ghgO9YvbyTZm9SuKUE7vUkgILCHoxsnLDc44zIpt0wZr9ctGQgO4SzILQlysE6Ywytxgzu3bcF6h5uzJuIvDdpHtIy7rUichSZztCcLQSG5cG8A/r3+4S0/w+9I1LZpsEXBFzJqf6uXF7Gs/Oebr17Qwl60npCRd2er92DmqZySKg/0EyPyje/GiUlUMiJQeBoTbN1wTlwoa0UnzR+qGVHOfkZnzQa6PVSc5xEcFSEz1npx3Xg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=XtmOM3MW7rFkPSGCo2UXcsMYb8KWb1UwDmlDYD2YqlM=; b=kOd0UUZRI+ranThgDJ4I8Vm8epGYfruUg4bxsUm9nwimvpxP9qXhug2uFSwS+WhLQuv3/MgNboMuMLeXZ0d+Xm6OoZlTTyxLmfmB81FB147FbU4c58fFI7jdB4rxRGK2CqoMajRwDLWhXDi8twJkZTlvobdGyz6lpwp5kfIAecaVWX5eACAXi2Nsw48PkM97D1uEaAeSkR9w4EtvmOgkyGEmfGt1XjrRXQ1S67uBeoD2vhRg6SIdxBfcQgT2U+bJndxciWfTRcQGEIPha1MXXvG29ZiHvmceYqLwXS4WT6cp+CC0ziGUyOPrB2jfkkY4lqK08Ss1GM5udR1r35MVNg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:27 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:27 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 08/15] phy: lynx-28g: make lynx_28g_pll_read_configuration() callable per PLL Date: Fri, 29 May 2026 20:15:02 +0300 Message-Id: <20260529171509.1163787-9-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0037.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::17) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: 27d3e0fe-f645-470d-e528-08debda5e0ed X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|6133799003|56012099006; X-Microsoft-Antispam-Message-Info: wPArAXk1KgFQvv4A6wUdWemL+31qK92yMebh/n7/7+pvHEXhrAWKk3shUj3odzkYsHD7/TfiNlqgIgSg3Rc7l2cBo8gGCizffbJBPM33+nVwoO3mD3RM6piS5vIbBYt2zluPWL+5BsuFmJb31HIlWNCnMsBV1OiKJEBXMbzIZHh/irCmvaVP9w5GnU3sQOjItlXbUkJwhdtDPn9svk/+OgCbCOAPO1i51MnTQhXaya0UR6j9V0f6Y6+BkC3bO2655opBAaTqhzUuo7lPxTxZAiKBd0KKaaQGZD0sTYCQRsxVr56d9V8I5dnoMcmfNgktvSUBqFAtcaIIGd3YsvnGotvzIYJDtdhcNNndyRWRmowERK64kuxiKsD72SvUoVhIZhoacxE3NiUa2SE/VOY7nVkAUWxRNbCOkdDkEpqCGS4vNQ39WKdD2CGmeOImkfRMMqdsD59xsN+KF7v8cKwHtW0piVP+caGtWPP04JwPwdH0Pw5hJR3BWFNWIO21svleWasVn3UPZmFysC29MIqtkGS3bNgogyjbX9HU2Se0d7rYF8aFX4PzH0aZdI7AcWd1ek9U7kfSKoflP4AdMSfGbvXxPrNn0qFlgs3iR7QqHTBvi6jsOKijuKRqwQLWDalBu4PQOeVrqL8dMRGxor7J2/7qqTw8OrnnAuRwiY4q/F3eKbmsPllgoIAryqDlDUtJ X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(6133799003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Yfj6WNTDBFHsyTRvbNGhI7tHuzzGUzL8LTyOz9VBs3MIuI8B343dT2EIZL3n?= =?us-ascii?Q?CYpUc/bh7dlUMTiFdWMMyczjfbxKs3KFKdJvU/9wbOZtp/Xr06wnvN8YkIek?= =?us-ascii?Q?6fJ0BsihdueEPQDAH2S4mGT9neSaCth2AmLzRf1eqJ4zaHfiJYI73EZkLUmx?= =?us-ascii?Q?kkwDTbPlFqt7Bk+MhBuN0vwspg9s3AzFkvuT92aeKFjwQc3L+CnflPMQ1QVr?= =?us-ascii?Q?DW6HcNinmSvqPDvjCg3Ry6+wyD03QzbLGOGTjmbE4QGn/teqwRtASzNT0ANK?= =?us-ascii?Q?YXu4hYQyk2DnT/QIAXeRi/oJ4s7g/kq/fy3zEhVVuoaESZg3k05s9zaSnqzq?= =?us-ascii?Q?O76KeReGnx85yrQxOX/wALTes5iLn430hCwf30XVA764kIemykGdkE5Wmmgv?= =?us-ascii?Q?OnuB+mqqGlErTHW1Z+8quMxFSZgkcje7LM2gzsHPt2YLThhEQdpE4nGobm8g?= =?us-ascii?Q?Nep32kXJkwAEZ52QUwrj2cvCxsgkqs22up/qaJ6T1FHdobMCWPaJsY6Pe540?= =?us-ascii?Q?3Ouz+2mt1nxzBrfi6cDGpDyBJvySJlQ1XqUZgWGq1WVrWZ+XgTekdH3N2iM2?= =?us-ascii?Q?gfPOENBLcbEBX3HCaz5p2lDCf+BD72/Pzhs6LJnJjeWNa5xWFH7hVOXOJlbK?= =?us-ascii?Q?Jp4c+6efzjxfPaY37vVXLJQRw8xxhY+iial5qRwT846O4bnF7YsMKT85GHAM?= =?us-ascii?Q?Ga4JYxF10RLuDcdW3Q1m/TigOHbljY/Xuey/fu0oXiEn6+vTSpdkYQTq17wz?= =?us-ascii?Q?MvYafPyaBTs7OmBuMkf2hR16gEwCbHRKsd0cTjeSj950/hxPsuQlCnhg4Zqd?= =?us-ascii?Q?/0XtN3v0A4MvX9Z6YkVJaPn3I+bomZEugvNORmT+1fKoCBquynnLnTid9cu9?= =?us-ascii?Q?PXiy9vRL1vmxMrq/odxcxGXUTiMyen6W5+CUM8fsOVosEwroXbG6YSQ0Dte2?= =?us-ascii?Q?Z1/NXdHbuAQbOtd9yyCrMv3NOHh8NetJStgP19DDrQz8Lh0Glg8mwwOvSMq8?= =?us-ascii?Q?5wUK/9ks2TOF09MpGj4YYZCWl6q2Ypv2GiKdOGpWXuDYSF0HsVtsWeX08KeC?= =?us-ascii?Q?QzJUpWvZi63ORVAAKAtneqCdJV1uO1hwMZPhqgKVqYpPqHDL0gi2GPsUi1iU?= =?us-ascii?Q?PLr9lUA7WolAlHosC/YrJWj6/LXwtPmwl7+P50dumzX4zm0rr7T6Ez82LAxu?= =?us-ascii?Q?vtVDUR7NP5SRLjlOjsTABL22Tc4ISZvKIVrmcYvKs4E4LPltL6qDUfnUHOx1?= =?us-ascii?Q?DJ1p0P2pTlTNTN5WuAlLVR2BUVGHfTRdvqwrOVsNvGE9pKzyCZxhpsN4UzZP?= =?us-ascii?Q?RvuS1IJenpTA9YO5IaG/v5WhW+4XvK1QSRmdksccGmpThyEuAJ0Kf4ofopwN?= =?us-ascii?Q?Me3LcDmNm7WD5n7TrbaswlhwgJjHgMPiogOcOO44LyOuALhVkYu5/qtXHh3m?= =?us-ascii?Q?Xb435UrKPWJWn0nMgY1M0O37Zm4XUGTwmKR8m6li2z25ztkTjpLMw7qdhZRQ?= =?us-ascii?Q?qqzkpgP3GXjvryyRGSmx4a835MRJjH5/L/elUx+cO0mRRP/d6+xu9xCf9Czs?= =?us-ascii?Q?i6MEv5RI9ReeVEmaUPQgE97VAswg232HEaGt8qmilo1sUErOco9N99sCGH4V?= =?us-ascii?Q?5icLn6qORRZUW7bq1UZr9WFRYK+dz+P3Wz0hLdkyhxt5KmODv2/6r1rqxJDP?= =?us-ascii?Q?QF0xU6DqqJq3heU98VVpqRL6k9Wwo7e3z4MdgsSBAjlM1X5IADAY5Q5bbH9T?= =?us-ascii?Q?qEmGDJjaLrVHHqMEQgLBiVINdlGhQBVHl95Lm+DGJFrR2MYGnzcA?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 27d3e0fe-f645-470d-e528-08debda5e0ed X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:27.4940 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: c0SmyzG/DeLS5vleYZRDj3XucZKKcuQkGtkNOea1xlwlF18MCW8rgp+XkzX5OQ82jjf0OpgqDlSx9hJsF/2O7w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" In a future change, lynx_28g_pll_read_configuration() and lynx_28g_lane_read_configuration() will be made methods of struct lynx_info. There is no functional reason, but lynx_28g_lane_read_configuration() is called per lane and lynx_28g_pll_read_configuration() iterates over PLLs internally. So the API exported by the lynx_info structure would not be uniform. Change lynx_28g_pll_read_configuration() to also permit reading the PLL configuration individually, and move the for loop at the call site. Signed-off-by: Vladimir Oltean --- v1->v2: fix typo in commit message (spotted by Sashiko) --- drivers/phy/freescale/phy-fsl-lynx-28g.c | 73 ++++++++++++------------ 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-28g.c b/drivers/phy/freesca= le/phy-fsl-lynx-28g.c index 0076de537763..25aeab478d49 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-28g.c +++ b/drivers/phy/freescale/phy-fsl-lynx-28g.c @@ -272,7 +272,6 @@ #define lynx_28g_lane_rmw lynx_lane_rmw #define lynx_28g_lane_read lynx_lane_read #define lynx_28g_lane_write lynx_lane_write -#define lynx_28g_pll_read lynx_pll_read =20 #define lynx_28g_priv lynx_priv #define lynx_28g_lane lynx_lane @@ -1051,49 +1050,41 @@ static const struct phy_ops lynx_28g_ops =3D { .owner =3D THIS_MODULE, }; =20 -static void lynx_28g_pll_read_configuration(struct lynx_28g_priv *priv) +static void lynx_28g_pll_read_configuration(struct lynx_pll *pll) { - struct lynx_28g_pll *pll; u32 val; - int i; =20 - for (i =3D 0; i < LYNX_28G_NUM_PLL; i++) { - pll =3D &priv->pll[i]; - pll->priv =3D priv; - pll->id =3D i; + val =3D lynx_pll_read(pll, PLLnRSTCTL); + pll->enabled =3D !(val & PLLnRSTCTL_DIS); + pll->locked =3D !!(val & PLLnRSTCTL_LOCK); =20 - val =3D lynx_28g_pll_read(pll, PLLnRSTCTL); - pll->enabled =3D !(val & PLLnRSTCTL_DIS); - pll->locked =3D !!(val & PLLnRSTCTL_LOCK); + val =3D lynx_pll_read(pll, PLLnCR0); + pll->refclk_sel =3D FIELD_GET(PLLnCR0_REFCLK_SEL, val); =20 - val =3D lynx_28g_pll_read(pll, PLLnCR0); - pll->refclk_sel =3D FIELD_GET(PLLnCR0_REFCLK_SEL, val); + val =3D lynx_pll_read(pll, PLLnCR1); + pll->frate_sel =3D FIELD_GET(PLLnCR1_FRATE_SEL, val); =20 - val =3D lynx_28g_pll_read(pll, PLLnCR1); - pll->frate_sel =3D FIELD_GET(PLLnCR1_FRATE_SEL, val); - - if (!pll->enabled) - continue; + if (!pll->enabled) + return; =20 - switch (pll->frate_sel) { - case PLLnCR1_FRATE_5G_10GVCO: - case PLLnCR1_FRATE_5G_25GVCO: - /* 5GHz clock net */ - __set_bit(LANE_MODE_1000BASEX_SGMII, pll->supported); - break; - case PLLnCR1_FRATE_10G_20GVCO: - /* 10.3125GHz clock net */ - __set_bit(LANE_MODE_10GBASER, pll->supported); - __set_bit(LANE_MODE_USXGMII, pll->supported); - break; - case PLLnCR1_FRATE_12G_25GVCO: - /* 12.890625GHz clock net */ - __set_bit(LANE_MODE_25GBASER, pll->supported); - break; - default: - /* 6GHz, 8GHz */ - break; - } + switch (pll->frate_sel) { + case PLLnCR1_FRATE_5G_10GVCO: + case PLLnCR1_FRATE_5G_25GVCO: + /* 5GHz clock net */ + __set_bit(LANE_MODE_1000BASEX_SGMII, pll->supported); + break; + case PLLnCR1_FRATE_10G_20GVCO: + /* 10.3125GHz clock net */ + __set_bit(LANE_MODE_10GBASER, pll->supported); + __set_bit(LANE_MODE_USXGMII, pll->supported); + break; + case PLLnCR1_FRATE_12G_25GVCO: + /* 12.890625GHz clock net */ + __set_bit(LANE_MODE_25GBASER, pll->supported); + break; + default: + /* 6GHz, 8GHz */ + break; } } =20 @@ -1291,7 +1282,13 @@ static int lynx_28g_probe(struct platform_device *pd= ev) if (IS_ERR(priv->base)) return PTR_ERR(priv->base); =20 - lynx_28g_pll_read_configuration(priv); + for (int i =3D 0; i < LYNX_28G_NUM_PLL; i++) { + struct lynx_28g_pll *pll =3D &priv->pll[i]; + + pll->priv =3D priv; + pll->id =3D i; + lynx_28g_pll_read_configuration(pll); + } =20 if (of_get_child_count(dn)) { struct device_node *child; --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E98933839A5 for ; Fri, 29 May 2026 17:15:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074938; cv=fail; b=Jbq2Ln/DyZ5KcmG1Qe9bjxDWRQ58Ml4PY6pS2MQmkZ8hjW4pPW7FOosIKm1jGe9uBuqsesMnZLXq+ZIEjmGhJN1SwbGA4LTSx5dZbx2LT7fDANxwcQFKWs0ojDkoGsGYsO0cLFg2vRr+kJbOVT+JM32z9ns2zDcYLUaR2g/UOfI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074938; c=relaxed/simple; bh=eVYKjecxbQpqKmlEgFVYFVeDsnc6JzACWG9YS/NY60Q=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=mUfIS7pwo6SCHRMnV5Orb2uLJ5gNicMgTk/HietVi29icHOdbkrAkgwbcc2FAoIVoTM0+aNoFzlsxlrjsm0MWmbCg46PwpMCuiI/ZYki+wnQWT3+VAfNH3oASu8PG1s5U7WhKkBYx4CeGk0aOmEP3N9Ig0OqQXfzodAs/enCYOA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=UedV8m71; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="UedV8m71" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=zHvBIGlkPCVDmdmmvmYOwGBkn1VOyL4ssBKL3OnUtgjZis8Xs0DgNvOS+rTQ+CmfFF0Bz6EXabUQGvPTTSAHMdVomGi+nWc9p0YvOUzJt6LuLnZmnEfc+oLxOKWr4vmUu3UoNM3gtQJebTwFbN2H2i51ejNC+diIYd1/lmRDlxocMhY6idwCnbvsiD20RHEfJ49233MM/grbvMoDizJJRDR0+jLPM5fUt3Ay1zbtnTXesV+6Zh5z+xl+OIhdd1YktDmsOddDLcfEmkhesyam692rxBiqUvzbJfVqNPyPUZRJ731qmYa85wy5/8v84Tenb19sn4fktTSAkFVkPWz4Pg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=xxsEgj0l8bfd1Jc9Q824MplQfS+SlDaAdNQa/xn0NZw=; b=q3+l6lqRN8vS/J7FiuEGKDOBHZ2aBnXNW+6ycfZzyaUex8MKclnkazq+JmHiV8SnbAD6yiJMSSw+zqMST0kHSXJi33Eyb0klfEXrP8WAstoZhnJ/h6ndC9jwWMo7dC0JP9M1RYhskQ3QWsEzDM1uRD0gpfzWULl+V5AqoWxNWoEwnn2uWQLiT2wAMWNf6tmK2nofjGuEESgl14pgbNNeYiDSfvEDrjsoDeXFbbQ5xfkWitK1TNHfaqg1p/FiCYbOYYNZfk0+MHBxmEd3l2ATDO6zo5Ih9h4y3S8LKg0JjbclIU/vpeHoDYtSjbYRS2pKZ2kFH/0Vvuh6AjiQdwGlxg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xxsEgj0l8bfd1Jc9Q824MplQfS+SlDaAdNQa/xn0NZw=; b=UedV8m71XEXeNqf6lMAxPYLjPY+p9HOklvfBww1ZiEbDvan4guOR3fx1FDszNOILvVdORpkHVJGpTkyc6vz5Tu15QRhvVZ+G+ajUgrWZP3R5sRElPCfQmIzh6PPChALxxMrrw9vJR9RSbnXjBDGgUOUIeAR/4nSheX+G80j8C4K0kZ+bzWvW1D3Lsm0U6QwhHP5X+1kEdvxUalnadGLgHj4nWolhOwSgDcvI28tVNflVKkEfgJcZE0wJb/W+84QkF11+lmLkYczzBlWMCZbgRnTvTVZDbmPoSPqqo9Wh1vuYuHX1MfGwxQjKxP2HqcbdDIR8Q9bjhzjKfnRnPfEWbA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:29 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:29 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 09/15] phy: lynx-28g: common probe() and remove() Date: Fri, 29 May 2026 20:15:03 +0300 Message-Id: <20260529171509.1163787-10-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0034.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::14) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: 035e4cdf-10b3-4312-01bf-08debda5e1de X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|6133799003|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: PzMZFvFcp1QzmZuA5F7huRcfJ/YY148Wtz0wA8wsUS4BP4bMN721vH5HKLzAvZQBj31XiCTlmmoLgZNhMqio77F5zvSpDb2fcOBNsto9OWzQBmuk8l/czB8gBfnm8/xCnrsh12eELmKT0rf2r7AbIlpllF93I3oV9LPd9er+HdkDZEZH9/Ot3AaNUtxp63Sc/J1RtJNHOmzRU+YUfLDSILLW3kKGtSBfS0ye1F/Q4AovVIjA39Wisret6nizmA2zHaPYv71IcMb2+SM7sHGpwbMYGSxfLKkAR8Wz5/Dsbru0fDIwllrOT8/WwI0ISeOc82OA33BKSfEOX7B4Ff3gF5rH4B/4FZovgu3vJpM/uG0NhozRQdQQb4GF+/mt5Kf8yVBSMGCGm8G/ejKKCsGHAv62yM5BdIsrIT/ez0E/u6ls09dQbcfwtQjEVrlW6eTCnfjD6YMhTjD85qFtSQ/6CKeru2T8xqXF/Q0KLY5RDMAd4joHtmhSTi/X27iJp24cMgl6Mz4Ft7irZl8S5RE/TQM9QB1wsVmTcGg52yNt6ISjCzVd8rycEqiZSSwbk94g7gQZpDHsO3zM9OLUSkLL49XNGFz9FT7/dBpKKzSOwKuOxRGa1591dG9jUb9Ydn1o+uCI8erENZNjVljQdK9Vhq04VbJC0GwNWQpFLvwTspz4bnwUqn9A4Nn066FYXDpj X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(6133799003)(56012099006)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?k+EKbBeYGjisLfFjBO0nfGp5k4S9nJd3IjWcPHie3bsGTG5coENDX7juqWLd?= =?us-ascii?Q?oL4ilLRgyXrWktGYmiWJaJFTuovY9Augx8ZqtdYO1DTVnqCjg1frDRhFTg42?= =?us-ascii?Q?gr/AIwmJHFWEaGj0nEAM+aOZK5otZZ4N0C4XmCbevprzJ/0KjKXRRtF37QFI?= =?us-ascii?Q?iK9/cn5Eo9Zzb1cuvvy2YFn+XQl52EixtGVEb0jTMKWz63rXumg7kiS/86yJ?= =?us-ascii?Q?kE+1V31YKy/OpS3CymainM84CNLly3GiblGUzTeNEcviywZ0huK64yvdwrzn?= =?us-ascii?Q?h9jGxq9sGJXSiyf1jLj3RxEbjIVPCFeejLFoKDkt+YR5QKjF1q8Jhrjzlm0B?= =?us-ascii?Q?arI3zjbIAvXabjINLRIncTnfFmqxWSO6Us4xQOCixLaweMTdVODPp8gJh8w4?= =?us-ascii?Q?Am/49tUEWXqkXVO9GUfREtUvuVwOxLfo/09T7RS1SbqmYUjceuLqdWi9Nwhf?= =?us-ascii?Q?IJEuaOKcfXre/yJLUyRVWSGW1CW0KyqO5bVYZgn9sfYMGPbO6dT0btYzqjRW?= =?us-ascii?Q?5qRrF8HX3KTyQub5oZS/p2f/jeEJgGScg62zxT8e+B/3zAyjQQBgAm7hxfaY?= =?us-ascii?Q?eZbC0UAmed7BtMOxbolzly1rV/wjgszsEDxpi+7p419BeTsynGDlBEaEHly+?= =?us-ascii?Q?63AlNsqj0TaBl4sXomMqY+7l+2lPyi59KQhUw5XNc1UmLv2Zy8q22Ygg7Zxj?= =?us-ascii?Q?nTclzD9M4Nl2L7ibzWwah6zrYgGdFRF1ewrE66oSp/0lCP1lQzPWmDZZ+Rxo?= =?us-ascii?Q?J2h+r09L9SxqHJmxQz+HWh3Otyjw7YeoKH4yTa47jeqeYDK9omt27H8KSoVE?= =?us-ascii?Q?egBxLZLlpcdxPrAKA8+O+NBbV+GsR3ofSqa7cqETJ9mLjrofd2+a4/DfFCiY?= =?us-ascii?Q?wpW4c74t3GE6RdF8WyRzNYJzDnATumAdQcWATcDuc2yUJm3+1YDVP28yIpSL?= =?us-ascii?Q?ahLwhp9M1A3H9SPJGLJSV+jJEn+cgePDGjq1xkvQuEjRZX4rHBgWlbKrmF+g?= =?us-ascii?Q?lJZqEERhuV+u65JXKycfmXeNTunVoVT4Jk5WFCD51O/1/VdoW84N9IqXMpfu?= =?us-ascii?Q?5UenIXEUG60bCV1VD5K70V7NvIDTcD8clPE0V90gAC+hk5aThiarFTwiswR/?= =?us-ascii?Q?zFkz5xHpPVsO1g0hYTPuU1gTnr8R2U65LISz6oKjAfz94JbpXOCCQ9rEpocO?= =?us-ascii?Q?7xBl0AWNXl4LnEc3qZA0vGoBVprsfCSL9VLWblRSA8RriFEOYubyw7sGLnLg?= =?us-ascii?Q?kqxhsmd4+/g2tQGpGF4Mtj0DoatnM7keOdiI/UqsspeniyNoJw18fu/GGUi5?= =?us-ascii?Q?+fGTALyEeBmgVk4w1uiXjgBlS6JG0x4gavYUj0Y3O4eNStkITE6NKwFXxSh4?= =?us-ascii?Q?WYF6BKtEbAJWEg9mMByKKiAdxMr3JJYPhSqnMbSKz2R0Lh2py1w7nRI1wYSu?= =?us-ascii?Q?rn/4T97CM/m7K9uTM57lRHhFU32W+Ft4uAhcgz0+2Mo+n5kcrhSvwMV3ukhh?= =?us-ascii?Q?0z6x9wWhYDla5QYba0zUmlu6x4rR78Q0r0HxGyywujhGTDUlQ/vRAf8Jnvyc?= =?us-ascii?Q?DUUKzJZmtbP0AjSmNvQvddl/ovWzwLHbAgzOu4nAQUiJQCH2LbYhQU2bIvTG?= =?us-ascii?Q?CO3BYQ406Nc56mqfbM4jE8bzSlzO6hx9fwNpy7zeVu5AXjkqN1abaYPmXCz/?= =?us-ascii?Q?qMwUugUC0t5hYVgybTBR6cpaxPyVLYtzKtAvlUwHgy3Uc6lRy+9v8P/TpICi?= =?us-ascii?Q?EDP6DS/ouhKcLjCM/QPfllUU4v9VIm9EppNiiiA4pw18D/QPBqTu?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 035e4cdf-10b3-4312-01bf-08debda5e1de X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:29.1118 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ckefzoq5gDndzVjPTB04bV5mZ1PotkevETpG256QBSzyFGYjRj2vyTzj2YnO8Kw1MtKhH2zh6+e2pkOTZgvG+w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" Factor the device-agnostic logic from lynx_28g_probe() and lynx_28g_remove() into lynx_probe() and lynx_remove() inside phy-fsl-lynx-core.c. These will be shared with the 10G Lynx driver. Since the PLL configuration, lane configuration and CDR lock detection procedure are going to be different, introduce lynx_info function pointers so that this code remains in the 28G Lynx driver. Signed-off-by: Vladimir Oltean --- v1->v2: - adapt to the addition of a NULL check for the "info" pointer. Note that lynx_28g_probe() does not need to test for NULL because it only compares the pointer to a value. --- drivers/phy/freescale/phy-fsl-lynx-28g.c | 225 +++++----------------- drivers/phy/freescale/phy-fsl-lynx-core.c | 170 ++++++++++++++++ drivers/phy/freescale/phy-fsl-lynx-core.h | 12 +- 3 files changed, 227 insertions(+), 180 deletions(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-28g.c b/drivers/phy/freesca= le/phy-fsl-lynx-28g.c index 25aeab478d49..50b991870edb 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-28g.c +++ b/drivers/phy/freescale/phy-fsl-lynx-28g.c @@ -12,7 +12,6 @@ #include "phy-fsl-lynx-core.h" =20 #define LYNX_28G_NUM_LANE 8 -#define LYNX_28G_NUM_PLL LYNX_NUM_PLL =20 /* SoC IP wrapper for protocol converters */ #define PCC8 0x10a0 @@ -781,6 +780,30 @@ static bool lynx_28g_compat_lane_supports_mode(int lan= e, } } =20 +static void lynx_28g_cdr_lock_check(struct lynx_lane *lane) +{ + u32 rrstctl; + int err; + + rrstctl =3D lynx_28g_lane_read(lane, LNaRRSTCTL); + if (!!(rrstctl & LNaRRSTCTL_CDR_LOCK)) + return; + + lynx_28g_lane_rmw(lane, LNaRRSTCTL, LNaRRSTCTL_RST_REQ, + LNaRRSTCTL_RST_REQ); + + err =3D read_poll_timeout(lynx_28g_lane_read, rrstctl, + !!(rrstctl & LNaRRSTCTL_RST_DONE), + LYNX_28G_LANE_RESET_SLEEP_US, + LYNX_28G_LANE_RESET_TIMEOUT_US, + false, lane, LNaRRSTCTL); + if (err) { + dev_warn_once(&lane->phy->dev, + "Lane %c receiver reset failed: %pe\n", + 'A' + lane->id, ERR_PTR(err)); + } +} + static void lynx_28g_lane_remap_pll(struct lynx_lane *lane, enum lynx_lane_mode lane_mode) { @@ -1088,50 +1111,6 @@ static void lynx_28g_pll_read_configuration(struct l= ynx_pll *pll) } } =20 -#define work_to_lynx(w) container_of((w), struct lynx_28g_priv, cdr_check.= work) - -static void lynx_28g_cdr_lock_check(struct work_struct *work) -{ - struct lynx_28g_priv *priv =3D work_to_lynx(work); - struct lynx_28g_lane *lane; - u32 rrstctl; - int err, i; - - for (i =3D priv->info->first_lane; i < LYNX_28G_NUM_LANE; i++) { - lane =3D &priv->lane[i]; - if (!lane->phy) - continue; - - mutex_lock(&lane->phy->mutex); - - if (!lane->init || !lane->powered_up) { - mutex_unlock(&lane->phy->mutex); - continue; - } - - rrstctl =3D lynx_28g_lane_read(lane, LNaRRSTCTL); - if (!(rrstctl & LNaRRSTCTL_CDR_LOCK)) { - lynx_28g_lane_rmw(lane, LNaRRSTCTL, LNaRRSTCTL_RST_REQ, - LNaRRSTCTL_RST_REQ); - - err =3D read_poll_timeout(lynx_28g_lane_read, rrstctl, - !!(rrstctl & LNaRRSTCTL_RST_DONE), - LYNX_28G_LANE_RESET_SLEEP_US, - LYNX_28G_LANE_RESET_TIMEOUT_US, - false, lane, LNaRRSTCTL); - if (err) { - dev_warn_once(&lane->phy->dev, - "Lane %c receiver reset failed: %pe\n", - 'A' + lane->id, ERR_PTR(err)); - } - } - - mutex_unlock(&lane->phy->mutex); - } - queue_delayed_work(system_power_efficient_wq, &priv->cdr_check, - msecs_to_jiffies(1000)); -} - static void lynx_28g_lane_read_configuration(struct lynx_28g_lane *lane) { u32 pccr, pss, protocol; @@ -1157,49 +1136,13 @@ static void lynx_28g_lane_read_configuration(struct= lynx_28g_lane *lane) } } =20 -static struct phy *lynx_28g_xlate(struct device *dev, - const struct of_phandle_args *args) -{ - struct lynx_28g_priv *priv =3D dev_get_drvdata(dev); - int idx; - - if (args->args_count =3D=3D 0) - return of_phy_simple_xlate(dev, args); - else if (args->args_count !=3D 1) - return ERR_PTR(-ENODEV); - - idx =3D args->args[0]; - - if (WARN_ON(idx >=3D LYNX_28G_NUM_LANE || - idx < priv->info->first_lane)) - return ERR_PTR(-EINVAL); - - return priv->lane[idx].phy; -} - -static int lynx_28g_probe_lane(struct lynx_28g_priv *priv, int id, - struct device_node *dn) -{ - struct lynx_28g_lane *lane =3D &priv->lane[id]; - struct phy *phy; - - phy =3D devm_phy_create(priv->dev, dn, &lynx_28g_ops); - if (IS_ERR(phy)) - return PTR_ERR(phy); - - lane->priv =3D priv; - lane->phy =3D phy; - lane->id =3D id; - phy_set_drvdata(phy, lane); - lynx_28g_lane_read_configuration(lane); - - return 0; -} - static const struct lynx_info lynx_info_compat =3D { .get_pccr =3D lynx_28g_get_pccr, .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lynx_28g_compat_lane_supports_mode, + .pll_read_configuration =3D lynx_28g_pll_read_configuration, + .lane_read_configuration =3D lynx_28g_lane_read_configuration, + .cdr_lock_check =3D lynx_28g_cdr_lock_check, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 @@ -1207,6 +1150,9 @@ static const struct lynx_info lynx_info_lx2160a_serde= s1 =3D { .get_pccr =3D lynx_28g_get_pccr, .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2160a_serdes1_lane_supports_mode, + .pll_read_configuration =3D lynx_28g_pll_read_configuration, + .lane_read_configuration =3D lynx_28g_lane_read_configuration, + .cdr_lock_check =3D lynx_28g_cdr_lock_check, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 @@ -1214,6 +1160,9 @@ static const struct lynx_info lynx_info_lx2160a_serde= s2 =3D { .get_pccr =3D lynx_28g_get_pccr, .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2160a_serdes2_lane_supports_mode, + .pll_read_configuration =3D lynx_28g_pll_read_configuration, + .lane_read_configuration =3D lynx_28g_lane_read_configuration, + .cdr_lock_check =3D lynx_28g_cdr_lock_check, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 @@ -1221,6 +1170,9 @@ static const struct lynx_info lynx_info_lx2160a_serde= s3 =3D { .get_pccr =3D lynx_28g_get_pccr, .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2160a_serdes3_lane_supports_mode, + .pll_read_configuration =3D lynx_28g_pll_read_configuration, + .lane_read_configuration =3D lynx_28g_lane_read_configuration, + .cdr_lock_check =3D lynx_28g_cdr_lock_check, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 @@ -1228,6 +1180,9 @@ static const struct lynx_info lynx_info_lx2162a_serde= s1 =3D { .get_pccr =3D lynx_28g_get_pccr, .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2162a_serdes1_lane_supports_mode, + .pll_read_configuration =3D lynx_28g_pll_read_configuration, + .lane_read_configuration =3D lynx_28g_lane_read_configuration, + .cdr_lock_check =3D lynx_28g_cdr_lock_check, .first_lane =3D 4, .num_lanes =3D LYNX_28G_NUM_LANE, }; @@ -1236,112 +1191,26 @@ static const struct lynx_info lynx_info_lx2162a_se= rdes2 =3D { .get_pccr =3D lynx_28g_get_pccr, .get_pcvt_offset =3D lynx_28g_get_pcvt_offset, .lane_supports_mode =3D lx2162a_serdes2_lane_supports_mode, + .pll_read_configuration =3D lynx_28g_pll_read_configuration, + .lane_read_configuration =3D lynx_28g_lane_read_configuration, + .cdr_lock_check =3D lynx_28g_cdr_lock_check, .num_lanes =3D LYNX_28G_NUM_LANE, }; =20 static int lynx_28g_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; - struct phy_provider *provider; - struct lynx_28g_priv *priv; - struct device_node *dn; - int err; - - dn =3D dev_of_node(dev); - if (!dn) { - dev_err(dev, "Device requires an OF node\n"); - return -EINVAL; - } - - priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - priv->dev =3D dev; - priv->info =3D of_device_get_match_data(dev); - if (!priv->info) - return -ENODEV; - - dev_set_drvdata(dev, priv); - spin_lock_init(&priv->pcc_lock); - INIT_DELAYED_WORK(&priv->cdr_check, lynx_28g_cdr_lock_check); + const struct lynx_info *info; =20 /* * If we get here it means we probed on a device tree where * "fsl,lynx-28g" wasn't the fallback, but the sole compatible string. */ - if (priv->info =3D=3D &lynx_info_compat) + info =3D of_device_get_match_data(dev); + if (info =3D=3D &lynx_info_compat) dev_warn(dev, "Please update device tree to use per-device compatible st= rings\n"); =20 - priv->lane =3D devm_kcalloc(dev, priv->info->num_lanes, - sizeof(*priv->lane), GFP_KERNEL); - if (!priv->lane) - return -ENOMEM; - - priv->base =3D devm_platform_ioremap_resource(pdev, 0); - if (IS_ERR(priv->base)) - return PTR_ERR(priv->base); - - for (int i =3D 0; i < LYNX_28G_NUM_PLL; i++) { - struct lynx_28g_pll *pll =3D &priv->pll[i]; - - pll->priv =3D priv; - pll->id =3D i; - lynx_28g_pll_read_configuration(pll); - } - - if (of_get_child_count(dn)) { - struct device_node *child; - - for_each_available_child_of_node(dn, child) { - u32 reg; - - /* PHY subnode name must be 'phy'. */ - if (!(of_node_name_eq(child, "phy"))) - continue; - - if (of_property_read_u32(child, "reg", ®)) { - dev_err(dev, "No \"reg\" property for %pOF\n", child); - of_node_put(child); - return -EINVAL; - } - - if (reg < priv->info->first_lane || reg >=3D LYNX_28G_NUM_LANE) { - dev_err(dev, "\"reg\" property out of range for %pOF\n", child); - of_node_put(child); - return -EINVAL; - } - - err =3D lynx_28g_probe_lane(priv, reg, child); - if (err) { - of_node_put(child); - return err; - } - } - } else { - for (int i =3D priv->info->first_lane; i < LYNX_28G_NUM_LANE; i++) { - err =3D lynx_28g_probe_lane(priv, i, NULL); - if (err) - return err; - } - } - - provider =3D devm_of_phy_provider_register(dev, lynx_28g_xlate); - if (IS_ERR(provider)) - return PTR_ERR(provider); - - queue_delayed_work(system_power_efficient_wq, &priv->cdr_check, - msecs_to_jiffies(1000)); - - return 0; -} - -static void lynx_28g_remove(struct platform_device *pdev) -{ - struct device *dev =3D &pdev->dev; - struct lynx_28g_priv *priv =3D dev_get_drvdata(dev); - - cancel_delayed_work_sync(&priv->cdr_check); + return lynx_probe(pdev, info, &lynx_28g_ops); } =20 static const struct of_device_id lynx_28g_of_match_table[] =3D { @@ -1357,7 +1226,7 @@ MODULE_DEVICE_TABLE(of, lynx_28g_of_match_table); =20 static struct platform_driver lynx_28g_driver =3D { .probe =3D lynx_28g_probe, - .remove =3D lynx_28g_remove, + .remove =3D lynx_remove, .driver =3D { .name =3D "lynx-28g", .of_match_table =3D lynx_28g_of_match_table, diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.c b/drivers/phy/freesc= ale/phy-fsl-lynx-core.c index 802e32dc6dca..b14d67e574f7 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.c +++ b/drivers/phy/freescale/phy-fsl-lynx-core.c @@ -2,6 +2,7 @@ /* Copyright 2025-2026 NXP */ =20 #include +#include =20 #include "phy-fsl-lynx-core.h" =20 @@ -202,5 +203,174 @@ int lynx_pcvt_rmw(struct lynx_lane *lane, enum lynx_l= ane_mode mode, int cr, } EXPORT_SYMBOL_NS_GPL(lynx_pcvt_rmw, "PHY_FSL_LYNX"); =20 +#define work_to_lynx(w) container_of((w), struct lynx_priv, cdr_check.work) + +static void lynx_cdr_lock_check(struct work_struct *work) +{ + struct lynx_priv *priv =3D work_to_lynx(work); + struct lynx_lane *lane; + + for (int i =3D priv->info->first_lane; i < priv->info->num_lanes; i++) { + lane =3D &priv->lane[i]; + if (!lane->phy) + continue; + + mutex_lock(&lane->phy->mutex); + + if (!lane->init || !lane->powered_up) { + mutex_unlock(&lane->phy->mutex); + continue; + } + + priv->info->cdr_lock_check(lane); + + mutex_unlock(&lane->phy->mutex); + } + + queue_delayed_work(system_power_efficient_wq, &priv->cdr_check, + msecs_to_jiffies(1000)); +} + +static struct phy *lynx_xlate(struct device *dev, + const struct of_phandle_args *args) +{ + struct lynx_priv *priv =3D dev_get_drvdata(dev); + int idx; + + if (args->args_count =3D=3D 0) + return of_phy_simple_xlate(dev, args); + else if (args->args_count !=3D 1) + return ERR_PTR(-ENODEV); + + idx =3D args->args[0]; + + if (WARN_ON(idx >=3D priv->info->num_lanes || + idx < priv->info->first_lane)) + return ERR_PTR(-EINVAL); + + return priv->lane[idx].phy; +} + +static int lynx_probe_lane(struct lynx_priv *priv, int id, + struct device_node *dn, + const struct phy_ops *phy_ops) +{ + struct lynx_lane *lane =3D &priv->lane[id]; + struct phy *phy; + + phy =3D devm_phy_create(priv->dev, dn, phy_ops); + if (IS_ERR(phy)) + return PTR_ERR(phy); + + lane->priv =3D priv; + lane->phy =3D phy; + lane->id =3D id; + phy_set_drvdata(phy, lane); + priv->info->lane_read_configuration(lane); + + return 0; +} + +int lynx_probe(struct platform_device *pdev, const struct lynx_info *info, + const struct phy_ops *phy_ops) +{ + struct device *dev =3D &pdev->dev; + struct phy_provider *provider; + struct device_node *dn; + struct lynx_priv *priv; + int err; + + dn =3D dev_of_node(dev); + if (!dn) { + dev_err(dev, "Device requires an OF node\n"); + return -EINVAL; + } + + if (!info) + return -ENODEV; + + priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev =3D dev; + priv->info =3D info; + dev_set_drvdata(dev, priv); + spin_lock_init(&priv->pcc_lock); + INIT_DELAYED_WORK(&priv->cdr_check, lynx_cdr_lock_check); + + priv->lane =3D devm_kcalloc(dev, priv->info->num_lanes, + sizeof(*priv->lane), GFP_KERNEL); + if (!priv->lane) + return -ENOMEM; + + priv->base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + + for (int i =3D 0; i < LYNX_NUM_PLL; i++) { + struct lynx_pll *pll =3D &priv->pll[i]; + + pll->priv =3D priv; + pll->id =3D i; + priv->info->pll_read_configuration(pll); + } + + if (of_get_child_count(dn)) { + struct device_node *child; + + for_each_available_child_of_node(dn, child) { + u32 reg; + + /* PHY subnode name must be 'phy'. */ + if (!(of_node_name_eq(child, "phy"))) + continue; + + if (of_property_read_u32(child, "reg", ®)) { + dev_err(dev, "No \"reg\" property for %pOF\n", child); + of_node_put(child); + return -EINVAL; + } + + if (reg < priv->info->first_lane || reg >=3D priv->info->num_lanes) { + dev_err(dev, "\"reg\" property out of range for %pOF\n", child); + of_node_put(child); + return -EINVAL; + } + + err =3D lynx_probe_lane(priv, reg, child, phy_ops); + if (err) { + of_node_put(child); + return err; + } + } + } else { + for (int i =3D priv->info->first_lane; i < priv->info->num_lanes; i++) { + err =3D lynx_probe_lane(priv, i, NULL, phy_ops); + if (err) + return err; + } + } + + provider =3D devm_of_phy_provider_register(dev, lynx_xlate); + if (IS_ERR(provider)) + return PTR_ERR(provider); + + queue_delayed_work(system_power_efficient_wq, &priv->cdr_check, + msecs_to_jiffies(1000)); + + return 0; +} +EXPORT_SYMBOL_NS_GPL(lynx_probe, "PHY_FSL_LYNX"); + +void lynx_remove(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct lynx_priv *priv =3D dev_get_drvdata(dev); + + cancel_delayed_work_sync(&priv->cdr_check); +} +EXPORT_SYMBOL_NS_GPL(lynx_remove, "PHY_FSL_LYNX"); + MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Freescale Lynx SerDes core functionality"); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.h b/drivers/phy/freesc= ale/phy-fsl-lynx-core.h index 5cd86c9543cb..e8b280cc9b38 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.h +++ b/drivers/phy/freescale/phy-fsl-lynx-core.h @@ -10,14 +10,15 @@ =20 #define LYNX_NUM_PLL 2 =20 +struct lynx_priv; +struct lynx_lane; + struct lynx_pccr { int offset; int width; int shift; }; =20 -struct lynx_priv; - struct lynx_pll { struct lynx_priv *priv; int id; @@ -42,6 +43,9 @@ struct lynx_info { struct lynx_pccr *pccr); int (*get_pcvt_offset)(int lane, enum lynx_lane_mode mode); bool (*lane_supports_mode)(int lane, enum lynx_lane_mode mode); + void (*pll_read_configuration)(struct lynx_pll *pll); + void (*lane_read_configuration)(struct lynx_lane *lane); + void (*cdr_lock_check)(struct lynx_lane *lane); int first_lane; int num_lanes; }; @@ -85,6 +89,10 @@ static inline void lynx_rmw(struct lynx_priv *priv, unsi= gned long off, u32 val, #define lynx_pll_read(pll, reg) \ ioread32((pll)->priv->base + reg((pll)->id)) =20 +int lynx_probe(struct platform_device *pdev, const struct lynx_info *info, + const struct phy_ops *phy_ops); +void lynx_remove(struct platform_device *pdev); + const char *lynx_lane_mode_str(enum lynx_lane_mode lane_mode); enum lynx_lane_mode phy_interface_to_lane_mode(phy_interface_t intf); bool lynx_lane_supports_mode(struct lynx_lane *lane, enum lynx_lane_mode m= ode); --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DA7073859D7 for ; Fri, 29 May 2026 17:15:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074941; cv=fail; b=Tamh+INeBrI+6P/Wu7tGFFAjBCq7jDgfbFndftHvtz3fWNL4M6NU3KC23MUlPfzn09Drr+RMq93Mt6Hjv40BMu1uWZC4DkKQFlaFgqVeT/N7N9/U8KKyjZi8suJZc+IXEeEs1oSSZdm5HTZOUOI1FTYl8qQfm/7KKEFMa60xXqk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074941; c=relaxed/simple; bh=Zln1sLPz/xDyCRuvxFXSn1b6dm9e6XZ9Nz6oCsBrJSg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=tg3mOAgwBoYkvuSUdv0616nUsYtyu/P09B7gMXTSEPepPdHjQ1x9DCntk8ZeqPHlPp2U9x+fjxg+Em+0A/eUFVeriRypDTPs2WNQLDDqOrKs+gcdkAwMG3dEef6XCqUvjOlXRaBlC5UIlTKkvieO2DMWfDzitvK4GlQgKKME/gc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=GZif9Zmg; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="GZif9Zmg" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=t7S7xgAvEdLnPvfipxkin9rv7FGyFN9KmkKwbgOeafhpFTupj+0aPH4b1QkvgLOLxEUYzH/xEH2PPL+LSPTJZ1AgE6tSRLOfFCbcHFU4X5DEZLXGFrtUzgbvFqlcnR9B8raa6I3HuU+j4Kdvj0jOPBc88k5/Q+wptlppkhn8C4RfuYAfKzJLEfYKFUwP8jJ/3kJPgXkwovsbtEgbvZjqGg4dr4VrcwiGZNzLG5WX+D8tlVY9sfSPouBaEwf5Q7201y2uiyznfMV15TAenW6GMgTk8nl/OFqFXraIYLstyoovhWmfeJEoV71pGYw60ex2EuzuOzRlFcddXPowLN2Igw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=swZc/KVwYAXVZMxYO5+B4gA3sgExw3WvUhW8di2GZuQ=; b=f8OMK3Hx5JjXZsopYG1lKtD3ZO1uKS9NBbfBIBw5aGW2d4nHcLsidH166zAllw8rPxBoSy6F+Bco8gfWZsR5S1+LzIPgVYn3viZqSZdtYQdYprQ0YQoOLrIk8E6QNcSZpsN2UOqVbdYyviM+/hyNGWE0o5orEvipfpf3A6el2HFXmuS3QEPMX+QT03AZVOD8Yzlft6FkIYA7cCSau9luRQlsQqgjcUzh6CqLpYqdp2hREWBc3F2Q/gnqfjpoMwyaj3b64QtX57dfjDRF6mnZNKNpikzH33UgEBIepbaEVIJiVzvyaNJV3pHQqB/2pCnhqpgT5eUiVIktEpQtiC+bpQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=swZc/KVwYAXVZMxYO5+B4gA3sgExw3WvUhW8di2GZuQ=; b=GZif9ZmgAO6xNwC0zMbRXBFHEK1mKYi/upXr2CXWwMk4z//jEaZZsDcRy44netxx6C85mxsBTWlOBwW7DxkvYtjc6KunT2ZP8QQYZN53TuJQHf/giFUxFBRfZ4/MCsygNCFdbxphUxudTOacgaeP/DiqGgfnRsy1T+CAMR10wB5+VnaUWb5tU0TLSGJY/Dwl/Q2yHPOOdWi2d+2VL+1D86uDfp85nhdznKlUr4UjIdPJ7nbdKJB64Rm4IenJlH0buJ2KS0De8q06+1+8gxVqLz/DjxKBP8Sowe8I3Gm9rWlLzPSGWuq0e6yWGJfoiOF6aiQeXXAMrPpeMAM8In1k/g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:30 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:30 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 10/15] phy: lynx-28g: add support for big endian register maps Date: Fri, 29 May 2026 20:15:04 +0300 Message-Id: <20260529171509.1163787-11-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0035.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::15) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: c6f0ef6d-1ffa-4352-c8a7-08debda5e2ca X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: tkEXiqSOaenEjDQ8vUk6STVzRG1IGOu5xpHI9/2fPKNBdaj/Iq/YePOMAzQHS/IdvuXp2TBxrcHJ9qGl6lHJl4v0dpNhDRclZmfWtKp77nnTnkiz/U7JJtrHeLrCNj/12ljPrjOQIdtz1ClwsDFFOgUvPPewJs1zCyglQyI+fYkwb4/7lKNHmAKgPf2ylZUuqiZwgET8ov9Wt0dYqVHqdDb9UzPZKPbPuQ17ggnrvsRKcjxQuamF/rRSDdvGJU/ut7nnKnw+KaLz3UDU9+rmG+JBM1C4Fmw83cZ+mSaC7iW5AWqI8O09ZqsabdYBo5fpdGtj1hSv7VVVSPaG1jVu8/W2ZrCSqjKSClAjMj7ukxQNDD9sB1Op49uYhfdouA7aGFGFb3rfmEFO6jRkmgjqixUdoT4Auw7Wr7ARb2e6SaFBKETsHqQFRdlxMhYzTvBhVDAryW6BWShg9v4doAq25iaJ7i/eaGNUuse/GhRQYUSFbyi0DypXGPLu78faj42MIvDKqA4GZSBxYrQ20GDof9CG+9F5nOf1M0Ei7js6HG5oyAI4s83r85DKqePeNpBlzvjpQeARFCrNQU4s1eyLHKCSbEJxxVPPWoMy+ZqfPJsDSudoHoohn+BHuK/j+OgrE44XxQEYqWc4XWfI5OD9RgDo7WDzETYNYVsW8R30onuoHW7liRrrqaR6Wi6YuJNqOEYTzMLwl0OSliIj1wxwrA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?20V17bhJ6NszAJwZ8qPl3vOiaX/PMhs+tVHGpRP1yNosEH5oIyN+E4996K8M?= =?us-ascii?Q?iSHcCrRFP96TkkanRA9iOyDW9XQPQ+VskJI36seiLenZaDjAHyx04M4u6fzW?= =?us-ascii?Q?aVvBBf8c2dHQyej6kYqXDZ+RYziFrWEW6XTbtDhq2pe+4xj31/NvtZmrpGya?= =?us-ascii?Q?En0zzMsX7MoLvo7dxtAIhMbjNr+9kJkRkgKKc8yM9FVAHdj1IcdrIq4EhzkL?= =?us-ascii?Q?K5x1E59m/SHoqdPyUbTkAeXo0nq3TvkcRmnPTedJD377lLSbaazKWb949g1A?= =?us-ascii?Q?7GXVRa0aad1ddo9qgZvtnw7SiQuVAGB0SeBUMvaFOMoc3ML5AUoX+51Uahb2?= =?us-ascii?Q?eiFDBeBRzA7PV5JXpb1zCxaaCfd9yISOEkigRt2UfdptKvYqU0bpN30O6Q2t?= =?us-ascii?Q?6F/yLaof3DFguOg5v4m0UVc/gjHa4+b6cRR42azBRJDubra0eckqz3Z49qtL?= =?us-ascii?Q?bsRpkVpbRQyBlkX1cZWzB3PiHU++y3H/ZTI/suWALPbvgyoazlm+DOBwyEFX?= =?us-ascii?Q?/8u3PVuvevz/Pi4lcIQmM4Dvw72Tcp+DtKNV3QrjDMf5AlAQorhHgChyCpCI?= =?us-ascii?Q?pTTjdxJpyTa9eEr0EDMdbXpp/CGZPTPqpFuseT2eBcs28GAYfdRj3lgBRC/z?= =?us-ascii?Q?YBM7PEgka+r9o/RI6Qit3xZL/TCpPaGBbcj66gF2M59qHgnPKYHLUKAzpvNg?= =?us-ascii?Q?ykG9sCqt4LQRZwot0KI/9VrOs8Hv+QRNV97pM8gmZP6G6FWoR0JBhiX0PhBK?= =?us-ascii?Q?j5cp2rq/8WH2u/jSloxopeQusP9BV7um85CJ/Sjz/FRp7Chks7C58UXT6GEY?= =?us-ascii?Q?6gxFLA2em6AZNtqBirfPvQh6lILrY3a+PhnTezwGSodx5lH7dHUBj1etSroT?= =?us-ascii?Q?72ldgA2c454BC5nC5JVr9OAoa0nRfkwW7avCxpczGhDcofVgfiRrwJdAbeVh?= =?us-ascii?Q?+SQLcb4kGd/U9GmVBfnjo2UzfHHCJJLuzNesX2cTuxRwpL+aE0/+V4VKY7tG?= =?us-ascii?Q?wh4g2h8W/4o4Kad40XLmvGSBq+5h2XS4o0ZYt7mBgWHuIWhqjHC0kutSA2Dk?= =?us-ascii?Q?A9tWTJPXqEJp4FfEw4ITqNPrXmV6dJsowB9XgrMX5Zw70ge/TFiqeI3EaoAS?= =?us-ascii?Q?muwRYpzDpAai0HsGqvs7uteS1NKz9aKH8ZYGUfimYILjOHna7VJPmmGgeLuY?= =?us-ascii?Q?s4ZEIWjSsdBGDzkBVqT2+v1y18MseHroEP3Uz1WA0z0Jrn0pYBHCQcEwA+Lh?= =?us-ascii?Q?JtgURrVnqsVTJWZTNcEIkWBD1RAfZD6aT8cB+NJZ2d3AEbIjciVkI4+oXQ8y?= =?us-ascii?Q?Itun3JaO3uWlzB+8ieXJfvzi1Dm0fixueKizWp9WQ8f0dtFpbRDJJcrJN/U0?= =?us-ascii?Q?0/OglWvbwWO2inqdRxWZIS/q6Q3wxLLHCrJ9dCh2nzNnBQhrpuhtnECW5HkU?= =?us-ascii?Q?7vpbyNH5+vjXUh5tN6r6st3XhfiAV/fnPJNhcf6trWbOtrqk95nLKzSFASRD?= =?us-ascii?Q?PuWxZnk2wGlBg5WJoAZHtrpxVVlvY/fE/bSPKQawLJCM4t/wkORllz6qB7bs?= =?us-ascii?Q?lVIQy7u98MotOjIo4k93MJBMjQ+lEZH2LYzH6UCRWQC+SQ5Pf0zHB3csu9v2?= =?us-ascii?Q?9xxWFsIBEnsH9C81X8ZuVQ/UOHofmwNGy5akTzH2c8fESfOrplEUCKQ3smnY?= =?us-ascii?Q?eBhFc75aB16rR1s+GXYEa9RkEhBpPtaJ2YkjsZlPUkOKioqJhSV3MCthMFbp?= =?us-ascii?Q?TIXoouh46Q7C1lCrLm36UZ/iQCcL64b7QyIUo26FNmAlN1IEgivo?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: c6f0ef6d-1ffa-4352-c8a7-08debda5e2ca X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:30.6940 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: raZPdsiQtXu1wtS7gpk9qA8hDVKgteibibOTfAhH/k71ud4V3tmuuuv9Hj9w5GdJSN56VLzFH2FmR4VVeGIdsg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" Some 10G Lynx SerDes blocks are big endian and require byte swapping because the CPUs are little endian armv8 (LS1046A). Parse the "big-endian" device tree property, and modify the base lynx_read() and lynx_write() accessors to test this property before issuing either the ioread32() or ioread32be() variants (as per Documentation/driver-api/device-io.rst). All other accessors - lynx_rmw(), lynx_lane_read(), lynx_lane_write(), lynx_lane_rmw(), lynx_pll_read() - need to go through these endian-aware helpers. Signed-off-by: Vladimir Oltean --- v1->v2: - none. Deliberately ignoring this Sashiko feedback: https://lore.kernel.org/linux-phy/20260529120005.icj44ffdvdk25fjm@skbuf/ --- drivers/phy/freescale/phy-fsl-lynx-core.c | 1 + drivers/phy/freescale/phy-fsl-lynx-core.h | 36 ++++++++++++++++------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.c b/drivers/phy/freesc= ale/phy-fsl-lynx-core.c index b14d67e574f7..92f8c82f5b8d 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.c +++ b/drivers/phy/freescale/phy-fsl-lynx-core.c @@ -295,6 +295,7 @@ int lynx_probe(struct platform_device *pdev, const stru= ct lynx_info *info, =20 priv->dev =3D dev; priv->info =3D info; + priv->big_endian =3D device_property_read_bool(dev, "big-endian"); dev_set_drvdata(dev, priv); spin_lock_init(&priv->pcc_lock); INIT_DELAYED_WORK(&priv->cdr_check, lynx_cdr_lock_check); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.h b/drivers/phy/freesc= ale/phy-fsl-lynx-core.h index e8b280cc9b38..d82e529fa65a 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.h +++ b/drivers/phy/freescale/phy-fsl-lynx-core.h @@ -58,36 +58,52 @@ struct lynx_priv { * like PCCn */ spinlock_t pcc_lock; + bool big_endian; struct lynx_pll pll[LYNX_NUM_PLL]; struct lynx_lane *lane; =20 struct delayed_work cdr_check; }; =20 +static inline u32 lynx_read(struct lynx_priv *priv, unsigned long off) +{ + void __iomem *reg =3D priv->base + off; + + if (priv->big_endian) + return ioread32be(reg); + + return ioread32(reg); +} + +static inline void lynx_write(struct lynx_priv *priv, unsigned long off, u= 32 val) +{ + void __iomem *reg =3D priv->base + off; + + if (priv->big_endian) + return iowrite32be(val, reg); + + return iowrite32(val, reg); +} + static inline void lynx_rmw(struct lynx_priv *priv, unsigned long off, u32= val, u32 mask) { - void __iomem *reg =3D priv->base + off; u32 orig, tmp; =20 - orig =3D ioread32(reg); + orig =3D lynx_read(priv, off); tmp =3D orig & ~mask; tmp |=3D val; - iowrite32(tmp, reg); + lynx_write(priv, off, tmp); } =20 -#define lynx_read(priv, off) \ - ioread32((priv)->base + (off)) -#define lynx_write(priv, off, val) \ - iowrite32(val, (priv)->base + (off)) #define lynx_lane_rmw(lane, reg, val, mask) \ lynx_rmw((lane)->priv, reg(lane->id), val, mask) #define lynx_lane_read(lane, reg) \ - ioread32((lane)->priv->base + reg((lane)->id)) + lynx_read((lane)->priv, reg((lane)->id)) #define lynx_lane_write(lane, reg, val) \ - iowrite32(val, (lane)->priv->base + reg((lane)->id)) + lynx_write((lane)->priv, reg((lane)->id), val) #define lynx_pll_read(pll, reg) \ - ioread32((pll)->priv->base + reg((pll)->id)) + lynx_read((pll)->priv, reg((pll)->id)) =20 int lynx_probe(struct platform_device *pdev, const struct lynx_info *info, const struct phy_ops *phy_ops); --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazon11010014.outbound.protection.outlook.com [52.101.84.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 997B4385D7B for ; Fri, 29 May 2026 17:15:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.84.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074944; cv=fail; b=l0E+eMg64pdpLrHAJUElC4Bfg+R5dKKkITbXylHwd1Xmd1gTIUi37rxZppE0sONh+lQc9U/6C88tUAo+MGR33L6Kceollvr8PxwhxaV9JlKseZiTp1V9UKdwwXBZox33kna6TNj0VLHbb5G4aKD6NWL5jVbwE4/BHeZ8nUsZmgg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074944; c=relaxed/simple; bh=+SzW/MdbICM0IsZjWI9c9+9sLc2ckEC8YqLaGHyJT9Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=TRFPrtZtoa2ARCns36snLEdrJOMZeWZS2+IkDOTjhCur8H75oRm59x8fc77V28W2HkuYUlxl+e6GuAlC6AIcbsmooUO9dXkFqbShb4y6sHZm2OJSqAD17jqFCIIRaE62saEZn4f0F2LRl48Ww6eFPpHIkE4b1H9yAksAi3+Hjfg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=jJFc8bpf; arc=fail smtp.client-ip=52.101.84.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="jJFc8bpf" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=W6oRdfxDPy6ySfg/gDgWtBVwutGv63D007PWjKP8VKkRdkDDoX6PgdH5z1Q9Xg0lx0AZkbNF/BK/MDUVHYzXPN8f0bA4NO/5OGIZaV9UmYCISAJgUJj5jNGWy6yGqMmpHPnIhHj1eUvRCjF71xx3poG8ZzaxfRuWuaogJLn44EaLmcauToR18lLNdkPLHaOywfmL4S0+GpKpY9winZIQb2R9eanPKOlRFNta/mu51abWc3tT5seB1qpU2EWdJnWnngX2NmMJGJ0KqIlei0U7lTNDv52W3BRBV/hfCoCcfqp+IbhGaT8MDGj22Q7tP/BTID1WkGTBTtMiE3KBOYKVqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=d+Lf5u5E/oUAT232APAvT9ZA8pbpkvY/DerNQ2OQNJ4=; b=s3DMqGSa+1TN9kb8Why8FdrJnYH4UfaM8jNc4wCtVC5F6thygHAMbbwrvSXE+wbsTjCa8AW1lnfiDPSYV4g03iNfT8lNrctHFkNcDzKby8HDea5VVJuAkPoYo5oqBSJAUZMNo88V6/5W/iz3pU8Vjj/LIM77dd2YcmRcR6rM8HgsGAUBuQqzrTVlf/Z3nVH9fGRyQpZWPaaveHGfPbHb9eM+y5CVFdaXp4FHTg9vRfdBTBA4TT+J44eG+wYliVXDkoJ6KUx2P59Dywt8gVQnfWQE+ed2ManrRm3jWcqMMxBczr4r50sbsMAef4KJmnJJdTkxGzuAEfQpV7EJ+c6/kg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=d+Lf5u5E/oUAT232APAvT9ZA8pbpkvY/DerNQ2OQNJ4=; b=jJFc8bpfyAMZ1Rdi4ycFaoO0zd9Xo+9WxjqP79Y6EL1wpSqzWXbDPexqah5PN94R8WOcXLGAJ21ALvwZPvmXoSrDB5668QIg7JZW3kWJUMDLvWiIIxAcZfM6w6UcKZIb7UC8wgD5sA5AAAeGYuBJ5G512Ny8HC8Z5HmfhD6o8UxDeIRZL9cb/4egzYemurMtUSkHwMj6ky+FYUEZhuaIByhYniuiYu0q8fM84Gjrdb1RFx1uD1CT3CpUEOGGNa/ZA0vEks24mR+JwqEiPOjSA2rOuk5W1CoLvBn/oqELjqQOzvfFZFQCoj8vLrwTv6HGdy0cWZFHbSOH25197XCj/w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:32 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:32 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 11/15] phy: lynx-28g: optimize read-modify-write operation Date: Fri, 29 May 2026 20:15:05 +0300 Message-Id: <20260529171509.1163787-12-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0038.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::18) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: 01de79e2-79ae-43ac-0677-08debda5e3dc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: c7ma7cwC4smW7j/YgZuN4DphsyY4sWXv6EAEzapLZm9L7aIOWtlSBy4L7HbWDsjCVY0++7dSrtw+ge7Ar2l5uy0UFXXI5FlsBPBqEFxf5tTes7x4j+nzT/6TkCQESKMsAlvCx0TRO8PXLXUcW9iJcZRu43JoYb06SPUswy3macmKmvgclVXcO3kctR8G9/Gfu0z9WSOPuRwXQ+BAfGubUnmN19GIAsBns6NMjDP02syBbDIbIVc86Ty7BM9MyXdSHSLlpff6mwrugjB/7una/emNq9m4Ybsux89ZWlRLrar55kPu1fXZJjlqtsthvxGU4FS5v4uJ9VsZ0wPRukuJWO/fZ03vSk0G38i1zNfKIqK41ZZL0VmJmGEIXYiQy0WbpjTQDoxyWtqW5HudDRKAN2dmpBvtMOirN0tg9hIRXjp4HtAA/VhYjKgHvSLQkfp0ew/Q7k5gYQe/PGqRzMUnq5mC3TpEHs+5xef/Jqqun+cniy5wSLJ+24MwNKw/NTi/P2d0x309MTfSUzw38D1tsEBjZSiJbGgxoC1V7iup/mYxeDLulXYe0SukX6C3bBSIhqH8QgyR+eFWw82JkgdcwlPtlOfVSAcseQGlJ8Y/pAJ5b07GYG8IgsqKf3S3oTx6Xyhe9q4SCbt+dfEdsPergJ/CU0Ja/UDp9fdJshYSs3LIuW9AKOzQtYuiINzS99Lu X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?kgw5PtzhQxkczS+g7ICeimlSJor1aWNjS1tgA0gaEI+3iuPsQYJEFEm+XyWT?= =?us-ascii?Q?DfKbMKE/2Od7DG9nBPVk6cJZDHyq+sz1oDXycWdYZqhfwmvI2/2xHU7ye3D6?= =?us-ascii?Q?KCXNXFjEpSM7fzSpxWBs1lDmXPP48dY4x2M1BAGkfGBk2zrUJmtQx3lLhdZB?= =?us-ascii?Q?5pxK/Znwe4xxkRiXIICpDwR+uJwN/nc5OAVVIJN8e6ivk6Ep9WsrZtIy3NP0?= =?us-ascii?Q?jLtdYVDSpZN44XDdKedjyO268Elwj6pK0GiDM7//4owdUWQsW4HIqPjZEG0y?= =?us-ascii?Q?oEw8JR0+DSXXQXQfH/Sb+0F9OCE2WN9JwQK7uYASjhw2Ej7GZTwO/01JElx3?= =?us-ascii?Q?wxioRln7SC978h8aS205S+YoovahBh206st6VBAZtTzaNBKIjgaPbCAr4xjt?= =?us-ascii?Q?7waO5J/cApkDVHQste4Hwfy0E7gyqxNvgDxz+n5kqfYwRDdNKMmXyG6iuB7S?= =?us-ascii?Q?yAmxRy3KZOCuIqt4CC9g1KiMouWzoSkulTdsGezSprJyxyMXfSDVDgI3pj9S?= =?us-ascii?Q?14p3E6f24GISQZZGEnQbxy62NRQ2w/kPh+EI3G+h5Gikpdf9WJ1SM5dwuLEf?= =?us-ascii?Q?hnM0eOOAwlVXDtS8OEvPDaz7pPZe6IPk2LioH02A05sNjAAFNo1j+zJT3zKy?= =?us-ascii?Q?HsO3pwicqJin2cFvo54UAKVZ+yd07wpbbjGFnxDjg1yiuybXIHAwdx0A2TOu?= =?us-ascii?Q?sWYvrckaN3lr4AwdBGaHg56dm1Y9YN9q3iZLFb+tPYoI/llSO/VscDNXzTdl?= =?us-ascii?Q?YJCrEC04vXalaDx3IgylcH9b3yTrOrxH2/oDrtr7x6aHHr4dm/TNUGvfGeNo?= =?us-ascii?Q?Q5HeRD/4aopYQ5JauEsyhVT0rlskqgX8jUOfOGqHwhRRsfjh9SmnatT69yxZ?= =?us-ascii?Q?nCmTnGOxGsv04R1JrkPYr36M6nxvrqyIqopXTVZ4ZF6YPHqK6rAdEb9fw5Iv?= =?us-ascii?Q?e6P1lhNhKtWBZLyDZ/mNXzhVHcQojN8dLMyVpKPMytZmCKDoMkR987BEy23E?= =?us-ascii?Q?OX2SVis2PK/nHAQmpX+CX3TSB9dldt94t/OZYG3k90honDYtQQ3fNwqYf9fM?= =?us-ascii?Q?F5PI8kGy3fK33fHjoolin9CHUmS8fzZf3zHZgxTST1EKUoi+TR2dpK0Sd0/T?= =?us-ascii?Q?PYS5EUrzWGr6yddytaqa+P/wmZ/wfFVfOExpNyyENhedqdmSqzmbogUiAWmH?= =?us-ascii?Q?4VIsemxC6v504F4BZMZwjJA9fxMTb5+TB+he+ih2DpZw1R8jayGL6dMIa2Lr?= =?us-ascii?Q?Np0e1Bpm6t9wSAmFoS45d2leURpsb7p33pUXyDc8NH4vMFIXDxIdIXNBJGOP?= =?us-ascii?Q?EOpjxFUJC4Suw/2yn0bdZ9zBr8dqBToZJOtMdfJOXA8IfOY6lD0DxLA71RPN?= =?us-ascii?Q?iyg9SwpLbUBzxuKkGO9/iatAbAN/EIKJt3MUN0fFVbhgwNqMv5Svx/CculZf?= =?us-ascii?Q?Ns9Tt9Zu0VMBcF8vX2ju/2gprJ3X3g58Sx0g4ToF1dXqXcTtVBV/oUX6x670?= =?us-ascii?Q?YhcpI8u0Eb+eZpEHwhoqWI3SGUQDf/PQA/DTksMRy6W38+pgcUzf7TDWbvxH?= =?us-ascii?Q?PchyKajG8j5OPWU+DaWdk6HEXdYGjcnClpPbX8pTzSNfAibH77xKINsKT5+5?= =?us-ascii?Q?JoT1nKjVRNP3ItW6vSYeH+ZInbVhIfT6eqm2uw5bO07edN60XbSAdsLYW6JU?= =?us-ascii?Q?/GHe42aj9zYZU0uyk5RRbh/c6mTJaYuOie7rz98T+rq3nDXtRUKu9e2IT/oM?= =?us-ascii?Q?lcSZMHwLOeU3f0NCLkCybpEuOqBrtN+skL/p2vjXWx0SL+dpVKhu?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 01de79e2-79ae-43ac-0677-08debda5e3dc X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:32.4194 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 2iflSzf8VR6/9MyH6vVJwu181KX9+UXSpQq6QcHR5rb2hvRhz/+h1fbZ9z7oSRD0k0Loafbq44PEEKICTZtdiw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" It is unnecessary to rewrite a register if the masked field already contains the desired value upon reading. The hardware behaviour does not depend upon register writes with identical values. Signed-off-by: Vladimir Oltean --- v1->v2: none --- drivers/phy/freescale/phy-fsl-lynx-core.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.h b/drivers/phy/freesc= ale/phy-fsl-lynx-core.h index d82e529fa65a..3d9508dfb2c1 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.h +++ b/drivers/phy/freescale/phy-fsl-lynx-core.h @@ -93,7 +93,8 @@ static inline void lynx_rmw(struct lynx_priv *priv, unsig= ned long off, u32 val, orig =3D lynx_read(priv, off); tmp =3D orig & ~mask; tmp |=3D val; - lynx_write(priv, off, tmp); + if (orig !=3D tmp) + lynx_write(priv, off, tmp); } =20 #define lynx_lane_rmw(lane, reg, val, mask) \ --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D6A9938655B for ; Fri, 29 May 2026 17:15:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074944; cv=fail; b=FqEMdv8VD3uFvJTu8IqCtF5xDpGsq+ryyYH76k+WwQj8R8GFVr8mVeK5gJUdtbFhEIn1ji/LIZU3bJbSLd0hT/xrBubdDMf/zO0cxIWqqfrQidltav0BFmwA6Ly+0hyh7VKGEGhYgh3ugjmvm8DRj/v2FwQSbQzSO5hMxx+OEi8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074944; c=relaxed/simple; bh=7NcDDfu19xQTadE9ToTAMM0PXw0+r0gNCFugfhyDWPM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=ESQ2+r3yUbWwbWJDIS6hfHbpIrmz7ylYkpuBeERP1esLn1gMei/SAvA68WZoik38aI4aL98jyoRuO6kUg0zyWjg320/ozPLWXlv2tEZhRse69H/BUVWfYNV6LTQBuAHaD4qQcezqTAOAfy5eyjW5AJ3uGb6R7CegN7aiSGiRiTk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=VwkA5l0y; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="VwkA5l0y" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=E2G5k7s0WgyoyKenf7pcGlqqeMhayq6cKlWfbdkIe2Y81r1IAqsixqkhKJi9Ob9KVFZIP6metwlVtdDgtZDzK8p+L5LFwNW4ChVTYDHBnVXU1htaVextfDleBdOG5nmRpEIinEMw0SLgk5PfXX9LbH1UyZH+mb7ZSrHzLl6+7/66aWzri00Cc9Fl50n6xV78zs917vs2Gfn4B2dRzOJCfbMdcdvU307xwTJ4+97nMRXXp+uwS9t+sfvHiwtHoT5htOMv9sbHMJg0obLE+FHpBI9oz9OtnfUQP5CMAEyuEhIzas+XSSLJbMBCuOQU/utU0VhnqudcEiqq85Bc11UQpQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=UTJcFDT7uHZJqbQ/AZdDmZNCqjsK8NkOKKv7Wl2tUXs=; b=ITuEBvevB00AELHG7wF/dAdXUqjd1mCtQd+WGIskLSPBurGCgr1p735HzMQXe0NMLz/sjbf6LynoAXPXR9Zz0KDfGr8APb/lFEyT6P4NJFijS9pj37GM9qCjzDq01eU+/Td5cIAN/YJURfP3ukLHwidm30gfnYYlARZ67D3QhtktJYLvCB9VodsnA3qSCozH7xZ+5gX49r9/ol1T43BhMMc54hrAbxbEpLemxNCCplfxICqfyTKF4vgK/p4GAWw4AG7643ozJIIyQL+H+taMG7/FUVPkBQB5MxDejEZGIHAZbxkIT52ZdypYRntDj5nTSQuDbH2QIsPdYUJO7u+yZA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UTJcFDT7uHZJqbQ/AZdDmZNCqjsK8NkOKKv7Wl2tUXs=; b=VwkA5l0yBnKlpHSlUYLuqacnLuUtHlipRKhJD09KKIgTiZV1OdoD4GYBjroVAcwzOBqVNrai3VnyUgO4egBi9P32IE/ZD7JD30azgtZ8iqPKtTIPFAOflrUXvVowNtG2S95hGF7Ur37UTSItKXIXq8AequszWJvfFBKO7YHp05tfPlDnFo76XYKsxtMYZr5VpgHcfB2Kzd/Np72fo/3tEOQ2jDjUQP9P0glUNxZ57pAwMPm69Ov7PcYiTL0Pw1Qkj311K6oyKeW/jQaC8Gru/MbjrDoE0mMiBKlZ/azZ+vzAMuNIp4Lzx4DbH903XWC3NwcjamUOtgi3yQQ8v4VmLA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:34 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:34 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org Subject: [PATCH v2 phy-next 12/15] phy: lynx-28g: improve phy_validate() procedure Date: Fri, 29 May 2026 20:15:06 +0300 Message-Id: <20260529171509.1163787-13-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0056.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::36) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: 6659f117-5227-4feb-1c37-08debda5e4d0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|6133799003|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: HWwqVMQ1aWHUSwqKpsLK25H+RZIqkZ/yxUrIus9XioMjydZEsdRiiApkn71+RWlzY35KCncHIXfIu+YvYnbxH8et4jo1N+SmwUsbbmyI6B/qpJZNuOBjIyjHN+VQTza0VzyFSj0RNcAlGMyJTXuC7+hOBYdi2lXfMwpbsiS5zAmhcVFZ6Vzg1Fc4sRiyNfxhUjykg2wUWXRVHRcN7b9CJ7s27ySj3KHOl7mhZsp/2wC6bfW3FRMvpogcf5HNXaBZlNrsHWMZMGOqc5ReP57dQVhbYT2bDncrPpKpNmjl7BTrjDGEZFU7SdpJbYZqznq6KI244mupFWG3fqQ2+tUPSK2g5KhcYW60OIElKJCS23SuNw6gGGQ3oE68CIT0vKovU/UxD+QelvOJVtUT5wEjN98HyPyRsY/FrAPIbY4G/gBhlrqoZyjvnCmsQEmwneU+cLpimJ+u5mPniDg+/Auc+rovzI0BkMpkOpmdUrO5e2lqNM440WqpRKmink6vfRsV53UAff/6AKsDvQtpDiFMEbQBN1t0lqSLdAI/aHutfIrIGNmcQIMQog5FzOjgBWpHk2XTotT91tfVmgvUVAFLjziwUZVK4Bpwc/LRiahnp7ch2sRnyBhKXCt7o16vgF5NtG6LragxgFaGSITyIudC8RA9tDUpUeUQqpAMh9pIrFihs3FH17D8rRQCoRre3TmM X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(6133799003)(56012099006)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?/b9vueQTpy/KQohQXkWmBkiSoCXxtUGZL+O48nq7vGYBUSAI4hmp0XofT/GD?= =?us-ascii?Q?tuIYf1HyUtFFlBoRy8u9w2jAhGrd/nydsxLZW+gWeIDlkyz9SQYHT8tDJOIS?= =?us-ascii?Q?VS96p7IXFhuEAoyni3LxttFBHrr5ZKWVFgPZG4zqDLtKQt48x4Oms0AQTDof?= =?us-ascii?Q?U7JQSrQc7P/a078+eP01qClpSAYYuIfK5ZskD5bRW9A0g0oOT9PVM6/Xe0oC?= =?us-ascii?Q?5BtswEL2xVJSXhjJex1YKzhidWVzZyT8RjqkTzx1nAH28/98HdU7KR6pOeaY?= =?us-ascii?Q?pwmkg5IgLUGx3gULilCzQJVRV3X4J0RItbLAhIm9aTMNUXYxMIlBp/iTyZDv?= =?us-ascii?Q?hj1weKTHNepGbJfd03Hwq/3Hux4Nq1n4abnZ8+MHOvTzRX8lq2C2W/on5HYH?= =?us-ascii?Q?N9vaXJuhZy5pYNbI8EpxSuEfkZqNyB7JUfpXb6RRiBKDL9S3ONui7Dh+6r1q?= =?us-ascii?Q?eWNYN4/Ff8dfgCJayfqwIDIVR+Vsz6NBKL+px02AQkVuDhm01L67BrbWK9Yo?= =?us-ascii?Q?m95cLA22uobATIwPKMqIQ1lC5svUS4zbH5YuZhg89BLfdo4l0UeEMMSOGbvG?= =?us-ascii?Q?GQgjFYfKCKicneZglqypz12sdmMW+m8eEZkyC3T6RCuSJn4KSO5VNG9Skc8v?= =?us-ascii?Q?OuKzoBB9DNMgUAYWeqo4tDFXW8gOKI94363tv7n1rNlP2NA7TnJOMiyudK+7?= =?us-ascii?Q?kV251b9FIOg+GN11zJPQCUELkz2SG6dNAh5d40jDA/fN4gDv2Unw8XOjPX2u?= =?us-ascii?Q?j3JSzZ+v1qjb8DjUXTON3Mbpr0VtwjKXmwnDsYUNUVIqYCLelbGYD3/04nlv?= =?us-ascii?Q?MM9PS6tOJHmtZ0cZBZoDO3e+fO36YN5oVTCT49a9k11yPwv9PFmzbtv9VSIH?= =?us-ascii?Q?OBy5aXCrD/gJnUk2qR2qHaqYWkwKs9DsjgXOs3CEyGKX6zzxH1BMNqy2R1vj?= =?us-ascii?Q?Hbs/JyI2vTtOk2L9y00aVbJOPRrCSRysprYRnP0il7CuCujU01qC5tfo8yrB?= =?us-ascii?Q?v/19q5k3nrNZEA5h2On8+YwL4EdXWFaJQfEUFXd8PLHZ2Dgq/fo3+94Dkwjy?= =?us-ascii?Q?228+G3HuCMFy1LVy/rU8bQ7SgbDNcDTGbhGPKzriTmhUROT4R3MPXQTUmyfX?= =?us-ascii?Q?VZbhFEmGR/86ySzVrBHis9Apa7Y293Dwq0rsi+C7qbbQnr7Z9XjYVP/NM07p?= =?us-ascii?Q?B9RfzC8CEHkpKU2GZraUnNO7AIIz0uL9ms6BCo1a4uYlVMXMyuONq+vEfI9F?= =?us-ascii?Q?igZOnmy//pAt6lRZQsFF56onfewct7NjNf3RZYWrFekNdnEWeJJoJ2ES+Gya?= =?us-ascii?Q?Oto+5wMGiO0p9QQo5Fwa7suC1Z82g81StILP2EXm45xqhh3fodazahZa9qen?= =?us-ascii?Q?jSIPkLw937PWNWh2YYmGDQR48qIC+hR1Ex5f4zUAEER2B9/cCoWFvXDsUvqV?= =?us-ascii?Q?vWYXPGiMqW762Bt2TEbFD/z6ZVAECXfDCSiVBmDrZeJMQCsQFZajsUUvG6L8?= =?us-ascii?Q?HJTHG1r1ZaLisLT8yvTZh8Xi93IdJoSeah7+LbVMDEeVIeyVMNZTBXE/Fo5w?= =?us-ascii?Q?IWrvQ8cFiCgMUubXCGOWc3wPG6nNTZ6LqBip/ajz5fe7oVPR5ykfCG4iNxQQ?= =?us-ascii?Q?fCT6fvKQV9AlxI240VFOBn6KFc93iK4Bk7X7d5hqr7LlIomoDChd0rL4xfMH?= =?us-ascii?Q?EDItEdH8T8M2IQQCb8QJzzuaNN9vFPerYW3qXPgVwVVS75dbIuLVcVwOgyqW?= =?us-ascii?Q?meUKQA2hAbSD/X8Bri4fGCgMCXoX+dvC55dYZdwBvonPJ8vrYCiL?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6659f117-5227-4feb-1c37-08debda5e4d0 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:34.0248 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: MmC4362C2YB8oZB9WndpzLevFiXi/dn6CS3TyJV2i79/VuzYCtHjfuDurv3lmv+uq0HkSn2fqHYKE0ot8hKN1g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" lynx_28g_validate() suffers from the following shortcomings: - Changing the protocol should not be possible if the source protocol of the lane is unsupported. This is because lynx_28g_proto_conf[] only covers the register deltas between any pair of supported lane modes, but that delta is probably incomplete if the source protocol is, say, PCIe (which is currently assimilated by the driver to LANE_MODE_UNKNOWN). lynx_28g_proto_conf() does refuse changing the protocol if the current one is unsupported, but we shouldn't advertise it via phy_validate() at all. The phy_set_mode_ext() call should perform the exact same verifications as phy_validate() did, in case the caller bypassed phy_validate(). So we need to centralize the logic into a common validation. But lynx_28g_set_mode() later needs the lane_mode that this validation needs to compute anyway, so name the common helper lynx_phy_mode_to_lane_mode() and let it return that lane_mode. - Future core sanity checks on phy_validate() will want to differentiate the case where this optional method is not implemented from the case where the mode/submode is really not supported. So we shouldn't return -EOPNOTSUPP from lynx_28g_validate(), but -EINVAL to signal that we do implement the operation: https://lore.kernel.org/linux-phy/aY2lFTIALH7qEJmM@shell.armlinux.org.uk/ Signed-off-by: Vladimir Oltean --- v1->v2: patch is new --- drivers/phy/freescale/phy-fsl-lynx-28g.c | 38 +++++++---------------- drivers/phy/freescale/phy-fsl-lynx-core.c | 30 ++++++++++++++++++ drivers/phy/freescale/phy-fsl-lynx-core.h | 2 ++ 3 files changed, 43 insertions(+), 27 deletions(-) diff --git a/drivers/phy/freescale/phy-fsl-lynx-28g.c b/drivers/phy/freesca= le/phy-fsl-lynx-28g.c index 50b991870edb..38afcd081a2a 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-28g.c +++ b/drivers/phy/freescale/phy-fsl-lynx-28g.c @@ -968,22 +968,22 @@ static int lynx_28g_lane_enable_pcvt(struct lynx_28g_= lane *lane, return err; } =20 +static int lynx_28g_validate(struct phy *phy, enum phy_mode mode, int subm= ode, + union phy_configure_opts *opts) +{ + return lynx_phy_mode_to_lane_mode(phy, mode, submode, NULL); +} + static int lynx_28g_set_mode(struct phy *phy, enum phy_mode mode, int subm= ode) { - struct lynx_28g_lane *lane =3D phy_get_drvdata(phy); + struct lynx_lane *lane =3D phy_get_drvdata(phy); int powered_up =3D lane->powered_up; enum lynx_lane_mode lane_mode; - int err =3D 0; - - if (mode !=3D PHY_MODE_ETHERNET) - return -EOPNOTSUPP; - - if (lane->mode =3D=3D LANE_MODE_UNKNOWN) - return -EOPNOTSUPP; + int err; =20 - lane_mode =3D phy_interface_to_lane_mode(submode); - if (!lynx_lane_supports_mode(lane, lane_mode)) - return -EOPNOTSUPP; + err =3D lynx_phy_mode_to_lane_mode(phy, mode, submode, &lane_mode); + if (err) + return err; =20 if (lane_mode =3D=3D lane->mode) return 0; @@ -1014,22 +1014,6 @@ static int lynx_28g_set_mode(struct phy *phy, enum p= hy_mode mode, int submode) return err; } =20 -static int lynx_28g_validate(struct phy *phy, enum phy_mode mode, int subm= ode, - union phy_configure_opts *opts __always_unused) -{ - struct lynx_28g_lane *lane =3D phy_get_drvdata(phy); - enum lynx_lane_mode lane_mode; - - if (mode !=3D PHY_MODE_ETHERNET) - return -EOPNOTSUPP; - - lane_mode =3D phy_interface_to_lane_mode(submode); - if (!lynx_lane_supports_mode(lane, lane_mode)) - return -EOPNOTSUPP; - - return 0; -} - static int lynx_28g_init(struct phy *phy) { struct lynx_28g_lane *lane =3D phy_get_drvdata(phy); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.c b/drivers/phy/freesc= ale/phy-fsl-lynx-core.c index 92f8c82f5b8d..a9fda85a7783 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.c +++ b/drivers/phy/freescale/phy-fsl-lynx-core.c @@ -89,6 +89,36 @@ bool lynx_lane_supports_mode(struct lynx_lane *lane, enu= m lynx_lane_mode mode) } EXPORT_SYMBOL_NS_GPL(lynx_lane_supports_mode, "PHY_FSL_LYNX"); =20 +/* Translate the mode/submode from phy_validate() and phy_set_mode_ext() t= o a + * lane_mode and return 0 if it is supported and we can transition to it f= rom + * the current lane mode, or return negative error otherwise. + */ +int lynx_phy_mode_to_lane_mode(struct phy *phy, enum phy_mode mode, + int submode, enum lynx_lane_mode *lane_mode) +{ + struct lynx_lane *lane =3D phy_get_drvdata(phy); + enum lynx_lane_mode tmp_lane_mode; + + /* The protocol configuration tables are incomplete for full lane + * reconfiguration from an arbitrary protocol. + */ + if (lane->mode =3D=3D LANE_MODE_UNKNOWN) + return -EINVAL; + + if (mode !=3D PHY_MODE_ETHERNET) + return -EINVAL; + + tmp_lane_mode =3D phy_interface_to_lane_mode(submode); + if (!lynx_lane_supports_mode(lane, tmp_lane_mode)) + return -EINVAL; + + if (lane_mode) + *lane_mode =3D tmp_lane_mode; + + return 0; +} +EXPORT_SYMBOL_NS_GPL(lynx_phy_mode_to_lane_mode, "PHY_FSL_LYNX"); + struct lynx_pll *lynx_pll_get(struct lynx_priv *priv, enum lynx_lane_mode = mode) { struct lynx_pll *pll; diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.h b/drivers/phy/freesc= ale/phy-fsl-lynx-core.h index 3d9508dfb2c1..37fa4b544faa 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.h +++ b/drivers/phy/freescale/phy-fsl-lynx-core.h @@ -113,6 +113,8 @@ void lynx_remove(struct platform_device *pdev); const char *lynx_lane_mode_str(enum lynx_lane_mode lane_mode); enum lynx_lane_mode phy_interface_to_lane_mode(phy_interface_t intf); bool lynx_lane_supports_mode(struct lynx_lane *lane, enum lynx_lane_mode m= ode); +int lynx_phy_mode_to_lane_mode(struct phy *phy, enum phy_mode mode, + int submode, enum lynx_lane_mode *lane_mode); =20 struct lynx_pll *lynx_pll_get(struct lynx_priv *priv, enum lynx_lane_mode = mode); =20 --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7F6A838735A; Fri, 29 May 2026 17:15:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074947; cv=fail; b=CJ33Idvp2/lpc4EDGaspN7zH0V+6pvNW+S8T2ChiWjMU8YOFb5nXRb8gUlZxwQMV2roQU71sLwhJUUIeF3EC/r+sttsqF3xBJJ5kVdgcV2TBwDSVD2uQw5KQFjs6HM79pd6sm9sCFfBWMIW9MpENp0TPYT62TwaVe+uladXXAek= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074947; c=relaxed/simple; bh=uSjA31lqdmAU/qI/2mX3sOUKIMfhNOYq/1kIDjivn7s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=qeoH49WLOJ+fQjeOsuRDnGMvXsc9Zc8r9r+rJTzrR7cqx6gQnJ8r1VRltSzqB7TLDEk7QaOdbyX4DEE5Z127WP/VxcZB9zPtVFuzcfIU1qpA0ihoEXYHKX60GJnzo2FqILOVc1fVYLc4FSPrfBSvf38cqaa6WSGNR6mgyiMEzJ8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=jgJ+uYo2; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="jgJ+uYo2" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KvmzXP1982hOmo8aQQOeVstH9Q7WIWnFiA4+i9qoYC/qU27mze3nd1VaMKp1WgmrGt0SNJ+N3p2EVJM5/2cHa2X0s+RirHjaNrilKiIFVV0PAHG6tEpA5q9drFd08hXhb4yFCRooojBgd4NFvUpXT2wllF9wC6NBWozgtAKVyJRIexDMZY3YPY9wEzYjfXJbAPl9GsVXoqq04Lyn2PrwMMT98aGmfRZ32Je+sRvIsYApHzValI93to4d5HsZX2PudD89V6XDY8tDbzEHGhX2nR9bUMldhLvt9VmgY9NMRXJFZK9WpHhZqbnRacLpaLC8b0uyhsVCpA9r5bTV8mKj8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=6VpMqM+F02JuMFQmso8hqwPFgd/odO+Z62dvLBBj8IY=; b=Fg2ZY4dkUkH09Kujwf3KVyDrOJJ/ynfrdg1ERD8MEI5xO1OKywn1BtE8IQal/TpFhubX8S4C78TZ8gIXYcgP8Bhy5AtJgwWo4bvJ9H2JCSoXJa4N1KQNn1q1gupet3eJnVkq/0L9B5xzseaEBdNNIu9u+qFZDHyRL04ptVM9py/o5fQYTDP8+l8CCSG+M5eEVY1fkzk8T8XFqYU94fhd29CUwd0S61zX0cLBUb0RP2sFCmfcUvLY0+h49bwW2WetUEIvpHmsNzwWyCC79qCrgZejHGAm11QSc3LpQkiUY9qe85EX5uYBKTZ/ruSBq6JE1zTIwFCldXAuqH3HIXACTw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6VpMqM+F02JuMFQmso8hqwPFgd/odO+Z62dvLBBj8IY=; b=jgJ+uYo2/2mneDTTjxys78613hcCZ9L+HA8h3cTUgKM886DkRZOhb8abyWAExRxbSq+B2CMbLKVUwKkIh0Qhxpa0uRgz1Kobd93XgbpLff1b+rNC498HinkqzJ7KOkGaWmW9kxxQCJoXyGEYy9ZWRu9mXrqVOoIonOZqkkNnE2uJwUpqrkEcACHB6VisQXnN9PSECOu74uZhKnIKWRnBB7XJRT+wKU7IAcWPnUIGkQopwfkTyLuFtI/Qy/8+cqzLaPfIQXgaYF9ygH02+eWi5Dhl0+ypMmpeGoit/EMK9NuWheKq+mO/yniZqS5/ELt4t7C4ahDVaByKZvdpEGEzaQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:35 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:35 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Conor Dooley , Krzysztof Kozlowski , Rob Herring Subject: [PATCH v2 phy-next 13/15] dt-bindings: phy: lynx-10g: initial document Date: Fri, 29 May 2026 20:15:07 +0300 Message-Id: <20260529171509.1163787-14-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0056.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::36) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: a10811ef-6216-429a-b1d3-08debda5e5b9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|6133799003|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: StgUytViZqoE9ZEBd9KnG4ENlqkzR3eFQGHtFh0ZCgdgea/1F8pbpLNLGdMWOOTbD/0gb5DZmKM5XmU70StWe+yxYjVUYCrmTty7bLyxvBWTeVkfGf7D6SaYTx8Vt2Yn95Bg1uYZDJJbH/UGT0drCpuj6mBDLgAQ1q0sXZaKTMa4qgIcHz3U4MQZI2xpPn96xFrWO7+CBLRqdLXj6gc50BEVWB3fxMGdlFm6GSWZHAlpkGfECXUObRVA4R4pDi/YlGaah0Bu6Ga1E0fL8FiqjymLM8AkGYdBYOIjw9v4Et17KwWTGDqDXDrO8EhIHusnbmbxTvo/rrDwZXXz2nVL4/47PluK25w/sjWnx0XzDFIPYpGl2DVgCFtkUhv6Gkbc1oqMw/77cRk9wZKgmZKa9uXBevXknyJ9pRjvdwJYqiIpIrNGvawuKQ/CK65nucrtDYKaUWtc0/1lBhn3xXlr7I0JWv8JL6SIK9O7xVjuGXQHsTHbnBjs83/dPblzIJosMtAeaIx/qzQFe6uUgNeMzAk6kdBhuBPw0Gy/NR1R+hHLVE/+9+Td/IgP0+WEuIsFgpUfk+l5zOXPNdU4y0nxTblL93D1+HO1VMyc1+i2Sb4i/FsKnjl5O12tMoy3tPO4yJ0dbcvxhVl49Umck5k6CQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(6133799003)(56012099006)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?gzJ/YdgDda1kuGfSsUZ8JV3IgY2K7DER8vGGP18POg8873e/eg3/rJnAobhi?= =?us-ascii?Q?zCqftErFazBMGCatWC/42EaRlnehOXgkEEHcs0yDJv+LkWZgaIoiepGar3ob?= =?us-ascii?Q?GF0tU/BisMFDEP0p7u03hjMHFF8s0dXswT2MmZzd3+ZU6MGeSu8XB8N2Jiou?= =?us-ascii?Q?rni7Vy29EgHEX8LvqNSqHJQSLqIyxRty6PYTp1Cq89cXoz/0ciiQwyFoqfZZ?= =?us-ascii?Q?vPvxOZ8qbcV1+rHqyu/wsg+kjDFKxIBo2+Igvy9T5TfAyYwQFv0gBB8xsJ9M?= =?us-ascii?Q?1vo8EqIInUdaPxdkCTSmyyv/bUfBdQzfZpu2Rvx/438WIIHb3SFPwdRRsdN6?= =?us-ascii?Q?HY9hA1/ERsOAEaEI9O5AuKfwuLIl51nliAZXjkBhYnDn7gun5aJxfKSg8nE5?= =?us-ascii?Q?/YgXvPaca/Ybo2ugyYNkRnoWuAFS2GDLLECANlh+Bd/bmDDCqEepym+SQ5np?= =?us-ascii?Q?PFdjzV6/otbUO5G8lL1U34d/cIBAW2/euGdMlM9K6q6nZM7I46QEH2K4pToL?= =?us-ascii?Q?9g4RgtnGs8my1eRi/Jjnlx4VW9hPaQh9SWeJ+Tx6NFsPLVr1wDPoR0Zfrc38?= =?us-ascii?Q?PR9FQ2FVVkEWCH6QYaqNjakoBs8yU8k2Ctb/1xSYjY52APKL7BLwvWAGLOaF?= =?us-ascii?Q?eMZ4n4koqqqBVtLL6pgb2vjfsoQ+J+L7gjF9ij2LAAEalM8jbHpPNkdEDe6c?= =?us-ascii?Q?UvEnA3sVI7sOjLdSMOyoS1e1ycVK7hWOfZOsIJ5bkIbDstcn/4BSR6Bt7mk0?= =?us-ascii?Q?wjOnPPN2zWF1CTaW9OvEN1+GNBTn7apOBuFEaACMeLr1NtG1ttQnfLgMGLRw?= =?us-ascii?Q?QWF6D5OJXPpUMYjFBseKG/7eSeOQaz+QPJQSBzeqEGtMdoFNNJU438Nn+nig?= =?us-ascii?Q?oxEOL5XMhgKmDsN8qhss39aQ4MsRvg5OX/dI+wkGywtk/tTatiXfMQEb8b7T?= =?us-ascii?Q?Yfmm8In6RcGA5ooUJ2T0bOrwtIZeM1xZzvuPnwV0mjoo1+9+YgrP0FAhCV6Y?= =?us-ascii?Q?uUIwnwHlL+RnM9n2mSmBJtqmQ3jZA5Atirk6inEX94CWtUEAPm+jnO4uN/Ab?= =?us-ascii?Q?8KJEcNbAbG/1LXkQfHX6r9VV7RGM3cWOf9GcO4pUx30WMPy6wqVhxKL+YSeZ?= =?us-ascii?Q?AAIQ+p89VjV/6AjtaMD+Xfp4XMJGQPBzNLPo8Ve7yTSBMfOrFGmk04oE0pdb?= =?us-ascii?Q?/cghZD4hK4XANhBXPbvLMCoDQarJV77b6CtTAYbdSLwBc3VY0q447y48ujND?= =?us-ascii?Q?AhvcsRJAVkLrlb7tsJ78dW2UtEVTNCcUyfGTV1hrDNEXqbfdNbP+D1vKhC5j?= =?us-ascii?Q?x6PorButwt3zPpVg82yxd70BaQM4AGSvRGGfbzcJRiodSZPImMOrYe7jaYEp?= =?us-ascii?Q?y6mVLlfaGVzycfxTaryr1dsJ224ExwT/XM14+W69timGFYJ31YUKR+MkH/Jk?= =?us-ascii?Q?y0jZXvIvJfv5A7KWQ+rPhBdNShMyTc6lnewGNXwIS77JsxxLRPb64FZi+x+/?= =?us-ascii?Q?vIQXFUH2+gOHTeCOH/6ME+nR01Bi/L9GlTfvYU900lJ01AH52iDDbLx9ESed?= =?us-ascii?Q?ovSuVdXNm45F/XGWSYxMybh0mupielkdBVlxLJPipivwp/qX/pEUHSYF2rO+?= =?us-ascii?Q?BOYCZZtj8pJCXan6CxDMuqZnVIMYE/viaV9cpFxKbdlyFYopIgSFgBkB4Fzs?= =?us-ascii?Q?dL/z6nhBFYarKNPziuj8LOiIL/EOgJpwLB9TU7UVhRgRqpIZrVKTXCgDGLAD?= =?us-ascii?Q?gycQBe5gRbwy/6gFDaF224jrQapctCzr+I8D72IUf/grhFwxifHj?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: a10811ef-6216-429a-b1d3-08debda5e5b9 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:35.5934 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: yr711KRC6xcyBZRj8rFpw7F0HVAyN4MMSpiOS59ngmLi602BBV2Dm3ordnSwN+wOmM6bIDojv/b+r23vWPRArA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" Add a schema for the 10G Lynx SerDes. This is very similar to the modern form of the 28G Lynx SerDes, which is very much the intention. We allow both forms of #phy-cells =3D <1> in the top-level provider and #phy-cells =3D <0> in the per-lane provider for more flexibility to consumers, and because the kernel code is shared with the 28G Lynx which already has that support for compatibility reasons. Signed-off-by: Vladimir Oltean --- Cc: devicetree@vger.kernel.org Cc: Conor Dooley Cc: Krzysztof Kozlowski Cc: Rob Herring v1->v2: - move patch later in series, right before driver - deliberately ignoring this Sashiko feedback: https://lore.kernel.org/linux-phy/20260529125017.ifqunh52gdzhthdg@skbuf/ --- .../devicetree/bindings/phy/fsl,lynx-10g.yaml | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 Documentation/devicetree/bindings/phy/fsl,lynx-10g.yaml diff --git a/Documentation/devicetree/bindings/phy/fsl,lynx-10g.yaml b/Docu= mentation/devicetree/bindings/phy/fsl,lynx-10g.yaml new file mode 100644 index 000000000000..993f076bba4e --- /dev/null +++ b/Documentation/devicetree/bindings/phy/fsl,lynx-10g.yaml @@ -0,0 +1,131 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/phy/fsl,lynx-10g.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Freescale Lynx 10G SerDes PHY + +maintainers: + - Vladimir Oltean + +description: + The 10G Lynx is a multi-protocol SerDes block which handles networking, = PCIe, + SATA and other high-speed interfaces. It is present on most QorIQ and + Layerscape SoCs. The register map is common, but the integration is + SoC-specific, with the differences consisting in register endianness, the + number of lanes, protocol converters available per lane and their locati= on in + the PCCR registers. Some SoCs have multiple SerDes blocks and those diff= er in + their protocol capabilities per lane. + +properties: + compatible: + description: + There is intentionally no generic fsl,lynx-10g compatible string due= to + the hardware inability to report its capabilities, despite having a + common register map. + enum: + - fsl,ls1028a-serdes + - fsl,ls1046a-serdes1 + - fsl,ls1046a-serdes2 + - fsl,ls1088a-serdes1 + - fsl,ls1088a-serdes2 + - fsl,ls2088a-serdes1 + - fsl,ls2088a-serdes2 + + reg: + maxItems: 1 + + big-endian: true + + "#phy-cells": + const: 1 + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + +patternProperties: + "^phy@[0-7]$": + type: object + description: SerDes lane (single RX/TX differential pair) + + properties: + reg: + minimum: 0 + maximum: 7 + description: Lane index as seen in register map + + "#phy-cells": + const: 0 + + required: + - reg + - "#phy-cells" + + additionalProperties: false + +required: + - compatible + - reg + - "#phy-cells" + - "#address-cells" + - "#size-cells" + +allOf: + - if: + properties: + compatible: + contains: + enum: + - fsl,ls1028a-serdes + - fsl,ls1046a-serdes1 + - fsl,ls1046a-serdes2 + - fsl,ls1088a-serdes1 + - fsl,ls1088a-serdes2 + then: + patternProperties: + "^phy@[0-7]$": + properties: + reg: + minimum: 0 + maximum: 3 + +additionalProperties: false + +examples: + - | + soc { + #address-cells =3D <2>; + #size-cells =3D <2>; + + serdes@1ea0000 { + compatible =3D "fsl,ls1028a-serdes"; + reg =3D <0x0 0x1ea0000 0x0 0xffff>; + #address-cells =3D <1>; + #size-cells =3D <0>; + #phy-cells =3D <1>; + + phy@0 { + reg =3D <0>; + #phy-cells =3D <0>; + }; + + phy@1 { + reg =3D <1>; + #phy-cells =3D <0>; + }; + + phy@2 { + reg =3D <2>; + #phy-cells =3D <0>; + }; + + phy@3 { + reg =3D <3>; + #phy-cells =3D <0>; + }; + }; + }; --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazon11010014.outbound.protection.outlook.com [52.101.84.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E93DA387371; Fri, 29 May 2026 17:15:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.84.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074948; cv=fail; b=hpVjfDdfB3ox3ISZztDd3iaHtvK81hxbGi7DncyXHN9tFVrEhAgvHNwbJ/yK/ANmK3buA6ZHVp4sbh++/3Ep+DIqY7Fs8aKek/buv2E0YAOx2kfBoYvE+l1psuDLxJi2YVIAIKx9b57B1xifVC5Q+RwlOdHeIKF+kfLkLXe/a7o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074948; c=relaxed/simple; bh=LGlSMAIPuApvap4mWzJO2Kpx96dXw/c2WMWHbNVgwxw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=gRBU30VljUul0pPGWRzkWZLGqO4If9qJ4zffnuDscAPIg0gw8AUr36qvN9TZS85QyC1Q20Jyu1/3gdKNl+cXwVg0PF7GLNVhluSU5b+pBLKrta6UryidUgeGMlUXF2FfA0i4qhhBTHo3Pl1FVT6Ci9xs5UcV1EQzdw3j2JX70KU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=caqouXUW; arc=fail smtp.client-ip=52.101.84.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="caqouXUW" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KZSWqR/URxfJgZzP3dYvCunKN2z6bwZ99g4iGmbwC9KnlLFaZi1TqyByP5W53LB3kuZioz2akzE4cgCyvhMIGuHBNi/Uqjd6vkbrEcxXcUwiXKs1wKCrDbQNSGc84oVADu2OJQbgxdnCLlQ9CfnQg+MtKC2F6Bl0GohU6Yme4MLO2usUQA/rynqc8ze8w6l17XgM39Nh+1os0d3SBGiJgCrSG/9+TmV3cWKGZbc9TiCn50wkjq1a9Laki6eOixvK2+G7otATBPkYmanUeYrJILHHc/wOlktY9YFosUPHwkazESOTogbPd7RJWIskbZ5iz8nboz8q+fULa5Y3XrKGUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=MoAluK5JZHBXrCrPyggbFXvirJ3YgNA9ugB7sW6APE0=; b=odIdxISJjWnbE+UafWXnsnF4ANUQidG6QGIP3x9GSY1/tDT6e56KplfDw4zwe42egskYvaN8jtoSUqu4ni2/eKd80yaPwWkmU7g+nWjIJiTG0ATaPFSthSzo5u1fF8Y8Jw/K6Sp81P2wlSBqrIj2TzXqH17HhhFB0lCpUyNYNp1wTDzUnZ/dHYOzipMqoutVeJZTstQXyw8BYUdOg5E9iIlnFiWHzL2RpWdv4TmuhPPqhvFb97Xj311Y7dlBg9jeJJS8KXS69sWXgB0PhesP43JFPkguiXfbyJwg7PVtVMHQJqYrBEAYf7f9h4V9qfwUtkHqCT3pe77CTt4tMt0E0A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MoAluK5JZHBXrCrPyggbFXvirJ3YgNA9ugB7sW6APE0=; b=caqouXUWMGD52+OhBuzvmPXLEaDceJ8DpihqnaCfJD2ZxmRMKXK8PYUXx4z1bwMt9gyoNnDEdeMAqBpF9/4hbbpBFKkPBYsHX1hP4vJhY8vyK2Hd9p70WlKvwb9nSHSpdho9bX64DXVlCGoRYdOxZmB/4DKNnLWOfSPvct8gbbq33SNRy8hniQ6spooY/mCww1Teq9E4nX2uPUrYMdgF/9KEZdqVTq7rRA6nCuSgmnaeL3KVv2aAlj0jzmDiLyVUUKY0oV48usm4UsRa5fXs6Bbz8480my9VRhGRo+AkXMB2EXetHSi4sT87c1bQLK9OTm4cKFIe3wqYXNJkj+pjOQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:37 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:37 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Conor Dooley , Krzysztof Kozlowski , Rob Herring , linux-arm-kernel@lists.infradead.org, chleroy@kernel.org, linuxppc-dev@lists.ozlabs.org Subject: [PATCH v2 phy-next 14/15] phy: lynx-10g: new driver Date: Fri, 29 May 2026 20:15:08 +0300 Message-Id: <20260529171509.1163787-15-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0031.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::11) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: e7c6a849-cc4b-4c25-7de7-08debda5e6bc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|6133799003|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: uD4p6hg887fqL27T5e+BxkFdlQRbkvVbQ+4tjLIkV2d6sKap+/Imu0EMXOD0k2bS32Lb8hJvmJWpNEPp1WvDA2RPrjDTNrKwCQQnnjVEeRz8y3lJ2ERxmpyxl0xNUWtObX6Bzm/SGtCIfARGfSM2elrY+HeEzwgqJ6Q43zv460KJqcWP8TuRAxarZm6hW5DSrfq95io7RrEZLtSXgE3vjdXxwhW+as4TgI9o9OngGWgR/wQBM+7BRPb2OiktTeTzho5CcBM8+3G7gPH+NN6+4KBxnBi85IdUReps+l9/bnZ3uBC1qNrCOkDFTmMFWfRhAL3k7QHZ5ZhWM08ocqNidZDryRiciSQLanKTQu3ziVwLmUHSnz751c+WXM4XEJRDFGlQpQ0/VEilAVaK8o8O1ISm4APN+OzuxlXB4ZuPRAOCDcf1igS+hGBkuXVPhSzjrzKaTJZPrYvkMYXDKDxtiMcVrdAscPn9epPPy1TfdDLFBvZeR5fXUqQlH68SnIku6+qdx3+LMScOMIFN93cAuAdmxwgN4a+M8v0sDSdme+i7rb3jwU2uA0P5POUHPaiu5yFjGX9GiKgvTEb6F9KD7P3n2ZFwBynQEFCwbYHgL9WqRVI5mijA7ADAxUKlG0xTPZQFPg1otGjLdmWJZUZvizfTaYoMdIuIhwAgMrHvsLWjHegatY3owY3CKAPEplgh X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(6133799003)(56012099006)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?GWp7aJKwrEjYZdyfXpuUaHrkpFSz7vtFio3FnX8DIGOCC2a7IDU0Dn8EKeNP?= =?us-ascii?Q?iqTUgTynEMiCoL1QXwAk86X+l+/7DAaEE8oXLooRrmTfnHIR5Q6StAaGrbAx?= =?us-ascii?Q?eqTQMLritQNPeIZhB2dXdYt2C9W+V5H5UvxTwpn0S1IzNFM0C1AxnHBKoY9s?= =?us-ascii?Q?qFk0bXPoY+IQLnIosBO3PgeELoOC/LdG6R5LdSvZ2HGysBXkPiUswAQ8MgTb?= =?us-ascii?Q?PK9LQMM65j8ef75y8rzdugyibOcoOA5AZD5yNyJeRdHNL/wGp8gc5QtcgU29?= =?us-ascii?Q?bknqlcimlgLeps9dZRyWlzafcqWp44kIrvkFLta8O8gWKm4cHFXAGjoPoGLH?= =?us-ascii?Q?qTRif7nVz0CDMkkpjz0YgHUJEkZJfuZAt5erzUnNfS3/s0ovTBruV+6tW2vj?= =?us-ascii?Q?ghsouVdEedM1JyvW3DoP6PGUMClYP59tH/FqXngKSDBMfySZsAjzVLvo231h?= =?us-ascii?Q?dXuUAZGEgBy/HdfdNg0g8aDhx6mo3r3MQVJ0b6pb82tI6YCxJtVTXEshDMv0?= =?us-ascii?Q?TFNdqxv8UG3tMfGee1e69bUW6RC34QvaL9b/sC1+xuu7BKT51fkhUPPxhyxp?= =?us-ascii?Q?wCxrhP5zwdDcPIyeVMlm9kudHMH87amUldy9kEjnCTdaCUljpyTvIOahVvda?= =?us-ascii?Q?ydcJ/7QqGkAKnumT25giP/N3f4kXTqtFDylIifTgcnml/A1fUEj2Ln0Wtzra?= =?us-ascii?Q?BgH7VqWIqmaIv5FKOilfjUqMl4C6zzLgmM9zqQYyHQ2j3xj4A32Z9DmxdWL1?= =?us-ascii?Q?3dHJz+JbaSXjSUGWsQ0/VZ0m8fD7s/jO8ArloAb9FGckdYMLOH+qyZW9jZ9R?= =?us-ascii?Q?mUnmiBn+l6W5xi0v1e3EeG0PXN3KSF4Wx6zYZ1CHg+MDdW1eXdrYpNgd3NE9?= =?us-ascii?Q?vWqM/qzrjSqbnBJk+aDtcJxYNKfgOG3K+RmyZsDO6HrgaQJNkums1239nYbA?= =?us-ascii?Q?fwcvD6gfkQUyhbKJhzF+PcZFF8YN1FAcEbG1DnBCOny7iu6IjrBC9Q2+PGVQ?= =?us-ascii?Q?jfUJOqeiMiTrV45WTkI6b0HWrEkxdcVweDt2k45FjdyysHhu1ZYp9U817sNL?= =?us-ascii?Q?SPqsB/bCTB/R32noi6IUSAqVt76Yh/WuOsAhdyTy08avxGuN1IGPWdLwVsHx?= =?us-ascii?Q?37jxBYaXI1+nFU+c0dFzFQDJPisACpFpxrXgVoJ8pUlizYO9QYPHTfWsnq8A?= =?us-ascii?Q?AMk5/6IwJL2pdjcDRgvip4jXYYaskSjQwcZZdXwwzCePt/OIJTDnR0bm1zG9?= =?us-ascii?Q?nYJxvs+wFJvsEpSMS/KJ38vy/KLT6AdSzyg+NKjetJ7sL7EkQU58XfEBRPyl?= =?us-ascii?Q?U/wqZWDHEsPcQcUgks6TmpkJcBiTvYZmdy1NFHMT8OBQoRjPnvgwWmBE0o87?= =?us-ascii?Q?aChZUuXmq7aAbtNJgfvrTGX9JDXXNplWaGDZhL2rTHYKZ+51OdjL+mTvD3az?= =?us-ascii?Q?PZLjXykOpMoBk66BVp7ImvrpH3kT3XRYHMXy7lsiFdUELL7PBn4Fz1BCHXg4?= =?us-ascii?Q?AXi96abYhBvCdm1hvwt/1evfg6Vfa8CuYyV7/kDODoWddqzbppHSMAWKNvJM?= =?us-ascii?Q?wVJY3xDWAHIcD7/mRphSzn+VMlkUYY9LvUkdiO9wPgoMhJfkOg3UQbehIrZS?= =?us-ascii?Q?mODCt5G4VDXkAor/mjQTk3zy4iAwgle80Oc9TfAnH9Sw2x9r75L67tQTYqtz?= =?us-ascii?Q?Jy8dTLYzap5aKd6LHEddYeAAGa64Ft6/3FInssti1L+rhdFxLm8Xf9JUAo1W?= =?us-ascii?Q?uZ6l/km8kKROIngJCQtrSJ/ReBTR+daFTpH0dBYBiZLTBZRIb/Ul?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: e7c6a849-cc4b-4c25-7de7-08debda5e6bc X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:37.3607 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: R5de83tyAaZXgWb/ke5yDXgCLGlwK8CcI9SbIQTAUl4pZNH+KgkKWq1wj6HfdKlVEwbS7z6JCN7HpTN6csbS9w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" Introduce a driver for the networking lanes of the 10G Lynx SerDes block, present on the majority of Layerscape and QorIQ (Freescale/NXP) SoCs. As with the 28G Lynx, the SerDes lanes come pre-initialized out of reset and the consumers use them that way outside the Generic PHY framework (for networking, the static configuration remains for the entire SoC lifetime, whereas for SATA and PCIe, the hardware reconfigures itself automatically for other link speeds). The need for the Generic PHY framework comes specifically for networking use cases where a static lane configuration is not sufficient. For example a network MAC is connected to an SFP cage, where various SFP or SFP+ modules can be connected. Each of them may require a different SerDes protocol (SGMII, 1000Base-X, 10GBase-R), which phylink + sfp-bus are responsible of figuring out. The phylink drivers are: - enetc - felix - dpaa_eth (fman_memac) - dpaa2-eth - dpaa2-switch and they all need to reconfigure the SerDes for the requested link mode, using phy_set_mode_ext() (and phy_validate() to see if it is supported in the first place). Note that SerDes 2 on LS1088A is exclusively non-networking, so there is currently no need for this driver. Therefore we skip matching on its compatible string and do not probe on that device. Co-developed-by: Ioana Ciornei Signed-off-by: Ioana Ciornei Signed-off-by: Vladimir Oltean --- Cc: devicetree@vger.kernel.org Cc: Conor Dooley Cc: Krzysztof Kozlowski Cc: Rob Herring Cc: linux-arm-kernel@lists.infradead.org Cc: chleroy@kernel.org Cc: linuxppc-dev@lists.ozlabs.org v1->v2: - move lynx_lane_restrict_fixed_mode_change() to lynx-core, even though the 28G Lynx as instantiated in LX2 does not have QSGMII. - lynx_10g_validate() now calls the new lynx_phy_mode_to_lane_mode() which does verify that the current lane mode is supported - avoid line size checkpatch warnings in lynx_10g_lane_set_nrate() by saving the nrate to a variable and calling lynx_lane_rmw() only once - remove redundant "if (!lane->powered_up)" checks from lynx_10g_lane_halt() and lynx_10g_lane_reset() - also checked at the only call site, lynx_10g_set_mode(), as in lynx-28g - expand CC list (flagged by Patchwork) --- drivers/phy/freescale/Kconfig | 10 + drivers/phy/freescale/Makefile | 1 + drivers/phy/freescale/phy-fsl-lynx-10g.c | 1280 +++++++++++++++++++++ drivers/phy/freescale/phy-fsl-lynx-core.c | 38 + drivers/phy/freescale/phy-fsl-lynx-core.h | 4 + include/soc/fsl/phy-fsl-lynx.h | 27 + 6 files changed, 1360 insertions(+) create mode 100644 drivers/phy/freescale/phy-fsl-lynx-10g.c diff --git a/drivers/phy/freescale/Kconfig b/drivers/phy/freescale/Kconfig index a87429f634ea..4368eb1668fb 100644 --- a/drivers/phy/freescale/Kconfig +++ b/drivers/phy/freescale/Kconfig @@ -57,6 +57,16 @@ config PHY_FSL_LYNX_CORE Enable this to add common support code for NXP Lynx 10G and Lynx 28G SerDes blocks. =20 +config PHY_FSL_LYNX_10G + tristate "Freescale Layerscape Lynx 10G SerDes PHY support" + depends on OF + depends on ARCH_LAYERSCAPE || COMPILE_TEST + select GENERIC_PHY + select PHY_FSL_LYNX_CORE + help + Enable this to add support for the Lynx 10G SerDes PHY as found on + NXP's Layerscape platform such as LS1088A or LS1028A. + config PHY_FSL_LYNX_28G tristate "Freescale Layerscape Lynx 28G SerDes PHY support" depends on OF diff --git a/drivers/phy/freescale/Makefile b/drivers/phy/freescale/Makefile index d7aa62cdeb39..5b0e180d6972 100644 --- a/drivers/phy/freescale/Makefile +++ b/drivers/phy/freescale/Makefile @@ -5,5 +5,6 @@ obj-$(CONFIG_PHY_MIXEL_MIPI_DPHY) +=3D phy-fsl-imx8-mipi-dp= hy.o obj-$(CONFIG_PHY_FSL_IMX8M_PCIE) +=3D phy-fsl-imx8m-pcie.o obj-$(CONFIG_PHY_FSL_IMX8QM_HSIO) +=3D phy-fsl-imx8qm-hsio.o obj-$(CONFIG_PHY_FSL_LYNX_CORE) +=3D phy-fsl-lynx-core.o +obj-$(CONFIG_PHY_FSL_LYNX_10G) +=3D phy-fsl-lynx-10g.o obj-$(CONFIG_PHY_FSL_LYNX_28G) +=3D phy-fsl-lynx-28g.o obj-$(CONFIG_PHY_FSL_SAMSUNG_HDMI_PHY) +=3D phy-fsl-samsung-hdmi.o diff --git a/drivers/phy/freescale/phy-fsl-lynx-10g.c b/drivers/phy/freesca= le/phy-fsl-lynx-10g.c new file mode 100644 index 000000000000..9b04d6a4b825 --- /dev/null +++ b/drivers/phy/freescale/phy-fsl-lynx-10g.c @@ -0,0 +1,1280 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* Copyright 2021-2026 NXP */ + +#include +#include +#include +#include +#include +#include +#include + +#include "phy-fsl-lynx-core.h" + +/* SoC IP wrapper for protocol converters */ +#define PCCR8 0x220 +#define PCCR8_SGMIIa_KX BIT(3) +#define PCCR8_SGMIIa_CFG BIT(0) + +#define PCCR9 0x224 +#define PCCR9_QSGMIIa_CFG BIT(0) +#define PCCR9_QXGMIIa_CFG BIT(0) + +#define PCCRB 0x22c +#define PCCRB_XFIa_CFG BIT(0) +#define PCCRB_SXGMIIa_CFG BIT(0) + +#define SGMII_CFG(id) (28 - (id) * 4) +#define QSGMII_CFG(id) (28 - (id) * 4) +#define SXGMII_CFG(id) (28 - (id) * 4) +#define QXGMII_CFG(id) (12 - (id) * 4) +#define XFI_CFG(id) (28 - (id) * 4) + +#define CR(x) ((x) * 4) + +#define A 0 +#define B 1 +#define C 2 +#define D 3 +#define E 4 +#define F 5 +#define G 6 +#define H 7 + +#define SGMIIaCR0(id) (0x1800 + (id) * 0x10) +#define QSGMIIaCR0(id) (0x1880 + (id) * 0x10) +#define XAUIaCR0(id) (0x1900 + (id) * 0x10) +#define XFIaCR0(id) (0x1980 + (id) * 0x10) +#define SXGMIIaCR0(id) (0x1a80 + (id) * 0x10) +#define QXGMIIaCR0(id) (0x1b00 + (id) * 0x20) + +#define SGMIIaCR0_RST_SGM BIT(31) +#define SGMIIaCR0_RST_SGM_OFF SGMIIaCR0_RST_SGM +#define SGMIIaCR0_RST_SGM_ON 0 +#define SGMIIaCR0_PD_SGM BIT(30) +#define SGMIIaCR1_SGPCS_EN BIT(11) +#define SGMIIaCR1_SGPCS_DIS 0x0 + +#define QSGMIIaCR0_RST_QSGM BIT(31) +#define QSGMIIaCR0_RST_QSGM_OFF QSGMIIaCR0_RST_QSGM +#define QSGMIIaCR0_RST_QSGM_ON 0 +#define QSGMIIaCR0_PD_QSGM BIT(30) + +/* Per PLL registers */ +#define PLLnCR0(pll) ((pll) * 0x20 + 0x4) + +#define PLLnCR0_POFF BIT(31) + +#define PLLnCR0_REFCLK_SEL GENMASK(30, 28) +#define PLLnCR0_REFCLK_SEL_100MHZ 0x0 +#define PLLnCR0_REFCLK_SEL_125MHZ 0x1 +#define PLLnCR0_REFCLK_SEL_156MHZ 0x2 +#define PLLnCR0_REFCLK_SEL_150MHZ 0x3 +#define PLLnCR0_REFCLK_SEL_161MHZ 0x4 +#define PLLnCR0_PLL_LCK BIT(23) +#define PLLnCR0_FRATE_SEL GENMASK(19, 16) +#define PLLnCR0_FRATE_5G 0x0 +#define PLLnCR0_FRATE_5_15625G 0x6 +#define PLLnCR0_FRATE_4G 0x7 +#define PLLnCR0_FRATE_3_125G 0x9 +#define PLLnCR0_FRATE_3G 0xa + +/* Per SerDes lane registers */ + +/* Lane a Protocol Select status register */ +#define LNaPSSR0(lane) (0x100 + (lane) * 0x20) +#define LNaPSSR0_TYPE GENMASK(30, 26) +#define LNaPSSR0_IS_QUAD GENMASK(25, 24) +#define LNaPSSR0_MAC GENMASK(19, 16) +#define LNaPSSR0_PCS GENMASK(10, 8) +#define LNaPSSR0_LANE GENMASK(2, 0) + +/* Lane a General Control Register */ +#define LNaGCR0(lane) (0x800 + (lane) * 0x40 + 0x0) +#define LNaGCR0_RPLL_PLLF BIT(31) +#define LNaGCR0_RPLL_PLLS 0x0 +#define LNaGCR0_RPLL_MSK BIT(31) +#define LNaGCR0_RRAT_SEL GENMASK(29, 28) +#define LNaGCR0_TRAT_SEL GENMASK(25, 24) +#define LNaGCR0_TPLL_PLLF BIT(27) +#define LNaGCR0_TPLL_PLLS 0x0 +#define LNaGCR0_TPLL_MSK BIT(27) +#define LNaGCR0_RRST_OFF LNaGCR0_RRST +#define LNaGCR0_TRST_OFF LNaGCR0_TRST +#define LNaGCR0_RRST_ON 0x0 +#define LNaGCR0_TRST_ON 0x0 +#define LNaGCR0_RRST BIT(22) +#define LNaGCR0_TRST BIT(21) +#define LNaGCR0_RX_PD BIT(20) +#define LNaGCR0_TX_PD BIT(19) +#define LNaGCR0_IF20BIT_EN BIT(18) +#define LNaGCR0_PROTS GENMASK(11, 7) + +#define LNaGCR1(lane) (0x800 + (lane) * 0x40 + 0x4) +#define LNaGCR1_RDAT_INV BIT(31) +#define LNaGCR1_TDAT_INV BIT(30) +#define LNaGCR1_OPAD_CTL BIT(26) +#define LNaGCR1_REIDL_TH GENMASK(22, 20) +#define LNaGCR1_REIDL_EX_SEL GENMASK(19, 18) +#define LNaGCR1_REIDL_ET_SEL GENMASK(17, 16) +#define LNaGCR1_REIDL_EX_MSB BIT(15) +#define LNaGCR1_REIDL_ET_MSB BIT(14) +#define LNaGCR1_REQ_CTL_SNP BIT(13) +#define LNaGCR1_REQ_CDR_SNP BIT(12) +#define LNaGCR1_TRSTDIR BIT(7) +#define LNaGCR1_REQ_BIN_SNP BIT(6) +#define LNaGCR1_ISLEW_RCTL GENMASK(5, 4) +#define LNaGCR1_OSLEW_RCTL GENMASK(1, 0) + +#define LNaRECR0(lane) (0x800 + (lane) * 0x40 + 0x10) +#define LNaRECR0_RXEQ_BST BIT(28) +#define LNaRECR0_GK2OVD GENMASK(27, 24) +#define LNaRECR0_GK3OVD GENMASK(19, 16) +#define LNaRECR0_GK2OVD_EN BIT(15) +#define LNaRECR0_GK3OVD_EN BIT(14) +#define LNaRECR0_OSETOVD_EN BIT(13) +#define LNaRECR0_BASE_WAND GENMASK(11, 10) +#define LNaRECR0_OSETOVD GENMASK(6, 0) + +#define LNaTECR0(lane) (0x800 + (lane) * 0x40 + 0x18) +#define LNaTECR0_TEQ_TYPE GENMASK(29, 28) +#define LNaTECR0_SGN_PREQ BIT(26) +#define LNaTECR0_RATIO_PREQ GENMASK(25, 22) +#define LNaTECR0_SGN_POST1Q BIT(21) +#define LNaTECR0_RATIO_PST1Q GENMASK(20, 16) +#define LNaTECR0_ADPT_EQ GENMASK(13, 8) +#define LNaTECR0_AMP_RED GENMASK(5, 0) + +#define LNaTTLCR0(lane) (0x800 + (lane) * 0x40 + 0x20) +#define LNaTTLCR1(lane) (0x800 + (lane) * 0x40 + 0x24) +#define LNaTTLCR2(lane) (0x800 + (lane) * 0x40 + 0x28) + +#define LNaTCSR3(lane) (0x800 + (lane) * 0x40 + 0x3C) +#define LNaTCSR3_CDR_LCK BIT(27) + +enum lynx_10g_rat_sel { + RAT_SEL_FULL =3D 0x0, + RAT_SEL_HALF =3D 0x1, + RAT_SEL_QUARTER =3D 0x2, + RAT_SEL_DOUBLE =3D 0x3, +}; + +enum lynx_10g_eq_type { + EQ_TYPE_NO_EQ =3D 0, + EQ_TYPE_2TAP =3D 1, + EQ_TYPE_3TAP =3D 2, +}; + +enum lynx_10g_proto_sel { + PROTO_SEL_PCIE =3D 0, + PROTO_SEL_SGMII_BASEX_KX_QSGMII =3D 1, + PROTO_SEL_SATA =3D 2, + PROTO_SEL_XAUI =3D 4, + PROTO_SEL_XFI_10GBASER_KR_SXGMII =3D 0xa, +}; + +struct lynx_10g_proto_conf { + int proto_sel; + int if20bit_en; + int reidl_th; + int reidl_et_msb; + int reidl_et_sel; + int reidl_ex_msb; + int reidl_ex_sel; + int islew_rctl; + int oslew_rctl; + int rxeq_bst; + int gk2ovd; + int gk3ovd; + int gk2ovd_en; + int gk3ovd_en; + int base_wand; + int teq_type; + int sgn_preq; + int ratio_preq; + int sgn_post1q; + int ratio_post1q; + int adpt_eq; + int amp_red; + int ttlcr0; +}; + +static const struct lynx_10g_proto_conf lynx_10g_proto_conf[LANE_MODE_MAX]= =3D { + [LANE_MODE_1000BASEX_SGMII] =3D { + .proto_sel =3D PROTO_SEL_SGMII_BASEX_KX_QSGMII, + .reidl_th =3D 1, + .reidl_ex_sel =3D 3, + .reidl_et_msb =3D 1, + .islew_rctl =3D 1, + .oslew_rctl =3D 1, + .gk2ovd =3D 15, + .gk3ovd =3D 15, + .gk2ovd_en =3D 1, + .gk3ovd_en =3D 1, + .teq_type =3D EQ_TYPE_NO_EQ, + .adpt_eq =3D 48, + .amp_red =3D 6, + .ttlcr0 =3D 0x39000400, + }, + [LANE_MODE_2500BASEX] =3D { + .proto_sel =3D PROTO_SEL_SGMII_BASEX_KX_QSGMII, + .islew_rctl =3D 2, + .oslew_rctl =3D 2, + .teq_type =3D EQ_TYPE_2TAP, + .sgn_post1q =3D 1, + .ratio_post1q =3D 6, + .adpt_eq =3D 48, + .ttlcr0 =3D 0x00000400, + }, + [LANE_MODE_QSGMII] =3D { + .proto_sel =3D PROTO_SEL_SGMII_BASEX_KX_QSGMII, + .islew_rctl =3D 1, + .oslew_rctl =3D 1, + .teq_type =3D EQ_TYPE_2TAP, + .sgn_post1q =3D 1, + .ratio_post1q =3D 6, + .adpt_eq =3D 48, + .amp_red =3D 2, + .ttlcr0 =3D 0x00000400, + }, + [LANE_MODE_10G_QXGMII] =3D { + .proto_sel =3D PROTO_SEL_XFI_10GBASER_KR_SXGMII, + .if20bit_en =3D 1, + .islew_rctl =3D 1, + .oslew_rctl =3D 1, + .base_wand =3D 1, + .teq_type =3D EQ_TYPE_NO_EQ, + .adpt_eq =3D 48, + .ttlcr0 =3D 0x00000400, + }, + [LANE_MODE_USXGMII] =3D { + .proto_sel =3D PROTO_SEL_XFI_10GBASER_KR_SXGMII, + .if20bit_en =3D 1, + .islew_rctl =3D 1, + .oslew_rctl =3D 1, + .base_wand =3D 1, + .teq_type =3D EQ_TYPE_NO_EQ, + .sgn_post1q =3D 1, + .adpt_eq =3D 48, + .ttlcr0 =3D 0x00000400, + }, + [LANE_MODE_10GBASER] =3D { + .proto_sel =3D PROTO_SEL_XFI_10GBASER_KR_SXGMII, + .if20bit_en =3D 1, + .islew_rctl =3D 2, + .oslew_rctl =3D 2, + .rxeq_bst =3D 1, + .base_wand =3D 1, + .teq_type =3D EQ_TYPE_2TAP, + .sgn_post1q =3D 1, + .ratio_post1q =3D 3, + .adpt_eq =3D 48, + .amp_red =3D 7, + .ttlcr0 =3D 0x00000400, + }, +}; + +static void lynx_10g_cdr_lock_check(struct lynx_lane *lane) +{ + u32 tcsr3 =3D lynx_lane_read(lane, LNaTCSR3); + + if (tcsr3 & LNaTCSR3_CDR_LCK) + return; + + dev_dbg(&lane->phy->dev, + "Lane %c CDR unlocked, resetting receiver...\n", + 'A' + lane->id); + + lynx_lane_rmw(lane, LNaGCR0, LNaGCR0_RRST_ON, LNaGCR0_RRST); + usleep_range(1, 2); + lynx_lane_rmw(lane, LNaGCR0, LNaGCR0_RRST_OFF, LNaGCR0_RRST); + + usleep_range(1, 2); +} + +static void lynx_10g_pll_read_configuration(struct lynx_pll *pll) +{ + u32 val; + + val =3D lynx_pll_read(pll, PLLnCR0); + pll->frate_sel =3D FIELD_GET(PLLnCR0_FRATE_SEL, val); + pll->refclk_sel =3D FIELD_GET(PLLnCR0_REFCLK_SEL, val); + pll->enabled =3D !(val & PLLnCR0_POFF); + pll->locked =3D !!(val & PLLnCR0_PLL_LCK); + + if (!pll->enabled) + return; + + switch (pll->frate_sel) { + case PLLnCR0_FRATE_5G: + /* 5GHz clock net */ + __set_bit(LANE_MODE_1000BASEX_SGMII, pll->supported); + __set_bit(LANE_MODE_QSGMII, pll->supported); + break; + case PLLnCR0_FRATE_3_125G: + __set_bit(LANE_MODE_2500BASEX, pll->supported); + break; + case PLLnCR0_FRATE_5_15625G: + /* 10.3125GHz clock net */ + __set_bit(LANE_MODE_10GBASER, pll->supported); + __set_bit(LANE_MODE_USXGMII, pll->supported); + __set_bit(LANE_MODE_10G_QXGMII, pll->supported); + break; + default: + break; + } +} + +/* On LS1028A, SGMIIA_CFG, SGMIIB_CFG, and SGMIIC_CFG from PCCR8 have the + * ability to map either an ENETC PCS or a Felix switch PCS to the same la= ne. + * The PHY API lacks the capability to distinguish between one consumer and + * another, so we don't support changing the initial muxing done by the RC= W. + * However, when disabling a PCS through PCCR8, we need to properly restore + * the original value to keep the same muxing, and for that we need to back + * it up (here). + */ +static void lynx_10g_backup_pccr_val(struct lynx_lane *lane) +{ + u32 val; + int err; + + if (lane->mode =3D=3D LANE_MODE_UNKNOWN) + return; + + err =3D lynx_pccr_read(lane, lane->mode, &val); + if (err) { + dev_warn(&lane->phy->dev, + "The driver doesn't know how to access the PCCR for lane mode %s\n", + lynx_lane_mode_str(lane->mode)); + lane->mode =3D LANE_MODE_UNKNOWN; + return; + } + + lane->default_pccr[lane->mode] =3D val; + + switch (lane->mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + lane->default_pccr[LANE_MODE_1000BASEX_SGMII] =3D val & ~PCCR8_SGMIIa_KX; + lane->default_pccr[LANE_MODE_2500BASEX] =3D val & ~PCCR8_SGMIIa_KX; + break; + default: + break; + } +} + +static bool lynx_10g_lane_is_3_125g(struct lynx_lane *lane) +{ + struct lynx_priv *priv =3D lane->priv; + struct lynx_pll *pll; + u32 gcr0; + + gcr0 =3D lynx_lane_read(lane, LNaGCR0); + + if (gcr0 & LNaGCR0_TPLL_PLLF) + pll =3D &priv->pll[0]; + else + pll =3D &priv->pll[1]; + + if (pll->frate_sel !=3D PLLnCR0_FRATE_3_125G) + return false; + + if (FIELD_GET(LNaGCR0_TRAT_SEL, gcr0) !=3D RAT_SEL_FULL || + FIELD_GET(LNaGCR0_RRAT_SEL, gcr0) !=3D RAT_SEL_FULL) + return false; + + return true; +} + +static void lynx_10g_lane_read_configuration(struct lynx_lane *lane) +{ + u32 pssr0 =3D lynx_lane_read(lane, LNaPSSR0); + struct lynx_priv *priv =3D lane->priv; + int proto; + + proto =3D FIELD_GET(LNaPSSR0_TYPE, pssr0); + switch (proto) { + case PROTO_SEL_SGMII_BASEX_KX_QSGMII: + if (lynx_10g_lane_is_3_125g(lane)) + lane->mode =3D LANE_MODE_2500BASEX; + else if (FIELD_GET(LNaPSSR0_IS_QUAD, pssr0)) + lane->mode =3D LANE_MODE_QSGMII; + else + lane->mode =3D LANE_MODE_1000BASEX_SGMII; + break; + case PROTO_SEL_XFI_10GBASER_KR_SXGMII: + if (FIELD_GET(LNaPSSR0_IS_QUAD, pssr0)) + lane->mode =3D LANE_MODE_10G_QXGMII; + else if (priv->info->quirks & LYNX_QUIRK_HAS_HARDCODED_USXGMII) + lane->mode =3D LANE_MODE_USXGMII; + else + lane->mode =3D LANE_MODE_10GBASER; + break; + case PROTO_SEL_PCIE: + case PROTO_SEL_SATA: + case PROTO_SEL_XAUI: + break; + default: + dev_warn(&lane->phy->dev, "Unknown lane protocol 0x%x\n", + proto); + } + + lynx_10g_backup_pccr_val(lane); +} + +static int ls1028a_get_pccr(enum lynx_lane_mode lane_mode, int lane, + struct lynx_pccr *pccr) +{ + switch (lane_mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + pccr->offset =3D PCCR8; + pccr->width =3D 4; + pccr->shift =3D SGMII_CFG(lane); + break; + case LANE_MODE_QSGMII: + if (lane !=3D 1) + return -EINVAL; + + pccr->offset =3D PCCR9; + pccr->width =3D 3; + pccr->shift =3D QSGMII_CFG(A); + break; + case LANE_MODE_10G_QXGMII: + if (lane !=3D 1) + return -EINVAL; + + pccr->offset =3D PCCR9; + pccr->width =3D 3; + pccr->shift =3D QXGMII_CFG(A); + break; + case LANE_MODE_USXGMII: + if (lane !=3D 0) + return -EINVAL; + + pccr->offset =3D PCCRB; + pccr->width =3D 3; + pccr->shift =3D SXGMII_CFG(A); + break; + default: + return -EINVAL; + } + + return 0; +} + +static int ls1028a_get_pcvt_offset(int lane, enum lynx_lane_mode mode) +{ + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + return SGMIIaCR0(lane); + case LANE_MODE_QSGMII: + return lane =3D=3D 1 ? QSGMIIaCR0(A) : -EINVAL; + case LANE_MODE_USXGMII: + return lane =3D=3D 0 ? SXGMIIaCR0(A) : -EINVAL; + case LANE_MODE_10G_QXGMII: + return lane =3D=3D 1 ? QXGMIIaCR0(A) : -EINVAL; + default: + return -EINVAL; + } +} + +static const struct lynx_info lynx_info_ls1028a =3D { + .get_pccr =3D ls1028a_get_pccr, + .get_pcvt_offset =3D ls1028a_get_pcvt_offset, + .pll_read_configuration =3D lynx_10g_pll_read_configuration, + .lane_read_configuration =3D lynx_10g_lane_read_configuration, + .cdr_lock_check =3D lynx_10g_cdr_lock_check, + .num_lanes =3D 4, + .index =3D 1, + .quirks =3D LYNX_QUIRK_HAS_HARDCODED_USXGMII, +}; + +static int ls1046a_serdes1_get_pccr(enum lynx_lane_mode lane_mode, int lan= e, + struct lynx_pccr *pccr) +{ + switch (lane_mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + pccr->offset =3D PCCR8; + pccr->width =3D 4; + pccr->shift =3D SGMII_CFG(lane); + break; + case LANE_MODE_QSGMII: + if (lane !=3D 1) + return -EINVAL; + + pccr->offset =3D PCCR9; + pccr->width =3D 3; + pccr->shift =3D QSGMII_CFG(B); + break; + case LANE_MODE_10GBASER: + switch (lane) { + case 2: + pccr->shift =3D XFI_CFG(A); + break; + case 3: + pccr->shift =3D XFI_CFG(B); + break; + default: + return -EINVAL; + } + + pccr->offset =3D PCCRB; + pccr->width =3D 3; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int ls1046a_serdes1_get_pcvt_offset(int lane, enum lynx_lane_mode m= ode) +{ + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + return SGMIIaCR0(lane); + case LANE_MODE_QSGMII: + if (lane !=3D 1) + return -EINVAL; + + return QSGMIIaCR0(B); + case LANE_MODE_10GBASER: + switch (lane) { + case 2: + return XFIaCR0(A); + case 3: + return XFIaCR0(B); + default: + return -EINVAL; + } + default: + return -EINVAL; + } +} + +static const struct lynx_info lynx_info_ls1046a_serdes1 =3D { + .get_pccr =3D ls1046a_serdes1_get_pccr, + .get_pcvt_offset =3D ls1046a_serdes1_get_pcvt_offset, + .pll_read_configuration =3D lynx_10g_pll_read_configuration, + .lane_read_configuration =3D lynx_10g_lane_read_configuration, + .cdr_lock_check =3D lynx_10g_cdr_lock_check, + .num_lanes =3D 4, + .index =3D 1, +}; + +static int ls1046a_serdes2_get_pccr(enum lynx_lane_mode lane_mode, int lan= e, + struct lynx_pccr *pccr) +{ + switch (lane_mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + if (lane !=3D 1) + return -EINVAL; + + pccr->offset =3D PCCR8; + pccr->width =3D 4; + pccr->shift =3D SGMII_CFG(B); + break; + default: + return -EINVAL; + } + + return 0; +} + +static int ls1046a_serdes2_get_pcvt_offset(int lane, enum lynx_lane_mode m= ode) +{ + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + if (lane !=3D 1) + return -EINVAL; + + return SGMIIaCR0(B); + default: + return -EINVAL; + } +} + +static const struct lynx_info lynx_info_ls1046a_serdes2 =3D { + .get_pccr =3D ls1046a_serdes2_get_pccr, + .get_pcvt_offset =3D ls1046a_serdes2_get_pcvt_offset, + .pll_read_configuration =3D lynx_10g_pll_read_configuration, + .lane_read_configuration =3D lynx_10g_lane_read_configuration, + .cdr_lock_check =3D lynx_10g_cdr_lock_check, + .num_lanes =3D 4, + .index =3D 2, +}; + +static int ls1088a_serdes1_get_pccr(enum lynx_lane_mode lane_mode, int lan= e, + struct lynx_pccr *pccr) +{ + switch (lane_mode) { + case LANE_MODE_1000BASEX_SGMII: + pccr->offset =3D PCCR8; + pccr->width =3D 4; + pccr->shift =3D SGMII_CFG(lane); + break; + case LANE_MODE_QSGMII: + switch (lane) { + case 0: + pccr->shift =3D QSGMII_CFG(A); + break; + case 1: + case 3: + pccr->shift =3D QSGMII_CFG(B); + break; + default: + return -EINVAL; + } + + pccr->offset =3D PCCR9; + pccr->width =3D 3; + break; + case LANE_MODE_10GBASER: + switch (lane) { + case 2: + pccr->shift =3D XFI_CFG(A); + break; + case 3: + pccr->shift =3D XFI_CFG(B); + break; + default: + return -EINVAL; + } + + pccr->offset =3D PCCRB; + pccr->width =3D 3; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int ls1088a_serdes1_get_pcvt_offset(int lane, enum lynx_lane_mode m= ode) +{ + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + return SGMIIaCR0(lane); + case LANE_MODE_QSGMII: + switch (lane) { + case 0: + return QSGMIIaCR0(A); + case 1: + case 3: + return QSGMIIaCR0(B); + default: + return -EINVAL; + } + case LANE_MODE_10GBASER: + switch (lane) { + case 2: + return XFIaCR0(A); + case 3: + return XFIaCR0(B); + default: + return -EINVAL; + } + default: + return -EINVAL; + } +} + +static const struct lynx_info lynx_info_ls1088a_serdes1 =3D { + .get_pccr =3D ls1088a_serdes1_get_pccr, + .get_pcvt_offset =3D ls1088a_serdes1_get_pcvt_offset, + .pll_read_configuration =3D lynx_10g_pll_read_configuration, + .lane_read_configuration =3D lynx_10g_lane_read_configuration, + .cdr_lock_check =3D lynx_10g_cdr_lock_check, + .num_lanes =3D 4, + .index =3D 1, +}; + +static int ls2088a_serdes1_get_pccr(enum lynx_lane_mode lane_mode, int lan= e, + struct lynx_pccr *pccr) +{ + switch (lane_mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + pccr->offset =3D PCCR8; + pccr->width =3D 4; + pccr->shift =3D SGMII_CFG(lane); + break; + case LANE_MODE_QSGMII: + switch (lane) { + case 2: + case 6: + pccr->shift =3D QSGMII_CFG(A); + break; + case 7: + pccr->shift =3D QSGMII_CFG(B); + break; + case 0: + case 4: + pccr->shift =3D QSGMII_CFG(C); + break; + case 1: + case 5: + pccr->shift =3D QSGMII_CFG(D); + break; + default: + return -EINVAL; + } + + pccr->offset =3D PCCR9; + pccr->width =3D 3; + break; + case LANE_MODE_10GBASER: + pccr->offset =3D PCCRB; + pccr->width =3D 3; + pccr->shift =3D XFI_CFG(lane); + break; + default: + return -EINVAL; + } + + return 0; +} + +static int ls2088a_serdes1_get_pcvt_offset(int lane, enum lynx_lane_mode m= ode) +{ + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + return SGMIIaCR0(lane); + case LANE_MODE_QSGMII: + switch (lane) { + case 2: + case 6: + return QSGMIIaCR0(A); + case 7: + return QSGMIIaCR0(B); + case 0: + case 4: + return QSGMIIaCR0(C); + case 1: + case 5: + return QSGMIIaCR0(D); + default: + return -EINVAL; + } + case LANE_MODE_10GBASER: + return XFIaCR0(lane); + default: + return -EINVAL; + } +} + +static const struct lynx_info lynx_info_ls2088a_serdes1 =3D { + .get_pccr =3D ls2088a_serdes1_get_pccr, + .get_pcvt_offset =3D ls2088a_serdes1_get_pcvt_offset, + .pll_read_configuration =3D lynx_10g_pll_read_configuration, + .lane_read_configuration =3D lynx_10g_lane_read_configuration, + .cdr_lock_check =3D lynx_10g_cdr_lock_check, + .num_lanes =3D 8, + .index =3D 1, +}; + +static int ls2088a_serdes2_get_pccr(enum lynx_lane_mode lane_mode, int lan= e, + struct lynx_pccr *pccr) +{ + switch (lane_mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + pccr->offset =3D PCCR8; + pccr->width =3D 4; + pccr->shift =3D SGMII_CFG(lane); + break; + default: + return -EINVAL; + } + + return 0; +} + +static int ls2088a_serdes2_get_pcvt_offset(int lane, enum lynx_lane_mode m= ode) +{ + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + return SGMIIaCR0(lane); + default: + return -EINVAL; + } +} + +static const struct lynx_info lynx_info_ls2088a_serdes2 =3D { + .get_pccr =3D ls2088a_serdes2_get_pccr, + .get_pcvt_offset =3D ls2088a_serdes2_get_pcvt_offset, + .pll_read_configuration =3D lynx_10g_pll_read_configuration, + .lane_read_configuration =3D lynx_10g_lane_read_configuration, + .cdr_lock_check =3D lynx_10g_cdr_lock_check, + .num_lanes =3D 8, + .index =3D 2, +}; + +/* Halting puts the lane in a mode in which it can be reconfigured */ +static void lynx_10g_lane_halt(struct phy *phy) +{ + struct lynx_lane *lane =3D phy_get_drvdata(phy); + + /* Issue a reset request */ + lynx_lane_rmw(lane, LNaGCR0, + LNaGCR0_RRST_ON | LNaGCR0_TRST_ON, + LNaGCR0_RRST | LNaGCR0_TRST); + + /* The RM says to wait for at least 50ns */ + usleep_range(1, 2); +} + +static void lynx_10g_lane_reset(struct phy *phy) +{ + struct lynx_lane *lane =3D phy_get_drvdata(phy); + + /* Finalize the reset request */ + lynx_lane_rmw(lane, LNaGCR0, + LNaGCR0_RRST_OFF | LNaGCR0_TRST_OFF, + LNaGCR0_RRST | LNaGCR0_TRST); + + /* The RM says to wait for at least 50ns */ + usleep_range(1, 2); +} + +static int lynx_10g_power_off(struct phy *phy) +{ + struct lynx_lane *lane =3D phy_get_drvdata(phy); + + if (!lane->powered_up) + return 0; + + /* Issue a reset request with the power down bits set */ + lynx_lane_rmw(lane, LNaGCR0, + LNaGCR0_RRST_ON | LNaGCR0_TRST_ON | + LNaGCR0_RX_PD | LNaGCR0_TX_PD, + LNaGCR0_RRST | LNaGCR0_TRST | + LNaGCR0_RX_PD | LNaGCR0_TX_PD); + + /* The RM says to wait for at least 50ns */ + usleep_range(1, 2); + + lane->powered_up =3D false; + + return 0; +} + +static int lynx_10g_power_on(struct phy *phy) +{ + struct lynx_lane *lane =3D phy_get_drvdata(phy); + + if (lane->powered_up) + return 0; + + /* The RM says to wait for at least 120ns between per lane setting have + * been changed and the lane being taken out of reset + */ + usleep_range(1, 2); + + lynx_lane_rmw(lane, LNaGCR0, LNaGCR0_RRST_OFF | LNaGCR0_TRST_OFF, + LNaGCR0_RRST | LNaGCR0_TRST | + LNaGCR0_RX_PD | LNaGCR0_TX_PD); + + lane->powered_up =3D true; + + return 0; +} + +static void lynx_10g_lane_set_nrate(struct lynx_lane *lane, + struct lynx_pll *pll, + enum lynx_lane_mode mode) +{ + enum lynx_10g_rat_sel nrate; + + switch (pll->frate_sel) { + case PLLnCR0_FRATE_5G: + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + nrate =3D RAT_SEL_QUARTER; + break; + case LANE_MODE_QSGMII: + nrate =3D RAT_SEL_FULL; + break; + default: + return; + } + break; + case PLLnCR0_FRATE_3_125G: + switch (mode) { + case LANE_MODE_2500BASEX: + nrate =3D RAT_SEL_FULL; + break; + default: + break; + } + break; + case PLLnCR0_FRATE_5_15625G: + switch (mode) { + case LANE_MODE_10GBASER: + case LANE_MODE_USXGMII: + case LANE_MODE_10G_QXGMII: + nrate =3D RAT_SEL_DOUBLE; + break; + default: + return; + } + break; + default: + return; + } + + lynx_lane_rmw(lane, LNaGCR0, + FIELD_PREP(LNaGCR0_TRAT_SEL, nrate) | + FIELD_PREP(LNaGCR0_RRAT_SEL, nrate), + LNaGCR0_RRAT_SEL | LNaGCR0_TRAT_SEL); +} + +static void lynx_10g_lane_set_pll(struct lynx_lane *lane, + struct lynx_pll *pll) +{ + if (pll->id =3D=3D 0) { + lynx_lane_rmw(lane, LNaGCR0, + LNaGCR0_RPLL_PLLF | LNaGCR0_TPLL_PLLF, + LNaGCR0_RPLL_MSK | LNaGCR0_TPLL_MSK); + } else { + lynx_lane_rmw(lane, LNaGCR0, + LNaGCR0_RPLL_PLLS | LNaGCR0_TPLL_PLLS, + LNaGCR0_RPLL_MSK | LNaGCR0_TPLL_MSK); + } +} + +static void lynx_10g_lane_remap_pll(struct lynx_lane *lane, + enum lynx_lane_mode lane_mode) +{ + struct lynx_priv *priv =3D lane->priv; + struct lynx_pll *pll; + + /* Switch to the PLL that works with this interface type */ + pll =3D lynx_pll_get(priv, lane_mode); + if (unlikely(!pll)) + return; + + lynx_10g_lane_set_pll(lane, pll); + + /* Choose the portion of clock net to be used on this lane */ + lynx_10g_lane_set_nrate(lane, pll, lane_mode); +} + +static void lynx_10g_lane_change_proto_conf(struct lynx_lane *lane, + enum lynx_lane_mode mode) +{ + const struct lynx_10g_proto_conf *conf =3D &lynx_10g_proto_conf[mode]; + + lynx_lane_rmw(lane, LNaGCR0, + FIELD_PREP(LNaGCR0_PROTS, conf->proto_sel) | + FIELD_PREP(LNaGCR0_IF20BIT_EN, conf->if20bit_en), + LNaGCR0_PROTS | LNaGCR0_IF20BIT_EN); + lynx_lane_rmw(lane, LNaGCR1, + FIELD_PREP(LNaGCR1_REIDL_TH, conf->reidl_th) | + FIELD_PREP(LNaGCR1_REIDL_ET_MSB, conf->reidl_et_msb) | + FIELD_PREP(LNaGCR1_REIDL_ET_SEL, conf->reidl_et_sel) | + FIELD_PREP(LNaGCR1_REIDL_EX_MSB, conf->reidl_ex_msb) | + FIELD_PREP(LNaGCR1_REIDL_EX_SEL, conf->reidl_ex_sel) | + FIELD_PREP(LNaGCR1_ISLEW_RCTL, conf->islew_rctl) | + FIELD_PREP(LNaGCR1_OSLEW_RCTL, conf->oslew_rctl), + LNaGCR1_REIDL_TH | + LNaGCR1_REIDL_ET_MSB | LNaGCR1_REIDL_ET_SEL | + LNaGCR1_REIDL_EX_MSB | LNaGCR1_REIDL_EX_SEL | + LNaGCR1_ISLEW_RCTL | LNaGCR1_OSLEW_RCTL); + lynx_lane_rmw(lane, LNaRECR0, + FIELD_PREP(LNaRECR0_RXEQ_BST, conf->rxeq_bst) | + FIELD_PREP(LNaRECR0_GK2OVD, conf->gk2ovd) | + FIELD_PREP(LNaRECR0_GK3OVD, conf->gk3ovd) | + FIELD_PREP(LNaRECR0_GK2OVD_EN, conf->gk2ovd_en) | + FIELD_PREP(LNaRECR0_GK3OVD_EN, conf->gk3ovd_en) | + FIELD_PREP(LNaRECR0_BASE_WAND, conf->base_wand), + LNaRECR0_RXEQ_BST | LNaRECR0_GK2OVD | LNaRECR0_GK3OVD | + LNaRECR0_GK2OVD_EN | LNaRECR0_GK3OVD_EN | + LNaRECR0_BASE_WAND); + lynx_lane_rmw(lane, LNaTECR0, + FIELD_PREP(LNaTECR0_TEQ_TYPE, conf->teq_type) | + FIELD_PREP(LNaTECR0_SGN_PREQ, conf->sgn_preq) | + FIELD_PREP(LNaTECR0_RATIO_PREQ, conf->ratio_preq) | + FIELD_PREP(LNaTECR0_SGN_POST1Q, conf->sgn_post1q) | + FIELD_PREP(LNaTECR0_RATIO_PST1Q, conf->ratio_post1q) | + FIELD_PREP(LNaTECR0_ADPT_EQ, conf->adpt_eq) | + FIELD_PREP(LNaTECR0_AMP_RED, conf->amp_red), + LNaTECR0_TEQ_TYPE | LNaTECR0_SGN_PREQ | + LNaTECR0_RATIO_PREQ | LNaTECR0_SGN_POST1Q | + LNaTECR0_RATIO_PST1Q | LNaTECR0_ADPT_EQ | + LNaTECR0_AMP_RED); + lynx_lane_write(lane, LNaTTLCR0, conf->ttlcr0); +} + +static int lynx_10g_lane_disable_pcvt(struct lynx_lane *lane, + enum lynx_lane_mode mode) +{ + struct lynx_priv *priv =3D lane->priv; + int err; + + spin_lock(&priv->pcc_lock); + + err =3D lynx_pccr_write(lane, mode, 0); + if (err) + goto out; + + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + err =3D lynx_pcvt_rmw(lane, mode, CR(1), SGMIIaCR1_SGPCS_DIS, + SGMIIaCR1_SGPCS_EN); + if (err) + goto out; + + lynx_pcvt_rmw(lane, mode, CR(0), + SGMIIaCR0_RST_SGM_ON | SGMIIaCR0_PD_SGM, + SGMIIaCR0_RST_SGM | SGMIIaCR0_PD_SGM); + break; + case LANE_MODE_QSGMII: + err =3D lynx_pcvt_rmw(lane, mode, CR(0), + QSGMIIaCR0_RST_QSGM_ON | QSGMIIaCR0_PD_QSGM, + QSGMIIaCR0_RST_QSGM | QSGMIIaCR0_PD_QSGM); + if (err) + goto out; + break; + default: + err =3D 0; + } + +out: + spin_unlock(&priv->pcc_lock); + + return err; +} + +static int lynx_10g_lane_enable_pcvt(struct lynx_lane *lane, + enum lynx_lane_mode mode) +{ + struct lynx_priv *priv =3D lane->priv; + u32 val; + int err; + + spin_lock(&priv->pcc_lock); + + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + err =3D lynx_pcvt_rmw(lane, mode, CR(1), SGMIIaCR1_SGPCS_EN, + SGMIIaCR1_SGPCS_EN); + if (err) + goto out; + + lynx_pcvt_rmw(lane, mode, CR(0), SGMIIaCR0_RST_SGM_OFF, + SGMIIaCR0_RST_SGM | SGMIIaCR0_PD_SGM); + break; + case LANE_MODE_QSGMII: + err =3D lynx_pcvt_rmw(lane, mode, CR(0), QSGMIIaCR0_RST_QSGM_OFF, + QSGMIIaCR0_RST_QSGM | QSGMIIaCR0_PD_QSGM); + if (err) + goto out; + break; + default: + err =3D 0; + } + + if (lane->default_pccr[mode]) { + err =3D lynx_pccr_write(lane, mode, lane->default_pccr[mode]); + goto out; + } + + val =3D 0; + + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + val |=3D PCCR8_SGMIIa_CFG; + break; + case LANE_MODE_QSGMII: + val |=3D PCCR9_QSGMIIa_CFG; + break; + case LANE_MODE_10G_QXGMII: + val |=3D PCCR9_QXGMIIa_CFG; + break; + case LANE_MODE_10GBASER: + val |=3D PCCRB_XFIa_CFG; + break; + case LANE_MODE_USXGMII: + val |=3D PCCRB_SXGMIIa_CFG; + break; + default: + err =3D 0; + goto out; + } + + err =3D lynx_pccr_write(lane, mode, val); +out: + spin_unlock(&priv->pcc_lock); + + return err; +} + +static bool lynx_10g_lane_mode_needs_rcw_override(struct lynx_lane *lane, + enum lynx_lane_mode new) +{ + enum lynx_lane_mode curr =3D lane->mode; + + /* Major protocol changes, which involve changing the PCS connection to + * the GMII MAC with the one to the XGMII MAC, require an RCW override + * procedure to reconfigure an internal mux, as documented here: + * https://lore.kernel.org/linux-phy/20230810102631.bvozjer3t67r67iy@skbu= f/ + * This is SoC-specific, and not yet implemented in drivers/soc/fsl/guts.= c. + * + * So the supported set of protocols depends on the initial lane mode. + * + * Minor protocol changes (SGMII <-> 1000Base-X <-> 2500Base-X or + * 10GBase-R <-> USXGMII) are supported. + */ + if ((lynx_lane_mode_uses_gmii_mac(curr) && + lynx_lane_mode_uses_xgmii_mac(new)) || + (lynx_lane_mode_uses_xgmii_mac(curr) && + lynx_lane_mode_uses_gmii_mac(new))) + return true; + + return false; +} + +static int lynx_10g_validate(struct phy *phy, enum phy_mode mode, int subm= ode, + union phy_configure_opts *opts) +{ + struct lynx_lane *lane =3D phy_get_drvdata(phy); + enum lynx_lane_mode lane_mode; + int err; + + err =3D lynx_phy_mode_to_lane_mode(phy, mode, submode, &lane_mode); + if (err) + return err; + + if (lynx_10g_lane_mode_needs_rcw_override(lane, lane_mode)) + return -EINVAL; + + return 0; +} + +static int lynx_10g_set_mode(struct phy *phy, enum phy_mode mode, int subm= ode) +{ + struct lynx_lane *lane =3D phy_get_drvdata(phy); + bool powered_up =3D lane->powered_up; + enum lynx_lane_mode lane_mode; + int err; + + err =3D lynx_10g_validate(phy, mode, submode, NULL); + if (err) + return err; + + lane_mode =3D phy_interface_to_lane_mode(submode); + /* lynx_10g_validate() already made sure the lane_mode is supported */ + + if (lane_mode =3D=3D lane->mode) + return 0; + + /* If the lane is powered up, put the lane into the halt state while + * the reconfiguration is being done. + */ + if (powered_up) + lynx_10g_lane_halt(phy); + + err =3D lynx_10g_lane_disable_pcvt(lane, lane->mode); + if (err) + goto out; + + lynx_10g_lane_change_proto_conf(lane, lane_mode); + lynx_10g_lane_remap_pll(lane, lane_mode); + WARN_ON(lynx_10g_lane_enable_pcvt(lane, lane_mode)); + + lane->mode =3D lane_mode; + +out: + if (powered_up) + lynx_10g_lane_reset(phy); + + return err; +} + +static int lynx_10g_init(struct phy *phy) +{ + struct lynx_lane *lane =3D phy_get_drvdata(phy); + + /* Mark the fact that the lane was init */ + lane->init =3D true; + + /* SerDes lanes are powered on at boot time. Any lane that is + * managed by this driver will get powered off when its consumer + * calls phy_init(). + */ + lane->powered_up =3D true; + lynx_10g_power_off(phy); + + return 0; +} + +static int lynx_10g_exit(struct phy *phy) +{ + struct lynx_lane *lane =3D phy_get_drvdata(phy); + + /* The lane returns to the state where it isn't managed by the + * consumer, so we must treat is as if it isn't initialized, and always + * powered on. + */ + lane->init =3D false; + lane->powered_up =3D false; + lynx_10g_power_on(phy); + + return 0; +} + +static const struct phy_ops lynx_10g_ops =3D { + .init =3D lynx_10g_init, + .exit =3D lynx_10g_exit, + .power_on =3D lynx_10g_power_on, + .power_off =3D lynx_10g_power_off, + .set_mode =3D lynx_10g_set_mode, + .validate =3D lynx_10g_validate, + .owner =3D THIS_MODULE, +}; + +static int lynx_10g_probe(struct platform_device *pdev) +{ + return lynx_probe(pdev, of_device_get_match_data(&pdev->dev), + &lynx_10g_ops); +} + +static const struct of_device_id lynx_10g_of_match_table[] =3D { + { .compatible =3D "fsl,ls1028a-serdes", .data =3D &lynx_info_ls1028a }, + { .compatible =3D "fsl,ls1046a-serdes1", .data =3D &lynx_info_ls1046a_ser= des1 }, + { .compatible =3D "fsl,ls1046a-serdes2", .data =3D &lynx_info_ls1046a_ser= des2 }, + { .compatible =3D "fsl,ls1088a-serdes1", .data =3D &lynx_info_ls1088a_ser= des1 }, + { .compatible =3D "fsl,ls2088a-serdes1", .data =3D &lynx_info_ls2088a_ser= des1 }, + { .compatible =3D "fsl,ls2088a-serdes2", .data =3D &lynx_info_ls2088a_ser= des2 }, + {} +}; +MODULE_DEVICE_TABLE(of, lynx_10g_of_match_table); + +static struct platform_driver lynx_10g_driver =3D { + .probe =3D lynx_10g_probe, + .remove =3D lynx_remove, + .driver =3D { + .name =3D "lynx-10g", + .of_match_table =3D lynx_10g_of_match_table, + }, +}; +module_platform_driver(lynx_10g_driver); + +MODULE_IMPORT_NS("PHY_FSL_LYNX"); +MODULE_AUTHOR("Ioana Ciornei "); +MODULE_AUTHOR("Vladimir Oltean "); +MODULE_DESCRIPTION("Lynx 10G SerDes PHY driver for Layerscape SoCs"); +MODULE_LICENSE("GPL"); diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.c b/drivers/phy/freesc= ale/phy-fsl-lynx-core.c index a9fda85a7783..e0d6b67a89b7 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.c +++ b/drivers/phy/freescale/phy-fsl-lynx-core.c @@ -11,6 +11,12 @@ const char *lynx_lane_mode_str(enum lynx_lane_mode lane_= mode) switch (lane_mode) { case LANE_MODE_1000BASEX_SGMII: return "1000Base-X/SGMII"; + case LANE_MODE_2500BASEX: + return "2500Base-X"; + case LANE_MODE_QSGMII: + return "QSGMII"; + case LANE_MODE_10G_QXGMII: + return "10G-QXGMII"; case LANE_MODE_10GBASER: return "10GBase-R"; case LANE_MODE_USXGMII: @@ -29,6 +35,12 @@ enum lynx_lane_mode phy_interface_to_lane_mode(phy_inter= face_t intf) case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_1000BASEX: return LANE_MODE_1000BASEX_SGMII; + case PHY_INTERFACE_MODE_2500BASEX: + return LANE_MODE_2500BASEX; + case PHY_INTERFACE_MODE_QSGMII: + return LANE_MODE_QSGMII; + case PHY_INTERFACE_MODE_10G_QXGMII: + return LANE_MODE_10G_QXGMII; case PHY_INTERFACE_MODE_10GBASER: return LANE_MODE_10GBASER; case PHY_INTERFACE_MODE_USXGMII: @@ -89,6 +101,29 @@ bool lynx_lane_supports_mode(struct lynx_lane *lane, en= um lynx_lane_mode mode) } EXPORT_SYMBOL_NS_GPL(lynx_lane_supports_mode, "PHY_FSL_LYNX"); =20 +/* The quad protocols are fixed because the lane has multiple consumers, a= nd + * one phy_set_mode_ext() affects the other consumers as well. We have no = use + * case for dynamic protocol changing here, so disallow it. + */ +static enum lynx_lane_mode lynx_fixed_protocols[] =3D { + LANE_MODE_QSGMII, + LANE_MODE_10G_QXGMII, +}; + +static bool lynx_lane_restrict_fixed_mode_change(struct lynx_lane *lane, + enum lynx_lane_mode new) +{ + enum lynx_lane_mode curr =3D lane->mode; + + for (int i =3D 0; i < ARRAY_SIZE(lynx_fixed_protocols); i++) + if ((curr =3D=3D lynx_fixed_protocols[i] || + new =3D=3D lynx_fixed_protocols[i]) && + curr !=3D new) + return true; + + return false; +} + /* Translate the mode/submode from phy_validate() and phy_set_mode_ext() t= o a * lane_mode and return 0 if it is supported and we can transition to it f= rom * the current lane mode, or return negative error otherwise. @@ -112,6 +147,9 @@ int lynx_phy_mode_to_lane_mode(struct phy *phy, enum ph= y_mode mode, if (!lynx_lane_supports_mode(lane, tmp_lane_mode)) return -EINVAL; =20 + if (lynx_lane_restrict_fixed_mode_change(lane, tmp_lane_mode)) + return -EINVAL; + if (lane_mode) *lane_mode =3D tmp_lane_mode; =20 diff --git a/drivers/phy/freescale/phy-fsl-lynx-core.h b/drivers/phy/freesc= ale/phy-fsl-lynx-core.h index 37fa4b544faa..a60429ba9324 100644 --- a/drivers/phy/freescale/phy-fsl-lynx-core.h +++ b/drivers/phy/freescale/phy-fsl-lynx-core.h @@ -9,6 +9,7 @@ #include =20 #define LYNX_NUM_PLL 2 +#define LYNX_QUIRK_HAS_HARDCODED_USXGMII BIT(0) =20 struct lynx_priv; struct lynx_lane; @@ -36,6 +37,7 @@ struct lynx_lane { bool init; unsigned int id; enum lynx_lane_mode mode; + u32 default_pccr[LANE_MODE_MAX]; }; =20 struct lynx_info { @@ -48,6 +50,8 @@ struct lynx_info { void (*cdr_lock_check)(struct lynx_lane *lane); int first_lane; int num_lanes; + int index; + unsigned long quirks; }; =20 struct lynx_priv { diff --git a/include/soc/fsl/phy-fsl-lynx.h b/include/soc/fsl/phy-fsl-lynx.h index 92e8272d5ae1..ff5a7d1835b5 100644 --- a/include/soc/fsl/phy-fsl-lynx.h +++ b/include/soc/fsl/phy-fsl-lynx.h @@ -7,10 +7,37 @@ enum lynx_lane_mode { LANE_MODE_UNKNOWN, LANE_MODE_1000BASEX_SGMII, + LANE_MODE_2500BASEX, + LANE_MODE_QSGMII, + LANE_MODE_10G_QXGMII, LANE_MODE_10GBASER, LANE_MODE_USXGMII, LANE_MODE_25GBASER, LANE_MODE_MAX, }; =20 +static inline bool lynx_lane_mode_uses_gmii_mac(enum lynx_lane_mode mode) +{ + switch (mode) { + case LANE_MODE_1000BASEX_SGMII: + case LANE_MODE_2500BASEX: + case LANE_MODE_QSGMII: + case LANE_MODE_10G_QXGMII: + return true; + default: + return false; + } +} + +static inline bool lynx_lane_mode_uses_xgmii_mac(enum lynx_lane_mode mode) +{ + switch (mode) { + case LANE_MODE_10GBASER: + case LANE_MODE_USXGMII: + return true; + default: + return false; + } +} + #endif /* __PHY_FSL_LYNX_H_ */ --=20 2.34.1 From nobody Mon Jun 8 14:52:06 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011024.outbound.protection.outlook.com [52.101.70.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE251380FF2; Fri, 29 May 2026 17:15:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074949; cv=fail; b=lTVQvt6s2VTjjDhRoWdMl4vHG5TPbqYm7gbL/esNETlDixRX5qit+tAqWCfcP8FlULZTPyOQoLvWR+VTYiVgjS5ZkKjgFbUZn2cOViJoTB61eXHOhIBGjIGX9CxEwH0PsXJeGpUxO4QTx0Jsh2le/Y/59SNWC314HMokitVjDOA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780074949; c=relaxed/simple; bh=lF1oPvzhnscuzY64u0uDXGtUdu7R79dcmeE8qDvsPzI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=WecJYc+apQTzTZrz0wsKxPLWCK1Fh4+5zfGJ/mA8817odrl9kDUwMpj9wNGXoXVL1VeyBIDLEFY7WcKkIPuX+4whzm27RjRRT5dJV0gLSHvo2xTYeC+PmEpoKZUq9gzNPZjynWZo8RBWloXtBuueepfM+iYt7cPnVaEiBJkQiEI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=fgFQr+xJ; arc=fail smtp.client-ip=52.101.70.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="fgFQr+xJ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rTmlRgZtCERTxUxhkWdO+noIWSibBYSsWgFflfl0jod1V13vCWvZfJZPe6m/DKQlqmtkLgLTJt5PglwEtQiWhUb/G+kkL/0QXDI2wgP/nMzpHRUVyOtMsjsz31tHzPRpF3cdVQCgmycOG7gcme+SNnMRzYq25q5JM5C4lpp7oadZtUnGFoV35WhkVq5thIF8sPPUFhoPixVZNQ02RSGlzscbOmGly7q9fOYQP/JGVmS0O7UMXcC6XDB0bohuYi3qH8MfgsVmGSXPBO0DH1STjSle4edfMuuXn9astfWbbRXXBVNqU3N1/84NV3qXetNV11pClxSpINlk8zKmNTQBaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=K8l34yQz2iuiYgJrihGwa5VrJY9BVgLITOOBbkS1O+w=; b=E94KzFMEfcg/RJYPgJ/P/LcFvpESKTtt1I3A02Ga40siHuUSqV13BoTFdZexzZIcqgQiZkFsBCtVYcdleueYrrGMW07IeaNam5HJ1NfZGmuM/bXeLsJWUlEngOPVbwzuDGZiCRXkMpfsE/LVMkCVTY78tCskJHWoFPavDHDCCgI3z23SAA2rXC/rOasouVf515VxqlDoZMZ22oSLKHAZj69NEBOIAN7/0s8PPr60tDcWs3xNZRXCgOW8+2vUjwSlavRn0VPjKLOgdzvfdIvhXQ4GAUGyQ9RxwLYcStAaEgzpt8VWKW3ke36UOT5QfYzeubZG374s6Akjux+RU3YAqg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=K8l34yQz2iuiYgJrihGwa5VrJY9BVgLITOOBbkS1O+w=; b=fgFQr+xJGYJX9DhzkHf1+YtEAw5hgUZ8XBzrGhpqp6VKHcOrUJ5Qbuy+BHtAuu0mZi4PJV/ObyQ7thAzCZepVgiuQk1VMn54fM6YsREr8zhR+cIFwUmrpRrkZK/XduHgFGXab3IH4SbCyY6w/DLtnQR3/nOBJU8ZLCYrZix8q6/GKMJ1nKkszShZkQmRmMzaCTbhBwtrhSKYsjLC3ztR6P86BUIkJngetv5I4cnEbxGlQPjQNMxXkIpqRUnzRdEQ+3sOY9+sqWfNk+LSa83WEgel7glf/VyqtzctrSg/0LITLZan7W/BElUWuCkHUM/CXPSrBbA4FZSKtay4Vt+L5Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) by PAXPR04MB8960.eurprd04.prod.outlook.com (2603:10a6:102:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.19; Fri, 29 May 2026 17:15:39 +0000 Received: from AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023]) by AM0PR04MB6900.eurprd04.prod.outlook.com ([fe80::7fda:8431:ca1b:b023%5]) with mapi id 15.21.0071.014; Fri, 29 May 2026 17:15:39 +0000 From: Vladimir Oltean To: linux-phy@lists.infradead.org Cc: Ioana Ciornei , Vinod Koul , Neil Armstrong , Tanjeff Moos , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Conor Dooley , Krzysztof Kozlowski , Rob Herring Subject: [PATCH v2 phy-next 15/15] MAINTAINERS: expand Lynx 28G entry to cover Lynx 10G SerDes Date: Fri, 29 May 2026 20:15:09 +0300 Message-Id: <20260529171509.1163787-16-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260529171509.1163787-1-vladimir.oltean@nxp.com> References: <20260529171509.1163787-1-vladimir.oltean@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR02CA0124.eurprd02.prod.outlook.com (2603:10a6:20b:28c::21) To AM0PR04MB6900.eurprd04.prod.outlook.com (2603:10a6:208:17d::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB6900:EE_|PAXPR04MB8960:EE_ X-MS-Office365-Filtering-Correlation-Id: ab83f91b-b045-42eb-7c0c-08debda5e7c3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003|19092799006|22082099003|18002099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: LtiDXRlE6z0dq+kHM1m2J8hLMMBT0UYxQlQUYRqWwnntSTfUlTWc6s3sCuULRclnOjy+blB3zRUklstD25NlvX5qUyNTGI5YXGPOJPu0yFAQSSL4Jwdfjy8ql9GjAxekPMdFZl6r31RCeyuLu0wz11LUejcg6Gy9/F4uXolc+73nDKMhevBgwJyO4gxLW8mp4FvnlHF32G46+TA0AaW+otime44jlOAl93eg6tIxCiLeCkRJ/IRAMiFofQ7Ybf1aCvocrtLqGUJxugl/xx88qaNH118PPX/in9SousyygnL1Zrdy07Do1RrYtABKzqFQ50loEATtnIU/CDxTSAidR5wOqH/BLMsrk3xeBYyTBuBKJlwSjcPyWfKXpw/eHdD0rQT3ZUi/r3ahxohKLBcq1691jAS3PAP90zd5dwnIyAblW+IJ2U73vrQmG9FO/COlfnCx943Upbm+CRPsG8nu26f89Ay/ttRlcscztD4NjCWMuP9jaUnJ96JnSISKhY8v8u6clsCQhvsZ0AlljxyMcar70fhDG9tL/yRaks+QFbbbTjjY6N4H4eEbzBliDVKPQg56DCDB0CcJl2H8vUsEYGQsJcqmN38qeocTLtA8yLnQae/A1LR476XZKeleSPmQkErdXfhEh9k6sGwCtlR2NxV4Dv6YiKJMj49wdDowLuJMEwiJyBAwKGzfor+hWThI X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB6900.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003)(19092799006)(22082099003)(18002099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?bfFQ4xxkluJMhxTFCIg0w9y+QjSEbuD4ORxOsp2YNy9ABo3NcaWfq+4GseYp?= =?us-ascii?Q?NUGVMFBtiNBTohJMeQx70nzSh7bLkQXFbfHiEKAbrh9SNqWXqUqaPpdb8Idl?= =?us-ascii?Q?T6NVIan2WVzkC+KXKSODnMm97PYmFG6WO/BMLf9627SjFvTULQg09sCQ+ygz?= =?us-ascii?Q?E0eNbBuzwN5N0HzmpCVxtzzJRxa8q0T/tF5X3XM5YMc1wOuo39aErvu0JUaF?= =?us-ascii?Q?cM9dU9MX/P+7mwpO/CUB2I1/IFU5gG3gFYDfHTZUFrVpURRFqThwHvxhA0A6?= =?us-ascii?Q?r1Fx0Yqcw5zJyESd31IO5ruF6+XTQL9ta/2pD0lrqoizq8zI7d2zS7abWHIt?= =?us-ascii?Q?Y8EMfoqFKVuDwLf4bKdT1ZPjltSV10O11VBHz+0Y8rG/LFM5amRujg8nBsyt?= =?us-ascii?Q?az2FBNgE9fDBsyrUG6o/7JS27ekKc2xn3gasN7qR35gZ2iFBBimV7tA+/QVn?= =?us-ascii?Q?66bAIZdEDJL8G0K8KODmWzixkgUfAfsolII5CMxWR45GP1SYCtAR/ONy6q3z?= =?us-ascii?Q?nnUmRtaZju2yRYdp9WHEncE2pNcPcKPupb+5PX8iGPyuFYesYt1D82ggJcK2?= =?us-ascii?Q?UZVPpKMA/RWnzWAxqkaGR1b/BLgwEsTPVffKU+czipkB9aT8+fxR8jN0g46j?= =?us-ascii?Q?VosjNAYBSIgcsGfjv/UzdLK/jOkFc7hN81FOjdE+na6PUETjUNFFxLdYndDC?= =?us-ascii?Q?0qbvK/xCCeWLi8pB24k/VSvMIcfTZ4OWZMUFqqijjxlmMnLrUEBA/HIEaWb3?= =?us-ascii?Q?Y7M3QTVrnCuTF0zXnoowZKdu2rCWwtxigbwhzXrhzfxiMM2QdjUzAt8FfDnh?= =?us-ascii?Q?KwxMlD3bHKIUu5kD/+yaK6YaGRYOb9i0pHhtlB0nuK0YWT+yWul61o3A9IB/?= =?us-ascii?Q?Earayj7QtCYr5eBUDq9vOA0/DvEdy0xC3WBVbiKD2MLUXFtkZwn7sYVjH+QM?= =?us-ascii?Q?xMHDFCtuG/GSbFjmyyRymVexArriHlhkkgWi6nuyUFMSGYthpXN42JhW3dXO?= =?us-ascii?Q?hdY4IeUMUB5eq4KaHsM2G1GefeMR+C+k9PZmvF/zqXJfNQxBJk5D+e8uTxz1?= =?us-ascii?Q?cgcRSlQbipkZoPLQ2DEGfP0fQglMd1k+DOSPjNXfw73yig/ujm27QQYULEey?= =?us-ascii?Q?FwU5fpCL12vAYLc3pSUQab7+n3Jcl8gn36xHIHecj4ul2dGf2VTAOwcFvp0U?= =?us-ascii?Q?1Fb/dLytFGCJOWC9BySe5ScmJ5lMLGjeUN3MPdohkJBsQj0HsDSf0ttb3Prb?= =?us-ascii?Q?Yo3NQdv478HupiwhaZ+u4JpsKBJy2YW0QyVHC6lChO+zzMkk/GPxH+v+oUCR?= =?us-ascii?Q?iqbX+RLcJ36S6Usb5OFe9zDHoaMyOB8S1ke4MUElTc047yb7qC/GMycI+L41?= =?us-ascii?Q?X2YfyvBnixiTMREU7Tr5YWTF3/5YYZbVUnzFPWQR3/RlVWqlqsgQr3TfJg79?= =?us-ascii?Q?X1KsK5rVdC277PirywOqdz0vR6pdmxYQvrt3OZ8orIhn7vK1QkOTrAW/S0+3?= =?us-ascii?Q?vnIbDCVdYppl+mS9H97/D+DJM+wIvqKYZoEGKdd9rx5Khu9etNoRHHVJge/P?= =?us-ascii?Q?aAEFNVHx6br+7/tLjJWO/8b8gXZz/96ocKRfchvbmFTXIE8PVwyjCyQo+wja?= =?us-ascii?Q?Arz4OPRXoKVyGDnkJ794iWjwFyinYxmKCyv64PyfZw4XD2p7kgB7UpEZg/uD?= =?us-ascii?Q?Tegl6jO5j/Rf2qk7A1J/ULApfx0pgQfT8KzY11vwe65vdJspqcxdpGEdf7jp?= =?us-ascii?Q?3h8s3NFpF09yla2WV2Do16uWhmo3fvGg30O7mrDBJfXwiVIndfdy?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: ab83f91b-b045-42eb-7c0c-08debda5e7c3 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB6900.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 May 2026 17:15:38.9972 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: x/KfufjzcKClmmSs8j82AkAvMXDpe9JAeuCmHh8cVwucArlT7yjLHsxMuFOXo4WBwM7GgJvriB2XycVof4VB3Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8960 Content-Type: text/plain; charset="utf-8" The lynx-28g and lynx-10g drivers share code and hardware architecture, so let them be covered by a single MAINTAINERS entry. Add myself as a second maintainer alongside Ioana Ciornei. Signed-off-by: Vladimir Oltean --- Cc: devicetree@vger.kernel.org Cc: Conor Dooley Cc: Krzysztof Kozlowski Cc: Rob Herring v1->v2: none --- MAINTAINERS | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 4087b67bbc69..bdae5acf8d50 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -15405,12 +15405,18 @@ S: Maintained F: Documentation/devicetree/bindings/iio/light/liteon,ltr390.yaml F: drivers/iio/light/ltr390.c =20 -LYNX 28G SERDES PHY DRIVER +LYNX SERDES PHY DRIVERS M: Ioana Ciornei +M: Vladimir Oltean L: netdev@vger.kernel.org S: Supported +F: Documentation/devicetree/bindings/phy/fsl,lynx-10g.yaml F: Documentation/devicetree/bindings/phy/fsl,lynx-28g.yaml +F: drivers/phy/freescale/phy-fsl-lynx-10g.c F: drivers/phy/freescale/phy-fsl-lynx-28g.c +F: drivers/phy/freescale/phy-fsl-lynx-core.c +F: drivers/phy/freescale/phy-fsl-lynx-core.h +F: include/soc/fsl/phy-fsl-lynx.h =20 LYNX PCS MODULE M: Ioana Ciornei --=20 2.34.1