Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/2234522/?format=api
{ "id": 2234522, "url": "http://patchwork.ozlabs.org/api/1.2/patches/2234522/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/patch/20260507181711.2696783-3-markus.stockhausen@gmx.de/", "project": { "id": 35, "url": "http://patchwork.ozlabs.org/api/1.2/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": "<20260507181711.2696783-3-markus.stockhausen@gmx.de>", "list_archive_url": null, "date": "2026-05-07T18:17:11", "name": "[2/2] i2c: shared-gpio: Add driver for gpio based busses with shared SCL", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "6a208a694839b5fa38202786f7109ffa66f501c0", "submitter": { "id": 89465, "url": "http://patchwork.ozlabs.org/api/1.2/people/89465/?format=api", "name": "Markus Stockhausen", "email": "markus.stockhausen@gmx.de" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-i2c/patch/20260507181711.2696783-3-markus.stockhausen@gmx.de/mbox/", "series": [ { "id": 503245, "url": "http://patchwork.ozlabs.org/api/1.2/series/503245/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/list/?series=503245", "date": "2026-05-07T18:17:10", "name": "i2c: Add i2c-shared-gpio driver", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/503245/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2234522/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2234522/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linux-i2c+bounces-17293-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 (2048-bit key;\n secure) header.d=gmx.de header.i=markus.stockhausen@gmx.de\n header.a=rsa-sha256 header.s=s31663417 header.b=aHELZxBr;\n\tdkim-atps=neutral", "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-i2c+bounces-17293-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)", "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=gmx.de header.i=markus.stockhausen@gmx.de\n header.b=\"aHELZxBr\"", "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=212.227.15.15", "smtp.subspace.kernel.org;\n dmarc=pass (p=quarantine dis=none) header.from=gmx.de", "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=gmx.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)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4gBL860nXGz1yKd\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 08 May 2026 04:17:42 +1000 (AEST)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id D5055302C5D0\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 7 May 2026 18:17:34 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id DE12044E043;\n\tThu, 7 May 2026 18:17:33 +0000 (UTC)", "from mout.gmx.net (mout.gmx.net [212.227.15.15])\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 9B71731E824;\n\tThu, 7 May 2026 18:17:31 +0000 (UTC)", "from client.hidden.invalid by mail.gmx.net (mrgmx004\n [212.227.17.190]) with ESMTPSA (Nemesis) id 1MWAOW-1voYix31ZK-00P0ed; Thu, 07\n May 2026 20:17:21 +0200" ], "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1778177853; cv=none;\n b=IYOyk2tskusC8xY5GOd6O2f4Rr18E0IRdeOOVLqxR9M+tEQF66GxUkWyjJQTNhQ4JQ0G6TBgv9sEMcA3qMaMeYfmSuIQtRbYzpMmXqxnT0Q3SpB87QSK2L10wk84lvnzI8Qr1CYQ1q0E6ZVxY4FbEmdq9ddv1RVEzUn9aMhjpKw=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1778177853; c=relaxed/simple;\n\tbh=PCdWB/j4d3tvqz2ICXj4w19V632VAX0CnlG+fbpCiVM=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=AzNeKkZylcjfLA8H/6BThPuBZN202X0UISvcVQdZmG707EiDwow9cOHN06SHo0y6Va3meliV4b+robNlWbI3hvJwSrTaVbURToW/BB7sL7AWO6kte4Lii2oPMwhiDkuHbHQaJT6GIYzSuCJ6IzHy17V4WdDqU8jspGKwIZycNwo=", "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=quarantine dis=none) header.from=gmx.de;\n spf=pass smtp.mailfrom=gmx.de;\n dkim=pass (2048-bit key) header.d=gmx.de header.i=markus.stockhausen@gmx.de\n header.b=aHELZxBr; arc=none smtp.client-ip=212.227.15.15", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de;\n\ts=s31663417; t=1778177841; x=1778782641;\n\ti=markus.stockhausen@gmx.de;\n\tbh=0YiKpRwYb2fXnbr0PtzZxuAo31T9Z1ow01hPDyeFMO4=;\n\th=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To:\n\t References:MIME-Version:Content-Transfer-Encoding:cc:\n\t content-transfer-encoding:content-type:date:from:message-id:\n\t mime-version:reply-to:subject:to;\n\tb=aHELZxBrEm39edXMOOyjLNl+59LTfuJhf/fxOM3l9X9qpxAmnpUyK6cUEjor8y5f\n\t o4DVHD3BXMTjHApAOA4xn/GTgkp1e66WjvcV3CGXMIMSVvQaNocptRw5ywSn26NdT\n\t 8gqMvbPLwt+4MND4ZQJWL/4i/aOao5ZPPlgMsU1gjP5DgHvA/pCKaOLaHdnj6PVb+\n\t 5naCTK1bAMOwS9mXlzeYQ2ajr0Qs/egcZph9ylek4e8k61G3p+fFWhq30/gPY/pWQ\n\t II+l//Gpd/fHaQai4OLcKD2jPL2CNEwCZFwXcpIHB8opQsciixFYwzeXrKWw5tBdx\n\t /9IM26jS8Rra+GD7OQ==", "X-UI-Sender-Class": "724b4f7f-cbec-4199-ad4e-598c01a50d3a", "From": "Markus Stockhausen <markus.stockhausen@gmx.de>", "To": "andi.shyti@kernel.org,\n\trobh@kernel.org,\n\tkrzk+dt@kernel.org,\n\tconor+dt@kernel.org,\n\tlinux-i2c@vger.kernel.org,\n\tdevicetree@vger.kernel.org", "Cc": "Markus Stockhausen <markus.stockhausen@gmx.de>", "Subject": "[PATCH 2/2] i2c: shared-gpio: Add driver for gpio based busses with\n shared SCL", "Date": "Thu, 7 May 2026 20:17:11 +0200", "Message-ID": "<20260507181711.2696783-3-markus.stockhausen@gmx.de>", "X-Mailer": "git-send-email 2.54.0", "In-Reply-To": "<20260507181711.2696783-1-markus.stockhausen@gmx.de>", "References": "<20260507181711.2696783-1-markus.stockhausen@gmx.de>", "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", "Content-Transfer-Encoding": "quoted-printable", "X-Provags-ID": "V03:K1:A0zUqg1Ysot0BC+ZoxQ069v2+QtiviSq4ODNCrl8cvoq/YE6D10\n 0/E7G8kMxsa+9LwfFBHuVqehHmzv+2Pqjx3kckLHm5HZoIyiRFzqn32b3SNFUYFgb2qmQPi\n aKJMD7gWeTUB0tqUFiDwW7tJeE4x14hcipYqppOaAzvTJ8fjbtKxHUOtXyiqsIhDDZZgOSk\n IxLcU3rKf6HDjy52ILu8g==", "X-Spam-Flag": "NO", "UI-OutboundReport": "notjunk:1;M01:P0:PNYMtdRjryI=;OCB1EywrRFiWe5KtedIw9YR7oUT\n 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" }, "content": "Some lower end hardware (especially Realtek based switches) are\ndesigned with multiple I2C busses that share a single clock\n(SCL) line. E.g. devices like the D-Link DGS-1250-28X can realize\n4 I2C SFP busses with 5 gpios this way.\n\nProvide a i2c-gpio-shared driver (derived from i2c-gpio) that\nhandles such hardware designs.\n\nSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\n---\n drivers/i2c/busses/Kconfig | 10 ++\n drivers/i2c/busses/Makefile | 1 +\n drivers/i2c/busses/i2c-gpio-shared.c | 177 +++++++++++++++++++++++++++\n 3 files changed, 188 insertions(+)\n create mode 100644 drivers/i2c/busses/i2c-gpio-shared.c", "diff": "diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig\nindex 8c935f867a37..f3ab68beeb7f 100644\n--- a/drivers/i2c/busses/Kconfig\n+++ b/drivers/i2c/busses/Kconfig\n@@ -691,6 +691,16 @@ config I2C_GPIO\n \t This is a very simple bitbanging I2C driver utilizing the\n \t arch-neutral GPIO API to control the SCL and SDA lines.\n \n+config I2C_GPIO_SHARED\n+\ttristate \"multiple GPIO-based bitbanging I2C with shared SCL\"\n+\tdepends on GPIOLIB || COMPILE_TEST\n+\tselect I2C_ALGOBIT\n+\thelp\n+\t This is an alternative of the I2C GPIO driver for devices with only\n+\t few GPIO pins where multiple busses with dedicated SDA lines share\n+\t a single SCL line. It can handle an arbitrary number of N shared\n+\t busses implemented with N+1 gpios.\n+\n config I2C_GPIO_FAULT_INJECTOR\n \tbool \"GPIO-based fault injector\"\n \tdepends on I2C_GPIO\ndiff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile\nindex 547123ab351f..724b09e613cb 100644\n--- a/drivers/i2c/busses/Makefile\n+++ b/drivers/i2c/busses/Makefile\n@@ -66,6 +66,7 @@ obj-$(CONFIG_I2C_EG20T)\t\t+= i2c-eg20t.o\n obj-$(CONFIG_I2C_EMEV2)\t\t+= i2c-emev2.o\n obj-$(CONFIG_I2C_EXYNOS5)\t+= i2c-exynos5.o\n obj-$(CONFIG_I2C_GPIO)\t\t+= i2c-gpio.o\n+obj-$(CONFIG_I2C_GPIO_SHARED)\t+= i2c-gpio-shared.o\n obj-$(CONFIG_I2C_HIGHLANDER)\t+= i2c-highlander.o\n obj-$(CONFIG_I2C_HISI)\t\t+= i2c-hisi.o\n obj-$(CONFIG_I2C_HIX5HD2)\t+= i2c-hix5hd2.o\ndiff --git a/drivers/i2c/busses/i2c-gpio-shared.c b/drivers/i2c/busses/i2c-gpio-shared.c\nnew file mode 100644\nindex 000000000000..de082888860c\n--- /dev/null\n+++ b/drivers/i2c/busses/i2c-gpio-shared.c\n@@ -0,0 +1,177 @@\n+// SPDX-License-Identifier: GPL-2.0\n+/*\n+ * Bitbanging driver for multiple I2C busses with shared SCL pin using the GPIO API\n+ * Copyright (c) 2025 Markus Stockhausen <markus.stockhausen at gmx.de>\n+ */\n+\n+#include <linux/gpio/consumer.h>\n+#include <linux/i2c-algo-bit.h>\n+#include <linux/mod_devicetable.h>\n+#include <linux/mutex.h>\n+#include <linux/platform_device.h>\n+\n+struct gpio_shared_ctx;\n+\n+struct gpio_shared_bus {\n+\tstruct gpio_desc *sda;\n+\tstruct i2c_adapter adap;\n+\tstruct i2c_algo_bit_data bit_data;\n+\tstruct gpio_shared_ctx *ctx;\n+};\n+\n+struct gpio_shared_ctx {\n+\tstruct device *dev;\n+\tstruct gpio_desc *scl;\n+\tstruct mutex lock;\n+\tstruct gpio_shared_bus bus[];\n+};\n+\n+static void gpio_shared_setsda(void *data, int state)\n+{\n+\tstruct gpio_shared_bus *bus = data;\n+\n+\tgpiod_set_value_cansleep(bus->sda, state);\n+}\n+\n+static void gpio_shared_setscl(void *data, int state)\n+{\n+\tstruct gpio_shared_bus *bus = data;\n+\tstruct gpio_shared_ctx *ctx = bus->ctx;\n+\n+\tgpiod_set_value_cansleep(ctx->scl, state);\n+}\n+\n+static int gpio_shared_getsda(void *data)\n+{\n+\tstruct gpio_shared_bus *bus = data;\n+\n+\treturn gpiod_get_value_cansleep(bus->sda);\n+}\n+\n+static int gpio_shared_getscl(void *data)\n+{\n+\tstruct gpio_shared_bus *bus = data;\n+\tstruct gpio_shared_ctx *ctx = bus->ctx;\n+\n+\treturn gpiod_get_value_cansleep(ctx->scl);\n+}\n+\n+static int gpio_shared_pre_xfer(struct i2c_adapter *adap)\n+{\n+\tstruct gpio_shared_bus *bus = container_of(adap, struct gpio_shared_bus, adap);\n+\tstruct gpio_shared_ctx *ctx = bus->ctx;\n+\n+\treturn mutex_lock_interruptible(&ctx->lock);\n+}\n+\n+static void gpio_shared_post_xfer(struct i2c_adapter *adap)\n+{\n+\tstruct gpio_shared_bus *bus = container_of(adap, typeof(*bus), adap);\n+\tstruct gpio_shared_ctx *ctx = bus->ctx;\n+\n+\tmutex_unlock(&ctx->lock);\n+}\n+\n+static void gpio_shared_del_adapter(void *data)\n+{\n+\ti2c_del_adapter(data);\n+}\n+\n+static int gpio_shared_probe(struct platform_device *pdev)\n+{\n+\tint bus_count, msecs, ret, bus_num = 0;\n+\tstruct device *dev = &pdev->dev;\n+\tstruct gpio_shared_ctx *ctx;\n+\n+\tbus_count = device_get_child_node_count(dev);\n+\tif (!bus_count)\n+\t\treturn dev_err_probe(dev, -EINVAL, \"no busses defined\\n\");\n+\n+\tctx = devm_kzalloc(dev, struct_size(ctx, bus, bus_count), GFP_KERNEL);\n+\tif (!ctx)\n+\t\treturn dev_err_probe(dev, -ENOMEM, \"memory allocation failed\\n\");\n+\n+\tctx->dev = dev;\n+\tmutex_init(&ctx->lock);\n+\n+\tctx->scl = devm_gpiod_get(dev, \"scl\", GPIOD_OUT_HIGH_OPEN_DRAIN);\n+\tif (IS_ERR(ctx->scl))\n+\t\treturn dev_err_probe(dev, PTR_ERR(ctx->scl), \"shared SCL node not found\\n\");\n+\n+\tdevice_for_each_child_node_scoped(dev, child) {\n+\t\tstruct gpio_shared_bus *bus = &ctx->bus[bus_num];\n+\t\tstruct i2c_adapter *adap = &bus->adap;\n+\t\tstruct i2c_algo_bit_data *bit_data = &bus->bit_data;\n+\n+\t\tbus->sda = devm_fwnode_gpiod_get(dev, child, \"sda\", GPIOD_OUT_HIGH_OPEN_DRAIN,\n+\t\t\t\t\t\t fwnode_get_name(child));\n+\t\tif (IS_ERR(bus->sda))\n+\t\t\treturn dev_err_probe(dev, PTR_ERR(bus->sda),\n+\t\t\t\t\t \"SDA node for bus %d not found\\n\", bus_num);\n+\t\tbus->ctx = ctx;\n+\t\tbit_data->data = bus;\n+\t\tbit_data->setsda = gpio_shared_setsda;\n+\t\tbit_data->setscl = gpio_shared_setscl;\n+\t\tbit_data->pre_xfer = gpio_shared_pre_xfer;\n+\t\tbit_data->post_xfer = gpio_shared_post_xfer;\n+\n+\t\tif (fwnode_property_read_u32(child, \"i2c-gpio-shared,delay-us\", &bit_data->udelay))\n+\t\t\tbit_data->udelay = 5;\n+\t\tif (!fwnode_property_read_bool(child, \"i2c-gpio-shared,sda-output-only\"))\n+\t\t\tbit_data->getsda = gpio_shared_getsda;\n+\n+\t\tif (!device_property_read_bool(dev, \"i2c-gpio-shared,scl-output-only\"))\n+\t\t\tbit_data->getscl = gpio_shared_getscl;\n+\t\tif (!device_property_read_u32(dev, \"i2c-gpio-shared,timeout-ms\", &msecs))\n+\t\t\tbit_data->timeout = msecs_to_jiffies(msecs);\n+\t\telse\n+\t\t\tbit_data->timeout = HZ / 10; /* 100ms */\n+\n+\t\tif (gpiod_cansleep(bus->sda) || gpiod_cansleep(ctx->scl))\n+\t\t\tdev_warn(dev, \"Slow GPIO pins might wreak havoc into I2C/SMBus bus timing\\n\");\n+\n+\t\tadap->dev.parent = dev;\n+\t\tadap->owner = THIS_MODULE;\n+\t\tadap->algo_data = &bus->bit_data;\n+\t\tdevice_set_node(&adap->dev, child);\n+\t\tsnprintf(adap->name, sizeof(adap->name),\n+\t\t\t \"i2c-gpio-shared:%s\", fwnode_get_name(child));\n+\n+\t\tret = i2c_bit_add_bus(adap);\n+\t\tif (ret)\n+\t\t\treturn dev_err_probe(dev, ret, \"failed to register bus %d\\n\", bus_num);\n+\n+\t\tret = devm_add_action_or_reset(dev, gpio_shared_del_adapter, adap);\n+\t\tif (ret)\n+\t\t\treturn dev_err_probe(dev, ret,\n+\t\t\t\t\t \"bus %d cleanup registration failed\\n\", bus_num);\n+\n+\t\tdev_info(dev, \"shared I2C bus %u using lines %u (SDA) and %u (SCL) delay=%d\\n\",\n+\t\t\t bus_num, desc_to_gpio(bus->sda), desc_to_gpio(ctx->scl),\n+\t\t\t bit_data->udelay);\n+\n+\t\tbus_num++;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static const struct of_device_id gpio_shared_of_match[] = {\n+\t{ .compatible = \"i2c-gpio-shared\" },\n+\t{}\n+};\n+MODULE_DEVICE_TABLE(of, gpio_shared_of_match);\n+\n+static struct platform_driver gpio_shared_driver = {\n+\t.probe = gpio_shared_probe,\n+\t.driver = {\n+\t\t.name = \"i2c-gpio-shared\",\n+\t\t.of_match_table = gpio_shared_of_match,\n+\t},\n+};\n+\n+module_platform_driver(gpio_shared_driver);\n+\n+MODULE_LICENSE(\"GPL\");\n+MODULE_AUTHOR(\"Markus Stockhausen <markus.stockhausen at gmx.de>\");\n+MODULE_DESCRIPTION(\"bitbanging multi I2C driver for shared SCL\");\n", "prefixes": [ "2/2" ] }