dt-bindings: pinctrl: Add generic pinctrl for board-level mux chips

Add a generic pinctrl binding for board-level pinmux chips that are
controlled through the multiplexer subsystem.

On some boards, especially development boards, external mux chips are used
to switch SoC signals between different peripherals (e.g. MMC and UART).
The mux select lines are often driven by a GPIO expander over I2C,
as illustrated below:

	┌──────┐      ┌─────┐
	│ SOC  │      │     │    ┌───────┐
	│      │      │     │───►│ MMC   │
	│      │      │ MUX │    └───────┘
	│      ├─────►│     │    ┌───────┐
	│      │      │     │───►│ UART  │
	│      │      └─────┘    └───────┘
	│      │         ▲
	│      │    ┌────┴──────────────┐
	│ I2C  ├───►│ GPIO Expander     │
	└──────┘    └───────────────────┘

Traditionally, gpio-hog is used to configure the onboard mux at boot.
However, the GPIO expander may probe later than consumer devices such as
MMC. As a result, the MUX might not be configured when the peripheral
driver probes, leading to initialization failures or data transfer errors.

Introduce a generic pinctrl binding that models the board-level MUX as a
pin control provider and builds proper device links between the MUX, its
GPIO controller, and peripheral devices. This ensures correct probe
ordering and reliable mux configuration.

The implementation leverages the standard multiplexer subsystem, which
provides broad support for onboard mux controllers and avoids the need for
per-driver custom MUX handling.

Allow pinctrl-* pattern as node name because this pinctrl device have not
reg property.

Reviewed-by: Linus Walleij <linusw@kernel.org>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Linus Walleij <linusw@kernel.org>
This commit is contained in:
Frank Li 2026-05-04 19:54:36 -04:00 committed by Linus Walleij
parent 05e58da46d
commit 9e5e1de61d
2 changed files with 58 additions and 1 deletions

View File

@ -0,0 +1,57 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/pinctrl-multiplexer.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Generic pinctrl device for on-board MUX Chips
maintainers:
- Frank Li <Frank.Li@nxp.com>
description:
Generic pinctrl device for on-board MUX Chips, which switch SoC signals
between different peripherals (e.g. MMC and UART).
The MUX select lines are often driven by a I2C GPIO expander.
properties:
compatible:
const: pinctrl-multiplexer
patternProperties:
'-grp$':
type: object
additionalProperties: false
properties:
mux-states:
maxItems: 1
required:
- mux-states
required:
- compatible
allOf:
- $ref: pinctrl.yaml#
unevaluatedProperties: false
examples:
- |
pinctrl-mux {
compatible = "pinctrl-multiplexer";
uart-grp {
mux-states = <&mux 0>;
};
spi-grp {
mux-states = <&mux 1>;
};
i2c-grp {
mux-states = <&mux 2>;
};
};

View File

@ -27,7 +27,7 @@ description: |
properties:
$nodename:
pattern: "^(pinctrl|pinmux)(@[0-9a-f]+)?$"
pattern: "^(pinctrl|pinmux)(@[0-9a-f]+|-[a-z0-9]+)?$"
"#pinctrl-cells":
description: >