Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2217276/?format=api
{ "id": 2217276, "url": "http://patchwork.ozlabs.org/api/patches/2217276/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-ide/patch/20260327184706.1600329-17-vladimir.oltean@nxp.com/", "project": { "id": 13, "url": "http://patchwork.ozlabs.org/api/projects/13/?format=api", "name": "Linux IDE development", "link_name": "linux-ide", "list_id": "linux-ide.vger.kernel.org", "list_email": "linux-ide@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260327184706.1600329-17-vladimir.oltean@nxp.com>", "list_archive_url": null, "date": "2026-03-27T18:46:54", "name": "[v6,phy-next,16/28] phy: move provider API out of public <linux/phy/phy.h>", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "91d2c858a4a714d1d4eca97adc7164de156a2749", "submitter": { "id": 75582, "url": "http://patchwork.ozlabs.org/api/people/75582/?format=api", "name": "Vladimir Oltean", "email": "vladimir.oltean@nxp.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-ide/patch/20260327184706.1600329-17-vladimir.oltean@nxp.com/mbox/", "series": [ { "id": 497820, "url": "http://patchwork.ozlabs.org/api/series/497820/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-ide/list/?series=497820", "date": "2026-03-27T18:46:39", "name": "Split Generic PHY consumer and provider", "version": 6, "mbox": "http://patchwork.ozlabs.org/series/497820/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2217276/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2217276/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linux-ide+bounces-5375-incoming=patchwork.ozlabs.org@vger.kernel.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-ide@vger.kernel.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256\n header.s=selector1 header.b=VQF/CMYP;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=104.64.211.4; helo=sin.lore.kernel.org;\n envelope-from=linux-ide+bounces-5375-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)", "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com\n header.b=\"VQF/CMYP\"", "smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=52.101.84.49", "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=nxp.com", "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=nxp.com", "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=nxp.com;" ], "Received": [ "from sin.lore.kernel.org (sin.lore.kernel.org [104.64.211.4])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fj9Q00LGfz1y1P\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 28 Mar 2026 06:17:28 +1100 (AEDT)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sin.lore.kernel.org (Postfix) with ESMTP id BEB1930E3418\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 18:54:30 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 89D743A7F69;\n\tFri, 27 Mar 2026 18:49:17 +0000 (UTC)", "from DB3PR0202CU003.outbound.protection.outlook.com\n (mail-northeuropeazon11010049.outbound.protection.outlook.com [52.101.84.49])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 54C743A6418;\n\tFri, 27 Mar 2026 18:49:14 +0000 (UTC)", "from DU2PR04MB8584.eurprd04.prod.outlook.com (2603:10a6:10:2db::24)\n by GV1PR04MB9515.eurprd04.prod.outlook.com (2603:10a6:150:24::6) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.20; Fri, 27 Mar\n 2026 18:49:07 +0000", "from DU2PR04MB8584.eurprd04.prod.outlook.com\n ([fe80::3f9d:4a01:f53c:952d]) by DU2PR04MB8584.eurprd04.prod.outlook.com\n ([fe80::3f9d:4a01:f53c:952d%5]) with mapi id 15.20.9745.019; Fri, 27 Mar 2026\n 18:49:07 +0000" ], "ARC-Seal": [ "i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1774637357; cv=fail;\n b=JFRxy8AntNygie4oB09WEMnHfdd22zYnxnRHcNYwnPhnILTHvRGNNHLVjXEDgDWsKDQsGvO39UEeNSrr/QyY7CpkGqTDahlZGOOoIS6Xan34Gty0Z4qwQS3Jb/5BWu0gUS/oZuxRTZXiRTJfA4EFV4O6Y3xxZZWv2Y9YyhClgJo=", "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=tAetS5MGH8i7GeMSrOtCj9vRL92Y37ATFVc4Xd44iLJJ+xgtLQomMvLfnKrFxof9NRGyS+qzj3GdcFXMKJ3HQZ5TKrCrhbAPfCJzZPwv2YU5TtcCc7wD8RRL3wKJH8lFK2+UxKURDve2ndR1f1NMUNZMD0/TYlkIBHv/80rhfYibfDE2vpaNoeLcSOCouN9crgfVkEP9JVC0aSQOeO8tY5v9aEQPSayjxp4zoyAQsNKrIhowbHJWXDnocUN7IFPbRng3XIXBwpVVlJ6IMH0q+CC/Dq7YK1kc2M4pOrcdLX2IkRMCA91NOeipukj7BjsM6PpdPtFbzzU54lUdj43QUg==" ], "ARC-Message-Signature": [ "i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1774637357; c=relaxed/simple;\n\tbh=fgtC5NlrTJvPFKtgRJ9BWfZeiqZ80RAIN0O+LigVRgg=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t Content-Type:MIME-Version;\n b=W+p2xRRCTrJlh7dgtLOtPtwt8zEom9htrVj1/y6AWV0vXBlMuAA4bnLn2dPFG15/3o5lcHElt3xmsovBaK1M3+ZWkbfjH7boi1EUZ/Q/l6wsBFla2ANzO0Fi/AjtCkn/cmO6XqVVNp2F4rYjg7i2llGYgUCJdMu/HYIBHA8VNvQ=", "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n 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;\n bh=4omQoUIAkwi7qvWK8SFUrFNMdz0VCDLujfrSPPBAPV4=;\n b=XVl1dGBtPrlgupl/tdtTDmSxImiSmmTUHLN51YCx1DAFD+CisnkFIL4nn0kPo6zp5P7nluDrQOP0SONuvzoFKc+wdrtGNwrCEIE6SJcgIoPiL3563jaPXvdt8SXak7gi7CvgcJKwIMk+fjABOTN+h2hPQkLgpHMOyijFyBr0ZE4X2YQ3TepiMMCSixmqLA2zKZSIMiovInXYjR6em4izyDKtm/ToE30zkO2w9ADnvysSqbxcrxNZmx7N7nFoOV0ZooXrTdEtUodd7sLaSolis76EzGZIMjHZijkZbXrszXn/n8ppPyc4MH0T9rJClXnQs9mWyd2W5R1fq/LNCmtNDA==" ], "ARC-Authentication-Results": [ "i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=nxp.com;\n spf=pass smtp.mailfrom=nxp.com;\n dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com\n header.b=VQF/CMYP; arc=fail smtp.client-ip=52.101.84.49", "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass\n header.d=nxp.com; arc=none" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=4omQoUIAkwi7qvWK8SFUrFNMdz0VCDLujfrSPPBAPV4=;\n b=VQF/CMYPggx7IGAtENvTmu9TkY488Xo0fbuYUPuN5nK8YDamuiKFce/rdVvktqLqhNmq5mqAMeUaS35mU0UFjN+l2N8JbRUQ74EFloUchLzm/hCW1YP1iPeycWm+CnbAiVvvFyzgQHqA1Oh6ubRz9AAP1Xhrtprio2Wp/wd+tvUf6FGXTfTxmbFT1Y2s3zCJeW74HytuO9/u+ZE1zPNJG08At1648MDEs+8O2Qhk1Td9HqaOmb88Ff/mVXRvXJ80+URh7AtoZR5AwElUbONf+PWlry90ry1ulhGLUQ10YkMnxZzIfjRvl8KQw9bzg3yx3qD7kd6P+qr5IzQHB/M11w==", "From": "Vladimir Oltean <vladimir.oltean@nxp.com>", "To": "linux-phy@lists.infradead.org", "Cc": "Vinod Koul <vkoul@kernel.org>, Neil Armstrong <neil.armstrong@linaro.org>,\n dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org,\n linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org,\n linux-can@vger.kernel.org, linux-gpio@vger.kernel.org,\n linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org,\n linux-media@vger.kernel.org, linux-pci@vger.kernel.org,\n linux-renesas-soc@vger.kernel.org, linux-riscv@lists.infradead.org,\n linux-rockchip@lists.infradead.org, linux-samsung-soc@vger.kernel.org,\n linux-scsi@vger.kernel.org, linux-sunxi@lists.linux.dev,\n linux-tegra@vger.kernel.org, linux-usb@vger.kernel.org,\n netdev@vger.kernel.org, spacemit@lists.linux.dev,\n UNGLinuxDriver@microchip.com,\n Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>,\n Abhinav Kumar <abhinav.kumar@linux.dev>,\n Alexandre Belloni <alexandre.belloni@bootlin.com>, =?utf-8?q?Andr=C3=A9_Dra?=\n\t=?utf-8?q?szik?= <andre.draszik@linaro.org>,\n Andrew Lunn <andrew+netdev@lunn.ch>, Andrzej Hajda <andrzej.hajda@intel.com>,\n Andy Yan <andy.yan@rock-chips.com>, Bjorn Helgaas <bhelgaas@google.com>,\n Chanho Park <chanho61.park@samsung.com>, Chen-Yu Tsai <wens@kernel.org>,\n Claudiu Beznea <claudiu.beznea@tuxon.dev>,\n Damien Le Moal <dlemoal@kernel.org>,\n Daniel Machon <daniel.machon@microchip.com>,\n David Airlie <airlied@gmail.com>, \"David S. Miller\" <davem@davemloft.net>,\n Dmitry Baryshkov <lumag@kernel.org>, Eric Dumazet <edumazet@google.com>,\n Fabio Estevam <festevam@gmail.com>, Frank Li <Frank.Li@nxp.com>,\n Geert Uytterhoeven <geert+renesas@glider.be>,\n Greg Kroah-Hartman <gregkh@linuxfoundation.org>, =?utf-8?q?Heiko_St=C3=BCbn?=\n\t=?utf-8?q?er?= <heiko@sntech.de>, Inki Dae <inki.dae@samsung.com>,\n Jagan Teki <jagan@amarulasolutions.com>, Jakub Kicinski <kuba@kernel.org>,\n \"James E.J. Bottomley\" <James.Bottomley@HansenPartnership.com>,\n JC Kuo <jckuo@nvidia.com>, Jernej Skrabec <jernej.skrabec@gmail.com>,\n Jessica Zhang <jesszhan0024@gmail.com>, Joe Perches <joe@perches.com>,\n Johan Hovold <johan+linaro@kernel.org>, Jonas Karlman <jonas@kwiboo.se>,\n Jonathan Hunter <jonathanh@nvidia.com>,\n Kevin Xie <kevin.xie@starfivetech.com>,\n Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>, =?utf-8?q?Krzys?=\n\t=?utf-8?q?ztof_Wilczy=C5=84ski?= <kwilczynski@kernel.org>,\n Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,\n Linus Walleij <linusw@kernel.org>, Lorenzo Pieralisi <lpieralisi@kernel.org>,\n Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,\n Magnus Damm <magnus.damm@gmail.com>, Manivannan Sadhasivam <mani@kernel.org>,\n Marc Kleine-Budde <mkl@pengutronix.de>,\n Marek Szyprowski <m.szyprowski@samsung.com>,\n Marijn Suijten <marijn.suijten@somainline.org>,\n Markus Schneider-Pargmann <msp@baylibre.com>,\n \"Martin K. Petersen\" <martin.petersen@oracle.com>,\n Mathias Nyman <mathias.nyman@intel.com>,\n Mauro Carvalho Chehab <mchehab@kernel.org>,\n Maxime Ripard <mripard@kernel.org>, Michael Dege <michael.dege@renesas.com>,\n Nicolas Ferre <nicolas.ferre@microchip.com>,\n Niklas Cassel <cassel@kernel.org>, Nitin Rawat <quic_nitirawa@quicinc.com>,\n Paolo Abeni <pabeni@redhat.com>,\n Pengutronix Kernel Team <kernel@pengutronix.de>,\n Peter Chen <peter.chen@kernel.org>, Peter Griffin <peter.griffin@linaro.org>,\n Rob Clark <robin.clark@oss.qualcomm.com>, Robert Foss <rfoss@kernel.org>,\n Rob Herring <robh@kernel.org>,\n \"Russell King (Oracle)\" <rmk+kernel@armlinux.org.uk>,\n Samuel Holland <samuel@sholland.org>, Sandy Huang <hjc@rock-chips.com>,\n Sascha Hauer <s.hauer@pengutronix.de>, Sean Paul <sean@poorly.run>,\n Sebastian Reichel <sre@kernel.org>, Shawn Guo <shawn.guo@linaro.org>,\n Shawn Lin <shawn.lin@rock-chips.com>, Simona Vetter <simona@ffwll.ch>,\n Steen Hegelund <Steen.Hegelund@microchip.com>,\n Thierry Reding <thierry.reding@gmail.com>,\n Thinh Nguyen <Thinh.Nguyen@synopsys.com>,\n Thomas Zimmermann <tzimmermann@suse.de>,\n Tudor Ambarus <tudor.ambarus@linaro.org>,\n Vincent Mailhol <mailhol@kernel.org>, Yixun Lan <dlan@kernel.org>,\n Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>", "Subject": "[PATCH v6 phy-next 16/28] phy: move provider API out of public\n <linux/phy/phy.h>", "Date": "Fri, 27 Mar 2026 20:46:54 +0200", "Message-ID": "<20260327184706.1600329-17-vladimir.oltean@nxp.com>", "X-Mailer": "git-send-email 2.43.0", "In-Reply-To": "<20260327184706.1600329-1-vladimir.oltean@nxp.com>", "References": "<20260327184706.1600329-1-vladimir.oltean@nxp.com>", "Content-Type": "text/plain; charset=UTF-8", "Content-Transfer-Encoding": "8bit", "X-ClientProxiedBy": "VE1PR08CA0004.eurprd08.prod.outlook.com\n (2603:10a6:803:104::17) To DU2PR04MB8584.eurprd04.prod.outlook.com\n (2603:10a6:10:2db::24)", "Precedence": "bulk", "X-Mailing-List": "linux-ide@vger.kernel.org", "List-Id": "<linux-ide.vger.kernel.org>", "List-Subscribe": "<mailto:linux-ide+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:linux-ide+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "X-MS-PublicTrafficType": "Email", "X-MS-TrafficTypeDiagnostic": "DU2PR04MB8584:EE_|GV1PR04MB9515:EE_", "X-MS-Office365-Filtering-Correlation-Id": "5f4891af-1f86-446d-bd6b-08de8c31868c", "X-LD-Processed": "686ea1d3-bc2b-4c6f-a92c-d99c5c301635,ExtAddr", "X-MS-Exchange-SenderADCheck": "1", "X-MS-Exchange-AntiSpam-Relay": "0", "X-Microsoft-Antispam": "\n BCL:0;ARA:13230040|10070799003|7416014|376014|366016|1800799024|19092799006|13003099007|56012099003|18092099006|18002099003|22082099003;", "X-Microsoft-Antispam-Message-Info": "\n xO6SmsIg8MDEWj2pNNroJsRlGO2OkqD88ewcN9PLxKjjqlOtwCi6ssg31l+GwapQTqb7ffnRJsmseazv4oUUZGcw1rNiiY1vba26LH6Rynb6Df2KyCzCZJ3hR0ZcFPwsBgCsrNdQNz4Z4X+Rn6zbQ1GEl6woNWARAlMow5S2nYUSnGwV1YMin3DDZlEZmE+rFunyNZhJJ+XmQxe//dDVode5YT3CiXRF+ZhZMn8QGZ7CSKweYLNPlVXrVHXjRsrRdmzxPoVXpva4GNwk0W2/pCr7FSS77RtiQgXQq5WAtiBMnQHuweEGM4ZjSAPYNxbpS+Df5oHkTi2XX+aQe8C96E4EgziHVnnIjX3AsGx7WDRlYZ3LkKnuOOmICaERJHIm27AclvPYof6uBjkuysnEBJwDlVWaHY/K2R9syhWlO0jSKgxgbWktqbqz8CLtQlSd13/P3h5Yyd1tmYzfJKVhx2O/b3uE8AlmH1Crxgowje4AR3Ks0rDpg2lAAy8PuEc5mddRXewWZZDBe2koW0DGI2WHrmA7wUMJ1ah1dzWiWFpwTdJqYloataRVDvM4hjGpxYksV2hF8gPHJCLOcLNGrEpDENEAOAwgV6JcGGneXtUeszWb40MuSfg4L1VnwALi9Coa+3BNb+HDPrR2YzVVbE1kqcLmTtwdm+irRZnh7KkrAVloJrqMBPCqugMNrN7M", "X-Forefront-Antispam-Report": "\n CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU2PR04MB8584.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(366016)(1800799024)(19092799006)(13003099007)(56012099003)(18092099006)(18002099003)(22082099003);DIR:OUT;SFP:1101;", "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "2", "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?xeSd32bF+j3d0H9tVzycCcVeZLRD?=\n\t=?utf-8?q?c5MRgDt2I4Q7DARCE1nmLtpmECkXrSrs4gTLHaZkjc1jxuWdt7k30ox2L96nrUeA2?=\n\t=?utf-8?q?/06CLmEJINuxZaRMeajnBUlCd0jnR5mEVb8UNRQ/Zc1/p3o7jcaOdKQMN65aL7Fpa?=\n\t=?utf-8?q?P6uZmISWqHDAU3Jy/C8gHGMo/LLT7D1d2copt6GTyZ1Q/DCcoLlvLDTmdntoAvM4p?=\n\t=?utf-8?q?ymDpFX5fMDpkEoemnyCFDQKrtlCODg8YyqhezjX9HYr4oUTVVOQN85byX7b3EzVmu?=\n\t=?utf-8?q?5BYIrr3e0tBX9hLqKNsQKsiH0PwmObCfB6DAhw3tfvomUL4K08jyagcyoBCfu+W1P?=\n\t=?utf-8?q?nRTsy1CYi72zwhadU9WN9qFhdMErVsnpvfprHDuhw6uvTVQA5j9HQvnKGeOgTe2Jj?=\n\t=?utf-8?q?sNIkyTWXMmMjp5NgsrXFbhJnlcuFCRtH/5StOXpia7oh6HJ5BCwzWaXyIRZklU5ll?=\n\t=?utf-8?q?9asTb4adV1zqneeaRbx+K392wKvIpgG4Wt8oQfKUM8l8X9N+CLEtXZbyutIAwYBHG?=\n\t=?utf-8?q?EwvlFoUCZ3q4lOdam+XuueLsiXurRlWrY4yFuwEo7abpe7U2HQEpk2Na83nXBtO1v?=\n\t=?utf-8?q?Uou92qu7jk1hOYWh+s6Mlq7en4557iicAIyz29IgrWQRCVKaNF/l4fCpURCO/8PRj?=\n\t=?utf-8?q?RifYou9RtjTX+9J8lrpToAPzl/RDAHljCGuaFyzjQwRXsCs5viSmfBpdYtq/w+gNS?=\n\t=?utf-8?q?ttWYRhYXiuGVP/yncvbdNGbKnlQfPeu11iy9ndN7GbpST1cE1h5r7KuqVRiu1yRGL?=\n\t=?utf-8?q?HS8ba2ghjcr8pajN+/msBlDtl00mhOQDXtOxo+Ibx9A7RTE1ujD/4CKJthsuox2i4?=\n\t=?utf-8?q?bKafqN3dLeGG+h/5Ebw98nxSsSW8QzxOyFnR8vpoiIjwnUmqHRxZ76YLqz8j6HbmR?=\n\t=?utf-8?q?B6Zvahx66H9MEjnx8udCOIHXmCTbu4tGPEX+bk1/iqDq/X1TTdMsG+knfHNqXY0/t?=\n\t=?utf-8?q?zP4jIXCjzH0KuR5Vkv0hVXnJOulTSxZjL4r7Hh7BbsaHVf1FDFH0S8cPilCnwb0C5?=\n\t=?utf-8?q?7ZSqLXEM9XIt6YNwg+D5JPFw7u5IFugqdZayINOEXyULPK4XX6/cN1gNQfOIZO1CY?=\n\t=?utf-8?q?SUDTr2U6OLgmbRSFYd/8tHPH5/3d6e7b9ESl+iRO4okHVh9c9kR9JcT17L1gAcscY?=\n\t=?utf-8?q?rm7pe056lWXTpBIGFmoECz9VWE03eCdopEwuFdwjCcsy4d5e5IslwXLPzZdIjb5CT?=\n\t=?utf-8?q?/Prwku9K48wr/UiEzbCVAFBCvDl57V+GfVKvmFSRJrpOuJM5OFMtfOBpssYuWYORp?=\n\t=?utf-8?q?mo6mYKW16O/xhDAw08Zd7WWhWr9VHyPDsAG8nYg49AyrcXK17SLoiT3ASnKDAF9Ox?=\n\t=?utf-8?q?yPInyQdvjrHJ0S5HBpMRt/RHoIYkZGbio0+gIiG9k3/FwQt4yddTeMpdmJLJEY/Rw?=\n\t=?utf-8?q?JmVHFgQ8stImYgqljUvxASqNYH0mlx6LaIMjuzTPNUpfFeNrWd6D2N5AaMhX1+lJm?=\n\t=?utf-8?q?BflRs5I2jKPFign5wK3i0u9T2Apcuew1UXY2yXGZW7JA45aownFLdC80v4i4iX23G?=\n\t=?utf-8?q?2A1toWoDllEwh6dAju1P4poERYMRaflLfSVLj3vo5n01SiwzFesoGaOiDBD9G3iH5?=\n\t=?utf-8?q?3EzHZowB9POvaFVL19yKkdgb8lA6Run4zR3eiJsTISAbIG0jMA6CylChhl+mlcsg4?=\n\t=?utf-8?q?coQI31kUXoS7TQofliD2QJ8Im7Rre+cNf/lAC12dU1TOqVQ6owTZAqKJbcyeP3Id4?=\n\t=?utf-8?q?Tiqha6PJEsdnUUdVQ?=", "X-MS-Exchange-AntiSpam-MessageData-1": "ElkcvNj1+8cKhit/hP7+5fAzw1ggsEYoQPI=", "X-OriginatorOrg": "nxp.com", "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 5f4891af-1f86-446d-bd6b-08de8c31868c", "X-MS-Exchange-CrossTenant-AuthSource": "DU2PR04MB8584.eurprd04.prod.outlook.com", "X-MS-Exchange-CrossTenant-AuthAs": "Internal", "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "27 Mar 2026 18:49:07.3508\n (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": "\n LtbqHVhXj2Nd2mN0DTsMLLRQIhY0TvaebVnbTBJb9PlJTbL9tFxBFEFpi+JdYXhuiVQjJ2ERK9dvpCgfknKhQA==", "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "GV1PR04MB9515" }, "content": "The major goal is to hide the contents of struct phy from consumer\ndrivers.\n\nThe idea with \"phy-props.h\" is that both consumers and providers make\nuse of some data types. So both headers include \"phy-props.h\".\n\nSome slight points of contention.\n\n1. phy_set_bus_width(): Vinod explains that despite the current caller\n situation (9 providers, 1 consumer), it is a consumer API function.\n\n The use case is that the controller (for example UFS) may have\n limitations and should set the expected lanes to be used and width on\n those lanes. A number of Generic PHYs can support multiple lanes and\n multiple width so this is way for controller telling I am using this\n configuration.\n\n2. phy-provider.h should go to include/linux/phy/ or to drivers/phy/?\n We do have 3 PHY providers outside of drivers/phy/:\n\n drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_dphy.c\n drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c\n drivers/pinctrl/tegra/pinctrl-tegra-xusb.c\n\n but the practice is not encouraged, and with time, these should be\n moved to the subsystem. This is not something that I can do now.\n\n3. We can no longer tolerate static inline helpers. Allowing these would\n make it impossible to hide the struct phy definition from consumers.\n I've made phy_get_mode(), phy_get_bus_width(), phy_set_bus_width()\n exported symbols in drivers/phy/phy-core.c.\n\n4. This is not a change without side effects. In the transition we are\n no longer providing <linux/pm_runtime.h> at all, and\n <linux/regulator/consumer.h> to PHY consumer drivers. However, the\n in-tree dependencies should all have been resolved. Also, the\n movement of phy-provider.h to drivers/phy/ is at least \"interesting\"\n for out of tree PHY provider drivers (this header is not deployed by\n make headers_install). However, it seems to be what Vinod is looking\n to see.\n\nFor temporary compatibility, keep including the provider header. This\nwill be removed when abuses are all gotten rid of.\n\nSigned-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>\nReviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>\n---\nCc: Abhinav Kumar <abhinav.kumar@linux.dev>\nCc: Alexandre Belloni <alexandre.belloni@bootlin.com>\nCc: \"André Draszik\" <andre.draszik@linaro.org>\nCc: Andrew Lunn <andrew+netdev@lunn.ch>\nCc: Andrzej Hajda <andrzej.hajda@intel.com>\nCc: Andy Yan <andy.yan@rock-chips.com>\nCc: Bjorn Helgaas <bhelgaas@google.com>\nCc: Chanho Park <chanho61.park@samsung.com>\nCc: Chen-Yu Tsai <wens@kernel.org>\nCc: Claudiu Beznea <claudiu.beznea@tuxon.dev>\nCc: Damien Le Moal <dlemoal@kernel.org>\nCc: Daniel Machon <daniel.machon@microchip.com>\nCc: David Airlie <airlied@gmail.com>\nCc: \"David S. Miller\" <davem@davemloft.net>\nCc: Dmitry Baryshkov <lumag@kernel.org>\nCc: Eric Dumazet <edumazet@google.com>\nCc: Fabio Estevam <festevam@gmail.com>\nCc: Frank Li <Frank.Li@nxp.com>\nCc: Geert Uytterhoeven <geert+renesas@glider.be>\nCc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>\nCc: \"Heiko Stübner\" <heiko@sntech.de>\nCc: Inki Dae <inki.dae@samsung.com>\nCc: Jagan Teki <jagan@amarulasolutions.com>\nCc: Jakub Kicinski <kuba@kernel.org>\nCc: \"James E.J. Bottomley\" <James.Bottomley@HansenPartnership.com>\nCc: JC Kuo <jckuo@nvidia.com>\nCc: Jernej Skrabec <jernej.skrabec@gmail.com>\nCc: Jessica Zhang <jesszhan0024@gmail.com>\nCc: Joe Perches <joe@perches.com>\nCc: Johan Hovold <johan+linaro@kernel.org>\nCc: Jonas Karlman <jonas@kwiboo.se>\nCc: Jonathan Hunter <jonathanh@nvidia.com>\nCc: Kevin Xie <kevin.xie@starfivetech.com>\nCc: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>\nCc: \"Krzysztof Wilczyński\" <kwilczynski@kernel.org>\nCc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>\nCc: Linus Walleij <linusw@kernel.org>\nCc: Lorenzo Pieralisi <lpieralisi@kernel.org>\nCc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>\nCc: Magnus Damm <magnus.damm@gmail.com>\nCc: Manivannan Sadhasivam <mani@kernel.org>\nCc: Marc Kleine-Budde <mkl@pengutronix.de>\nCc: Marek Szyprowski <m.szyprowski@samsung.com>\nCc: Marijn Suijten <marijn.suijten@somainline.org>\nCc: Markus Schneider-Pargmann <msp@baylibre.com>\nCc: \"Martin K. Petersen\" <martin.petersen@oracle.com>\nCc: Mathias Nyman <mathias.nyman@intel.com>\nCc: Mauro Carvalho Chehab <mchehab@kernel.org>\nCc: Maxime Ripard <mripard@kernel.org>\nCc: Michael Dege <michael.dege@renesas.com>\nCc: Neil Armstrong <neil.armstrong@linaro.org>\nCc: Nicolas Ferre <nicolas.ferre@microchip.com>\nCc: Niklas Cassel <cassel@kernel.org>\nCc: Nitin Rawat <quic_nitirawa@quicinc.com>\nCc: Paolo Abeni <pabeni@redhat.com>\nCc: Pengutronix Kernel Team <kernel@pengutronix.de>\nCc: Peter Chen <peter.chen@kernel.org>\nCc: Peter Griffin <peter.griffin@linaro.org>\nCc: Rob Clark <robin.clark@oss.qualcomm.com>\nCc: Robert Foss <rfoss@kernel.org>\nCc: Rob Herring <robh@kernel.org>\nCc: \"Russell King (Oracle)\" <rmk+kernel@armlinux.org.uk>\nCc: Samuel Holland <samuel@sholland.org>\nCc: Sandy Huang <hjc@rock-chips.com>\nCc: Sascha Hauer <s.hauer@pengutronix.de>\nCc: Sean Paul <sean@poorly.run>\nCc: Sebastian Reichel <sre@kernel.org>\nCc: Shawn Guo <shawn.guo@linaro.org>\nCc: Shawn Lin <shawn.lin@rock-chips.com>\nCc: Simona Vetter <simona@ffwll.ch>\nCc: Steen Hegelund <Steen.Hegelund@microchip.com>\nCc: Thierry Reding <thierry.reding@gmail.com>\nCc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>\nCc: Thomas Zimmermann <tzimmermann@suse.de>\nCc: Tudor Ambarus <tudor.ambarus@linaro.org>\nCc: Vincent Mailhol <mailhol@kernel.org>\nCc: Yixun Lan <dlan@kernel.org>\nCc: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>\n\nv5->v6:\n- expand CC list to inform maintainers of touched drivers that the API\n is becoming unavailable\nv2->v5: none\nv1->v2:\n- collect tag\n- fix path to phy-provider.h\n- update commit message with the 4th point of contention\n---\n drivers/phy/phy-core.c | 34 +++\n drivers/phy/phy-provider.h | 256 +++++++++++++++++\n include/linux/phy/phy-props.h | 75 +++++\n include/linux/phy/phy.h | 497 +++++++---------------------------\n 4 files changed, 456 insertions(+), 406 deletions(-)\n create mode 100644 drivers/phy/phy-provider.h\n create mode 100644 include/linux/phy/phy-props.h", "diff": "diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c\nindex 21aaf2f76e53..a1aff00fba7c 100644\n--- a/drivers/phy/phy-core.c\n+++ b/drivers/phy/phy-core.c\n@@ -20,6 +20,22 @@\n #include <linux/pm_runtime.h>\n #include <linux/regulator/consumer.h>\n \n+#define\tto_phy(a)\t(container_of((a), struct phy, dev))\n+\n+/**\n+ * struct phy_lookup - PHY association in list of phys managed by the phy driver\n+ * @node: list node\n+ * @dev_id: the device of the association\n+ * @con_id: connection ID string on device\n+ * @phy: the phy of the association\n+ */\n+struct phy_lookup {\n+\tstruct list_head node;\n+\tconst char *dev_id;\n+\tconst char *con_id;\n+\tstruct phy *phy;\n+};\n+\n static void phy_release(struct device *dev);\n static const struct class phy_class = {\n \t.name = \"phy\",\n@@ -606,6 +622,24 @@ int phy_validate(struct phy *phy, enum phy_mode mode, int submode,\n }\n EXPORT_SYMBOL_GPL(phy_validate);\n \n+enum phy_mode phy_get_mode(struct phy *phy)\n+{\n+\treturn phy->attrs.mode;\n+}\n+EXPORT_SYMBOL_GPL(phy_get_mode);\n+\n+int phy_get_bus_width(struct phy *phy)\n+{\n+\treturn phy->attrs.bus_width;\n+}\n+EXPORT_SYMBOL_GPL(phy_get_bus_width);\n+\n+void phy_set_bus_width(struct phy *phy, int bus_width)\n+{\n+\tphy->attrs.bus_width = bus_width;\n+}\n+EXPORT_SYMBOL_GPL(phy_set_bus_width);\n+\n /**\n * _of_phy_get() - lookup and obtain a reference to a phy by phandle\n * @np: device_node for which to get the phy\ndiff --git a/drivers/phy/phy-provider.h b/drivers/phy/phy-provider.h\nnew file mode 100644\nindex 000000000000..0637278a2d8d\n--- /dev/null\n+++ b/drivers/phy/phy-provider.h\n@@ -0,0 +1,256 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+/*\n+ * phy-provider.h -- Generic PHY provider API\n+ *\n+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com\n+ *\n+ * Author: Kishon Vijay Abraham I <kishon@ti.com>\n+ */\n+#ifndef __PHY_PROVIDER_H\n+#define __PHY_PROVIDER_H\n+\n+#include <linux/err.h>\n+#include <linux/of.h>\n+#include <linux/device.h>\n+#include <linux/regulator/consumer.h>\n+#include <linux/phy/phy-props.h>\n+\n+struct phy;\n+\n+/**\n+ * struct phy_ops - set of function pointers for performing phy operations\n+ * @init: operation to be performed for initializing phy\n+ * @exit: operation to be performed while exiting\n+ * @power_on: powering on the phy\n+ * @power_off: powering off the phy\n+ * @set_mode: set the mode of the phy\n+ * @set_media: set the media type of the phy (optional)\n+ * @set_speed: set the speed of the phy (optional)\n+ * @reset: resetting the phy\n+ * @calibrate: calibrate the phy\n+ * @notify_phystate: notify and configure the phy for a particular state\n+ * @release: ops to be performed while the consumer relinquishes the PHY\n+ * @owner: the module owner containing the ops\n+ */\n+struct phy_ops {\n+\tint\t(*init)(struct phy *phy);\n+\tint\t(*exit)(struct phy *phy);\n+\tint\t(*power_on)(struct phy *phy);\n+\tint\t(*power_off)(struct phy *phy);\n+\tint\t(*set_mode)(struct phy *phy, enum phy_mode mode, int submode);\n+\tint\t(*set_media)(struct phy *phy, enum phy_media media);\n+\tint\t(*set_speed)(struct phy *phy, int speed);\n+\n+\t/**\n+\t * @configure:\n+\t *\n+\t * Optional.\n+\t *\n+\t * Used to change the PHY parameters. phy_init() must have\n+\t * been called on the phy.\n+\t *\n+\t * Returns: 0 if successful, an negative error code otherwise\n+\t */\n+\tint\t(*configure)(struct phy *phy, union phy_configure_opts *opts);\n+\n+\t/**\n+\t * @validate:\n+\t *\n+\t * Optional.\n+\t *\n+\t * Used to check that the current set of parameters can be\n+\t * handled by the phy. Implementations are free to tune the\n+\t * parameters passed as arguments if needed by some\n+\t * implementation detail or constraints. It must not change\n+\t * any actual configuration of the PHY, so calling it as many\n+\t * times as deemed fit by the consumer must have no side\n+\t * effect.\n+\t *\n+\t * Returns: 0 if the configuration can be applied, an negative\n+\t * error code otherwise\n+\t */\n+\tint\t(*validate)(struct phy *phy, enum phy_mode mode, int submode,\n+\t\t\t union phy_configure_opts *opts);\n+\tint\t(*reset)(struct phy *phy);\n+\tint\t(*calibrate)(struct phy *phy);\n+\n+\t/* notify phy connect status change */\n+\tint\t(*connect)(struct phy *phy, int port);\n+\tint\t(*disconnect)(struct phy *phy, int port);\n+\n+\tint\t(*notify_phystate)(struct phy *phy, union phy_notify state);\n+\tvoid\t(*release)(struct phy *phy);\n+\tstruct module *owner;\n+};\n+\n+/**\n+ * struct phy_attrs - represents phy attributes\n+ * @bus_width: Data path width implemented by PHY\n+ * @max_link_rate: Maximum link rate supported by PHY (units to be decided by producer and consumer)\n+ * @mode: PHY mode\n+ */\n+struct phy_attrs {\n+\tu32\t\t\tbus_width;\n+\tu32\t\t\tmax_link_rate;\n+\tenum phy_mode\t\tmode;\n+};\n+\n+/**\n+ * struct phy - represents the phy device\n+ * @dev: phy device\n+ * @id: id of the phy device\n+ * @ops: function pointers for performing phy operations\n+ * @mutex: mutex to protect phy_ops\n+ * @lockdep_key: lockdep information for this mutex\n+ * @init_count: used to protect when the PHY is used by multiple consumers\n+ * @power_count: used to protect when the PHY is used by multiple consumers\n+ * @attrs: used to specify PHY specific attributes\n+ * @pwr: power regulator associated with the phy\n+ * @debugfs: debugfs directory\n+ */\n+struct phy {\n+\tstruct device\t\tdev;\n+\tint\t\t\tid;\n+\tconst struct phy_ops\t*ops;\n+\tstruct mutex\t\tmutex;\n+\tstruct lock_class_key\tlockdep_key;\n+\tint\t\t\tinit_count;\n+\tint\t\t\tpower_count;\n+\tstruct phy_attrs\tattrs;\n+\tstruct regulator\t*pwr;\n+\tstruct dentry\t\t*debugfs;\n+};\n+\n+/**\n+ * struct phy_provider - represents the phy provider\n+ * @dev: phy provider device\n+ * @children: can be used to override the default (dev->of_node) child node\n+ * @owner: the module owner having of_xlate\n+ * @list: to maintain a linked list of PHY providers\n+ * @of_xlate: function pointer to obtain phy instance from phy pointer\n+ */\n+struct phy_provider {\n+\tstruct device\t\t*dev;\n+\tstruct device_node\t*children;\n+\tstruct module\t\t*owner;\n+\tstruct list_head\tlist;\n+\tstruct phy *(*of_xlate)(struct device *dev,\n+\t\t\t\tconst struct of_phandle_args *args);\n+};\n+\n+#define\tof_phy_provider_register(dev, xlate)\t\\\n+\t__of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))\n+\n+#define\tdevm_of_phy_provider_register(dev, xlate)\t\\\n+\t__devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))\n+\n+#define of_phy_provider_register_full(dev, children, xlate) \\\n+\t__of_phy_provider_register(dev, children, THIS_MODULE, xlate)\n+\n+#define devm_of_phy_provider_register_full(dev, children, xlate) \\\n+\t__devm_of_phy_provider_register(dev, children, THIS_MODULE, xlate)\n+\n+static inline void phy_set_drvdata(struct phy *phy, void *data)\n+{\n+\tdev_set_drvdata(&phy->dev, data);\n+}\n+\n+static inline void *phy_get_drvdata(struct phy *phy)\n+{\n+\treturn dev_get_drvdata(&phy->dev);\n+}\n+\n+#if IS_ENABLED(CONFIG_GENERIC_PHY)\n+struct phy *phy_create(struct device *dev, struct device_node *node,\n+\t\t const struct phy_ops *ops);\n+struct phy *devm_phy_create(struct device *dev, struct device_node *node,\n+\t\t\t const struct phy_ops *ops);\n+void phy_destroy(struct phy *phy);\n+void devm_phy_destroy(struct device *dev, struct phy *phy);\n+\n+struct phy_provider *\n+__of_phy_provider_register(struct device *dev, struct device_node *children,\n+\t\t\t struct module *owner,\n+\t\t\t struct phy *(*of_xlate)(struct device *dev,\n+\t\t\t\t\t\t const struct of_phandle_args *args));\n+struct phy_provider *\n+__devm_of_phy_provider_register(struct device *dev, struct device_node *children,\n+\t\t\t\tstruct module *owner,\n+\t\t\t\tstruct phy *(*of_xlate)(struct device *dev,\n+\t\t\t\t\t\t\tconst struct of_phandle_args *args));\n+void of_phy_provider_unregister(struct phy_provider *phy_provider);\n+void devm_of_phy_provider_unregister(struct device *dev,\n+\t\t\t\t struct phy_provider *phy_provider);\n+int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id);\n+void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);\n+struct phy *of_phy_simple_xlate(struct device *dev,\n+\t\t\t\tconst struct of_phandle_args *args);\n+#else\n+static inline struct phy *phy_create(struct device *dev,\n+\t\t\t\t struct device_node *node,\n+\t\t\t\t const struct phy_ops *ops)\n+{\n+\treturn ERR_PTR(-ENOSYS);\n+}\n+\n+static inline struct phy *devm_phy_create(struct device *dev,\n+\t\t\t\t\t struct device_node *node,\n+\t\t\t\t\t const struct phy_ops *ops)\n+{\n+\treturn ERR_PTR(-ENOSYS);\n+}\n+\n+static inline void phy_destroy(struct phy *phy)\n+{\n+}\n+\n+static inline void devm_phy_destroy(struct device *dev, struct phy *phy)\n+{\n+}\n+\n+static inline struct phy_provider *\n+__of_phy_provider_register(struct device *dev, struct device_node *children,\n+\t\t\t struct module *owner,\n+\t\t\t struct phy *(*of_xlate)(struct device *dev,\n+\t\t\t\t\t\t const struct of_phandle_args *args))\n+{\n+\treturn ERR_PTR(-ENOSYS);\n+}\n+\n+static inline struct phy_provider *\n+__devm_of_phy_provider_register(struct device *dev, struct device_node *children,\n+\t\t\t\tstruct module *owner,\n+\t\t\t\tstruct phy *(*of_xlate)(struct device *dev,\n+\t\t\t\t\t\t\tconst struct of_phandle_args *args))\n+{\n+\treturn ERR_PTR(-ENOSYS);\n+}\n+\n+static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)\n+{\n+}\n+\n+static inline void devm_of_phy_provider_unregister(struct device *dev,\n+\t\t\t\t\t\t struct phy_provider *phy_provider)\n+{\n+}\n+\n+static inline int phy_create_lookup(struct phy *phy, const char *con_id,\n+\t\t\t\t const char *dev_id)\n+{\n+\treturn 0;\n+}\n+\n+static inline void phy_remove_lookup(struct phy *phy, const char *con_id,\n+\t\t\t\t const char *dev_id)\n+{\n+}\n+\n+static inline struct phy *of_phy_simple_xlate(struct device *dev,\n+\t\t\t\t\t const struct of_phandle_args *args)\n+{\n+\treturn ERR_PTR(-ENOSYS);\n+}\n+#endif /* IS_ENABLED(CONFIG_GENERIC_PHY) */\n+\n+#endif /* __PHY_PROVIDER_H */\ndiff --git a/include/linux/phy/phy-props.h b/include/linux/phy/phy-props.h\nnew file mode 100644\nindex 000000000000..11f36738165f\n--- /dev/null\n+++ b/include/linux/phy/phy-props.h\n@@ -0,0 +1,75 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+/*\n+ * phy-provider.h -- Generic PHY properties\n+ *\n+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com\n+ *\n+ * Author: Kishon Vijay Abraham I <kishon@ti.com>\n+ */\n+#ifndef __PHY_PROPS_H\n+#define __PHY_PROPS_H\n+\n+#include <linux/phy/phy-dp.h>\n+#include <linux/phy/phy-hdmi.h>\n+#include <linux/phy/phy-lvds.h>\n+#include <linux/phy/phy-mipi-dphy.h>\n+\n+enum phy_mode {\n+\tPHY_MODE_INVALID,\n+\tPHY_MODE_USB_HOST,\n+\tPHY_MODE_USB_HOST_LS,\n+\tPHY_MODE_USB_HOST_FS,\n+\tPHY_MODE_USB_HOST_HS,\n+\tPHY_MODE_USB_HOST_SS,\n+\tPHY_MODE_USB_DEVICE,\n+\tPHY_MODE_USB_DEVICE_LS,\n+\tPHY_MODE_USB_DEVICE_FS,\n+\tPHY_MODE_USB_DEVICE_HS,\n+\tPHY_MODE_USB_DEVICE_SS,\n+\tPHY_MODE_USB_OTG,\n+\tPHY_MODE_UFS_HS_A,\n+\tPHY_MODE_UFS_HS_B,\n+\tPHY_MODE_PCIE,\n+\tPHY_MODE_ETHERNET,\n+\tPHY_MODE_MIPI_DPHY,\n+\tPHY_MODE_SATA,\n+\tPHY_MODE_LVDS,\n+\tPHY_MODE_DP,\n+\tPHY_MODE_HDMI,\n+};\n+\n+enum phy_media {\n+\tPHY_MEDIA_DEFAULT,\n+\tPHY_MEDIA_SR,\n+\tPHY_MEDIA_DAC,\n+};\n+\n+enum phy_ufs_state {\n+\tPHY_UFS_HIBERN8_ENTER,\n+\tPHY_UFS_HIBERN8_EXIT,\n+};\n+\n+union phy_notify {\n+\tenum phy_ufs_state ufs_state;\n+};\n+\n+/**\n+ * union phy_configure_opts - Opaque generic phy configuration\n+ *\n+ * @mipi_dphy:\tConfiguration set applicable for phys supporting\n+ *\t\tthe MIPI_DPHY phy mode.\n+ * @dp:\t\tConfiguration set applicable for phys supporting\n+ *\t\tthe DisplayPort protocol.\n+ * @lvds:\tConfiguration set applicable for phys supporting\n+ *\t\tthe LVDS phy mode.\n+ * @hdmi:\tConfiguration set applicable for phys supporting\n+ *\t\tthe HDMI phy mode.\n+ */\n+union phy_configure_opts {\n+\tstruct phy_configure_opts_mipi_dphy\tmipi_dphy;\n+\tstruct phy_configure_opts_dp\t\tdp;\n+\tstruct phy_configure_opts_lvds\t\tlvds;\n+\tstruct phy_configure_opts_hdmi\t\thdmi;\n+};\n+\n+#endif /* __PHY_PROPS_H */\ndiff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h\nindex ea47975e288a..f208edd25afe 100644\n--- a/include/linux/phy/phy.h\n+++ b/include/linux/phy/phy.h\n@@ -1,246 +1,38 @@\n /* SPDX-License-Identifier: GPL-2.0-or-later */\n /*\n- * phy.h -- generic phy header file\n+ * phy.h -- Generic PHY consumer API\n *\n * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com\n *\n * Author: Kishon Vijay Abraham I <kishon@ti.com>\n */\n \n-#ifndef __DRIVERS_PHY_H\n-#define __DRIVERS_PHY_H\n+#ifndef __PHY_CONSUMER_H\n+#define __PHY_CONSUMER_H\n \n-#include <linux/err.h>\n-#include <linux/of.h>\n-#include <linux/device.h>\n-#include <linux/pm_runtime.h>\n-#include <linux/regulator/consumer.h>\n+#include <linux/phy/phy-props.h>\n \n-#include <linux/phy/phy-dp.h>\n-#include <linux/phy/phy-hdmi.h>\n-#include <linux/phy/phy-lvds.h>\n-#include <linux/phy/phy-mipi-dphy.h>\n+#include \"../../../drivers/phy/phy-provider.h\"\n \n+struct device;\n+struct device_node;\n struct phy;\n \n-enum phy_mode {\n-\tPHY_MODE_INVALID,\n-\tPHY_MODE_USB_HOST,\n-\tPHY_MODE_USB_HOST_LS,\n-\tPHY_MODE_USB_HOST_FS,\n-\tPHY_MODE_USB_HOST_HS,\n-\tPHY_MODE_USB_HOST_SS,\n-\tPHY_MODE_USB_DEVICE,\n-\tPHY_MODE_USB_DEVICE_LS,\n-\tPHY_MODE_USB_DEVICE_FS,\n-\tPHY_MODE_USB_DEVICE_HS,\n-\tPHY_MODE_USB_DEVICE_SS,\n-\tPHY_MODE_USB_OTG,\n-\tPHY_MODE_UFS_HS_A,\n-\tPHY_MODE_UFS_HS_B,\n-\tPHY_MODE_PCIE,\n-\tPHY_MODE_ETHERNET,\n-\tPHY_MODE_MIPI_DPHY,\n-\tPHY_MODE_SATA,\n-\tPHY_MODE_LVDS,\n-\tPHY_MODE_DP,\n-\tPHY_MODE_HDMI,\n-};\n-\n-enum phy_media {\n-\tPHY_MEDIA_DEFAULT,\n-\tPHY_MEDIA_SR,\n-\tPHY_MEDIA_DAC,\n-};\n-\n-enum phy_ufs_state {\n-\tPHY_UFS_HIBERN8_ENTER,\n-\tPHY_UFS_HIBERN8_EXIT,\n-};\n-\n-union phy_notify {\n-\tenum phy_ufs_state ufs_state;\n-};\n-\n-/**\n- * union phy_configure_opts - Opaque generic phy configuration\n- *\n- * @mipi_dphy:\tConfiguration set applicable for phys supporting\n- *\t\tthe MIPI_DPHY phy mode.\n- * @dp:\t\tConfiguration set applicable for phys supporting\n- *\t\tthe DisplayPort protocol.\n- * @lvds:\tConfiguration set applicable for phys supporting\n- *\t\tthe LVDS phy mode.\n- * @hdmi:\tConfiguration set applicable for phys supporting\n- *\t\tthe HDMI phy mode.\n- */\n-union phy_configure_opts {\n-\tstruct phy_configure_opts_mipi_dphy\tmipi_dphy;\n-\tstruct phy_configure_opts_dp\t\tdp;\n-\tstruct phy_configure_opts_lvds\t\tlvds;\n-\tstruct phy_configure_opts_hdmi\t\thdmi;\n-};\n-\n-/**\n- * struct phy_ops - set of function pointers for performing phy operations\n- * @init: operation to be performed for initializing phy\n- * @exit: operation to be performed while exiting\n- * @power_on: powering on the phy\n- * @power_off: powering off the phy\n- * @set_mode: set the mode of the phy\n- * @set_media: set the media type of the phy (optional)\n- * @set_speed: set the speed of the phy (optional)\n- * @reset: resetting the phy\n- * @calibrate: calibrate the phy\n- * @notify_phystate: notify and configure the phy for a particular state\n- * @release: ops to be performed while the consumer relinquishes the PHY\n- * @owner: the module owner containing the ops\n- */\n-struct phy_ops {\n-\tint\t(*init)(struct phy *phy);\n-\tint\t(*exit)(struct phy *phy);\n-\tint\t(*power_on)(struct phy *phy);\n-\tint\t(*power_off)(struct phy *phy);\n-\tint\t(*set_mode)(struct phy *phy, enum phy_mode mode, int submode);\n-\tint\t(*set_media)(struct phy *phy, enum phy_media media);\n-\tint\t(*set_speed)(struct phy *phy, int speed);\n-\n-\t/**\n-\t * @configure:\n-\t *\n-\t * Optional.\n-\t *\n-\t * Used to change the PHY parameters. phy_init() must have\n-\t * been called on the phy.\n-\t *\n-\t * Returns: 0 if successful, an negative error code otherwise\n-\t */\n-\tint\t(*configure)(struct phy *phy, union phy_configure_opts *opts);\n-\n-\t/**\n-\t * @validate:\n-\t *\n-\t * Optional.\n-\t *\n-\t * Used to check that the current set of parameters can be\n-\t * handled by the phy. Implementations are free to tune the\n-\t * parameters passed as arguments if needed by some\n-\t * implementation detail or constraints. It must not change\n-\t * any actual configuration of the PHY, so calling it as many\n-\t * times as deemed fit by the consumer must have no side\n-\t * effect.\n-\t *\n-\t * Returns: 0 if the configuration can be applied, an negative\n-\t * error code otherwise\n-\t */\n-\tint\t(*validate)(struct phy *phy, enum phy_mode mode, int submode,\n-\t\t\t union phy_configure_opts *opts);\n-\tint\t(*reset)(struct phy *phy);\n-\tint\t(*calibrate)(struct phy *phy);\n-\n-\t/* notify phy connect status change */\n-\tint\t(*connect)(struct phy *phy, int port);\n-\tint\t(*disconnect)(struct phy *phy, int port);\n-\n-\tint\t(*notify_phystate)(struct phy *phy, union phy_notify state);\n-\tvoid\t(*release)(struct phy *phy);\n-\tstruct module *owner;\n-};\n-\n-/**\n- * struct phy_attrs - represents phy attributes\n- * @bus_width: Data path width implemented by PHY\n- * @max_link_rate: Maximum link rate supported by PHY (units to be decided by producer and consumer)\n- * @mode: PHY mode\n- */\n-struct phy_attrs {\n-\tu32\t\t\tbus_width;\n-\tu32\t\t\tmax_link_rate;\n-\tenum phy_mode\t\tmode;\n-};\n-\n-/**\n- * struct phy - represents the phy device\n- * @dev: phy device\n- * @id: id of the phy device\n- * @ops: function pointers for performing phy operations\n- * @mutex: mutex to protect phy_ops\n- * @lockdep_key: lockdep information for this mutex\n- * @init_count: used to protect when the PHY is used by multiple consumers\n- * @power_count: used to protect when the PHY is used by multiple consumers\n- * @attrs: used to specify PHY specific attributes\n- * @pwr: power regulator associated with the phy\n- * @debugfs: debugfs directory\n- */\n-struct phy {\n-\tstruct device\t\tdev;\n-\tint\t\t\tid;\n-\tconst struct phy_ops\t*ops;\n-\tstruct mutex\t\tmutex;\n-\tstruct lock_class_key\tlockdep_key;\n-\tint\t\t\tinit_count;\n-\tint\t\t\tpower_count;\n-\tstruct phy_attrs\tattrs;\n-\tstruct regulator\t*pwr;\n-\tstruct dentry\t\t*debugfs;\n-};\n-\n-/**\n- * struct phy_provider - represents the phy provider\n- * @dev: phy provider device\n- * @children: can be used to override the default (dev->of_node) child node\n- * @owner: the module owner having of_xlate\n- * @list: to maintain a linked list of PHY providers\n- * @of_xlate: function pointer to obtain phy instance from phy pointer\n- */\n-struct phy_provider {\n-\tstruct device\t\t*dev;\n-\tstruct device_node\t*children;\n-\tstruct module\t\t*owner;\n-\tstruct list_head\tlist;\n-\tstruct phy * (*of_xlate)(struct device *dev,\n-\t\t\t\t const struct of_phandle_args *args);\n-};\n-\n-/**\n- * struct phy_lookup - PHY association in list of phys managed by the phy driver\n- * @node: list node\n- * @dev_id: the device of the association\n- * @con_id: connection ID string on device\n- * @phy: the phy of the association\n- */\n-struct phy_lookup {\n-\tstruct list_head node;\n-\tconst char *dev_id;\n-\tconst char *con_id;\n-\tstruct phy *phy;\n-};\n-\n-#define\tto_phy(a)\t(container_of((a), struct phy, dev))\n-\n-#define\tof_phy_provider_register(dev, xlate)\t\\\n-\t__of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))\n-\n-#define\tdevm_of_phy_provider_register(dev, xlate)\t\\\n-\t__devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))\n-\n-#define of_phy_provider_register_full(dev, children, xlate) \\\n-\t__of_phy_provider_register(dev, children, THIS_MODULE, xlate)\n-\n-#define devm_of_phy_provider_register_full(dev, children, xlate) \\\n-\t__devm_of_phy_provider_register(dev, children, THIS_MODULE, xlate)\n-\n-static inline void phy_set_drvdata(struct phy *phy, void *data)\n-{\n-\tdev_set_drvdata(&phy->dev, data);\n-}\n-\n-static inline void *phy_get_drvdata(struct phy *phy)\n-{\n-\treturn dev_get_drvdata(&phy->dev);\n-}\n-\n #if IS_ENABLED(CONFIG_GENERIC_PHY)\n+struct phy *phy_get(struct device *dev, const char *string);\n+struct phy *devm_phy_get(struct device *dev, const char *string);\n+struct phy *devm_phy_optional_get(struct device *dev, const char *string);\n+struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,\n+\t\t\t const char *con_id);\n+struct phy *devm_of_phy_optional_get(struct device *dev, struct device_node *np,\n+\t\t\t\t const char *con_id);\n+struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,\n+\t\t\t\t int index);\n+void of_phy_put(struct phy *phy);\n+void phy_put(struct device *dev, struct phy *phy);\n+void devm_phy_put(struct device *dev, struct phy *phy);\n+struct phy *of_phy_get(struct device_node *np, const char *con_id);\n+\n int phy_pm_runtime_get(struct phy *phy);\n int phy_pm_runtime_get_sync(struct phy *phy);\n void phy_pm_runtime_put(struct phy *phy);\n@@ -257,59 +49,69 @@ int phy_set_speed(struct phy *phy, int speed);\n int phy_configure(struct phy *phy, union phy_configure_opts *opts);\n int phy_validate(struct phy *phy, enum phy_mode mode, int submode,\n \t\t union phy_configure_opts *opts);\n-\n-static inline enum phy_mode phy_get_mode(struct phy *phy)\n-{\n-\treturn phy->attrs.mode;\n-}\n+enum phy_mode phy_get_mode(struct phy *phy);\n int phy_reset(struct phy *phy);\n int phy_calibrate(struct phy *phy);\n int phy_notify_connect(struct phy *phy, int port);\n int phy_notify_disconnect(struct phy *phy, int port);\n int phy_notify_state(struct phy *phy, union phy_notify state);\n-static inline int phy_get_bus_width(struct phy *phy)\n+int phy_get_bus_width(struct phy *phy);\n+void phy_set_bus_width(struct phy *phy, int bus_width);\n+#else\n+static inline struct phy *phy_get(struct device *dev, const char *string)\n {\n-\treturn phy->attrs.bus_width;\n+\treturn ERR_PTR(-ENOSYS);\n }\n-static inline void phy_set_bus_width(struct phy *phy, int bus_width)\n+\n+static inline struct phy *devm_phy_get(struct device *dev, const char *string)\n {\n-\tphy->attrs.bus_width = bus_width;\n+\treturn ERR_PTR(-ENOSYS);\n }\n-struct phy *phy_get(struct device *dev, const char *string);\n-struct phy *devm_phy_get(struct device *dev, const char *string);\n-struct phy *devm_phy_optional_get(struct device *dev, const char *string);\n-struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,\n-\t\t\t const char *con_id);\n-struct phy *devm_of_phy_optional_get(struct device *dev, struct device_node *np,\n-\t\t\t\t const char *con_id);\n-struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,\n-\t\t\t\t int index);\n-void of_phy_put(struct phy *phy);\n-void phy_put(struct device *dev, struct phy *phy);\n-void devm_phy_put(struct device *dev, struct phy *phy);\n-struct phy *of_phy_get(struct device_node *np, const char *con_id);\n-struct phy *of_phy_simple_xlate(struct device *dev,\n-\t\t\t\tconst struct of_phandle_args *args);\n-struct phy *phy_create(struct device *dev, struct device_node *node,\n-\t\t const struct phy_ops *ops);\n-struct phy *devm_phy_create(struct device *dev, struct device_node *node,\n-\t\t\t const struct phy_ops *ops);\n-void phy_destroy(struct phy *phy);\n-void devm_phy_destroy(struct device *dev, struct phy *phy);\n-struct phy_provider *__of_phy_provider_register(struct device *dev,\n-\tstruct device_node *children, struct module *owner,\n-\tstruct phy * (*of_xlate)(struct device *dev,\n-\t\t\t\t const struct of_phandle_args *args));\n-struct phy_provider *__devm_of_phy_provider_register(struct device *dev,\n-\tstruct device_node *children, struct module *owner,\n-\tstruct phy * (*of_xlate)(struct device *dev,\n-\t\t\t\t const struct of_phandle_args *args));\n-void of_phy_provider_unregister(struct phy_provider *phy_provider);\n-void devm_of_phy_provider_unregister(struct device *dev,\n-\tstruct phy_provider *phy_provider);\n-int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id);\n-void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);\n-#else\n+\n+static inline struct phy *devm_phy_optional_get(struct device *dev,\n+\t\t\t\t\t\tconst char *string)\n+{\n+\treturn NULL;\n+}\n+\n+static inline struct phy *devm_of_phy_get(struct device *dev,\n+\t\t\t\t\t struct device_node *np,\n+\t\t\t\t\t const char *con_id)\n+{\n+\treturn ERR_PTR(-ENOSYS);\n+}\n+\n+static inline struct phy *devm_of_phy_optional_get(struct device *dev,\n+\t\t\t\t\t\t struct device_node *np,\n+\t\t\t\t\t\t const char *con_id)\n+{\n+\treturn NULL;\n+}\n+\n+static inline struct phy *devm_of_phy_get_by_index(struct device *dev,\n+\t\t\t\t\t\t struct device_node *np,\n+\t\t\t\t\t\t int index)\n+{\n+\treturn ERR_PTR(-ENOSYS);\n+}\n+\n+static inline void of_phy_put(struct phy *phy)\n+{\n+}\n+\n+static inline void phy_put(struct device *dev, struct phy *phy)\n+{\n+}\n+\n+static inline void devm_phy_put(struct device *dev, struct phy *phy)\n+{\n+}\n+\n+static inline struct phy *of_phy_get(struct device_node *np, const char *con_id)\n+{\n+\treturn ERR_PTR(-ENOSYS);\n+}\n+\n static inline int phy_pm_runtime_get(struct phy *phy)\n {\n \tif (!phy)\n@@ -388,61 +190,59 @@ static inline int phy_set_speed(struct phy *phy, int speed)\n \treturn -ENODEV;\n }\n \n-static inline enum phy_mode phy_get_mode(struct phy *phy)\n-{\n-\treturn PHY_MODE_INVALID;\n-}\n-\n-static inline int phy_reset(struct phy *phy)\n+static inline int phy_configure(struct phy *phy,\n+\t\t\t\tunion phy_configure_opts *opts)\n {\n \tif (!phy)\n \t\treturn 0;\n \treturn -ENOSYS;\n }\n \n-static inline int phy_calibrate(struct phy *phy)\n+static inline int phy_validate(struct phy *phy, enum phy_mode mode, int submode,\n+\t\t\t union phy_configure_opts *opts)\n {\n \tif (!phy)\n \t\treturn 0;\n \treturn -ENOSYS;\n }\n \n-static inline int phy_notify_connect(struct phy *phy, int index)\n+static inline enum phy_mode phy_get_mode(struct phy *phy)\n+{\n+\treturn PHY_MODE_INVALID;\n+}\n+\n+static inline int phy_reset(struct phy *phy)\n {\n \tif (!phy)\n \t\treturn 0;\n \treturn -ENOSYS;\n }\n \n-static inline int phy_notify_disconnect(struct phy *phy, int index)\n+static inline int phy_calibrate(struct phy *phy)\n {\n \tif (!phy)\n \t\treturn 0;\n \treturn -ENOSYS;\n }\n \n-static inline int phy_notify_state(struct phy *phy, union phy_notify state)\n+static inline int phy_notify_connect(struct phy *phy, int index)\n {\n \tif (!phy)\n \t\treturn 0;\n \treturn -ENOSYS;\n }\n \n-static inline int phy_configure(struct phy *phy,\n-\t\t\t\tunion phy_configure_opts *opts)\n+static inline int phy_notify_disconnect(struct phy *phy, int index)\n {\n \tif (!phy)\n \t\treturn 0;\n-\n \treturn -ENOSYS;\n }\n \n-static inline int phy_validate(struct phy *phy, enum phy_mode mode, int submode,\n-\t\t\t union phy_configure_opts *opts)\n+static inline int phy_notify_state(struct phy *phy, union phy_notify state)\n {\n \tif (!phy)\n \t\treturn 0;\n-\n \treturn -ENOSYS;\n }\n \n@@ -453,122 +253,7 @@ static inline int phy_get_bus_width(struct phy *phy)\n \n static inline void phy_set_bus_width(struct phy *phy, int bus_width)\n {\n-\treturn;\n-}\n-\n-static inline struct phy *phy_get(struct device *dev, const char *string)\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline struct phy *devm_phy_get(struct device *dev, const char *string)\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline struct phy *devm_phy_optional_get(struct device *dev,\n-\t\t\t\t\t\tconst char *string)\n-{\n-\treturn NULL;\n-}\n-\n-static inline struct phy *devm_of_phy_get(struct device *dev,\n-\t\t\t\t\t struct device_node *np,\n-\t\t\t\t\t const char *con_id)\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline struct phy *devm_of_phy_optional_get(struct device *dev,\n-\t\t\t\t\t\t struct device_node *np,\n-\t\t\t\t\t\t const char *con_id)\n-{\n-\treturn NULL;\n-}\n-\n-static inline struct phy *devm_of_phy_get_by_index(struct device *dev,\n-\t\t\t\t\t\t struct device_node *np,\n-\t\t\t\t\t\t int index)\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline void of_phy_put(struct phy *phy)\n-{\n-}\n-\n-static inline void phy_put(struct device *dev, struct phy *phy)\n-{\n-}\n-\n-static inline void devm_phy_put(struct device *dev, struct phy *phy)\n-{\n-}\n-\n-static inline struct phy *of_phy_get(struct device_node *np, const char *con_id)\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline struct phy *of_phy_simple_xlate(struct device *dev,\n-\t\t\t\t\t const struct of_phandle_args *args)\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline struct phy *phy_create(struct device *dev,\n-\t\t\t\t struct device_node *node,\n-\t\t\t\t const struct phy_ops *ops)\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline struct phy *devm_phy_create(struct device *dev,\n-\t\t\t\t\t struct device_node *node,\n-\t\t\t\t\t const struct phy_ops *ops)\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline void phy_destroy(struct phy *phy)\n-{\n-}\n-\n-static inline void devm_phy_destroy(struct device *dev, struct phy *phy)\n-{\n-}\n-\n-static inline struct phy_provider *__of_phy_provider_register(\n-\tstruct device *dev, struct device_node *children, struct module *owner,\n-\tstruct phy * (*of_xlate)(struct device *dev,\n-\t\t\t\t const struct of_phandle_args *args))\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline struct phy_provider *__devm_of_phy_provider_register(struct device\n-\t*dev, struct device_node *children, struct module *owner,\n-\tstruct phy * (*of_xlate)(struct device *dev,\n-\t\t\t\t const struct of_phandle_args *args))\n-{\n-\treturn ERR_PTR(-ENOSYS);\n-}\n-\n-static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)\n-{\n-}\n-\n-static inline void devm_of_phy_provider_unregister(struct device *dev,\n-\tstruct phy_provider *phy_provider)\n-{\n-}\n-static inline int\n-phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id)\n-{\n-\treturn 0;\n }\n-static inline void phy_remove_lookup(struct phy *phy, const char *con_id,\n-\t\t\t\t const char *dev_id) { }\n-#endif\n+#endif /* IS_ENABLED(CONFIG_GENERIC_PHY) */\n \n-#endif /* __DRIVERS_PHY_H */\n+#endif /* __PHY_CONSUMER_H */\n", "prefixes": [ "v6", "phy-next", "16/28" ] }