[PATCH v4 00/18] platform/chrome: Add DT USB/DP muxing/topology support

From: Stephen Boyd
Date: Sun Sep 01 2024 - 00:07:16 EST


This series adds support for fully describing the USB/DP topology on
ChromeOS Trogdor devices in DT. Trogdor devices have a single DP phy in
the AP that is muxed to one of two usb type-c connectors depending on
which port asserts HPD first to the EC. We'd like to know which port is
connected to an external monitor to provide a better experience to the
user about things like which type-c port is displaying DP or which
type-c hub is acting up, etc. Describing the connection all the way from
the source to the connector will allow us to do this.

DRM core patches: These are used to implement lane assignment for DP
altmode configurations through the drm_bridge code. The typec code will
use this to tell the DP phy how many lanes of DP to drive and which
lanes to drive out to the USB type-c connector. Adding support for lane
assignment allows us to implement DP muxing as well, physically
splitting the DP lanes on the DP phy so that hardware doesn't have to
use an analog mux to steer two DP lanes to one or the other type-c port.

Type-c core patches: These add some devm helpers so that the next
patches in the series can skip open-coding devres helpers for
unregistering typec switches and muxes.

DRM aux hpd patches: These implement an auxiliary device for USB type-c
DP alternate mode. I took Dmitry's suggestion and moved the code that
does the remapping into this driver. The existing hpd bridge is wrapped
so as to avoid changing the current users. It also registers a typec mux
and switch (if applicable) so that the DP altmode pin assignment and
port orientation can be passed to the switch callbacks. We'll still need
to implement logic in the phy layer to handle configuration.

Cros EC typec patches: This ties together everything that comes before it in
this series. The EC typec driver registers the drm_dp_typec_bridge that
can signal HPD from the type-c connector through the bridge chain, mux
the DP phy in software so that we don't have to use an analog mux, and
implement orientation control for boards like Kukui that directly
connect the DP phy to the type-c port, necessitating lane assignment to
flip the lanes to match the cable orientation.

Changes from v3: https://lore.kernel.org/r/20240819223834.2049862-1-swboyd@xxxxxxxxxxxx
* Use devm_add_action_or_reset() for typec patches
* Fix kernel-doc
* Document devcon_match_fn_t before extending it
* Include err.h in typec header
* Document devm_typec_switch_register()
* Remove struct cros_typec_dp_bridge and fold it into parent
* Drop unevaluatedProperties in some places
* Change name of registered typec switches to include dev_name of
parent to avoid collisions

Changes from v2: https://lore.kernel.org/r/20240815003417.1175506-1-swboyd@xxxxxxxxxxxx
* Move most of the binding bits to usb-switch.yaml
* Move google,cros-ec-typec binding to usb/
* Implement mode-switch and orientation-switch typec controls in
drm_dp_typec_bridge driver
* Get rid of public APIs that would be used to assign pins or
orientation of the port
* Add devm helpers for typec mux and switch registration
* Add a way to match fwnodes while walking the graph based on the
endpoint

Changes from v1: https://lore.kernel.org/r/20240210070934.2549994-1-swboyd@xxxxxxxxxxxx
* Too many to count!
* Split out the DRM bits into this series
* Moved the logic into dp-aux-hpd bridge driver
* Drive the bridge from cros_ec_typec driver instead of globbing onto
the ACPI centric cros-typec-switch driver
* During that process drop a lot of patches that aren't needed anymore
* Move the DT graph and other properties to the cros-ec-typec binding
* Skip mode-switch/orientation-switch properties because we're not
registering typec structs anymore

Stephen Boyd (18):
drm/atomic-helper: Introduce lane remapping support to bridges
drm/bridge: Verify lane assignment is going to work during
atomic_check
usb: typec: Stub out typec_switch APIs when CONFIG_TYPEC=n
usb: typec: Add device managed typec_mux_register()
usb: typec: Add device managed typec_switch_register()
drm/bridge: aux-hpd: Support USB Type-C DP altmodes via DRM lane
assignment
drm/bridge: dp_typec: Support USB Type-C orientation
drm/bridge: dp_typec: Add "no-hpd" support
drm/bridge: dp_typec: Allow users to hook hpd notify path
devcon property: Document devcon_match_fn_t
device property: Add remote endpoint to devcon matcher
dt-bindings: usb-switch: Extract endpoints to defs
dt-bindings: usb-switch: Extend for DisplayPort altmode
dt-bindings: Move google,cros-ec-typec binding to usb
dt-bindings: usb: Add ports to google,cros-ec-typec for DP altmode
platform/chrome: cros_ec_typec: Add support for signaling DP HPD via
drm_bridge
platform/chrome: cros_ec_typec: Support DP muxing
platform/chrome: cros_ec_typec: Handle lack of HPD information

.../bindings/chrome/google,cros-ec-typec.yaml | 66 --
.../bindings/mfd/google,cros-ec.yaml | 7 +-
.../bindings/usb/google,cros-ec-typec.yaml | 295 +++++++++
.../devicetree/bindings/usb/usb-switch.yaml | 163 ++++-
drivers/base/property.c | 7 +-
drivers/gpu/drm/bridge/aux-hpd-bridge.c | 575 +++++++++++++++++-
drivers/gpu/drm/drm_atomic_state_helper.c | 2 +
drivers/gpu/drm/drm_bridge.c | 51 ++
drivers/platform/chrome/Kconfig | 1 +
drivers/platform/chrome/cros_ec_typec.c | 136 ++++-
drivers/platform/chrome/cros_ec_typec.h | 4 +
drivers/usb/roles/class.c | 4 +-
drivers/usb/typec/mux.c | 79 +++
drivers/usb/typec/retimer.c | 7 +-
include/drm/bridge/aux-bridge.h | 26 +
include/drm/drm_atomic.h | 31 +
include/drm/drm_bridge.h | 4 +
include/linux/property.h | 24 +-
include/linux/usb/typec_mux.h | 59 +-
19 files changed, 1433 insertions(+), 108 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml
create mode 100644 Documentation/devicetree/bindings/usb/google,cros-ec-typec.yaml


base-commit: 8400291e289ee6b2bf9779ff1c83a291501f017b
--
https://chromeos.dev