Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2218216/?format=api
{ "id": 2218216, "url": "http://patchwork.ozlabs.org/api/patches/2218216/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/patch/20260331171612.102018-4-o.rempel@pengutronix.de/", "project": { "id": 42, "url": "http://patchwork.ozlabs.org/api/projects/42/?format=api", "name": "Linux GPIO development", "link_name": "linux-gpio", "list_id": "linux-gpio.vger.kernel.org", "list_email": "linux-gpio@vger.kernel.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260331171612.102018-4-o.rempel@pengutronix.de>", "list_archive_url": null, "date": "2026-03-31T17:16:09", "name": "[v9,3/6] pinctrl: core: Make pin group callbacks optional for pin-only drivers", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "d7ffc92f4d63a7cbe90ec7b33e1729d0192b00fb", "submitter": { "id": 71360, "url": "http://patchwork.ozlabs.org/api/people/71360/?format=api", "name": "Oleksij Rempel", "email": "o.rempel@pengutronix.de" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-gpio/patch/20260331171612.102018-4-o.rempel@pengutronix.de/mbox/", "series": [ { "id": 498233, "url": "http://patchwork.ozlabs.org/api/series/498233/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/list/?series=498233", "date": "2026-03-31T17:16:09", "name": "mfd: Add support for NXP MC33978/MC34978 MSDI", "version": 9, "mbox": "http://patchwork.ozlabs.org/series/498233/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2218216/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2218216/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linux-gpio+bounces-34494-incoming=patchwork.ozlabs.org@vger.kernel.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-gpio@vger.kernel.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c09:e001:a7::12fc:5321; helo=sto.lore.kernel.org;\n envelope-from=linux-gpio+bounces-34494-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)", "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=185.203.201.7", "smtp.subspace.kernel.org;\n dmarc=none (p=none dis=none) header.from=pengutronix.de", "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=pengutronix.de" ], "Received": [ "from sto.lore.kernel.org (sto.lore.kernel.org\n [IPv6:2600:3c09:e001:a7::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 4flZj422S0z1y1q\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 01 Apr 2026 04:23:52 +1100 (AEDT)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sto.lore.kernel.org (Postfix) with ESMTP id 2D94E30B6AF8\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 31 Mar 2026 17:17:21 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id A5E6D3644D5;\n\tTue, 31 Mar 2026 17:16:37 +0000 (UTC)", "from metis.whiteo.stw.pengutronix.de\n (metis.whiteo.stw.pengutronix.de [185.203.201.7])\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 19C6333F8C5\n\tfor <linux-gpio@vger.kernel.org>; Tue, 31 Mar 2026 17:16:36 +0000 (UTC)", "from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2])\n\tby metis.whiteo.stw.pengutronix.de with esmtps\n (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256)\n\t(Exim 4.92)\n\t(envelope-from <ore@pengutronix.de>)\n\tid 1w7chK-0004mO-Dv; Tue, 31 Mar 2026 19:16:14 +0200", "from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac]\n helo=dude04)\n\tby drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls\n TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\n\t(Exim 4.96)\n\t(envelope-from <ore@pengutronix.de>)\n\tid 1w7chJ-0034jO-1u;\n\tTue, 31 Mar 2026 19:16:13 +0200", "from ore by dude04 with local (Exim 4.98.2)\n\t(envelope-from <ore@pengutronix.de>)\n\tid 1w7chJ-00000000QZ5-21RR;\n\tTue, 31 Mar 2026 19:16:13 +0200" ], "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1774977397; cv=none;\n b=kcxvEhujOsuiPNJMQ4rT9zaVhRQ09d052weVmioUOvaV2LUNWNAwIUxOR0pTEA7JCfkbkwGBPXIw/yRZFKQH/6+HfrvFocALEf2pQeInxuh4lAKZZQ91e5AHw6nAshBBPpxaaRwvYOK2ndTyTE3JyG7olytExrRO6l2qxIQXVVk=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1774977397; c=relaxed/simple;\n\tbh=wttz8EiMfDEbsECutb5S4dAbB7JeD1kDnCgqAc+PJJA=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=rZ3gN5YYEJk1Z1yiIV0s487gDyQxPpiwUPL33r+QKz/kI2RMzosq5+VZ09+xcgM7cP7O3ALk97GPtTWXRM8CbhNeKV9eiB/THCAtSRefIp4PnE0fBkgq7YP2XapaIKYEQ7qZ/rWqjeqrkmYc+EnUsD6AnKVU4a5fCJBh0qF88ac=", "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dmarc=none (p=none dis=none) header.from=pengutronix.de;\n spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7", "From": "Oleksij Rempel <o.rempel@pengutronix.de>", "To": "Guenter Roeck <linux@roeck-us.net>,\n\tRob Herring <robh@kernel.org>,\n\tKrzysztof Kozlowski <krzk+dt@kernel.org>,\n\tConor Dooley <conor+dt@kernel.org>,\n\tLee Jones <lee@kernel.org>,\n\tPeter Rosin <peda@axentia.se>,\n\tLinus Walleij <linusw@kernel.org>", "Cc": "Oleksij Rempel <o.rempel@pengutronix.de>,\n\tkernel@pengutronix.de,\n\tlinux-kernel@vger.kernel.org,\n\tdevicetree@vger.kernel.org,\n\tlinux-hwmon@vger.kernel.org,\n\tlinux-gpio@vger.kernel.org,\n\tDavid Jander <david@protonic.nl>", "Subject": "[PATCH v9 3/6] pinctrl: core: Make pin group callbacks optional for\n pin-only drivers", "Date": "Tue, 31 Mar 2026 19:16:09 +0200", "Message-ID": "<20260331171612.102018-4-o.rempel@pengutronix.de>", "X-Mailer": "git-send-email 2.47.3", "In-Reply-To": "<20260331171612.102018-1-o.rempel@pengutronix.de>", "References": "<20260331171612.102018-1-o.rempel@pengutronix.de>", "Precedence": "bulk", "X-Mailing-List": "linux-gpio@vger.kernel.org", "List-Id": "<linux-gpio.vger.kernel.org>", "List-Subscribe": "<mailto:linux-gpio+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:linux-gpio+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-SA-Exim-Connect-IP": "2a0a:edc0:0:c01:1d::a2", "X-SA-Exim-Mail-From": "ore@pengutronix.de", "X-SA-Exim-Scanned": "No (on metis.whiteo.stw.pengutronix.de);\n SAEximRunCond expanded to false", "X-PTX-Original-Recipient": "linux-gpio@vger.kernel.org" }, "content": "Currently, the pinctrl core strictly requires all drivers to implement\n.get_groups_count and .get_group_name callbacks in their pinctrl_ops.\n\nHowever, for simple pinctrl drivers that act purely as GPIO controllers\nand pin-specific configuration proxies, without any concept of muxing or\npin groups, this strict requirement forces the implementation of dummy\ncallbacks just to satisfy pinctrl_check_ops().\n\nRelax this requirement for pin-only drivers by making the group callbacks\noptional when no muxing or group pin configuration support is provided.\nUpdate the core and debugfs helpers to check for the existence of these\ncallbacks before invoking them.\n\nDrivers that provide muxing or group pin configuration operations still\nmust implement group enumeration and naming callbacks, and are rejected\nat registration time if they do not.\n\nSuggested-by: Linus Walleij <linusw@kernel.org>\nSigned-off-by: Oleksij Rempel <o.rempel@pengutronix.de>\nReviewed-by: Linus Walleij <linusw@kernel.org>\n---\nchanges v9:\n- no changes\nchanges v8:\n- no changes\nchanges v7:\n- no changes\nchanges v6:\n- Reject drivers in pinctrl_check_ops() that use pmxops or group confops\n without providing group callbacks.\n- Add <linux/pinctrl/pinconf.h> to core.c.\n- Revert the unnecessary NULL check in pinconf_show_setting(), since\n group settings are now strictly gated.\n- Keep debugfs group listings tolerant of drivers without group callbacks.\nchanges v5:\n- no changes\nchanges v4:\n- add Reviewed-by: Linus Walleij ...\nchanges v3:\n- no changes\n---\n drivers/pinctrl/core.c | 41 ++++++++++++++++++++++++++++++++++-----\n drivers/pinctrl/pinconf.c | 9 +++++++--\n 2 files changed, 43 insertions(+), 7 deletions(-)", "diff": "diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c\nindex b5e97689589f..19a9a370d7b9 100644\n--- a/drivers/pinctrl/core.c\n+++ b/drivers/pinctrl/core.c\n@@ -30,6 +30,7 @@\n #include <linux/pinctrl/consumer.h>\n #include <linux/pinctrl/devinfo.h>\n #include <linux/pinctrl/machine.h>\n+#include <linux/pinctrl/pinconf.h>\n #include <linux/pinctrl/pinctrl.h>\n \n #include \"core.h\"\n@@ -621,8 +622,13 @@ static int pinctrl_generic_group_name_to_selector(struct pinctrl_dev *pctldev,\n \t\t\t\t\t\t const char *function)\n {\n \tconst struct pinctrl_ops *ops = pctldev->desc->pctlops;\n-\tint ngroups = ops->get_groups_count(pctldev);\n \tint selector = 0;\n+\tint ngroups;\n+\n+\tif (!ops->get_groups_count || !ops->get_group_name)\n+\t\treturn -EINVAL;\n+\n+\tngroups = ops->get_groups_count(pctldev);\n \n \t/* See if this pctldev has this group */\n \twhile (selector < ngroups) {\n@@ -737,8 +743,15 @@ int pinctrl_get_group_selector(struct pinctrl_dev *pctldev,\n \t\t\t const char *pin_group)\n {\n \tconst struct pinctrl_ops *pctlops = pctldev->desc->pctlops;\n-\tunsigned int ngroups = pctlops->get_groups_count(pctldev);\n \tunsigned int group_selector = 0;\n+\tunsigned int ngroups;\n+\n+\tif (!pctlops->get_groups_count || !pctlops->get_group_name) {\n+\t\tdev_err(pctldev->dev, \"does not support pin groups\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tngroups = pctlops->get_groups_count(pctldev);\n \n \twhile (group_selector < ngroups) {\n \t\tconst char *gname = pctlops->get_group_name(pctldev,\n@@ -1769,6 +1782,11 @@ static int pinctrl_groups_show(struct seq_file *s, void *what)\n \n \tmutex_lock(&pctldev->mutex);\n \n+\tif (!ops->get_groups_count || !ops->get_group_name) {\n+\t\tmutex_unlock(&pctldev->mutex);\n+\t\treturn 0;\n+\t}\n+\n \tngroups = ops->get_groups_count(pctldev);\n \n \tseq_puts(s, \"registered pin groups:\\n\");\n@@ -2049,12 +2067,25 @@ static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev)\n static int pinctrl_check_ops(struct pinctrl_dev *pctldev)\n {\n \tconst struct pinctrl_ops *ops = pctldev->desc->pctlops;\n+\tconst struct pinconf_ops *confops = pctldev->desc->confops;\n+\tbool needs_groups = false;\n \n-\tif (!ops ||\n-\t !ops->get_groups_count ||\n-\t !ops->get_group_name)\n+\tif (!ops)\n \t\treturn -EINVAL;\n \n+\tif (pctldev->desc->pmxops)\n+\t\tneeds_groups = true;\n+\n+\tif (confops && (confops->pin_config_group_get ||\n+\t\t\tconfops->pin_config_group_set))\n+\t\tneeds_groups = true;\n+\n+\tif (needs_groups && (!ops->get_groups_count || !ops->get_group_name)) {\n+\t\tdev_err(pctldev->dev,\n+\t\t\t\"driver needs group callbacks for mux or group config\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n \treturn 0;\n }\n \ndiff --git a/drivers/pinctrl/pinconf.c b/drivers/pinctrl/pinconf.c\nindex dca963633b5d..81686844dfa5 100644\n--- a/drivers/pinctrl/pinconf.c\n+++ b/drivers/pinctrl/pinconf.c\n@@ -275,7 +275,7 @@ void pinconf_show_setting(struct seq_file *s,\n \tcase PIN_MAP_TYPE_CONFIGS_GROUP:\n \t\tseq_printf(s, \"group %s (%d)\",\n \t\t\t pctlops->get_group_name(pctldev,\n-\t\t\t\t\tsetting->data.configs.group_or_pin),\n+\t\t\t\t\t\t setting->data.configs.group_or_pin),\n \t\t\t setting->data.configs.group_or_pin);\n \t\tbreak;\n \tdefault:\n@@ -348,8 +348,13 @@ static int pinconf_groups_show(struct seq_file *s, void *what)\n {\n \tstruct pinctrl_dev *pctldev = s->private;\n \tconst struct pinctrl_ops *pctlops = pctldev->desc->pctlops;\n-\tunsigned int ngroups = pctlops->get_groups_count(pctldev);\n \tunsigned int selector = 0;\n+\tunsigned int ngroups;\n+\n+\tif (!pctlops->get_groups_count || !pctlops->get_group_name)\n+\t\treturn 0;\n+\n+\tngroups = pctlops->get_groups_count(pctldev);\n \n \tseq_puts(s, \"Pin config settings per pin group\\n\");\n \tseq_puts(s, \"Format: group (name): configs\\n\");\n", "prefixes": [ "v9", "3/6" ] }