Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2194318/?format=api
{ "id": 2194318, "url": "http://patchwork.ozlabs.org/api/patches/2194318/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/patch/20260208-rz-sdio-mux-v9-2-9a3be13c1280@solid-run.com/", "project": { "id": 35, "url": "http://patchwork.ozlabs.org/api/projects/35/?format=api", "name": "Linux I2C development", "link_name": "linux-i2c", "list_id": "linux-i2c.vger.kernel.org", "list_email": "linux-i2c@vger.kernel.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260208-rz-sdio-mux-v9-2-9a3be13c1280@solid-run.com>", "list_archive_url": null, "date": "2026-02-08T15:38:57", "name": "[v9,2/7] mux: Add helper functions for getting optional and selected mux-state", "commit_ref": null, "pull_url": null, "state": "not-applicable", "archived": false, "hash": "5a01b7f07300a405e60c857561bf766ca3452c49", "submitter": { "id": 76995, "url": "http://patchwork.ozlabs.org/api/people/76995/?format=api", "name": "Josua Mayer", "email": "josua@solid-run.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-i2c/patch/20260208-rz-sdio-mux-v9-2-9a3be13c1280@solid-run.com/mbox/", "series": [ { "id": 491423, "url": "http://patchwork.ozlabs.org/api/series/491423/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/list/?series=491423", "date": "2026-02-08T15:38:56", "name": "mmc: host: renesas_sdhi_core: support configuring an optional sdio mux", "version": 9, "mbox": "http://patchwork.ozlabs.org/series/491423/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2194318/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2194318/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linux-i2c+bounces-15907-incoming=patchwork.ozlabs.org@vger.kernel.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-i2c@vger.kernel.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=solidrn.onmicrosoft.com header.i=@solidrn.onmicrosoft.com\n header.a=rsa-sha256 header.s=selector1-solidrn-onmicrosoft-com\n header.b=pEXFfHDU;\n\tdkim=pass (1024-bit key) header.d=solidrn.onmicrosoft.com\n header.i=@solidrn.onmicrosoft.com header.a=rsa-sha256\n header.s=selector1-solidrn-onmicrosoft-com header.b=pEXFfHDU;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-i2c+bounces-15907-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)", "smtp.subspace.kernel.org;\n\tdkim=pass (1024-bit key) header.d=solidrn.onmicrosoft.com\n header.i=@solidrn.onmicrosoft.com header.b=\"pEXFfHDU\";\n\tdkim=pass (1024-bit key) header.d=solidrn.onmicrosoft.com\n header.i=@solidrn.onmicrosoft.com header.b=\"pEXFfHDU\"", "smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=52.101.72.101", "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=solid-run.com", "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=solid-run.com" ], "Received": [ "from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\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 4f8Bqq3LfYz1xtr\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 09 Feb 2026 02:40:55 +1100 (AEDT)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 648B63044B83\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 8 Feb 2026 15:39:31 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 6CE5F364EBF;\n\tSun, 8 Feb 2026 15:39:28 +0000 (UTC)", "from AM0PR02CU008.outbound.protection.outlook.com\n (mail-westeuropeazon11023101.outbound.protection.outlook.com [52.101.72.101])\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 9109B365A19;\n\tSun, 8 Feb 2026 15:39:27 +0000 (UTC)", "from AS4PR09CA0004.eurprd09.prod.outlook.com (2603:10a6:20b:5e0::10)\n by VI1PR04MB7184.eurprd04.prod.outlook.com (2603:10a6:800:125::15) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.18; Sun, 8 Feb\n 2026 15:39:23 +0000", "from AMS1EPF0000004A.eurprd04.prod.outlook.com\n (2603:10a6:20b:5e0:cafe::52) by AS4PR09CA0004.outlook.office365.com\n (2603:10a6:20b:5e0::10) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9587.18 via Frontend Transport; Sun,\n 8 Feb 2026 15:39:17 +0000", "from eu-dlp.cloud-sec-av.com (52.17.62.50) by\n AMS1EPF0000004A.mail.protection.outlook.com (10.167.16.134) with Microsoft\n SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9587.10\n via Frontend Transport; Sun, 8 Feb 2026 15:39:23 +0000", "from emails-2350297-12-mt-prod-cp-eu-2.checkpointcloudsec.com\n (ip-10-20-6-212.eu-west-1.compute.internal [10.20.6.212])\n\tby mta-outgoing-dlp-431-mt-prod-cp-eu-2.checkpointcloudsec.com (Postfix) with\n ESMTPS id D1FD080010;\n\tSun, 8 Feb 2026 15:39:22 +0000 (UTC)", "from PAXPR04MB8749.eurprd04.prod.outlook.com (2603:10a6:102:21f::22)\n by PAXPR04MB9074.eurprd04.prod.outlook.com (2603:10a6:102:227::7) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.18; Sun, 8 Feb\n 2026 15:39:09 +0000", "from PAXPR04MB8749.eurprd04.prod.outlook.com\n ([fe80::d782:fbb2:be9a:43f1]) by PAXPR04MB8749.eurprd04.prod.outlook.com\n ([fe80::d782:fbb2:be9a:43f1%3]) with mapi id 15.20.9587.016; Sun, 8 Feb 2026\n 15:39:09 +0000" ], "ARC-Seal": [ "i=4; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1770565168; cv=fail;\n b=tff8t82XZJtekeaIs6+KvGw2yyDNVoOqOXFrWtovjAcMG7BDkvQ8pYUYKwUVfNdACSG8FTeKlxUVoRi+qeVwOf84pT9Iz6qNeeLRiB2Mr1y60hmkaeUQwiYu+COMEy6cXo/FOOw5BXsGCcgfaLP8qAN2iyEOWQviBtvaT2ZMDdo=", "i=3; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass;\n b=UjtYlUYLFdghfeyspM6pRaqCDy2QyVU8QmAuHYwhV5Y1CuzEo5iJb4jmy+vmJgxQayaFlQJJJtTqxsugSuQurztJ2nqP9Q2uD95tSS3Y2+KP4/FHyqgi0NLIJDzuK877hMCfSPs1mwjuKCFHYwojFQL5XixCEwX5ZYARf9zqjRWQYaTo5vqDUqOTo0oFbLMLAk5VCL2LxuiyPb/vZWl3nin4WI5SdeJDNJ8KuHxZ41MgjKeE6jp9HzligldFT/XolsTC1ZuYBuGjoVgj3H+blMzl4kkNKUQk6kQgBXxZAheCn3syF93E6b1bBvKsI/gP38HjnO2lyq+c4JpeX7Hh7Q==", "i=2; cv=pass; a=rsa-sha256; d=checkpointcloudsec.com;\n s=arcselector01; t=1770565162;\n b=Lx9Z6rvkCWHa87H00/C4w+U1wdBj7O26NCUxbFALBRg9Y0O2Q9ogtvYc5jmTYo9Im8/n3\n d75ycJY7KA04sskm1qjpDCGZDG5iH1PEOrlTVQ6hW+dqKGDrcpUuioOU1DjcrgGqa4o1WRt\n 73PVk2JYXwF6rEPvW/xrGgZEfNeS7Bo=", "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=LMbvLd0BeFfTUUulA7cKm1IYI1rfFjVLjgQAZzSwu44iGD1gzSnl4ibp+Thzak6ddVvEBFsUXg2iYexMd/NzrKlRIMDs2yM2T1GRmEJDQ3iNWSLuGq23WS/CzGa3+8N3OK/WAKKrrSp6bAlV3xWkEXSLB/iocVLVILZHvfvjJAoIGl7EkRU39Qa1nFHnqopqSg6jBA+DFb1qar5Y21wh8M86lmdNwUqlGF882shEwvd2O6JWWh/qAdKiFH5JsFMZ+TIxF/++mZyN+6tPZxQSBpd8W70jvRrCYCPa6fHfoY9CZceQ95w5JyNxlLghVRG8B/GO6uPyWd2+PwBMcgzZCw==" ], "ARC-Message-Signature": [ "i=4; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1770565168; c=relaxed/simple;\n\tbh=Exw4FOm3n3YV/7zqss2WtWQHfZybSYS25sbrGjMOiXg=;\n\th=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To:\n\t To:Cc:MIME-Version;\n b=eEN2L2JSeg2Nc8UrbglDz2Gc0upDk+EIWmSQNPm+dounP0KNgJrEdWV0xx411QqEbYeuto9ytKw3XYtkSpkB26MjBsLO+1vxA0iUAcsBYe6PsK7zsMXgFa8YekAv4JNG1+e+kWSMp82SEPITRiFIuYbH6i7LhScabtIFwOoDuos=", "i=3; 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=rcrPdd5V7JVI+Z4iqSY9JnnlAHfAmAt7JLa4RTerNpw=;\n b=YDQdIVLyMuGZl/yGDniHY3aHUSNBRWMmXSPqMeAJ9wFSfBFoFv8mwLrCjdlPVjc6RP5jXPiBcm49+eN2N/ZcrjTtZwNZgwceOfyIX1jN8hi9PstPoqiATgKi0X3oQZEikFmyNnbJhZisy58eSAuCEXi3uerJvCBPPnkMmmcWQcuBXqlVzN+kNWkq/LF+/NHHb+XQToYaNJriAhSwKkfBNbJQUDX0KnvbwbpekX9iH+kRjIhJPFrqm0gL4xTqj/cjM5yL9oooGKpL8jl7+B3SStc6mq8JWuE3Nu/btVMvvQjfbIf4M0KJotjMo8nK8bMR3sY3RMFVGtWwQu92JLftIg==", "i=2; a=rsa-sha256; c=relaxed/relaxed;\n d=checkpointcloudsec.com; s=arcselector01; t=1770565162; h=from : to :\n subject : date : message-id : content-type : mime-version;\n bh=rcrPdd5V7JVI+Z4iqSY9JnnlAHfAmAt7JLa4RTerNpw=;\n b=cHPNsNNJbNDTWElES9Grmx1PkneG61CkwPqm+HE95v1jsv8gZmKZSX6HT9CQaAhdCLkQM\n wNte5AtOJNYRsq0FrF9wwf41WpFepm1B9LRNv51LeBs4C6hSePNlsqTyrBx5ESZU30LOR0k\n hNhxAUdVeV2qUqNvL6W+YsgvUaXBMKA=", "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=rcrPdd5V7JVI+Z4iqSY9JnnlAHfAmAt7JLa4RTerNpw=;\n b=PPakpEQ77QV9KJbfkdX8/QimwGFLeXMKlCLobCPPxz5mm+BZzYzeWz1UgMugoWipPNQHdPNwds7O9l4PMYJf8sfSZUCKXeg2hIcf7786VFViRl/s9B37me9LnM4NqYFlbAHX23Gsmz//+kxqCO6BU+PmqCo0is2zu7keUG3QH0Er1HrsyOl/5E080SI7D+kT2cZqwRsfe2/I6eoB4wPzp+rwr5BF+KUpNn38qiLS1sdcknLr46yKLkNrTBisScn7zSLgCbaoq/wnzt+rTWg2/bIKAnynCpSw3xQTM0/an5qL2uOSHkT6x7mZAGjc9+QXx7rav/g6Z8DQbpOMEe1z3A==" ], "ARC-Authentication-Results": [ "i=4; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=solid-run.com;\n spf=pass smtp.mailfrom=solid-run.com;\n dkim=pass (1024-bit key) header.d=solidrn.onmicrosoft.com\n header.i=@solidrn.onmicrosoft.com header.b=pEXFfHDU;\n dkim=pass (1024-bit key) header.d=solidrn.onmicrosoft.com\n header.i=@solidrn.onmicrosoft.com header.b=pEXFfHDU;\n arc=fail smtp.client-ip=52.101.72.101", "i=3; mx.microsoft.com 1; spf=softfail (sender ip\n is 52.17.62.50) smtp.rcpttodomain=atomide.com smtp.mailfrom=solid-run.com;\n dmarc=fail (p=none sp=none pct=100) action=none header.from=solid-run.com;\n dkim=pass (signature was verified) header.d=solidrn.onmicrosoft.com; arc=pass\n (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=solid-run.com]\n dkim=[1,1,header.d=solid-run.com] dmarc=[1,1,header.from=solid-run.com])", "i=2; mx.checkpointcloudsec.com;\n arc=pass;\n dkim=none header.d=none", "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=solid-run.com; dmarc=pass action=none\n header.from=solid-run.com; dkim=pass header.d=solid-run.com; arc=none" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=solidrn.onmicrosoft.com; s=selector1-solidrn-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=rcrPdd5V7JVI+Z4iqSY9JnnlAHfAmAt7JLa4RTerNpw=;\n b=pEXFfHDUx458Rz8RJQBFM4BVIx6tFwaqeP8Wl/7qtCpMTBArc3YKPi/zKIfPAHO/Z5CaEwx6SVMTo6kYc06Ha0ytyBqQlOG1GaXlAC+4C1r8KSG6dWgYI7f1UXsOXm9GLy4NW8aNYVzZrT4EZjacX4kCUF1c1PQdd3NI5FtHQTg=", "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=solidrn.onmicrosoft.com; s=selector1-solidrn-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=rcrPdd5V7JVI+Z4iqSY9JnnlAHfAmAt7JLa4RTerNpw=;\n b=pEXFfHDUx458Rz8RJQBFM4BVIx6tFwaqeP8Wl/7qtCpMTBArc3YKPi/zKIfPAHO/Z5CaEwx6SVMTo6kYc06Ha0ytyBqQlOG1GaXlAC+4C1r8KSG6dWgYI7f1UXsOXm9GLy4NW8aNYVzZrT4EZjacX4kCUF1c1PQdd3NI5FtHQTg=" ], "X-MS-Exchange-Authentication-Results": "spf=softfail (sender IP is 52.17.62.50)\n smtp.mailfrom=solid-run.com; dkim=pass (signature was verified)\n header.d=solidrn.onmicrosoft.com;dmarc=fail action=none\n header.from=solid-run.com;", "Received-SPF": "SoftFail (protection.outlook.com: domain of transitioning\n solid-run.com discourages use of 52.17.62.50 as permitted sender)", "From": "Josua Mayer <josua@solid-run.com>", "Date": "Sun, 08 Feb 2026 17:38:57 +0200", "Subject": "[PATCH v9 2/7] mux: Add helper functions for getting optional and\n selected mux-state", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "7bit", "Message-Id": "<20260208-rz-sdio-mux-v9-2-9a3be13c1280@solid-run.com>", "References": "<20260208-rz-sdio-mux-v9-0-9a3be13c1280@solid-run.com>", "In-Reply-To": "<20260208-rz-sdio-mux-v9-0-9a3be13c1280@solid-run.com>", "To": "Marc Kleine-Budde <mkl@pengutronix.de>,\n Vincent Mailhol <mailhol@kernel.org>, Vinod Koul <vkoul@kernel.org>,\n Neil Armstrong <neil.armstrong@linaro.org>, Peter Rosin <peda@axentia.se>,\n Aaro Koskinen <aaro.koskinen@iki.fi>,\n Andreas Kemnade <andreas@kemnade.info>, Kevin Hilman <khilman@baylibre.com>,\n Roger Quadros <rogerq@kernel.org>, Tony Lindgren <tony@atomide.com>,\n Janusz Krzysztofik <jmkrzyszt@gmail.com>, Vignesh R <vigneshr@ti.com>,\n Andi Shyti <andi.shyti@kernel.org>, Ulf Hansson <ulf.hansson@linaro.org>,\n Rob Herring <robh@kernel.org>, Krzysztof Kozlowski <krzk+dt@kernel.org>,\n Conor Dooley <conor+dt@kernel.org>,\n Geert Uytterhoeven <geert+renesas@glider.be>,\n Magnus Damm <magnus.damm@gmail.com>,\n Wolfram Sang <wsa+renesas@sang-engineering.com>", "Cc": "Yazan Shhady <yazan.shhady@solid-run.com>,\n Jon Nettleton <jon@solid-run.com>,\n Mikhail Anikin <mikhail.anikin@solid-run.com>, linux-can@vger.kernel.org,\n linux-phy@lists.infradead.org, linux-kernel@vger.kernel.org,\n linux-omap@vger.kernel.org, linux-i2c@vger.kernel.org,\n linux-mmc@vger.kernel.org, devicetree@vger.kernel.org,\n linux-renesas-soc@vger.kernel.org, Josua Mayer <josua@solid-run.com>", "X-Mailer": "b4 0.13.0", "X-ClientProxiedBy": "TL2P290CA0029.ISRP290.PROD.OUTLOOK.COM\n (2603:1096:950:3::19) To PAXPR04MB8749.eurprd04.prod.outlook.com\n (2603:10a6:102:21f::22)", "Precedence": "bulk", "X-Mailing-List": "linux-i2c@vger.kernel.org", "List-Id": "<linux-i2c.vger.kernel.org>", "List-Subscribe": "<mailto:linux-i2c+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:linux-i2c+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "X-MS-TrafficTypeDiagnostic": "\n\tPAXPR04MB8749:EE_|PAXPR04MB9074:EE_|AMS1EPF0000004A:EE_|VI1PR04MB7184:EE_", "X-MS-Office365-Filtering-Correlation-Id": "562cd626-5577-4c34-bb27-08de67283bc7", "X-CLOUD-SEC-AV-Info": "solidrun,office365_emails,sent,inline", "X-MS-Exchange-SenderADCheck": "1", "X-MS-Exchange-AntiSpam-Relay": "0", "X-Microsoft-Antispam-Untrusted": "\n BCL:0;ARA:13230040|366016|7416014|1800799024|52116014|376014|38350700014|921020;", "X-Microsoft-Antispam-Message-Info-Original": "=?utf-8?q?PVlKQK7/JAfWDtezenJ+Av?=\n\t=?utf-8?q?GZ7SSEZeKUhR+mMUPFUzmZRcuPakczh7Xf5slZ2DXJQnaAGIdJtqCWomci54g+7Xj?=\n\t=?utf-8?q?X4i8vSw3de1XjzWyyfJDx9eXo1OJ9PWRRBcFk4qoA4o3PZW2pz3PUUN2RuRy+3PUC?=\n\t=?utf-8?q?95K0/kBqPcuUtcQ39TaD5aV2lS4ohZtZOIADtPZmwe7DVCMDfcWLUIMxnGknB6r+E?=\n\t=?utf-8?q?+V+OZ0eKdtJir/kLrhx+kVpI/IFW7Qun1jSuL3by2yWK/nw7nMn8ty0dflGSuGni7?=\n\t=?utf-8?q?Xa79FUJHR9V3yg45Mnnsjt6uS0wxxqo3aJckg2RXhqdZlJjNeQHABQVFrCbwt94Cq?=\n\t=?utf-8?q?C8eifRvGi9u5LgkujFQJ+T0v/mzk4RwEl65ukvW2Yihl8//WkVbDLvAD7k2F5K7Pc?=\n\t=?utf-8?q?6ovu0P4ki6Jxf2LWH7idPVIGloRkD4eIIbSdhwqKPQ/TcwpBqaehSDkEmRcaUVGcF?=\n\t=?utf-8?q?FTUNAN5DuzZ5RU2sbhj/sKuYABPXoWmUmggJnGtqWARIAByEPvfaX0j4LyJ12mRYM?=\n\t=?utf-8?q?esj7c7z6VLk50kbUcBkth9XUWIIu7YdgvwEoipD02LFAJmOXgXidPUqkkfnGo76cL?=\n\t=?utf-8?q?BHtiX1i5rZMbuJBC2blevkWPhYhp+E/cTDErbMz6KDdlAntDGjNPxSI1ws3hKwNXg?=\n\t=?utf-8?q?JjkBYBfG35khSsxbY5wUoj6vhx9JA0hKsL/lbKPPqYqRlPLlRiZNdy4EVrC3dKvUy?=\n\t=?utf-8?q?jpVfcGyrsdFH42wQjEHmOpt8Bq0VybKNfqOw5GlfhYJVPsHszwswz9fYIU0ttAcwn?=\n\t=?utf-8?q?f+aOG/XJRajluuvtNaVoDcNbA/px1Im+sbCOonsKgz8BOD84J6Y+9alGwI0hh3j7m?=\n\t=?utf-8?q?vjUVYAMepgeh7Ln1CxjXzsQqUxgyNKERDbiQGDHaj92RUSjvSTWfl6wA6Z9GV1cV6?=\n\t=?utf-8?q?tX8igGeHFYmBmJCrb35X7tBDTSystQIqyPdSfpwq2aXs9OCMQMaG/p8JePvo0P246?=\n\t=?utf-8?q?x+AA/FWub+QPuL5Ar2avRiLaHht2+0W8ZyDT9Gmc878bfogJomWcXkEdQnp+DLDUf?=\n\t=?utf-8?q?7Up5uTMJBecY42//e+pTq7scdM+whDbnHY57I1WMP5iJbAAoEqrIj9Cnjg5jgSmqg?=\n\t=?utf-8?q?LQqqSv3MXwEyV/+eAi9I5h0iFMnofPyZbxi4Ww4xxfdrMhD8oMHeBwtmyWNTpPgB/?=\n\t=?utf-8?q?Ln70NzdAU3mHT06gBwR/smJbHCmK5ydOJH7mKWb7D9ElCNQuHVt0NP99NOkyAgkJN?=\n\t=?utf-8?q?1G6dCUuV9aljWXjY9sdP0PlHcZdYGQga2z4fQbc/EQxw5/yHaXJq47g3+ytp69BFq?=\n\t=?utf-8?q?C4xuAmXSRRli3w2UEPg0H6Yd1wr2xj8YncikG4jjZtsarg9akSBCqgUdJXetw4cxH?=\n\t=?utf-8?q?+4WHg7kR0WvyC0SmP8Ht14clwJ0qhRh9TkUUFFVcOtViBgB/HfgzdSqn3qRXVt9Mn?=\n\t=?utf-8?q?+yP0QTqrvQ+MAJ31WI1kNUmaNIA9sZEGF/ltjTLmX2MODptPl+SyiQMjc1qMNrN1w?=\n\t=?utf-8?q?gXdvCm5yFp9kG4Uhcc4tjbYaZT/Fu7NkaFh8C9XbSXWcs92n2gU0P7HvXyefg7QmP?=\n\t=?utf-8?q?3Qd0DFOrD6tuZvG5q4/N41Ym03OL+tDxmgXt0QqL/lvhuR1r9lAudc05xTPlG5r0q?=\n\t=?utf-8?q?2rrC+0XqqLkXABAkB?=", "X-Forefront-Antispam-Report-Untrusted": "\n CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB8749.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(7416014)(1800799024)(52116014)(376014)(38350700014)(921020);DIR:OUT;SFP:1102;", "X-MS-Exchange-Transport-CrossTenantHeadersStamped": [ "PAXPR04MB9074", "VI1PR04MB7184" ], "X-CLOUD-SEC-AV-INT-Relay": "\n sent<mta-outgoing-dlp-mt-prod-cp-eu-2.checkpointcloudsec.com>", "X-CLOUD-SEC-AV-UUID": "\n a89241e2f87e414295adc7746ecf8b41:solidrun,office365_emails,sent,inline:12b0fcb10f4278561484c091dce66039", "Authentication-Results-Original": "mx.checkpointcloudsec.com; arc=pass;\n dkim=none header.d=none", "X-EOPAttributedMessage": "0", "X-MS-Exchange-Transport-CrossTenantHeadersStripped": "\n AMS1EPF0000004A.eurprd04.prod.outlook.com", "X-MS-PublicTrafficType": "Email", "X-MS-Office365-Filtering-Correlation-Id-Prvs": "\n\t11141a7a-cce5-454e-1631-08de67283386", "X-Microsoft-Antispam": "\n\tBCL:0;ARA:13230040|36860700013|14060799003|82310400026|1800799024|376014|7416014|35042699022|921020;", "X-Microsoft-Antispam-Message-Info": "=?utf-8?q?9Ue7izxnBfECiLWw3R8TFQIrK4K2kvs?=\n\t=?utf-8?q?pAO3v9fv4U0DWgGw+k07woQD4wI0/vDU3NGesEfGS7hm7KggWlTUA+RwWNDu0DH88?=\n\t=?utf-8?q?Bl1vVc29Y/aH3UYjvKEexfvlC/Y8tre//x0e2SUk+GbKRpinnvbwSlyyvUNigWAcK?=\n\t=?utf-8?q?eZv3or6HriUS4O1s81WLd1kZru4AmcCctBEGNMXAW/C76FDLxQm2ru+6wI2c2DUga?=\n\t=?utf-8?q?GOfM9dfoRj0VSNiIV26EzJKL9w0M2pnWzFhtJ+b0tucSN1bz1WtUw/qZHgY8O71Ku?=\n\t=?utf-8?q?3sHJ2wvtLUtO/+QHYvd6nxJbAdl0ngIwe+Qfb2yOwmpdUNtbBLbCex/hoNEcjdPMX?=\n\t=?utf-8?q?epUhNp5g5QpF4DkOXAuCWPuZL74G33jnaNzaJ75YnR5bNu5ESMrgTwbps8w1ByOj0?=\n\t=?utf-8?q?z8USbP1RV1KZpI+xsVXE6RIeHlTM62HhKnAUXJ/iwUXQQzhx4GziT7xjNM8/+OZSC?=\n\t=?utf-8?q?yfy3rgdwxu9cwrl09OWKJ5Yg4hx1qTM4pvBmPl/qJBvt9DmI7zDjc7UPweUUxdk2r?=\n\t=?utf-8?q?Ya73csui3jyo2pBRlK7TjkzRCsegInb4VtXFMJJvJ/XwhwegTD4mz4L1QL4T6LEfP?=\n\t=?utf-8?q?moNY9ox9TTnOm3vHGDd7PqVZG5VQHj1h1m0xu6TdEHb2oDtavx2jktg+gsXvjtqII?=\n\t=?utf-8?q?7D3kRH10WqR6qwSlZ9PO4dFNbHw/Zxv/2NMfgFR3YCdw51Ca9RoKtM2d5ZgTL3phA?=\n\t=?utf-8?q?DPRnZ5NA/9IjUB/qdPqwfV/Mv5t0rntePZyGNmlkbuL9cFTjs29gcWK5SQkS0w2X3?=\n\t=?utf-8?q?/HuS0867VQwlJ8YBaX0OxvdXnyDCmI4TQLNkH1Ku+xNwXqUHlUGFqLBjO2Sjr3BAr?=\n\t=?utf-8?q?2g+gYj54sTfueCZCs9ltG7TAZJgNydb1JyjKmInKraDY7JpO4BkKMsg+V3o0BHECy?=\n\t=?utf-8?q?T9YSgKZb6zRRbjfKqDp2gt4qU0L5yQCBSKFih/NcmQgFENpF9imQL1YmCyFwKfIOr?=\n\t=?utf-8?q?dOR+jhfIYmOH7E/KJwVkG2qH1CsKe4lr4or1mZYQ33/H/yUXHAG4dSmlLLMa7TpyH?=\n\t=?utf-8?q?MWNgcGvRo8mnIV/fpCDjU167XZ7PJl4InDfX8JvwBIa8tAkUncvYVadBNQE16vPnH?=\n\t=?utf-8?q?iP9yG5zFsOU9L1qH2cWHDOx60llllA8+FxI3Klyw2qENlnJKRzIeIT50xLLpqajVF?=\n\t=?utf-8?q?TB8Gx8rOcUkiwXpGPtNYfTrdG8Epu5JfAfz7I1or3thfWYdAi7GFK3BJIssX5Odek?=\n\t=?utf-8?q?22SHy2AsZvKvUrvjt0+F31hZNlwWfw3NNIIL1tPY/iYYyv9Ec0gJNb1Tt1/6uL9Zh?=\n\t=?utf-8?q?XpXNU/X1eCmjw7Uxm6IAeGtq8hpDX/j0JoHlQUpoEuvABUN8PCjKunGuxZyoh6JG2?=\n\t=?utf-8?q?h0V6j1VURpgIkjs6t5mN948SVWy9SRz6oVM+VoN8NLIlVMYUjCSCGiss67BX9VOwK?=\n\t=?utf-8?q?hXbuJVXB2mBda1QCA/i8YYkk7aUPBKjmNUWkV+P5XMFRU0QuyUiidmQ2//6SzWBte?=\n\t=?utf-8?q?AzNaZ3NN1g8mB9aqbMQ4hEEBGGqiyNmcwMKVzwehwiyH74lJBVbE205Y8w3GbaJXt?=\n\t=?utf-8?q?5ZrESzR6ujaSzLpWeP6t4uFL/5b2q8emMelupLMBqkEaqd6VNXtemDSCIm4+y1A08?=\n\t=?utf-8?q?tzaqq48GJzHJ/VQ6C7IEVJZv/L2w1Jp01Vaj9H1L3ZNJS/OaaEo=3D?=", "X-Forefront-Antispam-Report": "\n\tCIP:52.17.62.50;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:eu-dlp.cloud-sec-av.com;PTR:eu-dlp.cloud-sec-av.com;CAT:NONE;SFS:(13230040)(36860700013)(14060799003)(82310400026)(1800799024)(376014)(7416014)(35042699022)(921020);DIR:OUT;SFP:1102;", "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1", "X-MS-Exchange-AntiSpam-MessageData-0": "\n\teZEOXs51+DGRZ4UqgxU2tbxaRCgNoCQRJIuJaFM4itcYWsm3TLxdHkCsVWEgsK0ugAdVwF1p3XCxR864xCMhueIoY7ZHs0Mk6BSygoYNXL6dTxY/UZfiPsSkrznI3/y2W/4g5oy++JckGhywL8EVHCgpZBQYVMX0x8ntz0SbQW42C7gfIZQTAELuMkxzkowfs21nA99FCRPOrZjFIHiJ2oxYn/RbJ2d9uXxyZ5NcaTnOKpWufIHkwyB72Wx8Fe5L5LNlf8F8tX1Gi3LCqO4GD9FpQacR01W3Xx8D7OIqchAUJ6tnzOMqPc02T6c6Qw8cpzWMBGfkDoC8/UJUxFfJ32Zj4At7w9jGMzoyAMwTM1Qor+jhB0BMhtEuHSfK7lFabbLtegI4akiX0vqYN5wSCiFpjW8khNSO3ecNVGpj8wiEKbNBbYchvvCIHsgEaX0e", "X-OriginatorOrg": "solid-run.com", "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "08 Feb 2026 15:39:23.1433\n (UTC)", "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 562cd626-5577-4c34-bb27-08de67283bc7", "X-MS-Exchange-CrossTenant-Id": "a4a8aaf3-fd27-4e27-add2-604707ce5b82", "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=a4a8aaf3-fd27-4e27-add2-604707ce5b82;Ip=[52.17.62.50];Helo=[eu-dlp.cloud-sec-av.com]", "X-MS-Exchange-CrossTenant-AuthSource": "\n\tAMS1EPF0000004A.eurprd04.prod.outlook.com", "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous", "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem" }, "content": "In-tree phy-can-transceiver driver has already implemented a local\nversion of devm_mux_state_get_optional.\n\nThe omap-i2c driver gets and selects an optional mux in its probe\nfunction without using any helper.\n\nAdd new helper functions covering both aforementioned use-cases:\n\n- mux_control_get_optional:\n Get a mux-control if specified in dt, return NULL otherwise.\n- devm_mux_state_get_optional:\n Get a mux-state if specified in dt, return NULL otherwise.\n- devm_mux_state_get_selected:\n Get and select a mux-state specified in dt, return error otherwise.\n- devm_mux_state_get_optional_selected:\n Get and select a mux-state if specified in dt, return error or NULL.\n\nExisting mux_get helper function is changed to take an extra argument\nindicating whether the mux is optional.\nIn this case no error is printed, and NULL returned in case of ENOENT.\n\nCalling code is adapted to handle NULL return case, and to pass optional\nargument as required.\n\nTo support automatic deselect for _selected helper, a new structure is\ncreated storing an exit pointer similar to clock core which is called on\nrelease.\n\nTo facilitate code sharing between optional/mandatory/selected helpers,\na new internal helper function is added to handle quiet (optional) and\nverbose (mandatory) errors, as well as storing the correct callback for\ndevm release: __devm_mux_state_get\n\nDue to this structure devm_mux_state_get_*_selected can no longer print\na useful error message when select fails. Instead callers should print\nerrors where needed.\n\nCommit e153fdea9db04 (\"phy: can-transceiver: Re-instate \"mux-states\"\nproperty presence check\") noted that \"mux_get() always prints an error\nmessage in case of an error, including when the property is not present,\nconfusing the user.\"\n\nThe first error message covers the case that a mux name is not matched\nin dt. The second error message is based on of_parse_phandle_with_args\nreturn value.\n\nIn optional case no error is printed and NULL is returned.\nThis ensures that the new helper functions will not confuse the user\neither.\n\nWith the addition of optional helper functions it became clear that\ndrivers should compile and link even if CONFIG_MULTIPLEXER was not enabled.\nAdd stubs for all symbols exported by mux core.\n\nAcked-by: Wolfram Sang <wsa+renesas@sang-engineering.com>\nSigned-off-by: Josua Mayer <josua@solid-run.com>\n---\n drivers/mux/core.c | 206 ++++++++++++++++++++++++++++++++++++-------\n include/linux/mux/consumer.h | 108 ++++++++++++++++++++++-\n 2 files changed, 279 insertions(+), 35 deletions(-)", "diff": "diff --git a/drivers/mux/core.c b/drivers/mux/core.c\nindex a3840fe0995f..b3ed3a094a09 100644\n--- a/drivers/mux/core.c\n+++ b/drivers/mux/core.c\n@@ -46,6 +46,16 @@ static const struct class mux_class = {\n \t.name = \"mux\",\n };\n \n+/**\n+ * struct devm_mux_state_state -\tTracks managed resources for mux-state objects.\n+ * @mstate:\t\t\t\tPointer to a mux state.\n+ * @exit:\t\t\t\tAn optional callback to execute before free.\n+ */\n+struct devm_mux_state_state {\n+\tstruct mux_state *mstate;\n+\tint (*exit)(struct mux_state *mstate);\n+};\n+\n static DEFINE_IDA(mux_ida);\n \n static int __init mux_init(void)\n@@ -516,17 +526,19 @@ static struct mux_chip *of_find_mux_chip_by_node(struct device_node *np)\n \treturn dev ? to_mux_chip(dev) : NULL;\n }\n \n-/*\n+/**\n * mux_get() - Get the mux-control for a device.\n * @dev: The device that needs a mux-control.\n * @mux_name: The name identifying the mux-control.\n * @state: Pointer to where the requested state is returned, or NULL when\n * the required multiplexer states are handled by other means.\n+ * @optional: Whether to return NULL and silence errors when mux doesn't exist.\n *\n- * Return: A pointer to the mux-control, or an ERR_PTR with a negative errno.\n+ * Return: Pointer to the mux-control on success, an ERR_PTR with a negative errno on error,\n+ * or NULL if optional is true and mux doesn't exist.\n */\n static struct mux_control *mux_get(struct device *dev, const char *mux_name,\n-\t\t\t\t unsigned int *state)\n+\t\t\t\t unsigned int *state, bool optional)\n {\n \tstruct device_node *np = dev->of_node;\n \tstruct of_phandle_args args;\n@@ -542,7 +554,9 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,\n \t\telse\n \t\t\tindex = of_property_match_string(np, \"mux-control-names\",\n \t\t\t\t\t\t\t mux_name);\n-\t\tif (index < 0) {\n+\t\tif (index < 0 && optional) {\n+\t\t\treturn NULL;\n+\t\t} else if (index < 0) {\n \t\t\tdev_err(dev, \"mux controller '%s' not found\\n\",\n \t\t\t\tmux_name);\n \t\t\treturn ERR_PTR(index);\n@@ -558,8 +572,12 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,\n \t\t\t\t\t\t \"mux-controls\", \"#mux-control-cells\",\n \t\t\t\t\t\t index, &args);\n \tif (ret) {\n+\t\tif (optional && ret == -ENOENT)\n+\t\t\treturn NULL;\n+\n \t\tdev_err(dev, \"%pOF: failed to get mux-%s %s(%i)\\n\",\n-\t\t\tnp, state ? \"state\" : \"control\", mux_name ?: \"\", index);\n+\t\t\tnp, state ? \"state\" : \"control\",\n+\t\t\tmux_name ?: \"\", index);\n \t\treturn ERR_PTR(ret);\n \t}\n \n@@ -617,10 +635,29 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,\n */\n struct mux_control *mux_control_get(struct device *dev, const char *mux_name)\n {\n-\treturn mux_get(dev, mux_name, NULL);\n+\tstruct mux_control *mux = mux_get(dev, mux_name, NULL, false);\n+\n+\tif (!mux)\n+\t\treturn ERR_PTR(-ENOENT);\n+\n+\treturn mux;\n }\n EXPORT_SYMBOL_GPL(mux_control_get);\n \n+/**\n+ * mux_control_get_optional() - Get the optional mux-control for a device.\n+ * @dev: The device that needs a mux-control.\n+ * @mux_name: The name identifying the mux-control.\n+ *\n+ * Return: Pointer to the mux-state on success, an ERR_PTR with a negative errno on error,\n+ * or NULL if mux doesn't exist.\n+ */\n+struct mux_control *mux_control_get_optional(struct device *dev, const char *mux_name)\n+{\n+\treturn mux_get(dev, mux_name, NULL, true);\n+}\n+EXPORT_SYMBOL_GPL(mux_control_get_optional);\n+\n /**\n * mux_control_put() - Put away the mux-control for good.\n * @mux: The mux-control to put away.\n@@ -657,10 +694,13 @@ struct mux_control *devm_mux_control_get(struct device *dev,\n \tif (!ptr)\n \t\treturn ERR_PTR(-ENOMEM);\n \n-\tmux = mux_control_get(dev, mux_name);\n+\tmux = mux_get(dev, mux_name, NULL, false);\n \tif (IS_ERR(mux)) {\n \t\tdevres_free(ptr);\n \t\treturn mux;\n+\t} else if (!mux) {\n+\t\tdevres_free(ptr);\n+\t\treturn ERR_PTR(-ENOENT);\n \t}\n \n \t*ptr = mux;\n@@ -670,14 +710,16 @@ struct mux_control *devm_mux_control_get(struct device *dev,\n }\n EXPORT_SYMBOL_GPL(devm_mux_control_get);\n \n-/*\n+/**\n * mux_state_get() - Get the mux-state for a device.\n * @dev: The device that needs a mux-state.\n * @mux_name: The name identifying the mux-state.\n+ * @optional: Whether to return NULL and silence errors when mux doesn't exist.\n *\n- * Return: A pointer to the mux-state, or an ERR_PTR with a negative errno.\n+ * Return: Pointer to the mux-state on success, an ERR_PTR with a negative errno on error,\n+ * or NULL if optional is true and mux doesn't exist.\n */\n-static struct mux_state *mux_state_get(struct device *dev, const char *mux_name)\n+static struct mux_state *mux_state_get(struct device *dev, const char *mux_name, bool optional)\n {\n \tstruct mux_state *mstate;\n \n@@ -685,12 +727,16 @@ static struct mux_state *mux_state_get(struct device *dev, const char *mux_name)\n \tif (!mstate)\n \t\treturn ERR_PTR(-ENOMEM);\n \n-\tmstate->mux = mux_get(dev, mux_name, &mstate->state);\n+\tmstate->mux = mux_get(dev, mux_name, &mstate->state, optional);\n \tif (IS_ERR(mstate->mux)) {\n-\t\tint err = PTR_ERR(mstate->mux);\n-\n \t\tkfree(mstate);\n-\t\treturn ERR_PTR(err);\n+\t\treturn ERR_CAST(mstate->mux);\n+\t} else if (optional && !mstate->mux) {\n+\t\tkfree(mstate);\n+\t\treturn NULL;\n+\t} else if (!mstate->mux) {\n+\t\tkfree(mstate);\n+\t\treturn ERR_PTR(-ENOENT);\n \t}\n \n \treturn mstate;\n@@ -710,9 +756,66 @@ static void mux_state_put(struct mux_state *mstate)\n \n static void devm_mux_state_release(struct device *dev, void *res)\n {\n-\tstruct mux_state *mstate = *(struct mux_state **)res;\n+\tstruct devm_mux_state_state *devm_state = res;\n \n+\tif (devm_state->exit)\n+\t\tdevm_state->exit(devm_state->mstate);\n+\n+\tmux_state_put(devm_state->mstate);\n+}\n+\n+/**\n+ * __devm_mux_state_get() - Get the optional mux-state for a device,\n+ *\t\t\t with resource management.\n+ * @dev: The device that needs a mux-state.\n+ * @mux_name: The name identifying the mux-state.\n+ * @optional: Whether to return NULL and silence errors when mux doesn't exist.\n+ * @init: Optional function pointer for mux-state object initialisation.\n+ * @exit: Optional function pointer for mux-state object cleanup on release.\n+ *\n+ * Return: Pointer to the mux-state on success, an ERR_PTR with a negative errno on error,\n+ * or NULL if optional is true and mux doesn't exist.\n+ */\n+static struct mux_state *__devm_mux_state_get(struct device *dev, const char *mux_name,\n+\t\t\t\t\t bool optional,\n+\t\t\t\t\t int (*init)(struct mux_state *mstate),\n+\t\t\t\t\t int (*exit)(struct mux_state *mstate))\n+{\n+\tstruct devm_mux_state_state *devm_state;\n+\tstruct mux_state *mstate;\n+\tint ret;\n+\n+\tmstate = mux_state_get(dev, mux_name, optional);\n+\tif (IS_ERR(mstate))\n+\t\treturn ERR_CAST(mstate);\n+\telse if (optional && !mstate)\n+\t\treturn NULL;\n+\telse if (!mstate)\n+\t\treturn ERR_PTR(-ENOENT);\n+\n+\tdevm_state = devres_alloc(devm_mux_state_release, sizeof(*devm_state), GFP_KERNEL);\n+\tif (!devm_state) {\n+\t\tret = -ENOMEM;\n+\t\tgoto err_devres_alloc;\n+\t}\n+\n+\tif (init) {\n+\t\tret = init(mstate);\n+\t\tif (ret)\n+\t\t\tgoto err_mux_state_init;\n+\t}\n+\n+\tdevm_state->mstate = mstate;\n+\tdevm_state->exit = exit;\n+\tdevres_add(dev, devm_state);\n+\n+\treturn mstate;\n+\n+err_mux_state_init:\n+\tdevres_free(devm_state);\n+err_devres_alloc:\n \tmux_state_put(mstate);\n+\treturn ERR_PTR(ret);\n }\n \n /**\n@@ -722,28 +825,69 @@ static void devm_mux_state_release(struct device *dev, void *res)\n * @mux_name: The name identifying the mux-control.\n *\n * Return: Pointer to the mux-state, or an ERR_PTR with a negative errno.\n+ *\n+ * The mux-state will automatically be freed on release.\n */\n-struct mux_state *devm_mux_state_get(struct device *dev,\n-\t\t\t\t const char *mux_name)\n+struct mux_state *devm_mux_state_get(struct device *dev, const char *mux_name)\n {\n-\tstruct mux_state **ptr, *mstate;\n-\n-\tptr = devres_alloc(devm_mux_state_release, sizeof(*ptr), GFP_KERNEL);\n-\tif (!ptr)\n-\t\treturn ERR_PTR(-ENOMEM);\n+\treturn __devm_mux_state_get(dev, mux_name, false, NULL, NULL);\n+}\n+EXPORT_SYMBOL_GPL(devm_mux_state_get);\n \n-\tmstate = mux_state_get(dev, mux_name);\n-\tif (IS_ERR(mstate)) {\n-\t\tdevres_free(ptr);\n-\t\treturn mstate;\n-\t}\n+/**\n+ * devm_mux_state_get_optional() - Get the optional mux-state for a device,\n+ *\t\t\t\t with resource management.\n+ * @dev: The device that needs a mux-state.\n+ * @mux_name: The name identifying the mux-state.\n+ *\n+ * Return: Pointer to the mux-state on success, an ERR_PTR with a negative errno on error,\n+ * or NULL if mux doesn't exist.\n+ *\n+ * The mux-state will automatically be freed on release.\n+ */\n+struct mux_state *devm_mux_state_get_optional(struct device *dev, const char *mux_name)\n+{\n+\treturn __devm_mux_state_get(dev, mux_name, true, NULL, NULL);\n+}\n+EXPORT_SYMBOL_GPL(devm_mux_state_get_optional);\n \n-\t*ptr = mstate;\n-\tdevres_add(dev, ptr);\n+/**\n+ * devm_mux_state_get_selected() - Get the mux-state for a device, with\n+ *\t\t\t\t resource management.\n+ * @dev: The device that needs a mux-state.\n+ * @mux_name: The name identifying the mux-state.\n+ *\n+ * Return: Pointer to the mux-state, or an ERR_PTR with a negative errno.\n+ *\n+ * The returned mux-state (if valid) is already selected.\n+ *\n+ * The mux-state will automatically be deselected and freed on release.\n+ */\n+struct mux_state *devm_mux_state_get_selected(struct device *dev, const char *mux_name)\n+{\n+\treturn __devm_mux_state_get(dev, mux_name, false, mux_state_select, mux_state_deselect);\n+}\n+EXPORT_SYMBOL_GPL(devm_mux_state_get_selected);\n \n-\treturn mstate;\n+/**\n+ * devm_mux_state_get_optional_selected() - Get the optional mux-state for\n+ *\t\t\t\t\t a device, with resource management.\n+ * @dev: The device that needs a mux-state.\n+ * @mux_name: The name identifying the mux-state.\n+ *\n+ * Return: Pointer to the mux-state on success, an ERR_PTR with a negative errno on error,\n+ * or NULL if mux doesn't exist.\n+ *\n+ * The returned mux-state (if valid) is already selected.\n+ *\n+ * The mux-state will automatically be deselected and freed on release.\n+ */\n+struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,\n+\t\t\t\t\t\t const char *mux_name)\n+{\n+\treturn __devm_mux_state_get(dev, mux_name, true, mux_state_select, mux_state_deselect);\n }\n-EXPORT_SYMBOL_GPL(devm_mux_state_get);\n+EXPORT_SYMBOL_GPL(devm_mux_state_get_optional_selected);\n \n /*\n * Using subsys_initcall instead of module_init here to try to ensure - for\ndiff --git a/include/linux/mux/consumer.h b/include/linux/mux/consumer.h\nindex 2e25c838f831..a961861a503b 100644\n--- a/include/linux/mux/consumer.h\n+++ b/include/linux/mux/consumer.h\n@@ -16,6 +16,8 @@ struct device;\n struct mux_control;\n struct mux_state;\n \n+#if IS_ENABLED(CONFIG_MULTIPLEXER)\n+\n unsigned int mux_control_states(struct mux_control *mux);\n int __must_check mux_control_select_delay(struct mux_control *mux,\n \t\t\t\t\t unsigned int state,\n@@ -54,11 +56,109 @@ int mux_control_deselect(struct mux_control *mux);\n int mux_state_deselect(struct mux_state *mstate);\n \n struct mux_control *mux_control_get(struct device *dev, const char *mux_name);\n+struct mux_control *mux_control_get_optional(struct device *dev, const char *mux_name);\n void mux_control_put(struct mux_control *mux);\n \n-struct mux_control *devm_mux_control_get(struct device *dev,\n-\t\t\t\t\t const char *mux_name);\n-struct mux_state *devm_mux_state_get(struct device *dev,\n-\t\t\t\t const char *mux_name);\n+struct mux_control *devm_mux_control_get(struct device *dev, const char *mux_name);\n+struct mux_state *devm_mux_state_get(struct device *dev, const char *mux_name);\n+struct mux_state *devm_mux_state_get_optional(struct device *dev, const char *mux_name);\n+struct mux_state *devm_mux_state_get_selected(struct device *dev, const char *mux_name);\n+struct mux_state *devm_mux_state_get_optional_selected(struct device *dev, const char *mux_name);\n+\n+#else\n+\n+static inline unsigned int mux_control_states(struct mux_control *mux)\n+{\n+\treturn 0;\n+}\n+static inline int __must_check mux_control_select_delay(struct mux_control *mux,\n+\t\t\t\t\t\t\tunsigned int state, unsigned int delay_us)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+static inline int __must_check mux_state_select_delay(struct mux_state *mstate,\n+\t\t\t\t\t\t unsigned int delay_us)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+static inline int __must_check mux_control_try_select_delay(struct mux_control *mux,\n+\t\t\t\t\t\t\t unsigned int state,\n+\t\t\t\t\t\t\t unsigned int delay_us)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+static inline int __must_check mux_state_try_select_delay(struct mux_state *mstate,\n+\t\t\t\t\t\t\t unsigned int delay_us)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+\n+static inline int __must_check mux_control_select(struct mux_control *mux,\n+\t\t\t\t\t\t unsigned int state)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+\n+static inline int __must_check mux_state_select(struct mux_state *mstate)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+\n+static inline int __must_check mux_control_try_select(struct mux_control *mux,\n+\t\t\t\t\t\t unsigned int state)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+\n+static inline int __must_check mux_state_try_select(struct mux_state *mstate)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+\n+static inline int mux_control_deselect(struct mux_control *mux)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+static inline int mux_state_deselect(struct mux_state *mstate)\n+{\n+\treturn -EOPNOTSUPP;\n+}\n+\n+static inline struct mux_control *mux_control_get(struct device *dev, const char *mux_name)\n+{\n+\treturn ERR_PTR(-EOPNOTSUPP);\n+}\n+static inline struct mux_control *mux_control_get_optional(struct device *dev,\n+\t\t\t\t\t\t\t const char *mux_name)\n+{\n+\treturn NULL;\n+}\n+static inline void mux_control_put(struct mux_control *mux) {}\n+\n+static inline struct mux_control *devm_mux_control_get(struct device *dev, const char *mux_name)\n+{\n+\treturn ERR_PTR(-EOPNOTSUPP);\n+}\n+static inline struct mux_state *devm_mux_state_get(struct device *dev, const char *mux_name)\n+{\n+\treturn ERR_PTR(-EOPNOTSUPP);\n+}\n+static inline struct mux_state *devm_mux_state_get_optional(struct device *dev,\n+\t\t\t\t\t\t\t const char *mux_name)\n+{\n+\treturn NULL;\n+}\n+static inline struct mux_state *devm_mux_state_get_selected(struct device *dev,\n+\t\t\t\t\t\t\t const char *mux_name)\n+{\n+\treturn ERR_PTR(-EOPNOTSUPP);\n+}\n+static inline struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,\n+\t\t\t\t\t\t\t\t const char *mux_name)\n+{\n+\treturn NULL;\n+}\n+\n+#endif /* CONFIG_MULTIPLEXER */\n \n #endif /* _LINUX_MUX_CONSUMER_H */\n", "prefixes": [ "v9", "2/7" ] }