* [PATCH 0/2] i2c: Add i2c-shared-gpio driver
@ 2026-05-07 18:17 Markus Stockhausen
2026-05-07 18:17 ` [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio Markus Stockhausen
2026-05-07 18:17 ` [PATCH 2/2] i2c: shared-gpio: Add driver for gpio based busses with shared SCL Markus Stockhausen
0 siblings, 2 replies; 15+ messages in thread
From: Markus Stockhausen @ 2026-05-07 18:17 UTC (permalink / raw)
To: andi.shyti, robh, krzk+dt, conor+dt, linux-i2c, devicetree
Cc: Markus Stockhausen
This series adds support for hardware designs where multiple I2C
gpio based busses are realized with dedicated SDA lines and a
shared SCL line. This way N busses can be realized with N+1 gpios.
Currently there are several Realtek switches that make use of
this design. Samples are:
HPE 1920-48G
Linksys LGS310C
Zyxel GS1920-24
Engenius EWS2910
D-Link DGS-1250
Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-07 18:17 [PATCH 0/2] i2c: Add i2c-shared-gpio driver Markus Stockhausen
@ 2026-05-07 18:17 ` Markus Stockhausen
2026-05-07 19:30 ` Rob Herring (Arm)
2026-05-08 13:18 ` Rob Herring
2026-05-07 18:17 ` [PATCH 2/2] i2c: shared-gpio: Add driver for gpio based busses with shared SCL Markus Stockhausen
1 sibling, 2 replies; 15+ messages in thread
From: Markus Stockhausen @ 2026-05-07 18:17 UTC (permalink / raw)
To: andi.shyti, robh, krzk+dt, conor+dt, linux-i2c, devicetree
Cc: Markus Stockhausen
Document the driver for bitbanged gpio I2C busses
with shared SCL lines.
Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
---
.../bindings/i2c/i2c-gpio-shared.yaml | 115 ++++++++++++++++++
1 file changed, 115 insertions(+)
create mode 100644 Documentation/devicetree/bindings/i2c/i2c-gpio-shared.yaml
diff --git a/Documentation/devicetree/bindings/i2c/i2c-gpio-shared.yaml b/Documentation/devicetree/bindings/i2c/i2c-gpio-shared.yaml
new file mode 100644
index 000000000000..7db344821e2f
--- /dev/null
+++ b/Documentation/devicetree/bindings/i2c/i2c-gpio-shared.yaml
@@ -0,0 +1,115 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/i2c/i2c-gpio-shared.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Multiple GPIO bitbanged I2C buses with shared SCL
+
+maintainers:
+ - Markus Stockhausen <markus.stockhausen@gmx.de>
+
+description:
+ Bitbanging I2C bus driver that supports multiple independent I2C buses
+ sharing a single SCL line. Each child node represents one I2C bus with
+ its own SDA line. The shared SCL line is driven by the parent node.
+ A mutex serializes access so that only one bus transfers at a time.
+
+select:
+ properties:
+ compatible:
+ contains:
+ const: i2c-gpio-shared
+ required:
+ - compatible
+
+properties:
+ compatible:
+ const: i2c-gpio-shared
+
+ scl-gpios:
+ maxItems: 1
+ description:
+ GPIO used for the shared SCL signal. Must be configured as
+ open-drain. All child buses share this single clock line.
+
+ i2c-gpio-shared,scl-output-only:
+ type: boolean
+ description:
+ If present, SCL is treated as output only and clock stretching
+ by devices is not supported.
+
+ i2c-gpio-shared,timeout-ms:
+ description:
+ Bus timeout in milliseconds. If not specified, defaults to 100 ms.
+
+ "#address-cells":
+ const: 1
+
+ "#size-cells":
+ const: 0
+
+patternProperties:
+ "^i2c@[0-9a-f]+$":
+ $ref: /schemas/i2c/i2c-controller.yaml#
+ unevaluatedProperties: false
+
+ properties:
+ reg:
+ maxItems: 1
+ description:
+ Bus index used to identify this child bus. Must be unique among
+ siblings and match the node unit address.
+
+ sda-gpios:
+ maxItems: 1
+ description:
+ GPIO used for the SDA signal of this I2C bus. Must be
+ configured as open-drain.
+
+ i2c-gpio-shared,delay-us:
+ default: 5
+ description:
+ Delay in microseconds between signal transitions for this bus.
+ Controls the I2C clock frequency. Defaults to 5 us (~100 kHz).
+
+ i2c-gpio-shared,sda-output-only:
+ type: boolean
+ description:
+ If present, SDA is treated as output only. No acknowledgment
+ or read data from devices can be received on this bus.
+
+ required:
+ - reg
+ - sda-gpios
+
+required:
+ - compatible
+ - scl-gpios
+ - "#address-cells"
+ - "#size-cells"
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+
+ i2c-gpio-shared {
+ compatible = "i2c-gpio-shared";
+ scl-gpios = <&gpio1 31 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ i2c@0 {
+ reg = <0>;
+ sda-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+ i2c-gpio-shared,delay-us = <2>;
+ };
+
+ i2c@1 {
+ reg = <1>;
+ sda-gpios = <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+ i2c-gpio-shared,delay-us = <2>;
+ };
+ };
--
2.54.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/2] i2c: shared-gpio: Add driver for gpio based busses with shared SCL
2026-05-07 18:17 [PATCH 0/2] i2c: Add i2c-shared-gpio driver Markus Stockhausen
2026-05-07 18:17 ` [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio Markus Stockhausen
@ 2026-05-07 18:17 ` Markus Stockhausen
1 sibling, 0 replies; 15+ messages in thread
From: Markus Stockhausen @ 2026-05-07 18:17 UTC (permalink / raw)
To: andi.shyti, robh, krzk+dt, conor+dt, linux-i2c, devicetree
Cc: Markus Stockhausen
Some lower end hardware (especially Realtek based switches) are
designed with multiple I2C busses that share a single clock
(SCL) line. E.g. devices like the D-Link DGS-1250-28X can realize
4 I2C SFP busses with 5 gpios this way.
Provide a i2c-gpio-shared driver (derived from i2c-gpio) that
handles such hardware designs.
Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
---
drivers/i2c/busses/Kconfig | 10 ++
drivers/i2c/busses/Makefile | 1 +
drivers/i2c/busses/i2c-gpio-shared.c | 177 +++++++++++++++++++++++++++
3 files changed, 188 insertions(+)
create mode 100644 drivers/i2c/busses/i2c-gpio-shared.c
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 8c935f867a37..f3ab68beeb7f 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -691,6 +691,16 @@ config I2C_GPIO
This is a very simple bitbanging I2C driver utilizing the
arch-neutral GPIO API to control the SCL and SDA lines.
+config I2C_GPIO_SHARED
+ tristate "multiple GPIO-based bitbanging I2C with shared SCL"
+ depends on GPIOLIB || COMPILE_TEST
+ select I2C_ALGOBIT
+ help
+ This is an alternative of the I2C GPIO driver for devices with only
+ few GPIO pins where multiple busses with dedicated SDA lines share
+ a single SCL line. It can handle an arbitrary number of N shared
+ busses implemented with N+1 gpios.
+
config I2C_GPIO_FAULT_INJECTOR
bool "GPIO-based fault injector"
depends on I2C_GPIO
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index 547123ab351f..724b09e613cb 100644
--- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -66,6 +66,7 @@ obj-$(CONFIG_I2C_EG20T) += i2c-eg20t.o
obj-$(CONFIG_I2C_EMEV2) += i2c-emev2.o
obj-$(CONFIG_I2C_EXYNOS5) += i2c-exynos5.o
obj-$(CONFIG_I2C_GPIO) += i2c-gpio.o
+obj-$(CONFIG_I2C_GPIO_SHARED) += i2c-gpio-shared.o
obj-$(CONFIG_I2C_HIGHLANDER) += i2c-highlander.o
obj-$(CONFIG_I2C_HISI) += i2c-hisi.o
obj-$(CONFIG_I2C_HIX5HD2) += i2c-hix5hd2.o
diff --git a/drivers/i2c/busses/i2c-gpio-shared.c b/drivers/i2c/busses/i2c-gpio-shared.c
new file mode 100644
index 000000000000..de082888860c
--- /dev/null
+++ b/drivers/i2c/busses/i2c-gpio-shared.c
@@ -0,0 +1,177 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Bitbanging driver for multiple I2C busses with shared SCL pin using the GPIO API
+ * Copyright (c) 2025 Markus Stockhausen <markus.stockhausen at gmx.de>
+ */
+
+#include <linux/gpio/consumer.h>
+#include <linux/i2c-algo-bit.h>
+#include <linux/mod_devicetable.h>
+#include <linux/mutex.h>
+#include <linux/platform_device.h>
+
+struct gpio_shared_ctx;
+
+struct gpio_shared_bus {
+ struct gpio_desc *sda;
+ struct i2c_adapter adap;
+ struct i2c_algo_bit_data bit_data;
+ struct gpio_shared_ctx *ctx;
+};
+
+struct gpio_shared_ctx {
+ struct device *dev;
+ struct gpio_desc *scl;
+ struct mutex lock;
+ struct gpio_shared_bus bus[];
+};
+
+static void gpio_shared_setsda(void *data, int state)
+{
+ struct gpio_shared_bus *bus = data;
+
+ gpiod_set_value_cansleep(bus->sda, state);
+}
+
+static void gpio_shared_setscl(void *data, int state)
+{
+ struct gpio_shared_bus *bus = data;
+ struct gpio_shared_ctx *ctx = bus->ctx;
+
+ gpiod_set_value_cansleep(ctx->scl, state);
+}
+
+static int gpio_shared_getsda(void *data)
+{
+ struct gpio_shared_bus *bus = data;
+
+ return gpiod_get_value_cansleep(bus->sda);
+}
+
+static int gpio_shared_getscl(void *data)
+{
+ struct gpio_shared_bus *bus = data;
+ struct gpio_shared_ctx *ctx = bus->ctx;
+
+ return gpiod_get_value_cansleep(ctx->scl);
+}
+
+static int gpio_shared_pre_xfer(struct i2c_adapter *adap)
+{
+ struct gpio_shared_bus *bus = container_of(adap, struct gpio_shared_bus, adap);
+ struct gpio_shared_ctx *ctx = bus->ctx;
+
+ return mutex_lock_interruptible(&ctx->lock);
+}
+
+static void gpio_shared_post_xfer(struct i2c_adapter *adap)
+{
+ struct gpio_shared_bus *bus = container_of(adap, typeof(*bus), adap);
+ struct gpio_shared_ctx *ctx = bus->ctx;
+
+ mutex_unlock(&ctx->lock);
+}
+
+static void gpio_shared_del_adapter(void *data)
+{
+ i2c_del_adapter(data);
+}
+
+static int gpio_shared_probe(struct platform_device *pdev)
+{
+ int bus_count, msecs, ret, bus_num = 0;
+ struct device *dev = &pdev->dev;
+ struct gpio_shared_ctx *ctx;
+
+ bus_count = device_get_child_node_count(dev);
+ if (!bus_count)
+ return dev_err_probe(dev, -EINVAL, "no busses defined\n");
+
+ ctx = devm_kzalloc(dev, struct_size(ctx, bus, bus_count), GFP_KERNEL);
+ if (!ctx)
+ return dev_err_probe(dev, -ENOMEM, "memory allocation failed\n");
+
+ ctx->dev = dev;
+ mutex_init(&ctx->lock);
+
+ ctx->scl = devm_gpiod_get(dev, "scl", GPIOD_OUT_HIGH_OPEN_DRAIN);
+ if (IS_ERR(ctx->scl))
+ return dev_err_probe(dev, PTR_ERR(ctx->scl), "shared SCL node not found\n");
+
+ device_for_each_child_node_scoped(dev, child) {
+ struct gpio_shared_bus *bus = &ctx->bus[bus_num];
+ struct i2c_adapter *adap = &bus->adap;
+ struct i2c_algo_bit_data *bit_data = &bus->bit_data;
+
+ bus->sda = devm_fwnode_gpiod_get(dev, child, "sda", GPIOD_OUT_HIGH_OPEN_DRAIN,
+ fwnode_get_name(child));
+ if (IS_ERR(bus->sda))
+ return dev_err_probe(dev, PTR_ERR(bus->sda),
+ "SDA node for bus %d not found\n", bus_num);
+ bus->ctx = ctx;
+ bit_data->data = bus;
+ bit_data->setsda = gpio_shared_setsda;
+ bit_data->setscl = gpio_shared_setscl;
+ bit_data->pre_xfer = gpio_shared_pre_xfer;
+ bit_data->post_xfer = gpio_shared_post_xfer;
+
+ if (fwnode_property_read_u32(child, "i2c-gpio-shared,delay-us", &bit_data->udelay))
+ bit_data->udelay = 5;
+ if (!fwnode_property_read_bool(child, "i2c-gpio-shared,sda-output-only"))
+ bit_data->getsda = gpio_shared_getsda;
+
+ if (!device_property_read_bool(dev, "i2c-gpio-shared,scl-output-only"))
+ bit_data->getscl = gpio_shared_getscl;
+ if (!device_property_read_u32(dev, "i2c-gpio-shared,timeout-ms", &msecs))
+ bit_data->timeout = msecs_to_jiffies(msecs);
+ else
+ bit_data->timeout = HZ / 10; /* 100ms */
+
+ if (gpiod_cansleep(bus->sda) || gpiod_cansleep(ctx->scl))
+ dev_warn(dev, "Slow GPIO pins might wreak havoc into I2C/SMBus bus timing\n");
+
+ adap->dev.parent = dev;
+ adap->owner = THIS_MODULE;
+ adap->algo_data = &bus->bit_data;
+ device_set_node(&adap->dev, child);
+ snprintf(adap->name, sizeof(adap->name),
+ "i2c-gpio-shared:%s", fwnode_get_name(child));
+
+ ret = i2c_bit_add_bus(adap);
+ if (ret)
+ return dev_err_probe(dev, ret, "failed to register bus %d\n", bus_num);
+
+ ret = devm_add_action_or_reset(dev, gpio_shared_del_adapter, adap);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "bus %d cleanup registration failed\n", bus_num);
+
+ dev_info(dev, "shared I2C bus %u using lines %u (SDA) and %u (SCL) delay=%d\n",
+ bus_num, desc_to_gpio(bus->sda), desc_to_gpio(ctx->scl),
+ bit_data->udelay);
+
+ bus_num++;
+ }
+
+ return 0;
+}
+
+static const struct of_device_id gpio_shared_of_match[] = {
+ { .compatible = "i2c-gpio-shared" },
+ {}
+};
+MODULE_DEVICE_TABLE(of, gpio_shared_of_match);
+
+static struct platform_driver gpio_shared_driver = {
+ .probe = gpio_shared_probe,
+ .driver = {
+ .name = "i2c-gpio-shared",
+ .of_match_table = gpio_shared_of_match,
+ },
+};
+
+module_platform_driver(gpio_shared_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Markus Stockhausen <markus.stockhausen at gmx.de>");
+MODULE_DESCRIPTION("bitbanging multi I2C driver for shared SCL");
--
2.54.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-07 18:17 ` [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio Markus Stockhausen
@ 2026-05-07 19:30 ` Rob Herring (Arm)
2026-05-08 13:18 ` Rob Herring
1 sibling, 0 replies; 15+ messages in thread
From: Rob Herring (Arm) @ 2026-05-07 19:30 UTC (permalink / raw)
To: Markus Stockhausen; +Cc: conor+dt, devicetree, krzk+dt, andi.shyti, linux-i2c
On Thu, 07 May 2026 20:17:10 +0200, Markus Stockhausen wrote:
> Document the driver for bitbanged gpio I2C busses
> with shared SCL lines.
>
> Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
> ---
> .../bindings/i2c/i2c-gpio-shared.yaml | 115 ++++++++++++++++++
> 1 file changed, 115 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/i2c/i2c-gpio-shared.yaml
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/i2c/i2c-gpio-shared.example.dtb: i2c@0: 'i2c-gpio-shared,delay-us' does not match any of the regexes: '^#.*', '^(at25|bm|devbus|dmacap|dsa|exynos|fsi[ab]|gpio-fan|gpio-key|gpio|gpmc|hdmi|i2c-gpio),.*', '^(keypad|m25p|max8952|max8997|max8998|mpmc),.*', '^(pciclass|pinctrl-single|#pinctrl-single|PowerPC),.*', '^(pl022|pxa-mmc|rcar_sound|rotary-encoder|s5m8767|sdhci),.*', '^(simple-audio-card|st-plgpio|st-spics|ts|vsc8531),.*', '^100ask,.*', '^70mai,.*', '^8dev,.*', '^9tripod,.*', '^GEFanuc,.*', '^IBM,.*', '^ORCL,.*', '^SUNW,.*', '^[a-zA-Z0-9#_][a-zA-Z0-9#+\\-._@]{0,63}$', '^[a-zA-Z0-9+\\-._]*@[0-9a-zA-Z,]*$', '^abb,.*', '^abilis,.*', '^abracon,.*', '^abt,.*', '^acbel,.*', '^acelink,.*', '^acer,.*', '^acme,.*', '^actions,.*', '^actiontec,.*', '^active-semi,.*', '^ad,.*', '^adafruit,.*', '^adapteva,.*', '^adaptrum,.*', '^adh,.*', '^adi,.*', '^adieng,.*', '^admatec,.*', '^advantech,.*', '^aeroflexgaisler,.*', '^aesop,.*', '^airoha,.*', '^al,.*', '^alcatel,.*', '^aldec,.*', '^alfa-network,.*', '^algoltek,.*', '^allegro,.*', '^allegromicro,.*', '^alliedtelesis,.*', '^alliedvision,.*', '^allo,.*', '^allwinner,.*', '^alphascale,.*', '^alps,.*', '^alt,.*', '^altr,.*', '^amarula,.*', '^amazon,.*', '^amcc,.*', '^amd,.*', '^amediatech,.*', '^amlogic,.*', '^ampere,.*', '^amphenol,.*', '^ampire,.*', '^ams,.*', '^amstaos,.*', '^analogix,.*', '^anbernic,.*', '^andestech,.*', '^anlogic,.*', '^anvo,.*', '^aoly,.*', '^aosong,.*', '^apm,.*', '^apple,.*', '^aptina,.*', '^arasan,.*', '^archermind,.*', '^arcom,.*', '^arctic,.*', '^arcx,.*', '^arduino,.*', '^argon40,.*', '^ariaboard,.*', '^aries,.*', '^arm,.*', '^armadeus,.*', '^armchina,.*', '^armsom,.*', '^arrow,.*', '^artesyn,.*', '^asahi-kasei,.*', '^asc,.*', '^asix,.*', '^asl-tek,.*', '^aspeed,.*', '^asrock,.*', '^asteralabs,.*', '^asus,.*', '^atheros,.*', '^atlas,.*', '^atmel,.*', '^auo,.*', '^auvidea,.*', '^avago,.*', '^avia,.*', '^avic,.*', '^avnet,.*', '^awinic,.*', '^axentia,.*', '^axiado,.*', '^axis,.*', '^ayaneo,.*', '^azoteq,.*', '^azw,.*', '^baikal,.*', '^bananapi,.*', '^beacon,.*', '^beagle,.*', '^belling,.*', '^bestar,.*', '^bhf,.*', '^bigtreetech,.*', '^bitmain,.*', '^blaize,.*', '^bluegiga,.*', '^blutek,.*', '^boe,.*', '^bosch,.*', '^boundary,.*', '^brcm,.*', '^broadmobi,.*', '^bsh,.*', '^bst,.*', '^bticino,.*', '^buffalo,.*', '^buglabs,.*', '^bur,.*', '^bytedance,.*', '^calamp,.*', '^calao,.*', '^calaosystems,.*', '^calxeda,.*', '^cameo,.*', '^canaan,.*', '^caninos,.*', '^capella,.*', '^cascoda,.*', '^catalyst,.*', '^cavium,.*', '^cct,.*', '^cdns,.*', '^cdtech,.*', '^cellwise,.*', '^ceva,.*', '^chargebyte,.*', '^checkpoint,.*', '^chefree,.*', '^chipidea,.*', '^chipone,.*', '^chipspark,.*', '^chongzhou,.*', '^chrontel,.*', '^chrp,.*', '^chunghwa,.*', '^chuwi,.*', '^ciaa,.*', '^cirrus,.*', '^cisco,.*', '^cix,.*', '^clockwork,.*', '^cloos,.*', '^cloudengines,.*', '^cnm,.*', '^cnxt,.*', '^colorfly,.*', '^compal,.*', '^compulab,.*', '^comvetia,.*', '^congatec,.*', '^coolpi,.*', '^corechips,.*', '^coreriver,.*', '^corpro,.*', '^cortina,.*', '^cosmic,.*', '^crane,.*', '^creative,.*', '^crystalfontz,.*', '^csky,.*', '^csot,.*', '^csq,.*', '^csr,.*', '^ctera,.*', '^ctu,.*', '^cubietech,.*', '^cudy,.*', '^cui,.*', '^cypress,.*', '^cyx,.*', '^cznic,.*', '^dallas,.*', '^dataimage,.*', '^davicom,.*', '^deepcomputing,.*', '^dell,.*', '^delta,.*', '^densitron,.*', '^denx,.*', '^devantech,.*', '^dfi,.*', '^dfrobot,.*', '^dh,.*', '^difrnce,.*', '^digi,.*', '^digilent,.*', '^dimonoff,.*', '^diodes,.*', '^dioo,.*', '^displaytech,.*', '^djn,.*', '^dlc,.*', '^dlg,.*', '^dlink,.*', '^dmo,.*', '^doestek,.*', '^domintech,.*', '^dongwoon,.*', '^dptechnics,.*', '^dragino,.*', '^dream,.*', '^ds,.*', '^dserve,.*', '^dynaimage,.*', '^ea,.*', '^ebang,.*', '^ebbg,.*', '^ebs-systart,.*', '^ebv,.*', '^eckelmann,.*', '^econet,.*', '^edgeble,.*', '^edimax,.*', '^edt,.*', '^ees,.*', '^eeti,.*', '^efinix,.*', '^egnite,.*', '^einfochips,.*', '^eink,.*', '^elan,.*', '^element14,.*', '^elgin,.*', '^elida,.*', '^elimo,.*', '^elpida,.*', '^embedfire,.*', '^embest,.*', '^emcraft,.*', '^emlid,.*', '^emmicro,.*', '^empire-electronix,.*', '^emtrion,.*', '^enbw,.*', '^enclustra,.*', '^endian,.*', '^endless,.*', '^ene,.*', '^energymicro,.*', '^engicam,.*', '^engleder,.*', '^epcos,.*', '^epfl,.*', '^epson,.*', '^esp,.*', '^est,.*', '^eswin,.*', '^etekmicro,.*', '^ettus,.*', '^eukrea,.*', '^everest,.*', '^everspin,.*', '^evervision,.*', '^exar,.*', '^excito,.*', '^exegin,.*', '^ezchip,.*', '^ezurio,.*', '^facebook,.*', '^fairchild,.*', '^fairphone,.*', '^faraday,.*', '^fascontek,.*', '^fastrax,.*', '^fcs,.*', '^feixin,.*', '^feiyang,.*', '^fii,.*', '^firefly,.*', '^fitipower,.*', '^flipkart,.*', '^focaltech,.*', '^forlinx,.*', '^foursemi,.*', '^foxlink,.*', '^freebox,.*', '^freecom,.*', '^frida,.*', '^friendlyarm,.*', '^fsl,.*', '^fujitsu,.*', '^fxtec,.*', '^galaxycore,.*', '^gameforce,.*', '^gardena,.*', '^gateway,.*', '^gateworks,.*', '^gcw,.*', '^ge,.*', '^geekbuying,.*', '^gef,.*', '^gehc,.*', '^gemei,.*', '^gemtek,.*', '^genesys,.*', '^genexis,.*', '^geniatech,.*', '^giantec,.*', '^giantplus,.*', '^glinet,.*', '^globalscale,.*', '^globaltop,.*', '^gmt,.*', '^gocontroll,.*', '^goldelico,.*', '^goodix,.*', '^google,.*', '^goramo,.*', '^gplus,.*', '^grinn,.*', '^grmn,.*', '^gumstix,.*', '^gw,.*', '^hannstar,.*', '^haochuangyi,.*', '^haoyu,.*', '^hardkernel,.*', '^hce,.*', '^headacoustics,.*', '^hechuang,.*', '^hideep,.*', '^himax,.*', '^hinlink,.*', '^hirschmann,.*', '^hisi,.*', '^hisilicon,.*', '^hit,.*', '^hitex,.*', '^hitron,.*', '^holitech,.*', '^holt,.*', '^holtek,.*', '^honestar,.*', '^honeywell,.*', '^hoperf,.*', '^hoperun,.*', '^hp,.*', '^hpe,.*', '^hsg,.*', '^htc,.*', '^huawei,.*', '^hugsun,.*', '^huiling,.*', '^hwacom,.*', '^hxt,.*', '^hycon,.*', '^hydis,.*', '^hynetek,.*', '^hynitron,.*', '^hynix,.*', '^hyundai,.*', '^i2se,.*', '^ibm,.*', '^icplus,.*', '^idt,.*', '^iei,.*', '^ifi,.*', '^ifm,.*', '^ilitek,.*', '^imagis,.*', '^img,.*', '^imi,.*', '^inanbo,.*', '^incircuit,.*', '^incostartec,.*', '^indiedroid,.*', '^inet-tek,.*', '^infineon,.*', '^inforce,.*', '^ingenic,.*', '^ingrasys,.*', '^injoinic,.*', '^innocomm,.*', '^innolux,.*', '^inside-secure,.*', '^insignal,.*', '^inspur,.*', '^intel,.*', '^intercontrol,.*', '^invensense,.*', '^inventec,.*', '^inversepath,.*', '^iom,.*', '^irondevice,.*', '^isee,.*', '^isil,.*', '^issi,.*', '^ite,.*', '^itead,.*', '^itian,.*', '^ivo,.*', '^iwave,.*', '^jadard,.*', '^jasonic,.*', '^jdi,.*', '^jedec,.*', '^jenson,.*', '^jesurun,.*', '^jethome,.*', '^jianda,.*', '^jide,.*', '^joz,.*', '^jty,.*', '^jutouch,.*', '^kam,.*', '^karo,.*', '^keithkoep,.*', '^keymile,.*', '^khadas,.*', '^kiebackpeter,.*', '^kinetic,.*', '^kingdisplay,.*', '^kingnovel,.*', '^kionix,.*', '^kobo,.*', '^kobol,.*', '^koe,.*', '^kontron,.*', '^kosagi,.*', '^kvg,.*', '^kyo,.*', '^lacie,.*', '^laird,.*', '^lamobo,.*', '^lantiq,.*', '^lattice,.*', '^lckfb,.*', '^lctech,.*', '^leadtek,.*', '^leez,.*', '^lego,.*', '^lemaker,.*', '^lenovo,.*', '^lg,.*', '^lgphilips,.*', '^libretech,.*', '^licheepi,.*', '^linaro,.*', '^lincolntech,.*', '^lineartechnology,.*', '^linkease,.*', '^linksprite,.*', '^linksys,.*', '^linutronix,.*', '^linux,.*', '^linx,.*', '^liontron,.*', '^liteon,.*', '^litex,.*', '^lltc,.*', '^logicpd,.*', '^logictechno,.*', '^longcheer,.*', '^lontium,.*', '^loongmasses,.*', '^loongson,.*', '^lsi,.*', '^luckfox,.*', '^lunzn,.*', '^luxshare,.*', '^luxul,.*', '^lwn,.*', '^lxa,.*', '^lxd,.*', '^m5stack,.*', '^macnica,.*', '^mantix,.*', '^mapleboard,.*', '^marantec,.*', '^marvell,.*', '^maxbotix,.*', '^maxim,.*', '^maxlinear,.*', '^maxtor,.*', '^mayqueen,.*', '^mbvl,.*', '^mcube,.*', '^meas,.*', '^mecer,.*', '^mediatek,.*', '^medion,.*', '^megachips,.*', '^mele,.*', '^melexis,.*', '^melfas,.*', '^mellanox,.*', '^memsensing,.*', '^memsic,.*', '^menlo,.*', '^mentor,.*', '^meraki,.*', '^merrii,.*', '^methode,.*', '^micrel,.*', '^microchip,.*', '^microcrystal,.*', '^micron,.*', '^microsoft,.*', '^microsys,.*', '^microtips,.*', '^mikroe,.*', '^mikrotik,.*', '^milianke,.*', '^milkv,.*', '^miniand,.*', '^minix,.*', '^mips,.*', '^miramems,.*', '^mitsubishi,.*', '^mitsumi,.*', '^mixel,.*', '^miyoo,.*', '^mntre,.*', '^mobileye,.*', '^modtronix,.*', '^moortec,.*', '^mosaixtech,.*', '^motorcomm,.*', '^motorola,.*', '^moxa,.*', '^mpl,.*', '^mps,.*', '^mqmaker,.*', '^mrvl,.*', '^mscc,.*', '^msi,.*', '^mstar,.*', '^mti,.*', '^multi-inno,.*', '^mundoreader,.*', '^murata,.*', '^mxic,.*', '^mxicy,.*', '^myir,.*', '^national,.*', '^neardi,.*', '^nec,.*', '^neofidelity,.*', '^neonode,.*', '^netcube,.*', '^netgear,.*', '^netlogic,.*', '^netron-dy,.*', '^netronix,.*', '^netxeon,.*', '^neweast,.*', '^newhaven,.*', '^newvision,.*', '^nexbox,.*', '^nextthing,.*', '^ni,.*', '^nicera,.*', '^nintendo,.*', '^nlt,.*', '^nokia,.*', '^nordic,.*', '^nothing,.*', '^novatech,.*', '^novatek,.*', '^novtech,.*', '^nuclei,.*', '^numonyx,.*', '^nutsboard,.*', '^nuvoton,.*', '^nvd,.*', '^nvidia,.*', '^nxp,.*', '^oceanic,.*', '^ocs,.*', '^oct,.*', '^okaya,.*', '^oki,.*', '^olimex,.*', '^olpc,.*', '^oneplus,.*', '^onething,.*', '^onie,.*', '^onion,.*', '^onnn,.*', '^ontat,.*', '^opalkelly,.*', '^openailab,.*', '^opencores,.*', '^openembed,.*', '^openpandora,.*', '^openrisc,.*', '^openwrt,.*', '^option,.*', '^oranth,.*', '^orisetech,.*', '^ortustech,.*', '^osddisplays,.*', '^osmc,.*', '^ouya,.*', '^overkiz,.*', '^ovti,.*', '^oxsemi,.*', '^ozzmaker,.*', '^panasonic,.*', '^parade,.*', '^parallax,.*', '^particle,.*', '^pda,.*', '^pegatron,.*', '^pericom,.*', '^pervasive,.*', '^phicomm,.*', '^phontech,.*', '^phytec,.*', '^picochip,.*', '^pinctrl-[0-9]+$', '^pine64,.*', '^pineriver,.*', '^pixcir,.*', '^plantower,.*', '^plathome,.*', '^plda,.*', '^plx,.*', '^ply,.*', '^pni,.*', '^pocketbook,.*', '^polaroid,.*', '^polyhex,.*', '^pool[0-3],.*', '^portwell,.*', '^poslab,.*', '^pov,.*', '^powertip,.*', '^powervr,.*', '^powkiddy,.*', '^pri,.*', '^primeview,.*', '^primux,.*', '^probox2,.*', '^prt,.*', '^pulsedlight,.*', '^purism,.*', '^puya,.*', '^qca,.*', '^qcom,.*', '^qemu,.*', '^qi,.*', '^qiaodian,.*', '^qihua,.*', '^qishenglong,.*', '^qnap,.*', '^quanta,.*', '^radxa,.*', '^raidsonic,.*', '^ralink,.*', '^ramtron,.*', '^raspberrypi,.*', '^raumfeld,.*', '^raydium,.*', '^raystar,.*', '^rda,.*', '^realtek,.*', '^relfor,.*', '^remarkable,.*', '^renesas,.*', '^rervision,.*', '^retronix,.*', '^revotics,.*', '^rex,.*', '^rfdigital,.*', '^richtek,.*', '^ricoh,.*', '^rikomagic,.*', '^riot,.*', '^riscv,.*', '^rockchip,.*', '^rocktech,.*', '^rohm,.*', '^ronbo,.*', '^ronetix,.*', '^roofull,.*', '^roseapplepi,.*', '^rve,.*', '^saef,.*', '^sakurapi,.*', '^samsung,.*', '^samtec,.*', '^sancloud,.*', '^sandisk,.*', '^satoz,.*', '^sbs,.*', '^schindler,.*', '^schneider,.*', '^schulercontrol,.*', '^sciosense,.*', '^sdmc,.*', '^seagate,.*', '^seeed,.*', '^seirobotics,.*', '^semtech,.*', '^senseair,.*', '^sensirion,.*', '^sensortek,.*', '^sercomm,.*', '^sff,.*', '^sgd,.*', '^sgmicro,.*', '^sgx,.*', '^sharp,.*', '^shift,.*', '^shimafuji,.*', '^shineworld,.*', '^shiratech,.*', '^si-en,.*', '^si-linux,.*', '^sielaff,.*', '^siemens,.*', '^sifive,.*', '^siflower,.*', '^sigma,.*', '^sii,.*', '^sil,.*', '^silabs,.*', '^silan,.*', '^silead,.*', '^silergy,.*', '^silex-insight,.*', '^siliconfile,.*', '^siliconmitus,.*', '^silvaco,.*', '^simtek,.*', '^sinlinx,.*', '^sinovoip,.*', '^sinowealth,.*', '^sipeed,.*', '^sirf,.*', '^sis,.*', '^sitronix,.*', '^skov,.*', '^skyworks,.*', '^smartfiber,.*', '^smartlabs,.*', '^smartrg,.*', '^smi,.*', '^smsc,.*', '^snps,.*', '^sochip,.*', '^socionext,.*', '^solidrun,.*', '^solomon,.*', '^somfy,.*', '^sony,.*', '^sophgo,.*', '^sourceparts,.*', '^spacemit,.*', '^spansion,.*', '^sparkfun,.*', '^spinalhdl,.*', '^sprd,.*', '^square,.*', '^ssi,.*', '^sst,.*', '^sstar,.*', '^st,.*', '^st-ericsson,.*', '^starfive,.*', '^starry,.*', '^startek,.*', '^starterkit,.*', '^ste,.*', '^stericsson,.*', '^storlink,.*', '^storm,.*', '^storopack,.*', '^summit,.*', '^sunchip,.*', '^sundance,.*', '^sunplus,.*', '^supermicro,.*', '^swir,.*', '^syna,.*', '^synaptics,.*', '^synology,.*', '^synopsys,.*', '^taiguanck,.*', '^taos,.*', '^tbs,.*', '^tbs-biometrics,.*', '^tcg,.*', '^tcl,.*', '^tcs,.*', '^tcu,.*', '^tdo,.*', '^team-source-display,.*', '^technexion,.*', '^technologic,.*', '^techstar,.*', '^techwell,.*', '^teejet,.*', '^teltonika,.*', '^tempo,.*', '^tenda,.*', '^tenstorrent,.*', '^terasic,.*', '^tesla,.*', '^test,.*', '^tfc,.*', '^thead,.*', '^thine,.*', '^thingyjp,.*', '^thundercomm,.*', '^thwc,.*', '^ti,.*', '^tianma,.*', '^tlm,.*', '^tmt,.*', '^topeet,.*', '^topic,.*', '^topland,.*', '^toppoly,.*', '^topwise,.*', '^toradex,.*', '^toshiba,.*', '^toumaz,.*', '^tpk,.*', '^tplink,.*', '^tpo,.*', '^tq,.*', '^transpeed,.*', '^traverse,.*', '^tronfy,.*', '^tronsmart,.*', '^truly,.*', '^tsd,.*', '^turing,.*', '^tuxedo,.*', '^tyan,.*', '^tyhx,.*', '^u-blox,.*', '^u-boot,.*', '^ubnt,.*', '^ucrobotics,.*', '^udoo,.*', '^ufispace,.*', '^ugoos,.*', '^ultrapower,.*', '^ultrarisc,.*', '^ultratronik,.*', '^uni-t,.*', '^uniwest,.*', '^upisemi,.*', '^urt,.*', '^usi,.*', '^usr,.*', '^utoo,.*', '^v3,.*', '^vaisala,.*', '^valve,.*', '^vamrs,.*', '^variscite,.*', '^vdl,.*', '^verisilicon,.*', '^vertexcom,.*', '^via,.*', '^vialab,.*', '^vicor,.*', '^videostrong,.*', '^virtio,.*', '^virtual,.*', '^vishay,.*', '^visionox,.*', '^vitesse,.*', '^vivante,.*', '^vivax,.*', '^vocore,.*', '^voipac,.*', '^voltafield,.*', '^vot,.*', '^vscom,.*', '^vxt,.*', '^wacom,.*', '^wanchanglong,.*', '^wand,.*', '^waveshare,.*', '^wd,.*', '^we,.*', '^welltech,.*', '^wetek,.*', '^wexler,.*', '^whwave,.*', '^wi2wi,.*', '^widora,.*', '^wiko,.*', '^wiligear,.*', '^willsemi,.*', '^winbond,.*', '^wingtech,.*', '^winlink,.*', '^winsen,.*', '^winstar,.*', '^wirelesstag,.*', '^wits,.*', '^wlf,.*', '^wm,.*', '^wobo,.*', '^wolfvision,.*', '^x-powers,.*', '^xen,.*', '^xes,.*', '^xiaomi,.*', '^xicor,.*', '^xillybus,.*', '^xingbangda,.*', '^xinpeng,.*', '^xiphera,.*', '^xlnx,.*', '^xnano,.*', '^xunlong,.*', '^xylon,.*', '^yadro,.*', '^yamaha,.*', '^yes-optoelectronics,.*', '^yic,.*', '^yiming,.*', '^ylm,.*', '^yna,.*', '^yones-toptech,.*', '^ys,.*', '^ysoft,.*', '^yuridenki,.*', '^yuzukihd,.*', '^zarlink,.*', '^zealz,.*', '^zeitec,.*', '^zidoo,.*', '^zii,.*', '^zinitix,.*', '^zkmagic,.*', '^zte,.*', '^zyxel,.*'
from schema $id: http://devicetree.org/schemas/vendor-prefixes.yaml
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/i2c/i2c-gpio-shared.example.dtb: i2c@1: 'i2c-gpio-shared,delay-us' does not match any of the regexes: '^#.*', '^(at25|bm|devbus|dmacap|dsa|exynos|fsi[ab]|gpio-fan|gpio-key|gpio|gpmc|hdmi|i2c-gpio),.*', '^(keypad|m25p|max8952|max8997|max8998|mpmc),.*', '^(pciclass|pinctrl-single|#pinctrl-single|PowerPC),.*', '^(pl022|pxa-mmc|rcar_sound|rotary-encoder|s5m8767|sdhci),.*', '^(simple-audio-card|st-plgpio|st-spics|ts|vsc8531),.*', '^100ask,.*', '^70mai,.*', '^8dev,.*', '^9tripod,.*', '^GEFanuc,.*', '^IBM,.*', '^ORCL,.*', '^SUNW,.*', '^[a-zA-Z0-9#_][a-zA-Z0-9#+\\-._@]{0,63}$', '^[a-zA-Z0-9+\\-._]*@[0-9a-zA-Z,]*$', '^abb,.*', '^abilis,.*', '^abracon,.*', '^abt,.*', '^acbel,.*', '^acelink,.*', '^acer,.*', '^acme,.*', '^actions,.*', '^actiontec,.*', '^active-semi,.*', '^ad,.*', '^adafruit,.*', '^adapteva,.*', '^adaptrum,.*', '^adh,.*', '^adi,.*', '^adieng,.*', '^admatec,.*', '^advantech,.*', '^aeroflexgaisler,.*', '^aesop,.*', '^airoha,.*', '^al,.*', '^alcatel,.*', '^aldec,.*', '^alfa-network,.*', '^algoltek,.*', '^allegro,.*', '^allegromicro,.*', '^alliedtelesis,.*', '^alliedvision,.*', '^allo,.*', '^allwinner,.*', '^alphascale,.*', '^alps,.*', '^alt,.*', '^altr,.*', '^amarula,.*', '^amazon,.*', '^amcc,.*', '^amd,.*', '^amediatech,.*', '^amlogic,.*', '^ampere,.*', '^amphenol,.*', '^ampire,.*', '^ams,.*', '^amstaos,.*', '^analogix,.*', '^anbernic,.*', '^andestech,.*', '^anlogic,.*', '^anvo,.*', '^aoly,.*', '^aosong,.*', '^apm,.*', '^apple,.*', '^aptina,.*', '^arasan,.*', '^archermind,.*', '^arcom,.*', '^arctic,.*', '^arcx,.*', '^arduino,.*', '^argon40,.*', '^ariaboard,.*', '^aries,.*', '^arm,.*', '^armadeus,.*', '^armchina,.*', '^armsom,.*', '^arrow,.*', '^artesyn,.*', '^asahi-kasei,.*', '^asc,.*', '^asix,.*', '^asl-tek,.*', '^aspeed,.*', '^asrock,.*', '^asteralabs,.*', '^asus,.*', '^atheros,.*', '^atlas,.*', '^atmel,.*', '^auo,.*', '^auvidea,.*', '^avago,.*', '^avia,.*', '^avic,.*', '^avnet,.*', '^awinic,.*', '^axentia,.*', '^axiado,.*', '^axis,.*', '^ayaneo,.*', '^azoteq,.*', '^azw,.*', '^baikal,.*', '^bananapi,.*', '^beacon,.*', '^beagle,.*', '^belling,.*', '^bestar,.*', '^bhf,.*', '^bigtreetech,.*', '^bitmain,.*', '^blaize,.*', '^bluegiga,.*', '^blutek,.*', '^boe,.*', '^bosch,.*', '^boundary,.*', '^brcm,.*', '^broadmobi,.*', '^bsh,.*', '^bst,.*', '^bticino,.*', '^buffalo,.*', '^buglabs,.*', '^bur,.*', '^bytedance,.*', '^calamp,.*', '^calao,.*', '^calaosystems,.*', '^calxeda,.*', '^cameo,.*', '^canaan,.*', '^caninos,.*', '^capella,.*', '^cascoda,.*', '^catalyst,.*', '^cavium,.*', '^cct,.*', '^cdns,.*', '^cdtech,.*', '^cellwise,.*', '^ceva,.*', '^chargebyte,.*', '^checkpoint,.*', '^chefree,.*', '^chipidea,.*', '^chipone,.*', '^chipspark,.*', '^chongzhou,.*', '^chrontel,.*', '^chrp,.*', '^chunghwa,.*', '^chuwi,.*', '^ciaa,.*', '^cirrus,.*', '^cisco,.*', '^cix,.*', '^clockwork,.*', '^cloos,.*', '^cloudengines,.*', '^cnm,.*', '^cnxt,.*', '^colorfly,.*', '^compal,.*', '^compulab,.*', '^comvetia,.*', '^congatec,.*', '^coolpi,.*', '^corechips,.*', '^coreriver,.*', '^corpro,.*', '^cortina,.*', '^cosmic,.*', '^crane,.*', '^creative,.*', '^crystalfontz,.*', '^csky,.*', '^csot,.*', '^csq,.*', '^csr,.*', '^ctera,.*', '^ctu,.*', '^cubietech,.*', '^cudy,.*', '^cui,.*', '^cypress,.*', '^cyx,.*', '^cznic,.*', '^dallas,.*', '^dataimage,.*', '^davicom,.*', '^deepcomputing,.*', '^dell,.*', '^delta,.*', '^densitron,.*', '^denx,.*', '^devantech,.*', '^dfi,.*', '^dfrobot,.*', '^dh,.*', '^difrnce,.*', '^digi,.*', '^digilent,.*', '^dimonoff,.*', '^diodes,.*', '^dioo,.*', '^displaytech,.*', '^djn,.*', '^dlc,.*', '^dlg,.*', '^dlink,.*', '^dmo,.*', '^doestek,.*', '^domintech,.*', '^dongwoon,.*', '^dptechnics,.*', '^dragino,.*', '^dream,.*', '^ds,.*', '^dserve,.*', '^dynaimage,.*', '^ea,.*', '^ebang,.*', '^ebbg,.*', '^ebs-systart,.*', '^ebv,.*', '^eckelmann,.*', '^econet,.*', '^edgeble,.*', '^edimax,.*', '^edt,.*', '^ees,.*', '^eeti,.*', '^efinix,.*', '^egnite,.*', '^einfochips,.*', '^eink,.*', '^elan,.*', '^element14,.*', '^elgin,.*', '^elida,.*', '^elimo,.*', '^elpida,.*', '^embedfire,.*', '^embest,.*', '^emcraft,.*', '^emlid,.*', '^emmicro,.*', '^empire-electronix,.*', '^emtrion,.*', '^enbw,.*', '^enclustra,.*', '^endian,.*', '^endless,.*', '^ene,.*', '^energymicro,.*', '^engicam,.*', '^engleder,.*', '^epcos,.*', '^epfl,.*', '^epson,.*', '^esp,.*', '^est,.*', '^eswin,.*', '^etekmicro,.*', '^ettus,.*', '^eukrea,.*', '^everest,.*', '^everspin,.*', '^evervision,.*', '^exar,.*', '^excito,.*', '^exegin,.*', '^ezchip,.*', '^ezurio,.*', '^facebook,.*', '^fairchild,.*', '^fairphone,.*', '^faraday,.*', '^fascontek,.*', '^fastrax,.*', '^fcs,.*', '^feixin,.*', '^feiyang,.*', '^fii,.*', '^firefly,.*', '^fitipower,.*', '^flipkart,.*', '^focaltech,.*', '^forlinx,.*', '^foursemi,.*', '^foxlink,.*', '^freebox,.*', '^freecom,.*', '^frida,.*', '^friendlyarm,.*', '^fsl,.*', '^fujitsu,.*', '^fxtec,.*', '^galaxycore,.*', '^gameforce,.*', '^gardena,.*', '^gateway,.*', '^gateworks,.*', '^gcw,.*', '^ge,.*', '^geekbuying,.*', '^gef,.*', '^gehc,.*', '^gemei,.*', '^gemtek,.*', '^genesys,.*', '^genexis,.*', '^geniatech,.*', '^giantec,.*', '^giantplus,.*', '^glinet,.*', '^globalscale,.*', '^globaltop,.*', '^gmt,.*', '^gocontroll,.*', '^goldelico,.*', '^goodix,.*', '^google,.*', '^goramo,.*', '^gplus,.*', '^grinn,.*', '^grmn,.*', '^gumstix,.*', '^gw,.*', '^hannstar,.*', '^haochuangyi,.*', '^haoyu,.*', '^hardkernel,.*', '^hce,.*', '^headacoustics,.*', '^hechuang,.*', '^hideep,.*', '^himax,.*', '^hinlink,.*', '^hirschmann,.*', '^hisi,.*', '^hisilicon,.*', '^hit,.*', '^hitex,.*', '^hitron,.*', '^holitech,.*', '^holt,.*', '^holtek,.*', '^honestar,.*', '^honeywell,.*', '^hoperf,.*', '^hoperun,.*', '^hp,.*', '^hpe,.*', '^hsg,.*', '^htc,.*', '^huawei,.*', '^hugsun,.*', '^huiling,.*', '^hwacom,.*', '^hxt,.*', '^hycon,.*', '^hydis,.*', '^hynetek,.*', '^hynitron,.*', '^hynix,.*', '^hyundai,.*', '^i2se,.*', '^ibm,.*', '^icplus,.*', '^idt,.*', '^iei,.*', '^ifi,.*', '^ifm,.*', '^ilitek,.*', '^imagis,.*', '^img,.*', '^imi,.*', '^inanbo,.*', '^incircuit,.*', '^incostartec,.*', '^indiedroid,.*', '^inet-tek,.*', '^infineon,.*', '^inforce,.*', '^ingenic,.*', '^ingrasys,.*', '^injoinic,.*', '^innocomm,.*', '^innolux,.*', '^inside-secure,.*', '^insignal,.*', '^inspur,.*', '^intel,.*', '^intercontrol,.*', '^invensense,.*', '^inventec,.*', '^inversepath,.*', '^iom,.*', '^irondevice,.*', '^isee,.*', '^isil,.*', '^issi,.*', '^ite,.*', '^itead,.*', '^itian,.*', '^ivo,.*', '^iwave,.*', '^jadard,.*', '^jasonic,.*', '^jdi,.*', '^jedec,.*', '^jenson,.*', '^jesurun,.*', '^jethome,.*', '^jianda,.*', '^jide,.*', '^joz,.*', '^jty,.*', '^jutouch,.*', '^kam,.*', '^karo,.*', '^keithkoep,.*', '^keymile,.*', '^khadas,.*', '^kiebackpeter,.*', '^kinetic,.*', '^kingdisplay,.*', '^kingnovel,.*', '^kionix,.*', '^kobo,.*', '^kobol,.*', '^koe,.*', '^kontron,.*', '^kosagi,.*', '^kvg,.*', '^kyo,.*', '^lacie,.*', '^laird,.*', '^lamobo,.*', '^lantiq,.*', '^lattice,.*', '^lckfb,.*', '^lctech,.*', '^leadtek,.*', '^leez,.*', '^lego,.*', '^lemaker,.*', '^lenovo,.*', '^lg,.*', '^lgphilips,.*', '^libretech,.*', '^licheepi,.*', '^linaro,.*', '^lincolntech,.*', '^lineartechnology,.*', '^linkease,.*', '^linksprite,.*', '^linksys,.*', '^linutronix,.*', '^linux,.*', '^linx,.*', '^liontron,.*', '^liteon,.*', '^litex,.*', '^lltc,.*', '^logicpd,.*', '^logictechno,.*', '^longcheer,.*', '^lontium,.*', '^loongmasses,.*', '^loongson,.*', '^lsi,.*', '^luckfox,.*', '^lunzn,.*', '^luxshare,.*', '^luxul,.*', '^lwn,.*', '^lxa,.*', '^lxd,.*', '^m5stack,.*', '^macnica,.*', '^mantix,.*', '^mapleboard,.*', '^marantec,.*', '^marvell,.*', '^maxbotix,.*', '^maxim,.*', '^maxlinear,.*', '^maxtor,.*', '^mayqueen,.*', '^mbvl,.*', '^mcube,.*', '^meas,.*', '^mecer,.*', '^mediatek,.*', '^medion,.*', '^megachips,.*', '^mele,.*', '^melexis,.*', '^melfas,.*', '^mellanox,.*', '^memsensing,.*', '^memsic,.*', '^menlo,.*', '^mentor,.*', '^meraki,.*', '^merrii,.*', '^methode,.*', '^micrel,.*', '^microchip,.*', '^microcrystal,.*', '^micron,.*', '^microsoft,.*', '^microsys,.*', '^microtips,.*', '^mikroe,.*', '^mikrotik,.*', '^milianke,.*', '^milkv,.*', '^miniand,.*', '^minix,.*', '^mips,.*', '^miramems,.*', '^mitsubishi,.*', '^mitsumi,.*', '^mixel,.*', '^miyoo,.*', '^mntre,.*', '^mobileye,.*', '^modtronix,.*', '^moortec,.*', '^mosaixtech,.*', '^motorcomm,.*', '^motorola,.*', '^moxa,.*', '^mpl,.*', '^mps,.*', '^mqmaker,.*', '^mrvl,.*', '^mscc,.*', '^msi,.*', '^mstar,.*', '^mti,.*', '^multi-inno,.*', '^mundoreader,.*', '^murata,.*', '^mxic,.*', '^mxicy,.*', '^myir,.*', '^national,.*', '^neardi,.*', '^nec,.*', '^neofidelity,.*', '^neonode,.*', '^netcube,.*', '^netgear,.*', '^netlogic,.*', '^netron-dy,.*', '^netronix,.*', '^netxeon,.*', '^neweast,.*', '^newhaven,.*', '^newvision,.*', '^nexbox,.*', '^nextthing,.*', '^ni,.*', '^nicera,.*', '^nintendo,.*', '^nlt,.*', '^nokia,.*', '^nordic,.*', '^nothing,.*', '^novatech,.*', '^novatek,.*', '^novtech,.*', '^nuclei,.*', '^numonyx,.*', '^nutsboard,.*', '^nuvoton,.*', '^nvd,.*', '^nvidia,.*', '^nxp,.*', '^oceanic,.*', '^ocs,.*', '^oct,.*', '^okaya,.*', '^oki,.*', '^olimex,.*', '^olpc,.*', '^oneplus,.*', '^onething,.*', '^onie,.*', '^onion,.*', '^onnn,.*', '^ontat,.*', '^opalkelly,.*', '^openailab,.*', '^opencores,.*', '^openembed,.*', '^openpandora,.*', '^openrisc,.*', '^openwrt,.*', '^option,.*', '^oranth,.*', '^orisetech,.*', '^ortustech,.*', '^osddisplays,.*', '^osmc,.*', '^ouya,.*', '^overkiz,.*', '^ovti,.*', '^oxsemi,.*', '^ozzmaker,.*', '^panasonic,.*', '^parade,.*', '^parallax,.*', '^particle,.*', '^pda,.*', '^pegatron,.*', '^pericom,.*', '^pervasive,.*', '^phicomm,.*', '^phontech,.*', '^phytec,.*', '^picochip,.*', '^pinctrl-[0-9]+$', '^pine64,.*', '^pineriver,.*', '^pixcir,.*', '^plantower,.*', '^plathome,.*', '^plda,.*', '^plx,.*', '^ply,.*', '^pni,.*', '^pocketbook,.*', '^polaroid,.*', '^polyhex,.*', '^pool[0-3],.*', '^portwell,.*', '^poslab,.*', '^pov,.*', '^powertip,.*', '^powervr,.*', '^powkiddy,.*', '^pri,.*', '^primeview,.*', '^primux,.*', '^probox2,.*', '^prt,.*', '^pulsedlight,.*', '^purism,.*', '^puya,.*', '^qca,.*', '^qcom,.*', '^qemu,.*', '^qi,.*', '^qiaodian,.*', '^qihua,.*', '^qishenglong,.*', '^qnap,.*', '^quanta,.*', '^radxa,.*', '^raidsonic,.*', '^ralink,.*', '^ramtron,.*', '^raspberrypi,.*', '^raumfeld,.*', '^raydium,.*', '^raystar,.*', '^rda,.*', '^realtek,.*', '^relfor,.*', '^remarkable,.*', '^renesas,.*', '^rervision,.*', '^retronix,.*', '^revotics,.*', '^rex,.*', '^rfdigital,.*', '^richtek,.*', '^ricoh,.*', '^rikomagic,.*', '^riot,.*', '^riscv,.*', '^rockchip,.*', '^rocktech,.*', '^rohm,.*', '^ronbo,.*', '^ronetix,.*', '^roofull,.*', '^roseapplepi,.*', '^rve,.*', '^saef,.*', '^sakurapi,.*', '^samsung,.*', '^samtec,.*', '^sancloud,.*', '^sandisk,.*', '^satoz,.*', '^sbs,.*', '^schindler,.*', '^schneider,.*', '^schulercontrol,.*', '^sciosense,.*', '^sdmc,.*', '^seagate,.*', '^seeed,.*', '^seirobotics,.*', '^semtech,.*', '^senseair,.*', '^sensirion,.*', '^sensortek,.*', '^sercomm,.*', '^sff,.*', '^sgd,.*', '^sgmicro,.*', '^sgx,.*', '^sharp,.*', '^shift,.*', '^shimafuji,.*', '^shineworld,.*', '^shiratech,.*', '^si-en,.*', '^si-linux,.*', '^sielaff,.*', '^siemens,.*', '^sifive,.*', '^siflower,.*', '^sigma,.*', '^sii,.*', '^sil,.*', '^silabs,.*', '^silan,.*', '^silead,.*', '^silergy,.*', '^silex-insight,.*', '^siliconfile,.*', '^siliconmitus,.*', '^silvaco,.*', '^simtek,.*', '^sinlinx,.*', '^sinovoip,.*', '^sinowealth,.*', '^sipeed,.*', '^sirf,.*', '^sis,.*', '^sitronix,.*', '^skov,.*', '^skyworks,.*', '^smartfiber,.*', '^smartlabs,.*', '^smartrg,.*', '^smi,.*', '^smsc,.*', '^snps,.*', '^sochip,.*', '^socionext,.*', '^solidrun,.*', '^solomon,.*', '^somfy,.*', '^sony,.*', '^sophgo,.*', '^sourceparts,.*', '^spacemit,.*', '^spansion,.*', '^sparkfun,.*', '^spinalhdl,.*', '^sprd,.*', '^square,.*', '^ssi,.*', '^sst,.*', '^sstar,.*', '^st,.*', '^st-ericsson,.*', '^starfive,.*', '^starry,.*', '^startek,.*', '^starterkit,.*', '^ste,.*', '^stericsson,.*', '^storlink,.*', '^storm,.*', '^storopack,.*', '^summit,.*', '^sunchip,.*', '^sundance,.*', '^sunplus,.*', '^supermicro,.*', '^swir,.*', '^syna,.*', '^synaptics,.*', '^synology,.*', '^synopsys,.*', '^taiguanck,.*', '^taos,.*', '^tbs,.*', '^tbs-biometrics,.*', '^tcg,.*', '^tcl,.*', '^tcs,.*', '^tcu,.*', '^tdo,.*', '^team-source-display,.*', '^technexion,.*', '^technologic,.*', '^techstar,.*', '^techwell,.*', '^teejet,.*', '^teltonika,.*', '^tempo,.*', '^tenda,.*', '^tenstorrent,.*', '^terasic,.*', '^tesla,.*', '^test,.*', '^tfc,.*', '^thead,.*', '^thine,.*', '^thingyjp,.*', '^thundercomm,.*', '^thwc,.*', '^ti,.*', '^tianma,.*', '^tlm,.*', '^tmt,.*', '^topeet,.*', '^topic,.*', '^topland,.*', '^toppoly,.*', '^topwise,.*', '^toradex,.*', '^toshiba,.*', '^toumaz,.*', '^tpk,.*', '^tplink,.*', '^tpo,.*', '^tq,.*', '^transpeed,.*', '^traverse,.*', '^tronfy,.*', '^tronsmart,.*', '^truly,.*', '^tsd,.*', '^turing,.*', '^tuxedo,.*', '^tyan,.*', '^tyhx,.*', '^u-blox,.*', '^u-boot,.*', '^ubnt,.*', '^ucrobotics,.*', '^udoo,.*', '^ufispace,.*', '^ugoos,.*', '^ultrapower,.*', '^ultrarisc,.*', '^ultratronik,.*', '^uni-t,.*', '^uniwest,.*', '^upisemi,.*', '^urt,.*', '^usi,.*', '^usr,.*', '^utoo,.*', '^v3,.*', '^vaisala,.*', '^valve,.*', '^vamrs,.*', '^variscite,.*', '^vdl,.*', '^verisilicon,.*', '^vertexcom,.*', '^via,.*', '^vialab,.*', '^vicor,.*', '^videostrong,.*', '^virtio,.*', '^virtual,.*', '^vishay,.*', '^visionox,.*', '^vitesse,.*', '^vivante,.*', '^vivax,.*', '^vocore,.*', '^voipac,.*', '^voltafield,.*', '^vot,.*', '^vscom,.*', '^vxt,.*', '^wacom,.*', '^wanchanglong,.*', '^wand,.*', '^waveshare,.*', '^wd,.*', '^we,.*', '^welltech,.*', '^wetek,.*', '^wexler,.*', '^whwave,.*', '^wi2wi,.*', '^widora,.*', '^wiko,.*', '^wiligear,.*', '^willsemi,.*', '^winbond,.*', '^wingtech,.*', '^winlink,.*', '^winsen,.*', '^winstar,.*', '^wirelesstag,.*', '^wits,.*', '^wlf,.*', '^wm,.*', '^wobo,.*', '^wolfvision,.*', '^x-powers,.*', '^xen,.*', '^xes,.*', '^xiaomi,.*', '^xicor,.*', '^xillybus,.*', '^xingbangda,.*', '^xinpeng,.*', '^xiphera,.*', '^xlnx,.*', '^xnano,.*', '^xunlong,.*', '^xylon,.*', '^yadro,.*', '^yamaha,.*', '^yes-optoelectronics,.*', '^yic,.*', '^yiming,.*', '^ylm,.*', '^yna,.*', '^yones-toptech,.*', '^ys,.*', '^ysoft,.*', '^yuridenki,.*', '^yuzukihd,.*', '^zarlink,.*', '^zealz,.*', '^zeitec,.*', '^zidoo,.*', '^zii,.*', '^zinitix,.*', '^zkmagic,.*', '^zte,.*', '^zyxel,.*'
from schema $id: http://devicetree.org/schemas/vendor-prefixes.yaml
doc reference errors (make refcheckdocs):
See https://patchwork.kernel.org/project/devicetree/patch/20260507181711.2696783-2-markus.stockhausen@gmx.de
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-07 18:17 ` [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio Markus Stockhausen
2026-05-07 19:30 ` Rob Herring (Arm)
@ 2026-05-08 13:18 ` Rob Herring
2026-05-08 14:43 ` AW: " markus.stockhausen
2026-05-09 11:16 ` markus.stockhausen
1 sibling, 2 replies; 15+ messages in thread
From: Rob Herring @ 2026-05-08 13:18 UTC (permalink / raw)
To: Markus Stockhausen; +Cc: andi.shyti, krzk+dt, conor+dt, linux-i2c, devicetree
On Thu, May 07, 2026 at 08:17:10PM +0200, Markus Stockhausen wrote:
> Document the driver for bitbanged gpio I2C busses
> with shared SCL lines.
>
> Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
> ---
> .../bindings/i2c/i2c-gpio-shared.yaml | 115 ++++++++++++++++++
> 1 file changed, 115 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/i2c/i2c-gpio-shared.yaml
>
> diff --git a/Documentation/devicetree/bindings/i2c/i2c-gpio-shared.yaml b/Documentation/devicetree/bindings/i2c/i2c-gpio-shared.yaml
> new file mode 100644
> index 000000000000..7db344821e2f
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/i2c/i2c-gpio-shared.yaml
> @@ -0,0 +1,115 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/i2c/i2c-gpio-shared.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Multiple GPIO bitbanged I2C buses with shared SCL
> +
> +maintainers:
> + - Markus Stockhausen <markus.stockhausen@gmx.de>
> +
> +description:
> + Bitbanging I2C bus driver that supports multiple independent I2C buses
> + sharing a single SCL line. Each child node represents one I2C bus with
> + its own SDA line. The shared SCL line is driven by the parent node.
> + A mutex serializes access so that only one bus transfers at a time.
Unless it's a h/w mutex, that doesn't belong in the binding. Just define
the requirement, not how it might be implemented.
This is basically a mux, so you should leverage i2c-mux.yaml. Maybe
there is driver infrastructure you can leverage too.
> +
> +select:
> + properties:
> + compatible:
> + contains:
> + const: i2c-gpio-shared
> + required:
> + - compatible
You don't need 'select'.
> +
> +properties:
> + compatible:
> + const: i2c-gpio-shared
> +
> + scl-gpios:
> + maxItems: 1
> + description:
> + GPIO used for the shared SCL signal. Must be configured as
> + open-drain. All child buses share this single clock line.
> +
> + i2c-gpio-shared,scl-output-only:
> + type: boolean
> + description:
> + If present, SCL is treated as output only and clock stretching
> + by devices is not supported.
> +
> + i2c-gpio-shared,timeout-ms:
> + description:
> + Bus timeout in milliseconds. If not specified, defaults to 100 ms.
These 2 properties don't appear to be specific in any way to this
particular h/w.
> +
> + "#address-cells":
> + const: 1
> +
> + "#size-cells":
> + const: 0
> +
> +patternProperties:
> + "^i2c@[0-9a-f]+$":
> + $ref: /schemas/i2c/i2c-controller.yaml#
> + unevaluatedProperties: false
> +
> + properties:
> + reg:
> + maxItems: 1
> + description:
> + Bus index used to identify this child bus. Must be unique among
> + siblings and match the node unit address.
> +
> + sda-gpios:
> + maxItems: 1
> + description:
> + GPIO used for the SDA signal of this I2C bus. Must be
> + configured as open-drain.
I would move this to the parent and make it multiple entries.
> +
> + i2c-gpio-shared,delay-us:
> + default: 5
> + description:
> + Delay in microseconds between signal transitions for this bus.
> + Controls the I2C clock frequency. Defaults to 5 us (~100 kHz).
We already have 'clock-frequency' to define the bus freq.
> +
> + i2c-gpio-shared,sda-output-only:
> + type: boolean
> + description:
> + If present, SDA is treated as output only. No acknowledgment
> + or read data from devices can be received on this bus.
> +
> + required:
> + - reg
> + - sda-gpios
> +
> +required:
> + - compatible
> + - scl-gpios
> + - "#address-cells"
> + - "#size-cells"
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/gpio/gpio.h>
> +
> + i2c-gpio-shared {
> + compatible = "i2c-gpio-shared";
> + scl-gpios = <&gpio1 31 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + i2c@0 {
> + reg = <0>;
> + sda-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
> + i2c-gpio-shared,delay-us = <2>;
> + };
> +
> + i2c@1 {
> + reg = <1>;
> + sda-gpios = <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
> + i2c-gpio-shared,delay-us = <2>;
> + };
> + };
> --
> 2.54.0
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-08 13:18 ` Rob Herring
@ 2026-05-08 14:43 ` markus.stockhausen
2026-05-09 17:38 ` Wolfram Sang
2026-05-09 11:16 ` markus.stockhausen
1 sibling, 1 reply; 15+ messages in thread
From: markus.stockhausen @ 2026-05-08 14:43 UTC (permalink / raw)
To: 'Rob Herring'; +Cc: andi.shyti, linux-i2c
> Von: Rob Herring <robh@kernel.org>
> Gesendet: Freitag, 8. Mai 2026 15:19
> An: Markus Stockhausen <markus.stockhausen@gmx.de>
> Betreff: Re: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
> ...
> This is basically a mux, so you should leverage i2c-mux.yaml. Maybe
> there is driver infrastructure you can leverage too.
Thats what I broke my head about the most. From testing and
my little knowledge I came to the conclusion
- two native i2c-gpio based busses can not share the same SCL
- so mux infrastructure cannot build on top of that
But maybe some I2C expert can advise.
Will address other feedbacks when direction is clear.
Markus
^ permalink raw reply [flat|nested] 15+ messages in thread
* AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-08 13:18 ` Rob Herring
2026-05-08 14:43 ` AW: " markus.stockhausen
@ 2026-05-09 11:16 ` markus.stockhausen
1 sibling, 0 replies; 15+ messages in thread
From: markus.stockhausen @ 2026-05-09 11:16 UTC (permalink / raw)
To: 'Rob Herring'
Cc: andi.shyti, krzk+dt, conor+dt, linux-i2c, devicetree
> Von: Rob Herring <robh@kernel.org>
> Gesendet: Freitag, 8. Mai 2026 15:19
> An: Markus Stockhausen <markus.stockhausen@gmx.de>
> Cc: andi.shyti@kernel.org; krzk+dt@kernel.org; conor+dt@kernel.org;
linux-i2c@vger.kernel.org; devicetree@vger.kernel.org
> Betreff: Re: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
> ...
> > + sda-gpios:
> > + maxItems: 1
> > + description:
> > + GPIO used for the SDA signal of this I2C bus. Must be
> > + configured as open-drain.
>
> I would move this to the parent and make it multiple entries.
Just to be sure. You are saying that the following is good way to go?
examples:
- |
#include <dt-bindings/gpio/gpio.h>
i2c-gpio-shared {
compatible = "i2c-gpio-shared";
scl-gpios = <&gpio1 31 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
sda-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>,
<&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
#address-cells = <1>;
#size-cells = <0>;
i2c@0 {
reg = <0>;
clock-frequency = <400000>;
};
i2c@1 {
reg = <1>;
clock-frequency = <400000>;
};
};
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-08 14:43 ` AW: " markus.stockhausen
@ 2026-05-09 17:38 ` Wolfram Sang
2026-05-09 20:41 ` AW: " markus.stockhausen
2026-05-13 16:21 ` Rob Herring
0 siblings, 2 replies; 15+ messages in thread
From: Wolfram Sang @ 2026-05-09 17:38 UTC (permalink / raw)
To: markus.stockhausen, Bartosz Golaszewski
Cc: 'Rob Herring', andi.shyti, linux-i2c
[-- Attachment #1: Type: text/plain, Size: 1021 bytes --]
Hi all,
> Thats what I broke my head about the most. From testing and
> my little knowledge I came to the conclusion
>
> - two native i2c-gpio based busses can not share the same SCL
> - so mux infrastructure cannot build on top of that
>
> But maybe some I2C expert can advise.
I am not sure i2c-mux is the right approach here. Because every SDA is
already wired, there is no need to select/deselect something. It is only
that SCL is shared, right?
Now, the GPIO subsystem since recently allows for shared GPIOs[1]. This
sounds like the proper approach to me. Sadly, I can't help much because
I have not used this API so far. So, it seems you rather need a GPIO
expert... CCing Bart.
@Bart: is it possible to share a GPIO so that multiple i2c-gpio
instances can use the same GPIO as SCL? Use case is explained in the
cover letter[2].
Happy hacking,
Wolfram
[1] https://lwn.net/Articles/1044022/
[2] https://lore.kernel.org/r/20260507181711.2696783-1-markus.stockhausen@gmx.de
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* AW: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-09 17:38 ` Wolfram Sang
@ 2026-05-09 20:41 ` markus.stockhausen
2026-05-11 12:43 ` Bartosz Golaszewski
2026-05-13 16:21 ` Rob Herring
1 sibling, 1 reply; 15+ messages in thread
From: markus.stockhausen @ 2026-05-09 20:41 UTC (permalink / raw)
To: 'Bartosz Golaszewski'
Cc: andi.shyti, linux-i2c, 'Wolfram Sang'
> Von: Wolfram Sang <wsa+renesas@sang-engineering.com>
> Gesendet: Samstag, 9. Mai 2026 19:39
> An: markus.stockhausen@gmx.de; Bartosz Golaszewski <brgl@kernel.org>
> Cc: 'Rob Herring' <robh@kernel.org>; andi.shyti@kernel.org;
linux-i2c@vger.kernel.org
> Betreff: Re: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
>...
>
> Now, the GPIO subsystem since recently allows for shared GPIOs[1]. This
> sounds like the proper approach to me. Sadly, I can't help much because
> I have not used this API so far. So, it seems you rather need a GPIO
> expert... CCing Bart.
>
> @Bart: is it possible to share a GPIO so that multiple i2c-gpio
> instances can use the same GPIO as SCL? Use case is explained in the
> cover letter[2].
Thanks fort he hint. That looks partly promising. I gave this a quick try
on Kernel 6.18 in OpenWrt. Set the target to HAVE_SHARED_GPIOS.
Finally added several backports (deadlock stalled the boot). Now it at
least starts.
This dts:
i2c0: i2c-sfp0 {
compatible = "i2c-gpio";
#address-cells = <1>;
#size-cells = <0>;
scl-gpios = <&gpio1 31 (GPIO_ACTIVE_HIGH |
GPIO_OPEN_DRAIN)>;
sda-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
};
i2c1: i2c-sfp1 {
compatible = "i2c-gpio";
#address-cells = <1>;
#size-cells = <0>;
scl-gpios = <&gpio1 31 (GPIO_ACTIVE_HIGH |
GPIO_OPEN_DRAIN)>;
sda-gpios = <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
};
Gives these messages:
[ 2.048352] i2c-gpio i2c-sfp0: Slow GPIO pins might wreak havoc into
I2C/SMBus bus timing
[ 2.058333] i2c-gpio i2c-sfp0: using lines 542 (SDA) and 573 (SCL)
[ 2.066139] i2c-gpio i2c-sfp1: Slow GPIO pins might wreak havoc into
I2C/SMBus bus timing
[ 2.076333] i2c-gpio i2c-sfp1: using lines 543 (SDA) and 574 (SCL)
[ 2.084817] sfp sfp-p9: Host maximum power 1.0W
[ 2.091419] sfp sfp-p10: Host maximum power 1.0W
[ 2.200954] In rtldsa_vlan_setup
[ 2.397223] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
set_value for open drain err -1
[ 2.407907] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
set_value for open drain err -1
[ 2.418605] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
set_value for open drain err -1
[ 2.429275] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
set_value for open drain err -1
[ 2.439937] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
set_value for open drain err -1
[ 2.450584] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
set_value for open drain err -1
[ 2.461223] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
set_value for open drain err -1
[ 2.471875] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
set_value for open drain err -1
[ 2.482539] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
set_value for open drain err -1
I assume I must dig deeper here.
Markus
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-09 20:41 ` AW: " markus.stockhausen
@ 2026-05-11 12:43 ` Bartosz Golaszewski
2026-05-11 15:39 ` Wolfram Sang
0 siblings, 1 reply; 15+ messages in thread
From: Bartosz Golaszewski @ 2026-05-11 12:43 UTC (permalink / raw)
To: markus.stockhausen
Cc: andi.shyti, linux-i2c, Wolfram Sang, Bartosz Golaszewski
On Sat, 9 May 2026 22:41:48 +0200, <markus.stockhausen@gmx.de> said:
>> Von: Wolfram Sang <wsa+renesas@sang-engineering.com>
>> Gesendet: Samstag, 9. Mai 2026 19:39
>> An: markus.stockhausen@gmx.de; Bartosz Golaszewski <brgl@kernel.org>
>> Cc: 'Rob Herring' <robh@kernel.org>; andi.shyti@kernel.org;
> linux-i2c@vger.kernel.org
>> Betreff: Re: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
>>...
>>
>> Now, the GPIO subsystem since recently allows for shared GPIOs[1]. This
>> sounds like the proper approach to me. Sadly, I can't help much because
>> I have not used this API so far. So, it seems you rather need a GPIO
>> expert... CCing Bart.
>>
There's no new API TBH. The GPIO shared proxy just mediates the usage of shared
GPIOs without the drivers knowing.
>> @Bart: is it possible to share a GPIO so that multiple i2c-gpio
>> instances can use the same GPIO as SCL? Use case is explained in the
>> cover letter[2].
>
The way it works is with a kind of a voting system. As long as there's at
least one user that votes for the GPIO to be "high", it stays high. Is this
behavior fine for the recovery use-case?
> Thanks fort he hint. That looks partly promising. I gave this a quick try
> on Kernel 6.18 in OpenWrt. Set the target to HAVE_SHARED_GPIOS.
> Finally added several backports (deadlock stalled the boot). Now it at
> least starts.
>
> This dts:
>
> i2c0: i2c-sfp0 {
> compatible = "i2c-gpio";
> #address-cells = <1>;
> #size-cells = <0>;
>
> scl-gpios = <&gpio1 31 (GPIO_ACTIVE_HIGH |
> GPIO_OPEN_DRAIN)>;
> sda-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
> };
>
> i2c1: i2c-sfp1 {
> compatible = "i2c-gpio";
> #address-cells = <1>;
> #size-cells = <0>;
>
> scl-gpios = <&gpio1 31 (GPIO_ACTIVE_HIGH |
> GPIO_OPEN_DRAIN)>;
> sda-gpios = <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
> };
>
> Gives these messages:
>
> [ 2.048352] i2c-gpio i2c-sfp0: Slow GPIO pins might wreak havoc into
> I2C/SMBus bus timing
> [ 2.058333] i2c-gpio i2c-sfp0: using lines 542 (SDA) and 573 (SCL)
> [ 2.066139] i2c-gpio i2c-sfp1: Slow GPIO pins might wreak havoc into
> I2C/SMBus bus timing
> [ 2.076333] i2c-gpio i2c-sfp1: using lines 543 (SDA) and 574 (SCL)
> [ 2.084817] sfp sfp-p9: Host maximum power 1.0W
> [ 2.091419] sfp sfp-p10: Host maximum power 1.0W
> [ 2.200954] In rtldsa_vlan_setup
> [ 2.397223] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
> set_value for open drain err -1
> [ 2.407907] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
> set_value for open drain err -1
> [ 2.418605] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
> set_value for open drain err -1
> [ 2.429275] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
> set_value for open drain err -1
> [ 2.439937] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
> set_value for open drain err -1
> [ 2.450584] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
> set_value for open drain err -1
> [ 2.461223] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
> set_value for open drain err -1
> [ 2.471875] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
> set_value for open drain err -1
> [ 2.482539] gpio-574 (scl): gpio_set_open_drain_value_commit: Error in
> set_value for open drain err -1
>
> I assume I must dig deeper here.
>
> Markus
>
>
Can you enable CONFIG_DEBUG_GPIO and see what it says in the kernel log?
Bart
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-11 12:43 ` Bartosz Golaszewski
@ 2026-05-11 15:39 ` Wolfram Sang
2026-05-11 16:08 ` Bartosz Golaszewski
0 siblings, 1 reply; 15+ messages in thread
From: Wolfram Sang @ 2026-05-11 15:39 UTC (permalink / raw)
To: Bartosz Golaszewski; +Cc: markus.stockhausen, andi.shyti, linux-i2c
[-- Attachment #1: Type: text/plain, Size: 704 bytes --]
> >> @Bart: is it possible to share a GPIO so that multiple i2c-gpio
> >> instances can use the same GPIO as SCL? Use case is explained in the
> >> cover letter[2].
> >
>
> The way it works is with a kind of a voting system. As long as there's at
> least one user that votes for the GPIO to be "high", it stays high. Is this
> behavior fine for the recovery use-case?
Ouch, I guess this will not work then. SCL is high in its idle state.
So, all busses except the active one will request high :(
I guess Markus would need some kind of locking for the shared SCL-GPIO
anyhow. Like bus Y has to wait until bus X has finished SCL toggling for
its transfer. That's how I understand it.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-11 15:39 ` Wolfram Sang
@ 2026-05-11 16:08 ` Bartosz Golaszewski
0 siblings, 0 replies; 15+ messages in thread
From: Bartosz Golaszewski @ 2026-05-11 16:08 UTC (permalink / raw)
To: Wolfram Sang; +Cc: markus.stockhausen, andi.shyti, linux-i2c
On Mon, May 11, 2026 at 5:39 PM Wolfram Sang
<wsa+renesas@sang-engineering.com> wrote:
>
>
> > >> @Bart: is it possible to share a GPIO so that multiple i2c-gpio
> > >> instances can use the same GPIO as SCL? Use case is explained in the
> > >> cover letter[2].
> > >
> >
> > The way it works is with a kind of a voting system. As long as there's at
> > least one user that votes for the GPIO to be "high", it stays high. Is this
> > behavior fine for the recovery use-case?
>
> Ouch, I guess this will not work then. SCL is high in its idle state.
> So, all busses except the active one will request high :(
>
> I guess Markus would need some kind of locking for the shared SCL-GPIO
> anyhow. Like bus Y has to wait until bus X has finished SCL toggling for
> its transfer. That's how I understand it.
>
Could Markus use gpiod_toggle_active_low() to make it logically
"inverted" and then vote high, when it wants it to go low?
Bart
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-09 17:38 ` Wolfram Sang
2026-05-09 20:41 ` AW: " markus.stockhausen
@ 2026-05-13 16:21 ` Rob Herring
2026-05-13 17:19 ` AW: " markus.stockhausen
1 sibling, 1 reply; 15+ messages in thread
From: Rob Herring @ 2026-05-13 16:21 UTC (permalink / raw)
To: Wolfram Sang
Cc: markus.stockhausen, Bartosz Golaszewski, andi.shyti, linux-i2c
On Sat, May 9, 2026 at 12:38 PM Wolfram Sang
<wsa+renesas@sang-engineering.com> wrote:
>
> Hi all,
>
> > Thats what I broke my head about the most. From testing and
> > my little knowledge I came to the conclusion
> >
> > - two native i2c-gpio based busses can not share the same SCL
> > - so mux infrastructure cannot build on top of that
> >
> > But maybe some I2C expert can advise.
>
> I am not sure i2c-mux is the right approach here. Because every SDA is
> already wired, there is no need to select/deselect something. It is only
> that SCL is shared, right?
There's no physical select, but it's still only 1 active at any time
just like a mux.
Rob
^ permalink raw reply [flat|nested] 15+ messages in thread
* AW: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-13 16:21 ` Rob Herring
@ 2026-05-13 17:19 ` markus.stockhausen
2026-05-13 21:34 ` 'Wolfram Sang'
0 siblings, 1 reply; 15+ messages in thread
From: markus.stockhausen @ 2026-05-13 17:19 UTC (permalink / raw)
To: 'Rob Herring', 'Wolfram Sang'
Cc: 'Bartosz Golaszewski', andi.shyti, linux-i2c
> Von: Rob Herring <robh@kernel.org>
> Gesendet: Mittwoch, 13. Mai 2026 18:21
> An: Wolfram Sang <wsa+renesas@sang-engineering.com>
> Betreff: Re: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
> > ...
> > I am not sure i2c-mux is the right approach here. Because every SDA is
> > already wired, there is no need to select/deselect something. It is
> > only that SCL is shared, right?
>
> There's no physical select, but it's still only 1 active at any time just like a mux.
While working around this challenge my POV is as follows:
- See each SDA/SCL combination as an always hardwired bus
- There is no muxing of the bus as a whole.
- It is only a question at what time access is allowed
- Why not expose each bus as simple as possible?
Coming back to my offer about the new I2C bus that only
switches from compatible "i2c-gpio" to "i2c-gpio-shared".
This should be achievable in the driver as follows:
- add each SDA to the individual bus
- build up a shared SCL list for all buses
- link each bus to the required SCL
That will need no shared gpio features. Managing the list
should add ~100 lines and the rest of the driver can be
reused/adapted.
Ideas, hints, objections?
Markus
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: AW: AW: [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio
2026-05-13 17:19 ` AW: " markus.stockhausen
@ 2026-05-13 21:34 ` 'Wolfram Sang'
0 siblings, 0 replies; 15+ messages in thread
From: 'Wolfram Sang' @ 2026-05-13 21:34 UTC (permalink / raw)
To: markus.stockhausen
Cc: 'Rob Herring', 'Bartosz Golaszewski', andi.shyti,
linux-i2c
[-- Attachment #1: Type: text/plain, Size: 1373 bytes --]
Hi Markus,
> While working around this challenge my POV is as follows:
>
> - See each SDA/SCL combination as an always hardwired bus
> - There is no muxing of the bus as a whole.
> - It is only a question at what time access is allowed
> - Why not expose each bus as simple as possible?
I agree and it matches the idea of DT being for HW description only...
> Coming back to my offer about the new I2C bus that only
> switches from compatible "i2c-gpio" to "i2c-gpio-shared".
... even so far that I don't think we should use "i2c-gpio-shared" but
only "i2c-gpio". The DT part (HW description only) is this compatible
with SCL and SDA described. It is up to the OS to decide how to handle
multiple SCLs using the same pin...
> This should be achievable in the driver as follows:
>
> - add each SDA to the individual bus
> - build up a shared SCL list for all buses
> - link each bus to the required SCL
... which should mean for Linux that the i2c-gpio driver recognizes an
already selected pin and reuses it by some reference.
> That will need no shared gpio features. Managing the list
> should add ~100 lines and the rest of the driver can be
> reused/adapted.
I think we are aligned. It would require no DT updates, only extra
handling in the i2c-gpio driver.
Bart, what do you think?
All the best,
Wolfram
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2026-05-13 21:34 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-07 18:17 [PATCH 0/2] i2c: Add i2c-shared-gpio driver Markus Stockhausen
2026-05-07 18:17 ` [PATCH 1/2] dt-bindings: i2c: Add i2c-shared-gpio Markus Stockhausen
2026-05-07 19:30 ` Rob Herring (Arm)
2026-05-08 13:18 ` Rob Herring
2026-05-08 14:43 ` AW: " markus.stockhausen
2026-05-09 17:38 ` Wolfram Sang
2026-05-09 20:41 ` AW: " markus.stockhausen
2026-05-11 12:43 ` Bartosz Golaszewski
2026-05-11 15:39 ` Wolfram Sang
2026-05-11 16:08 ` Bartosz Golaszewski
2026-05-13 16:21 ` Rob Herring
2026-05-13 17:19 ` AW: " markus.stockhausen
2026-05-13 21:34 ` 'Wolfram Sang'
2026-05-09 11:16 ` markus.stockhausen
2026-05-07 18:17 ` [PATCH 2/2] i2c: shared-gpio: Add driver for gpio based busses with shared SCL Markus Stockhausen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox