Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2217453/?format=api
{ "id": 2217453, "url": "http://patchwork.ozlabs.org/api/patches/2217453/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/patch/20260329090601.532477-7-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": "<20260329090601.532477-7-o.rempel@pengutronix.de>", "list_archive_url": null, "date": "2026-03-29T09:06:01", "name": "[v8,6/6] mux: add NXP MC33978/MC34978 AMUX driver", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "e6298e27b1553895665aaa60184479122db120f5", "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/20260329090601.532477-7-o.rempel@pengutronix.de/mbox/", "series": [ { "id": 497911, "url": "http://patchwork.ozlabs.org/api/series/497911/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/list/?series=497911", "date": "2026-03-29T09:05:56", "name": "mfd: Add support for NXP MC33978/MC34978 MSDI", "version": 8, "mbox": "http://patchwork.ozlabs.org/series/497911/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2217453/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2217453/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linux-gpio+bounces-34357-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=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-gpio+bounces-34357-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 sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fk7qG3M8fz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 29 Mar 2026 20:09:14 +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 9EEC1304B2B4\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 29 Mar 2026 09:06:26 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 6F75F2EA754;\n\tSun, 29 Mar 2026 09:06:25 +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 54D962EA749\n\tfor <linux-gpio@vger.kernel.org>; Sun, 29 Mar 2026 09:06:23 +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 1w6m5s-00018w-0v; Sun, 29 Mar 2026 11:06:04 +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 1w6m5r-002gZY-0H;\n\tSun, 29 Mar 2026 11:06:03 +0200", "from ore by dude04 with local (Exim 4.98.2)\n\t(envelope-from <ore@pengutronix.de>)\n\tid 1w6m5q-00000002EYW-466x;\n\tSun, 29 Mar 2026 11:06:02 +0200" ], "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1774775185; cv=none;\n b=q2YbVGkVXji7jHIy6RTFDrlEw4sv/Fr+xX+hdOgn6dCLyUbnDaXrUp4QhPxigjOfy2DA11i2tRkcEi9233SKeBXrnECxiWUHsSiD2g1ccwndjQJ1tmjttg82e8G5m7I9tjC2mayfFQM0Ls07+DVUr5/BiZBdir7e7YsoB0Sraig=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1774775185; c=relaxed/simple;\n\tbh=b3thwzw91Nc7MzipNSn8e9LdwrVtomh8juTx54pUF+A=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=EZcJBQ3L3ZVeP6ygyTtAr++aGB2crBcQ5g03G5aPHk6VQkEpzz89RcPgf2uYSx2S9q/akBw343tj68sCZA9ts/wnNhEKJG4JkMTVHxVk8Y79XoccAO3esQBMx5nAZhCV/7J08Adjrj8nh18lil9FbGe+vn8E/YaPwcJrCY/dDS4=", "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 v8 6/6] mux: add NXP MC33978/MC34978 AMUX driver", "Date": "Sun, 29 Mar 2026 11:06:01 +0200", "Message-ID": "<20260329090601.532477-7-o.rempel@pengutronix.de>", "X-Mailer": "git-send-email 2.47.3", "In-Reply-To": "<20260329090601.532477-1-o.rempel@pengutronix.de>", "References": "<20260329090601.532477-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": "Add a mux-control driver for the 24-to-1 analog multiplexer (AMUX)\nembedded in the NXP MC33978/MC34978 Multiple Switch Detection\nInterface (MSDI) devices.\n\nSigned-off-by: Oleksij Rempel <o.rempel@pengutronix.de>\n---\nchanges v8:\n- no chnages\nchanges v7:\n- Simplify the return path and local variable assignment in\n mc33978_mux_set().\n- Change idle_state to a signed integer to properly handle negative MUX\n subsystem constants.\n- Default to MUX_IDLE_AS_IS when the \"idle-state\" device tree property\n is missing.\n- Explicitly reject MUX_IDLE_DISCONNECT since the hardware does not\n support disconnecting the multiplexer.\nchanges v6:\n- parse optional idle-state property\n- validate idle-state against available AMUX channels\n- lower-case probe error messages\nchanges v5:\n- no changes\nchanges v4:\n- no changes\nchanges v3:\n- no changes\nchanges v2:\n- Add missing <linux/err.h> include.\n- Add platform_device_id table\n---\n drivers/mux/Kconfig | 14 ++++\n drivers/mux/Makefile | 2 +\n drivers/mux/mc33978-mux.c | 136 ++++++++++++++++++++++++++++++++++++++\n 3 files changed, 152 insertions(+)\n create mode 100644 drivers/mux/mc33978-mux.c", "diff": "diff --git a/drivers/mux/Kconfig b/drivers/mux/Kconfig\nindex c68132e38138..7532da7e087e 100644\n--- a/drivers/mux/Kconfig\n+++ b/drivers/mux/Kconfig\n@@ -45,6 +45,20 @@ config MUX_GPIO\n \t To compile the driver as a module, choose M here: the module will\n \t be called mux-gpio.\n \n+config MUX_MC33978\n+\ttristate \"NXP MC33978/MC34978 Analog Multiplexer\"\n+\tdepends on MFD_MC33978\n+\thelp\n+\t MC33978/MC34978 24-to-1 analog multiplexer (AMUX) driver.\n+\n+\t This driver provides mux-control for the analog multiplexer,\n+\t which can route switch voltages, temperature, and battery voltage\n+\t to an external ADC. Typically used with IIO ADC drivers to measure\n+\t analog values from the 22 switch inputs plus temperature and VBATP.\n+\n+\t To compile the driver as a module, choose M here: the module will\n+\t be called mc33978-mux.\n+\n config MUX_MMIO\n \ttristate \"MMIO/Regmap register bitfield-controlled Multiplexer\"\n \tdepends on OF\ndiff --git a/drivers/mux/Makefile b/drivers/mux/Makefile\nindex 6e9fa47daf56..339c44b4d4f4 100644\n--- a/drivers/mux/Makefile\n+++ b/drivers/mux/Makefile\n@@ -7,10 +7,12 @@ mux-core-objs\t\t\t:= core.o\n mux-adg792a-objs\t\t:= adg792a.o\n mux-adgs1408-objs\t\t:= adgs1408.o\n mux-gpio-objs\t\t\t:= gpio.o\n+mux-mc33978-objs\t\t:= mc33978-mux.o\n mux-mmio-objs\t\t\t:= mmio.o\n \n obj-$(CONFIG_MULTIPLEXER)\t+= mux-core.o\n obj-$(CONFIG_MUX_ADG792A)\t+= mux-adg792a.o\n obj-$(CONFIG_MUX_ADGS1408)\t+= mux-adgs1408.o\n obj-$(CONFIG_MUX_GPIO)\t\t+= mux-gpio.o\n+obj-$(CONFIG_MUX_MC33978)\t+= mux-mc33978.o\n obj-$(CONFIG_MUX_MMIO)\t\t+= mux-mmio.o\ndiff --git a/drivers/mux/mc33978-mux.c b/drivers/mux/mc33978-mux.c\nnew file mode 100644\nindex 000000000000..2cc7abc659a8\n--- /dev/null\n+++ b/drivers/mux/mc33978-mux.c\n@@ -0,0 +1,136 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+// Copyright (c) 2026 Pengutronix, Oleksij Rempel <kernel@pengutronix.de>\n+/*\n+ * MC33978/MC34978 Analog Multiplexer (AMUX) Driver\n+ *\n+ * This driver provides mux-control for the 24-to-1 analog multiplexer.\n+ * The AMUX routes one of the following signals to the external AMUX pin:\n+ * - Channels 0-13: SG0-SG13 switch voltages\n+ * - Channels 14-21: SP0-SP7 switch voltages\n+ * - Channel 22: Internal temperature diode\n+ * - Channel 23: Battery voltage (VBATP)\n+ *\n+ * Consumer drivers (typically IIO ADC drivers) use the mux-control\n+ * subsystem to select which signal to measure.\n+ *\n+ * Architecture:\n+ * The MC33978 does not have an internal ADC. Instead, it routes analog\n+ * signals to an external AMUX pin that must be connected to an external\n+ * ADC (such as the SoC's internal ADC). The IIO subsystem is responsible\n+ * for coordinating the mux selection and ADC sampling.\n+ */\n+\n+#include <linux/device.h>\n+#include <linux/err.h>\n+#include <linux/mod_devicetable.h>\n+#include <linux/module.h>\n+#include <linux/mux/driver.h>\n+#include <linux/platform_device.h>\n+#include <linux/property.h>\n+#include <linux/regmap.h>\n+\n+#include <linux/mfd/mc33978.h>\n+\n+/* AMUX_CTRL register field definitions */\n+#define MC33978_AMUX_CTRL_MASK\tGENMASK(5, 0)\t/* 6-bit channel select */\n+\n+struct mc33978_mux_priv {\n+\tstruct device *dev;\n+\tstruct regmap *map;\n+};\n+\n+static int mc33978_mux_set(struct mux_control *mux, int state)\n+{\n+\tstruct mux_chip *mux_chip = mux->chip;\n+\tstruct mc33978_mux_priv *priv = mux_chip_priv(mux_chip);\n+\tint ret;\n+\n+\tif (state < 0 || state >= MC33978_NUM_AMUX_CH)\n+\t\treturn -EINVAL;\n+\n+\tret = regmap_update_bits(priv->map, MC33978_REG_AMUX_CTRL,\n+\t\t\t\t MC33978_AMUX_CTRL_MASK, state);\n+\tif (ret)\n+\t\tdev_err(priv->dev, \"failed to set AMUX channel %d: %d\\n\",\n+\t\t\tstate, ret);\n+\n+\treturn ret;\n+}\n+\n+static const struct mux_control_ops mc33978_mux_ops = {\n+\t.set = mc33978_mux_set,\n+};\n+\n+static int mc33978_mux_probe(struct platform_device *pdev)\n+{\n+\tstruct device *dev = &pdev->dev;\n+\tstruct mc33978_mux_priv *priv;\n+\tstruct mux_chip *mux_chip;\n+\tstruct mux_control *mux;\n+\ts32 idle_state;\n+\tint ret;\n+\n+\tmux_chip = devm_mux_chip_alloc(dev, 1, sizeof(*priv));\n+\tif (IS_ERR(mux_chip))\n+\t\treturn dev_err_probe(dev, PTR_ERR(mux_chip), \"failed to allocate mux chip\\n\");\n+\n+\t/* Borrow the parent's DT node so consumers can find this mux chip */\n+\tdevice_set_node(&mux_chip->dev, dev_fwnode(dev->parent));\n+\n+\tpriv = mux_chip_priv(mux_chip);\n+\tpriv->dev = dev;\n+\n+\tpriv->map = dev_get_regmap(dev->parent, NULL);\n+\tif (!priv->map)\n+\t\treturn dev_err_probe(dev, -ENODEV, \"failed to get parent regmap\\n\");\n+\n+\tmux_chip->ops = &mc33978_mux_ops;\n+\n+\tmux = &mux_chip->mux[0];\n+\tmux->states = MC33978_NUM_AMUX_CH;\n+\n+\tret = device_property_read_u32(&mux_chip->dev, \"idle-state\",\n+\t\t\t\t (u32 *)&idle_state);\n+\tif (ret < 0 && ret != -EINVAL) {\n+\t\treturn dev_err_probe(dev, ret, \"failed to parse idle-state\\n\");\n+\t} else if (ret == -EINVAL) {\n+\t\tmux->idle_state = MUX_IDLE_AS_IS;\n+\t} else {\n+\t\tif (idle_state == MUX_IDLE_DISCONNECT)\n+\t\t\treturn dev_err_probe(dev, -EINVAL,\n+\t\t\t\t\t \"idle-disconnect not supported by hardware\\n\");\n+\t\tif (idle_state != MUX_IDLE_AS_IS &&\n+\t\t (idle_state < 0 || idle_state >= MC33978_NUM_AMUX_CH))\n+\t\t\treturn dev_err_probe(dev, -EINVAL, \"invalid idle-state %d\\n\",\n+\t\t\t\t\t idle_state);\n+\t\tmux->idle_state = idle_state;\n+\t}\n+\n+\tret = devm_mux_chip_register(dev, mux_chip);\n+\tif (ret)\n+\t\treturn dev_err_probe(dev, ret, \"failed to register mux chip\\n\");\n+\n+\tplatform_set_drvdata(pdev, mux_chip);\n+\n+\treturn 0;\n+}\n+\n+static const struct platform_device_id mc33978_mux_id[] = {\n+\t{ \"mc33978-mux\", },\n+\t{ \"mc34978-mux\", },\n+\t{ }\n+};\n+MODULE_DEVICE_TABLE(platform, mc33978_mux_id);\n+\n+static struct platform_driver mc33978_mux_driver = {\n+\t.driver = {\n+\t\t.name = \"mc33978-mux\",\n+\t},\n+\t.probe = mc33978_mux_probe,\n+\t.id_table = mc33978_mux_id,\n+};\n+module_platform_driver(mc33978_mux_driver);\n+\n+MODULE_AUTHOR(\"Oleksij Rempel <kernel@pengutronix.de>\");\n+MODULE_DESCRIPTION(\"NXP MC33978/MC34978 Analog Multiplexer Driver\");\n+MODULE_LICENSE(\"GPL\");\n", "prefixes": [ "v8", "6/6" ] }