From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbgjp3.qq.com (smtpbgjp3.qq.com [54.92.39.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82EA82D193C; Thu, 20 Nov 2025 02:24:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.92.39.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605456; cv=none; b=Q2nH3CkfLUTT76eYm0v0D5mIfaxMUEi2gb1+DF/BCo8FXUJnzdJlzRN8/SspfvYmpsFROl5dgfqTxbzw4REU65iASPBG04oCxMFuLyFwcmDTPCvSnNddfC7IKEb8W4jEDIa8I0oU7S1fTU2dnp0fKokjU0/ZCYAyUF3WlyY9l6k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605456; c=relaxed/simple; bh=+93XFzrsl+Mlsx9c1Lxbv/o1PQtmB/e2le8mDGU24DQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=HwF5iV8PMuhfR7evnEhFFGCLQ2jjiLEA0ifKBbKlKu6BMMYIBsbMicDr03R/Zrl2/cn/NFBJ0NWK2ERrwX1Pnus/d+WaRzj18lazz9ctTHM81spiF9I5MbVRemAyShDUfQv4WuBV7VfnSB9zjlnbr+SD63fhocWQLVwwvWsgfjs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=BlVMdBy7; arc=none smtp.client-ip=54.92.39.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="BlVMdBy7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605438; bh=j1djG2TFE/CUEyP0COdHWqSO/caFFOIst9KD5pPTwfU=; h=From:To:Subject:Date:Message-Id; b=BlVMdBy7Ltf441wLnCmm0AVUXNNXTZ3ZWlUIy4BNh3+xUzTTU2XbgXzBhTOBz7Wu2 ZpmUgkC19gH5rdC/0MfNQkHGjckdTMbO3qRrVnu2uO31Op6KBfZ97G1rG2UTs6Kv8d LobSEOUIwcV8KY6HToIkSajUDgB+GenvllqlBB88= X-QQ-mid: zesmtpsz5t1763605436tb3e0b544 X-QQ-Originating-IP: xlc9ysITpbSHXMdJexYj64rNZJQOqI/N1w8Cl7S5hso= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:23:53 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 17663910937081771390 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 01/11] usb: typec: Add notifier functions Date: Thu, 20 Nov 2025 10:23:33 +0800 Message-Id: <20251120022343.250-2-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: MoggEQ/w056c0cwQrknoff/OaUSA1S9PH5HvzFRlhm7bmZvqKQPxLx0s WlTnwqNj4afJEQy2fBzULBeAVDH57xZwNy/KAukcpfRaIU3GYzpkj0Xl/bZDYcIKnUvcF/i hBDL77acA/lGqK61QOA/ts+G/UJmW1WiLfh8r4Va/KuaDOIjf6zv5jQQRDBWHwL2e2k5SVl 6AprX/44Nrs2N4OhxWJHJe5KrDCzTF6gLZNPyIe4wnZObBkhQMMjhvfJDv4cSWpljofqHHs mYhZiFmKZxpxo01iwzMnU0YGGfoj9+gr5+pGHla70VTx9lkqRy/d4TuMuB8XWCT18i/SC8A s19MAI8/etgc4rWe9seKXSqq6ZEc7Tg236qyPyJjO9eTCb0HB7BPgLYJ3z+gVDfpknaW53n QzVqCnKbROb7pnyIUCmmoz7vFrMcsruBIH1lEdbMkGg5vcfa9eBFbNpqKMd7TAcwmirTmy5 Ym9xFjChnwj4RsuW5xzzPmWPn8XCq3oez67ET3oxnlJ+RsabeakvzkU4tfAbWWtNbxITtMG h1+YCT9fC09vw1uUa3WuOuAekdkx7dX52Xf7xqhBKjijD8uyxc/NFWcvxK4B6N4N58OXfLY oUKtFPeui3ii3xcWqmoZ/vroRUMxCbW5tU4T2sY0XPmpYByeo1OhBQQ8AkSqHNnVHJKVZQq WQ93YHSykXRfRNbkDnMcGOlmpL+FwIy3IcpwlMlL7XY+KUulClGUgLCVl1seEBIl205V4zh bUyDJ1wIEtaiTAj+PL+ci/MwKukDQ83NrC+YCo6A+xg9zyIArin2dueXuU7VWg3uyp3lhMQ T/4R7JaoWm+yy5SKuycKISWPnVYReOToozYkgbIHuuVglMU2xp+RRCgX/Vq3vy4T0u3m/cr P2HwYF4IcXtFwEFJ+BG6EBaLv8qnkCBHYDjWWGWDcmi5Qf1lP9kDPzBPjD7sbhq0q6OGNOA mxb8y+f3lqaonwFg2UFTIsMQjS07FbkOm5eGVjqnP8WF/TAwrkMt9MOaiZ8UtDe3qyE3VwC ZfMtD//Q== X-QQ-XMRINFO: NS+P29fieYNw95Bth2bWPxk= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen Some other part of kernel may want to know the event of typec bus. This patch add common notifier function to notify these event. Signed-off-by: Chaoyi Chen --- Changes in v10: - Notify TYPEC_ALTMODE_UNREGISTERED when altmode removed.=20 Changes in v9: - Remove redundant header files. Changes in v8: - Fix coding style. drivers/usb/typec/Makefile | 2 +- drivers/usb/typec/bus.h | 2 ++ drivers/usb/typec/class.c | 3 +++ drivers/usb/typec/notify.c | 23 +++++++++++++++++++++++ include/linux/usb/typec_altmode.h | 9 +++++++++ 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 drivers/usb/typec/notify.c diff --git a/drivers/usb/typec/Makefile b/drivers/usb/typec/Makefile index 7a368fea61bc..20d09c5314d7 100644 --- a/drivers/usb/typec/Makefile +++ b/drivers/usb/typec/Makefile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_TYPEC) +=3D typec.o -typec-y :=3D class.o mux.o bus.o pd.o retimer.o +typec-y :=3D class.o mux.o notify.o bus.o pd.o retimer.o typec-$(CONFIG_ACPI) +=3D port-mapper.o obj-$(CONFIG_TYPEC) +=3D altmodes/ obj-$(CONFIG_TYPEC_TCPM) +=3D tcpm/ diff --git a/drivers/usb/typec/bus.h b/drivers/usb/typec/bus.h index 643b8c81786d..820b59b6d434 100644 --- a/drivers/usb/typec/bus.h +++ b/drivers/usb/typec/bus.h @@ -26,6 +26,8 @@ struct altmode { struct altmode *plug[2]; }; =20 +void typec_notify_event(unsigned long event, void *data); + #define to_altmode(d) container_of(d, struct altmode, adev) =20 extern const struct bus_type typec_bus; diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index 9b2647cb199b..1ccf5385d559 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -600,6 +600,8 @@ typec_register_altmode(struct device *parent, return ERR_PTR(ret); } =20 + typec_notify_event(TYPEC_ALTMODE_REGISTERED, &alt->adev); + return &alt->adev; } =20 @@ -614,6 +616,7 @@ void typec_unregister_altmode(struct typec_altmode *ade= v) { if (IS_ERR_OR_NULL(adev)) return; + typec_notify_event(TYPEC_ALTMODE_UNREGISTERED, adev); typec_retimer_put(to_altmode(adev)->retimer); typec_mux_put(to_altmode(adev)->mux); device_unregister(&adev->dev); diff --git a/drivers/usb/typec/notify.c b/drivers/usb/typec/notify.c new file mode 100644 index 000000000000..9e50b54da359 --- /dev/null +++ b/drivers/usb/typec/notify.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0 +#include + +#include "bus.h" + +static BLOCKING_NOTIFIER_HEAD(typec_notifier_list); + +int typec_altmode_register_notify(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&typec_notifier_list, nb); +} +EXPORT_SYMBOL_GPL(typec_altmode_register_notify); + +int typec_altmode_unregister_notify(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&typec_notifier_list, nb); +} +EXPORT_SYMBOL_GPL(typec_altmode_unregister_notify); + +void typec_notify_event(unsigned long event, void *data) +{ + blocking_notifier_call_chain(&typec_notifier_list, event, data); +} diff --git a/include/linux/usb/typec_altmode.h b/include/linux/usb/typec_al= tmode.h index f7db3bd4c90e..59e20702504b 100644 --- a/include/linux/usb/typec_altmode.h +++ b/include/linux/usb/typec_altmode.h @@ -10,6 +10,7 @@ #define MODE_DISCOVERY_MAX 6 =20 struct typec_altmode_ops; +struct notifier_block; =20 /** * struct typec_altmode - USB Type-C alternate mode device @@ -77,6 +78,14 @@ int typec_altmode_notify(struct typec_altmode *altmode, = unsigned long conf, const struct typec_altmode * typec_altmode_get_partner(struct typec_altmode *altmode); =20 +enum usb_typec_event { + TYPEC_ALTMODE_REGISTERED, + TYPEC_ALTMODE_UNREGISTERED, +}; + +int typec_altmode_register_notify(struct notifier_block *nb); +int typec_altmode_unregister_notify(struct notifier_block *nb); + /** * struct typec_cable_ops - Cable alternate mode operations vector * @enter: Operations to be executed with Enter Mode Command --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbgau2.qq.com (smtpbgau2.qq.com [54.206.34.216]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4799A2D0C9A; Thu, 20 Nov 2025 02:24:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.206.34.216 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605455; cv=none; b=dCHLcZICLmr0Gyf9LX8bwmaaIcKkFVLdMU4WGFRlNSxoQXdepHFKCIhC9uwQ5NSgblI4pYYE5yOv7rWTPbNnKcmZT8V2I5YmQBd9flLQnM8KerNsLqskkkLFM5+0Eifako1G4h5MBnTqYgMnXreeIswokohSuxp1nOnnjQ/VZ7Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605455; c=relaxed/simple; bh=7wtNhbo+VeVCavgf4XLgabmFOfBXoHpxA5cTFC57EsA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=cVhg4MuCHb3FBZ09BNraGf6OBVgLmF06oBw7CobgDavEvxsKm9dq0z2nz6WUpQLgS6ZD2c+jbi1qtd7Kd2BXpoB+gqc1oO19DTlLrbxbiC3SQUF5Db41dnnJ68srVp45dMgqCzEpFmATUL4X191iGmF7HZyBEwq8gvBCE1fK8HA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=QIGs7h07; arc=none smtp.client-ip=54.206.34.216 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="QIGs7h07" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605442; bh=sNllLzwzBdbka1nV55jX2kPT1B2apGnU6AJpIMBuw2w=; h=From:To:Subject:Date:Message-Id; b=QIGs7h07c7TwQWmHT52X4cRsRrfSYK9GKGbCoyHkzWbyzXUrKYGZj0tumTA+P9rlf R/exwNh8CTv0VQwmdu5IB98R7AlGUtYu8RFYcceiHAUbNuopjX1F5MbHGD6bG7kVlq 393hL+7hXRFiZnHupznHh0lkUuIgvAlpYlh5JaMk= X-QQ-mid: zesmtpsz5t1763605440ta4483ad6 X-QQ-Originating-IP: rY8CRKUnY2Dkoe7g+ABEYFCRQNfG+zxyr4d4xbHKp1Y= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:23:57 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 10264243527081182811 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 02/11] usb: typec: Export all typec device types Date: Thu, 20 Nov 2025 10:23:34 +0800 Message-Id: <20251120022343.250-3-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: OYpbVsTx4C81sRvOX01gMFpA6wlrIwTFEYLDEuzfgpFu0RQ/KUjc7bIT JSNZwqE7tgKCMSmxhHX5jeF5phwqrHzQnJkV00Jj8p4P9+i4M2QJaKprBKHth9nd/JAD+F+ VTIGYll9az/XM54HT3011omXOgHdbK9Hn2mmkbj0BqjVGU0jr0IcVFPKmMwDPlvrlAn1j+D b+xJHxr0kTz2VkWGyi+fwquWzASGybQi1iy6YpgwEX3k9SWqgPCDSvWn8wbDjsoGdBLGAAF T08QktUistBXlD6GQHyvOQnyPrGmqwpZutX8V8SFjj206GhQabYSmK/4m9C//lNa+xnWR39 8ce/WupJtPTEnUSMcfliJpxxISveTxvdeHk9IWpmmi9Q0YfSJ1nr+F43Xt8HuQPFXSbUkQp dWc4r5wr/vy6mCiAxebm8Mppl4Fe0ltNwD110X8hejz1ZDiloVQoz/PRw/rm8lbpv9rv/QP e/1rSdWjtUFQE38zb3ge0QH5BLWKONvpfWq/6cgg/tF+E9L9aelxOoDv5qJescLmgd3r8UF m+H4He2nRIA/+lzqPUgtaDzL1ZRYYJvDUfXlQnE3THwBmNQyz/PDip7gAavU3ImvCf5ELn/ 9HzYU/klBnus9OBohTtQcq0Nks7Zl4g9u4oI0qAFt33XoNLwFx8fq2i9BBatvbk1eZXCBju GbYbzyPAjODBPF+cOK/YC7fGdb8E5wqETt/9BeUJ7Ij2lSwUqgmUbwasz9aJViaGIw6wOvM kOtr6AZAKjA8p202tMQTRI/X5qqKFqEkm98MRMLA6xry5vJr/PBScZv7eDlxYSmUVwzcwg0 NOPeCG29jx1WviopsoaJg98NOjKp3lwYuEzzhwUSEELBNTZV7AmAtokWXQC044Xwk3UIdtn MqlHyKkVH91ME++3r5P0pfJ6FWo2JpMhJTjQdDhlbclWuDW7CtU4AbQo/H+tT7pwNbxlqmu rZn+/rCXrsZpZDbjbHEz3biG7wxJml2OGlLFWSk5CWLrVUmO5v7E/TWH+D1qZJ2+Kgqs= X-QQ-XMRINFO: M/715EihBoGSf6IYSX1iLFg= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen Export all typec device types for identification. Signed-off-by: Chaoyi Chen Reviewed-by: Heikki Krogerus --- (no changes since v9) drivers/usb/typec/class.c | 4 ++++ drivers/usb/typec/class.h | 10 ---------- include/linux/usb/typec.h | 10 ++++++++++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index 1ccf5385d559..957add6b73e9 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -793,6 +793,7 @@ const struct device_type typec_partner_dev_type =3D { .groups =3D typec_partner_groups, .release =3D typec_partner_release, }; +EXPORT_SYMBOL_GPL(typec_partner_dev_type); =20 static void typec_partner_link_device(struct typec_partner *partner, struc= t device *dev) { @@ -1147,6 +1148,7 @@ const struct device_type typec_plug_dev_type =3D { .groups =3D typec_plug_groups, .release =3D typec_plug_release, }; +EXPORT_SYMBOL_GPL(typec_plug_dev_type); =20 /** * typec_plug_set_num_altmodes - Set the number of available plug altmodes @@ -1295,6 +1297,7 @@ const struct device_type typec_cable_dev_type =3D { .groups =3D typec_cable_groups, .release =3D typec_cable_release, }; +EXPORT_SYMBOL_GPL(typec_cable_dev_type); =20 /** * typec_cable_get - Get a reference to the USB Type-C cable @@ -2034,6 +2037,7 @@ const struct device_type typec_port_dev_type =3D { .uevent =3D typec_uevent, .release =3D typec_release, }; +EXPORT_SYMBOL_GPL(typec_port_dev_type); =20 /* --------------------------------------- */ /* Driver callbacks to report role updates */ diff --git a/drivers/usb/typec/class.h b/drivers/usb/typec/class.h index db2fe96c48ff..f04f6987bed8 100644 --- a/drivers/usb/typec/class.h +++ b/drivers/usb/typec/class.h @@ -87,16 +87,6 @@ struct typec_port { #define to_typec_cable(_dev_) container_of(_dev_, struct typec_cable, dev) #define to_typec_partner(_dev_) container_of(_dev_, struct typec_partner, = dev) =20 -extern const struct device_type typec_partner_dev_type; -extern const struct device_type typec_cable_dev_type; -extern const struct device_type typec_plug_dev_type; -extern const struct device_type typec_port_dev_type; - -#define is_typec_partner(dev) ((dev)->type =3D=3D &typec_partner_dev_type) -#define is_typec_cable(dev) ((dev)->type =3D=3D &typec_cable_dev_type) -#define is_typec_plug(dev) ((dev)->type =3D=3D &typec_plug_dev_type) -#define is_typec_port(dev) ((dev)->type =3D=3D &typec_port_dev_type) - extern const struct class typec_mux_class; extern const struct class retimer_class; extern const struct class typec_class; diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h index 309251572e2e..02fed8293415 100644 --- a/include/linux/usb/typec.h +++ b/include/linux/usb/typec.h @@ -56,6 +56,16 @@ enum typec_role { TYPEC_SOURCE, }; =20 +extern const struct device_type typec_partner_dev_type; +extern const struct device_type typec_cable_dev_type; +extern const struct device_type typec_plug_dev_type; +extern const struct device_type typec_port_dev_type; + +#define is_typec_partner(dev) ((dev)->type =3D=3D &typec_partner_dev_type) +#define is_typec_cable(dev) ((dev)->type =3D=3D &typec_cable_dev_type) +#define is_typec_plug(dev) ((dev)->type =3D=3D &typec_plug_dev_type) +#define is_typec_port(dev) ((dev)->type =3D=3D &typec_port_dev_type) + static inline int is_sink(enum typec_role role) { return role =3D=3D TYPEC_SINK; --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbgeu2.qq.com (smtpbgeu2.qq.com [18.194.254.142]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 857922D97A1; Thu, 20 Nov 2025 02:24:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=18.194.254.142 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605462; cv=none; b=uoRw2hxkXMwrWN35XmgWQvi7ZG3uHRJQ+sIXQIppbXJqoBJ7FzPCAkFABNqXE2mS3irVZt3NjYT3ryZY3GKyQs2AzZv2uMbXRL9+HRlzyCKnwCd4FXrVP3Jhc1FASl+DwVy8QeQYSuKF9lL4J20fvOJr+st8F8i2ldclKOf8qaI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605462; c=relaxed/simple; bh=w4wTrcR9PdM/fwgDqYtYC2AR8/Tuu4WqkLc2PahVwYM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=e6zlMGb2Q6OTU3scgLOaOz1yWa0AuEZoSzDr1ip6ZCZ/yHrYndxsn8HYjAa2xwT9ZGM0dJ1W8wkeED9JAiIEEys0SXdFS6DeRLwF/iLHi3LzwZJF68pSUL4SWSoa30hb9h+kQScabq7cakthJn/6vOCma1RovBuEx10/R1T7WM4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=KGrp+SJI; arc=none smtp.client-ip=18.194.254.142 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="KGrp+SJI" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605446; bh=6190OwFbT9PTsW3kKLd3ukON7IhuHFcLiMCVWlPFG/w=; h=From:To:Subject:Date:Message-Id; b=KGrp+SJIX/GgOlZrN8zuK0TbkgZR00QZtBgblFcsBobHlvzL0TPTZwvpTDxriu2NS 8SkuRkd56JWYl5deN92jlH9ihbr5zpTXOP4I7w6DAQZvp+3Im8qLRXmPVkDh3gQEPy Vl4gx+8lKPRMRlOR+D5bFhj1zVjCTSndXltlhGCU= X-QQ-mid: zesmtpsz5t1763605445t5e65da5a X-QQ-Originating-IP: yMXVAgeYNGkbnDLlHmM3QvLOvK3cAkWMNfw32dJmod4= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:24:02 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 11576405309476374289 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 03/11] drm/bridge: Implement generic USB Type-C DP HPD bridge Date: Thu, 20 Nov 2025 10:23:35 +0800 Message-Id: <20251120022343.250-4-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: M+eyQDNJUfG3XFyaHo9S/Bx1EZAd/b3cfc5vSrVm9q8eCzLP+9A2RJB+ NGhM4lpqYMQfoDjJzcy6COmNA/AsQafet0tmxxX/ZrTbXP6EsFukNRRrd6R4tjeCUzhzUxs +o26USEwYnCnsIur0kNJAgw1tb3D1WZYpD5Kt26GlonEnN9l/DyVBHWlwEPAvOBTUmKXvM7 eVXHo5P7IM3B52AhANWSk+7IGSwYJzfl2xqbdTSwtyun1DdMWIRn0Gh18B4ahwzrmhWQOLp JecJ4Z1WuC26CX5I6a7LbYKLRvoS1kFfyxC3oSLtY7aO0rcUbS1GD6qQgJkXxaTJq3p5m8L 64imKm5tWZSOO/LKFbbfZ3leZX0/K0vUS6aXzFei7Cdh1tnyzjIaevbdUMqN5uUGEJheTjQ pFZm9BlGvJP7UgUyChZLiATAItzjHlNUwt4EsL69Gb5qsiAaASobPrqN7yQWj1bDhHQ+qOn AtDoxopQz0s18TxxJADIJAmXWf+ioJJxxKv9FVCFWn1LwH919X3q6P8OtI+aoUYfvRytZmJ plzxAHU4iDaeAKvxm3Ws/JDW8h2VNlOiZ9IEvv1C6ZmygvGpoJLkRZFg/LIcjkLovVeFNaH YIrsWN6WgDKmT1CZ1p3NFqzOKru8qvqdj2SxCqWVJ+JBoDA2J5SjxRsnI+kDySZIgDU9Zxb l1JVmvCXzN3nnYMMEue41lUmMfSjNe0FYEp1xbllimecmOOMkS5rH/Wyuo/Q8hntbfBS+K+ KnMdwIfco0XkHVO1mY8eWQ7gmjWricoQquIJ8QLgQwZwlv69n6CCGghoBbKW46JEXG3sdKE HWWzxNp8AJE0pJuJ3CD2BISDRNcgSkj/CDxzNsycQyEb1D+s5/lfQcOOJEfLd/XSisLw4eD HciMxojztNXnjAik9M6fCwTU4heLWaxTHQx+Mw+yrdo/9cgMZkAU71saL956y6ipXScl8jX yvE2HHSzZFwRs9i3K8biV/U4UFWDuTmRqsqGazPHeAo5gc6s9gs1LD2/o2TQvFp48EwXTRe 9rTCrBoaBvGif/sQvdoC0UG6T85LI0S7ixig2EeGmPkUj8m1DOkkceTFCCuYJS+QXJZ5Dz5 qqg77vR72yX X-QQ-XMRINFO: OWPUhxQsoeAVDbp3OJHYyFg= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen The HPD function of Type-C DP is implemented through drm_connector_oob_hotplug_event(). For embedded DP, it is required that the DRM connector fwnode corresponds to the Type-C port fwnode. To describe the relationship between the DP controller and the Type-C port device, we usually using drm_bridge to build a bridge chain. Now several USB-C controller drivers have already implemented the DP HPD bridge function provided by aux-hpd-bridge.c, it will build a DP HPD bridge on USB-C connector port device. But this requires the USB-C controller driver to manually register the HPD bridge. If the driver does not implement this feature, the bridge will not be create. So this patch implements a generic DP HPD bridge based on aux-hpd-bridge.c. It will monitor Type-C bus events, and when a Type-C port device containing the DP svid is registered, it will create an HPD bridge for it without the need for the USB-C controller driver to implement it. Signed-off-by: Chaoyi Chen Reviewed-by: Heikki Krogerus --- (no changes since v10) Changes in v9: - Remove the exposed DRM_AUX_HPD_BRIDGE option, and select DRM_AUX_HPD_TYPEC_BRIDGE when it is available. - Add more commit comment about problem background. Changes in v8: - Merge generic DP HPD bridge into one module. drivers/gpu/drm/bridge/Kconfig | 10 ++++ drivers/gpu/drm/bridge/Makefile | 1 + .../gpu/drm/bridge/aux-hpd-typec-dp-bridge.c | 50 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 drivers/gpu/drm/bridge/aux-hpd-typec-dp-bridge.c diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index a250afd8d662..559487aa09a9 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -30,6 +30,16 @@ config DRM_AUX_HPD_BRIDGE Simple bridge that terminates the bridge chain and provides HPD support. =20 +if DRM_AUX_HPD_BRIDGE +config DRM_AUX_HPD_TYPEC_BRIDGE + tristate + depends on TYPEC || !TYPEC + default TYPEC + help + Simple bridge that terminates the bridge chain and provides HPD + support. It build bridge on each USB-C connector device node. +endif + menu "Display Interface Bridges" depends on DRM && DRM_BRIDGE =20 diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makef= ile index c7dc03182e59..a3a0393d2e72 100644 --- a/drivers/gpu/drm/bridge/Makefile +++ b/drivers/gpu/drm/bridge/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_DRM_AUX_BRIDGE) +=3D aux-bridge.o obj-$(CONFIG_DRM_AUX_HPD_BRIDGE) +=3D aux-hpd-bridge.o +obj-$(CONFIG_DRM_AUX_HPD_TYPEC_BRIDGE) +=3D aux-hpd-typec-dp-bridge.o obj-$(CONFIG_DRM_CHIPONE_ICN6211) +=3D chipone-icn6211.o obj-$(CONFIG_DRM_CHRONTEL_CH7033) +=3D chrontel-ch7033.o obj-$(CONFIG_DRM_CROS_EC_ANX7688) +=3D cros-ec-anx7688.o diff --git a/drivers/gpu/drm/bridge/aux-hpd-typec-dp-bridge.c b/drivers/gpu= /drm/bridge/aux-hpd-typec-dp-bridge.c new file mode 100644 index 000000000000..9cb6a0cb0f0a --- /dev/null +++ b/drivers/gpu/drm/bridge/aux-hpd-typec-dp-bridge.c @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-2.0+ +#include +#include +#include + +#include + +static int drm_typec_bus_event(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct typec_altmode *alt =3D (struct typec_altmode *)data; + + if (action !=3D TYPEC_ALTMODE_REGISTERED) + goto done; + + if (is_typec_partner(&alt->dev) || alt->svid !=3D USB_TYPEC_DP_SID) + goto done; + + /* + * alt->dev.parent->parent : USB-C controller device + * alt->dev.parent : USB-C connector device + */ + drm_dp_hpd_bridge_register(alt->dev.parent->parent, + to_of_node(alt->dev.parent->fwnode)); + +done: + return NOTIFY_OK; +} + +static struct notifier_block drm_typec_event_nb =3D { + .notifier_call =3D drm_typec_bus_event, +}; + +static void drm_aux_hpd_typec_dp_bridge_module_exit(void) +{ + typec_altmode_unregister_notify(&drm_typec_event_nb); +} + +static int __init drm_aux_hpd_typec_dp_bridge_module_init(void) +{ + typec_altmode_register_notify(&drm_typec_event_nb); + + return 0; +} + +module_init(drm_aux_hpd_typec_dp_bridge_module_init); +module_exit(drm_aux_hpd_typec_dp_bridge_module_exit); + +MODULE_DESCRIPTION("DRM TYPEC DP HPD BRIDGE"); +MODULE_LICENSE("GPL"); --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbgsg1.qq.com (smtpbgsg1.qq.com [54.254.200.92]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C8E972D949F; Thu, 20 Nov 2025 02:24:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.254.200.92 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605461; cv=none; b=JdPphctilPKE7FNubZYJC9w/8VSF9Bmr32FHQ3WpOm+/v29CdKrUbmOXXJIfBvrbBOAqhuqJZ7aiLGsv2LY6l38SzYYM/fa85WFOUFCQazzLMvLa84fkpOKKNFp17G7O49WB+AyuuoI2AZNKI7f6iECiH6uIuIC7qCc1+/9/ggU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605461; c=relaxed/simple; bh=vsDLDpzUdRvKLfqh5r53F2pJg80bDLMY9OUZw5pQizo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=KaNZu0i6gEuq+JtPGSdWkUan6y+jXF0aaN7GTfW8dfO7yEM3em3bwmySoiKennbNiZOspOh7HEPzJTqTrwVzbNbPGNQhIGXlhg7dil7/xkFkUSEbGDEvF6XrfeXCuh44a9qu8DVhY5QD6l+ssbDp0eR3/vDbegzHmQ6CEblGyew= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=Hp0aa4k/; arc=none smtp.client-ip=54.254.200.92 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="Hp0aa4k/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605450; bh=1Rmi+Q4GF/407K6ZniEsrCCllkX24Iw13eXk+RLRPJY=; h=From:To:Subject:Date:Message-Id; b=Hp0aa4k/br6PbjS95vPQnZpgPyRggBKKdqEtBEhc4r2Bb9Wwr2BXumq+u3ofjnNmM TeN/5fXWEYbtlsniyLesB+dZv0EsHFXsxLcJM+rS7EHlbgn9Wkii9MQBhgL1zdtaqH pyWAugequtHLiJ9N7nIzxPJ94Ysqk6KgVwQxnsR8= X-QQ-mid: zesmtpsz5t1763605449te09995bd X-QQ-Originating-IP: SlP6sV3u7ks5xAuCRdbslt/D/tIaAhTCdFu9YZVAHsA= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:24:06 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 14872000006937239510 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 04/11] drm/bridge: aux: Add drm_aux_bridge_register_from_node() Date: Thu, 20 Nov 2025 10:23:36 +0800 Message-Id: <20251120022343.250-5-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: Mmvzdtxf/rngUnDKibpYxs1ajCmCS4W9up5e5k67xYJ3fkI5d7aJP+RX aQwk0fwXb5t6WHhaBd2CcgFtLvcTmHqTIrdh3NSi0zYTXGasrFpcuzozan3dyPFhTobGQhS 0y5P1aAtOEnV6LXUl5joY493IgumAzdWCxtxYhOfuj9OoX6g6dWmU5EiSuYhmLGMcfDOWVX O6FWlRCW0NUx0dQqoRxohAjknGvyRAnFvJ4XD46C/J9KFLVO7gmj9O0S0gzLvAkMtj/b9R4 NhelZCp4D4pP2zFPsWplqFwTyWFDot/EPHbz9S4kq76PpQB23MBGHotGnPt4gRvPECmf/9A hastU7c4QgluD5BTjzDt078CDjrFR217s/ET2pYuHoBAjWcbEDsaLNwZWZt0QUBU7HV9T+Q PTwn/zHhaYtzdAQzZ347Jy7YUmxAlG6t8aZ45G94qfMIsZZDqN2W3j5Oa6fOWODF+T5M39h c88hlKoew9OViX99Psn7dZdXtPlhy+tMVRYuVVZm223Zbce/t4gbuZbBZ/HOeSyEciYkq6l ylOPzNJTF05/8+g1Bo47MsajYWopqrl63ED02fCob9vVCSzeIK4AtKaRFBNhQytc5W4J6KD F1Vo0UlNo/g12of5tqfZhIim8fI5QR81/lazdjZdNyEQw/KQskrhDiDMoS/anjn9uCcQZz6 EP12BIUfMott3iIdF3yZxT42wZ+zOzLwl+8Pm+bAPv/3oW18jQ1oqb33y4tqLXSG29XxBMB cceZOzE2hq/VjPwb2wGGoQ+1ZNqWi9HcEyy6+G3gMKygaY9mutaeafgnLsInEBnjvtfafb1 ebSUGsULNBim7Y+N7tbv9vUgehBeBJvecW0KL5s6eCuGytrpKwThu0FLvUsK6lQII9m2SzM G3rDiuDdVQh5BwWw5+/8oHumL+92aDb1Bcb33L8hPJojPg+LcA8H6Axhj636QZoVn54034c ckOGnhd0X8ORtPMvzM/RMkG8Dca2kU2vu3mbM/57cePxrJqk+EviKtthpJoTUvUO2ZcnKNZ bYBOCgh3oJfgGnc84A X-QQ-XMRINFO: NyFYKkN4Ny6FSmKK/uo/jdU= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen The drm_aux_bridge_register() uses the device->of_node as the bridge->of_node. This patch adds drm_aux_bridge_register_from_node() to allow specifying the of_node corresponding to the bridge. Signed-off-by: Chaoyi Chen Reviewed-by: Neil Armstrong --- drivers/gpu/drm/bridge/aux-bridge.c | 24 ++++++++++++++++++++++-- include/drm/bridge/aux-bridge.h | 6 ++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/aux-bridge.c b/drivers/gpu/drm/bridge/a= ux-bridge.c index b3e4cdff61d6..52dff4601c2d 100644 --- a/drivers/gpu/drm/bridge/aux-bridge.c +++ b/drivers/gpu/drm/bridge/aux-bridge.c @@ -35,6 +35,7 @@ static void drm_aux_bridge_unregister_adev(void *_adev) /** * drm_aux_bridge_register - Create a simple bridge device to link the cha= in * @parent: device instance providing this bridge + * @np: device node pointer corresponding to this bridge instance * * Creates a simple DRM bridge that doesn't implement any drm_bridge * operations. Such bridges merely fill a place in the bridge chain linking @@ -42,7 +43,7 @@ static void drm_aux_bridge_unregister_adev(void *_adev) * * Return: zero on success, negative error code on failure */ -int drm_aux_bridge_register(struct device *parent) +int drm_aux_bridge_register_from_node(struct device *parent, struct device= _node *np) { struct auxiliary_device *adev; int ret; @@ -62,7 +63,10 @@ int drm_aux_bridge_register(struct device *parent) adev->dev.parent =3D parent; adev->dev.release =3D drm_aux_bridge_release; =20 - device_set_of_node_from_dev(&adev->dev, parent); + if (np) + device_set_node(&adev->dev, of_fwnode_handle(np)); + else + device_set_of_node_from_dev(&adev->dev, parent); =20 ret =3D auxiliary_device_init(adev); if (ret) { @@ -80,6 +84,22 @@ int drm_aux_bridge_register(struct device *parent) =20 return devm_add_action_or_reset(parent, drm_aux_bridge_unregister_adev, a= dev); } +EXPORT_SYMBOL_GPL(drm_aux_bridge_register_from_node); + +/** + * drm_aux_bridge_register - Create a simple bridge device to link the cha= in + * @parent: device instance providing this bridge + * + * Creates a simple DRM bridge that doesn't implement any drm_bridge + * operations. Such bridges merely fill a place in the bridge chain linking + * surrounding DRM bridges. + * + * Return: zero on success, negative error code on failure + */ +int drm_aux_bridge_register(struct device *parent) +{ + return drm_aux_bridge_register_from_node(parent, NULL); +} EXPORT_SYMBOL_GPL(drm_aux_bridge_register); =20 struct drm_aux_bridge_data { diff --git a/include/drm/bridge/aux-bridge.h b/include/drm/bridge/aux-bridg= e.h index c2f5a855512f..7dd1f17a1354 100644 --- a/include/drm/bridge/aux-bridge.h +++ b/include/drm/bridge/aux-bridge.h @@ -13,11 +13,17 @@ struct auxiliary_device; =20 #if IS_ENABLED(CONFIG_DRM_AUX_BRIDGE) int drm_aux_bridge_register(struct device *parent); +int drm_aux_bridge_register_from_node(struct device *parent, struct device= _node *np); #else static inline int drm_aux_bridge_register(struct device *parent) { return 0; } + +static inline int drm_aux_bridge_register_from_node(struct device *parent,= struct device_node *np) +{ + return 0; +} #endif =20 #if IS_ENABLED(CONFIG_DRM_AUX_HPD_BRIDGE) --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbgeu2.qq.com (smtpbgeu2.qq.com [18.194.254.142]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB79C2E1C65; Thu, 20 Nov 2025 02:24:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=18.194.254.142 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605467; cv=none; b=gYd09DVUOqqqNtIQx73I84o/7pqHT8dci4us+utGij+3Ov8OSejgNVS7+IuQzeiCGCnXL+s89wzo98qP0on+01YaU+GZP3IbodVtzj0/0CneeWv7rLGH5ws70WkKlJ8jL7gmRxS7RQelxnQHql7lVvOCzvek0TifUIw6BtyuKXU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605467; c=relaxed/simple; bh=PZVWV9La4AVAK585StcPgOtfdN1ZVMCq4aFPpEmKQzo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=b59DrPAtho9JQx5rIxIrYzvkObyxONUCHauSRUYw3Glj0cGlyjOzMedjEbSV5DR//pPljZzNFsikm/fQsZ4kf2168+RPR6RHHwDY6IhA8kcvc5jr5y9TuGifMYHBjrdYq8vIgk8HUPwqZWPADSltLsu1HLE67dT02jjnUxDlWqk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=mzLDUlMH; arc=none smtp.client-ip=18.194.254.142 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="mzLDUlMH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605455; bh=26BNys9MtzTfRweLMQzeXqwDzhVXLyZIh9kJ9w6YpoA=; h=From:To:Subject:Date:Message-Id; b=mzLDUlMHkH2XQbNViN5w9YUFUehKIex60zmI+ubNGAViFScnQU66WCaHL1GqWdeN8 Cczfx4GwwVHPg7GMQBx3ZijP3vinqzneAh0+dqrKuJQHv5ZTpwhBF3UBaBK2VXBXGc y2DzIW4JlMglqObexfbysUlvZ5CzSrVaS8Yq7h5Q= X-QQ-mid: zesmtpsz5t1763605453t2f8b4143 X-QQ-Originating-IP: gN54Olypo3pIwlMUyr2ea9GcV0PMJO+w5anSEboDf2s= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:24:10 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 15843998276639765348 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 05/11] dt-bindings: phy: rockchip: rk3399-typec-phy: Support mode-switch Date: Thu, 20 Nov 2025 10:23:37 +0800 Message-Id: <20251120022343.250-6-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: NYz8c2bcbB9MQnNn3zMpWCw2p695Ot7QFwH/flvWex9RbogN4LmQMMi3 bC06sfaBKt7eyPTixuyKW8Tc/QMs8UghDlkgaMJzgUX4KvNGRg871hGT/4BsbRsDmUE4JgL W0evNhLD8GAFZ0CBvwVNv3736bcEI4p5r0eFnxlDjfQK/h9wpY7A5Vzv+Jm0ZAngtSuDmoY 07wJxkjI/LjMQgVVSblu0Mn0m6V2TG3KQJhf15TGgt3dhFUGOxehkmiSaVHbQASIuTsD2hN n6Uq1e2m6lHC8a3mugOA4MnFekc/Jb10IwLaEcowKKM8PFuwSPvYN3i9IAETdoUMUhLVNwq QbklMA8myybjkL0KMvoz7rw3sax8H6VpD6bAkCkFXNabpjzxiG97pOleU7bmp7VEA5Fhw/t 1HDPr6CXgM4lkrlIgF5cgnmRsjXRGNRnOhRX6F5sdEmxQMV7M/J57Wz/XTtQTQSOd07JF6D Db3hozY8MjSO45jtclWrx39ln8Ivd+4MBu8/6Tj7JmIUOeOiFNxZ5LiK8szj+Fe4SDZf+NR dQg/VzAcA/jY2jOMqMS4tQ9AF86LLkaKFJSFm3wx/5oCDw3Ra9iMME5Cq0n029W6jew+H3a C344GmZ8cMuyvUOI2B1wW+GbO1+W3PEpfaB+QcHua6vHOGRHI2L0g4FBZCrrBWUBg+/dYSw lnuZzSMP6EEOrmgeFK9xL0K4WiPt27fhZbtzOM1IsyZRAcpKj4xPf9GeAa53W5oIYxPWKel bT1s6Gpa6jyUuTijv0PUm0X0ZoE8EKzUH9dWkYFXFJXmg/liX1EXzhabCgVp0lrpk4q877v YrjofvAxE7q2tiAqnerHFe8cpxxmcEu7+bE7JRP+Bh2p31pi80OvKSEu+b48xt1RhgCM+xG gHzGXaKKGOqTYb0RFGi0PUZ1+5DZbp/ldr62ZreiWinCFJQKCEcqxH1a57Z58zgOWYIFR/B 6KjbpvUU82tCOnP9sWHyUOgh6fkN9yc/8TOe1MF20Yj742b9DwKedWmiaz+e3hg6M7USbIe 9GFd2oVnYDruKUUvj+K2woRgNCsf8lDo55yLG9zA== X-QQ-XMRINFO: OWPUhxQsoeAVDbp3OJHYyFg= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen The RK3399 SoC integrates two USB/DP combo PHYs, each of which supports software-configurable pin mapping and DisplayPort lane assignment. These capabilities enable the PHY itself to handle both mode switching and orientation switching, based on the Type-C plug orientation and USB PD negotiation results. While an external Type-C controller is still required to detect cable attachment and report USB PD events, the actual mode and orientation switching is performed internally by the PHY through software configuration. This allows the PHY to act as a Type-C multiplexer for both data role and DP altmode configuration. To reflect this hardware design, this patch introduces a new "mode-switch" property for the dp-port node in the device tree bindings. This property indicates that the connected PHY is capable of handling Type-C mode switching itself. Signed-off-by: Chaoyi Chen Acked-by: Krzysztof Kozlowski --- (no changes since v5) Changes in v4: - Remove "|" in description. Changes in v3: - Add more descriptions to clarify the role of the PHY in switching. Changes in v2: - Reuse dp-port/usb3-port in rk3399-typec-phy binding. .../devicetree/bindings/phy/rockchip,rk3399-typec-phy.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/phy/rockchip,rk3399-typec-ph= y.yaml b/Documentation/devicetree/bindings/phy/rockchip,rk3399-typec-phy.ya= ml index 91c011f68cd0..83ebcde096ea 100644 --- a/Documentation/devicetree/bindings/phy/rockchip,rk3399-typec-phy.yaml +++ b/Documentation/devicetree/bindings/phy/rockchip,rk3399-typec-phy.yaml @@ -51,6 +51,12 @@ properties: '#phy-cells': const: 0 =20 + mode-switch: + description: + Indicates the PHY can handle altmode switching. In this case, + requires an external USB Type-C controller to report USB PD mess= age. + type: boolean + port: $ref: /schemas/graph.yaml#/properties/port description: Connection to USB Type-C connector --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbgsg2.qq.com (smtpbgsg2.qq.com [54.254.200.128]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3674D2E3AEA; Thu, 20 Nov 2025 02:24:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.254.200.128 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605470; cv=none; b=qUu22H2xlYYNiewo6Z1NxjMehAXESJ77py+q+jfe6Y4tj/EChmHab5NiPzkkPWRSYAip57Tgz+J6bZuG2rvTvK1C4VyfF0FX8cHZcwaLTvFDE5dhgoMtGtAs/B201ZEQiPFxuyMNXxXWtVK7O3PBvZz59DEt0VTIJUvKdqD9lzM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605470; c=relaxed/simple; bh=R3heeE9hR3co2ACiydh9o+HhTZMeJ1YRf5V1MBmv3DU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=bkOGEkxPEIRfGrs0Z91k9/0bxB9Otu3Sankf+Sy/uC4apbhOIfPGdNel2Gs12G5/5NvoC1Vn94JsgDRQoqrggOYlMXaf3nfv/kRKGwzdGyxxzhE3HhU4Qlr/jOHseFzfQG1ZeWzyRezjCgLjZsMYdmX5uwmShQMKIyFj/AdCjXI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=DFQ0Qjj8; arc=none smtp.client-ip=54.254.200.128 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="DFQ0Qjj8" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605459; bh=frpOn7dhVQ6Nxp3VUESgJ6aTlZPf3p22en66tauvZ1I=; h=From:To:Subject:Date:Message-Id; b=DFQ0Qjj8IVi6ncTcGCXDhWZ8M8QAmKVQKc22alN8mMto4YLB4czeQkbt25hulqNL0 7qW1g3w81+CuVKTJ6d91IceikENqtAQoVwBEIFgP1im4hH9k2lkToZzSYg1tZkctaU 4wh1A/JV8Lra3ySqckOmFFCRgi3HwZoM/zivmSOs= X-QQ-mid: zesmtpsz5t1763605457t51705423 X-QQ-Originating-IP: O7e8IxoJycTrDiuYoTG/j2VH1JlTpVcLEux9BPFpacg= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:24:14 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 5241649199338281624 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 06/11] phy: rockchip: phy-rockchip-typec: Add typec_mux/typec_switch support Date: Thu, 20 Nov 2025 10:23:38 +0800 Message-Id: <20251120022343.250-7-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: MGBb/1RBkD+8zzeozZpqYHZTC55h24fglAd/KLiiYwJgRDY7ziI6D4Te 7Y6JT2VslDh+fswNnYe0IoE98lkDtkfRg41qW4Wd1kDc269pK2vbHRJUh2CnuMAJ1qdiORc TxHfWR4UgZG0FHWMubX/eui2Y71g7zOkRWKIWJK+TG+/tH9z7pnHeTfC6k6gG+fGYyUpwIn emLAOtIkl4L3h8RhU75EWgBZCb+m8hsUaWBZodsHEl81bb8y6f5Oe6SO/0jyfr6zVBux3/I FE5+8vdHbHqr+5IWT9DO3qH47//4PEGXk/Wpp7T27gMpr663ZIOs3LP0NDpMUtOSb/HsalD NuULan6l9h5Xvl56RQEpJ/YqFx+bLP0sAu9By3/i8P70Qyy5Zg+tO4vKD0iQEP5Y+HovQlN nDQEmz+wMEktiOiP0PPTfhp5anLDEbIX39U4koSvYAg4fiTS/DaB71HQk+YELBF47hUxWJx tS98EHqMwS7+ISPUJemm9H1SkR1/9OZh0WnwgyI4G+YOtLu/arVaM2RIkh/1Bq/SLH2fLSd 7jtpC9NhAM0Xx3UO/P5IrR7umJO+t0kH3BnoZPUP59R6FypqFEWVz+HSpO8O+e50ZCUEK2E 69fbXBAGkh069VbnxwNqes92zqKG6KQgs89OySojUuXbScpfm1K/hR2drTxpGu8OMWxgjL5 Utug4ov6sEVw5lF2lnR1rU5/eyZojmSWqsd4tRrc3v+5yot4Nbp5w+5MAawE6H9rfeD1DBo nvkwuUMJv3Q9RRg8sSpSdCchzf6B+vV1hifM8JO0YgZ6ltTEtd59YFlWOb9yCS1T5/Qy+xe fjg3pw80N6XLA6TFsnp/e3Q5mEH9tWCNSiCrIHWr1JB/ytgbd040tW28lKQH/p7Ga/tCI8A Xfxjtq+4rrLuusY+kadDa0Eevvi8wotTaDBakxh+h8UrirSn+uIGT0E9P01HD4xdVgKhiKD ZDfw8/mptBRTnehar3fmFO+kDKMdJR0JECcLmqNNY6uMdOQy3jxcvASdf8Ewc6C9wvc3Hz9 v0PTrw8Q== X-QQ-XMRINFO: OWPUhxQsoeAVDbp3OJHYyFg= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen This patch add support for Type-C Port Controller Manager. Each PHY will register typec_mux and typec_switch when external Type-C controller is present. Type-C events are handled by TCPM without extcon. The extcon device should still be supported. Signed-off-by: Chaoyi Chen --- (no changes since v7) Changes in v6: - Fix depend in Kconfig. - Check DP svid in tcphy_typec_mux_set(). - Remove mode setting in tcphy_orien_sw_set(). (no changes since v5) Changes in v4: - Remove notify DP HPD state by USB/DP PHY. (no changes since v3) Changes in v2: - Fix compile error when CONFIG_TYPEC is not enabled. - Notify DP HPD state by USB/DP PHY. drivers/phy/rockchip/Kconfig | 1 + drivers/phy/rockchip/phy-rockchip-typec.c | 368 +++++++++++++++++++++- 2 files changed, 353 insertions(+), 16 deletions(-) diff --git a/drivers/phy/rockchip/Kconfig b/drivers/phy/rockchip/Kconfig index 14698571b607..db4adc7c53da 100644 --- a/drivers/phy/rockchip/Kconfig +++ b/drivers/phy/rockchip/Kconfig @@ -119,6 +119,7 @@ config PHY_ROCKCHIP_SNPS_PCIE3 config PHY_ROCKCHIP_TYPEC tristate "Rockchip TYPEC PHY Driver" depends on OF && (ARCH_ROCKCHIP || COMPILE_TEST) + depends on TYPEC || TYPEC=3Dn select EXTCON select GENERIC_PHY select RESET_CONTROLLER diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c b/drivers/phy/rockch= ip/phy-rockchip-typec.c index d9701b6106d5..1f5b4142cbe4 100644 --- a/drivers/phy/rockchip/phy-rockchip-typec.c +++ b/drivers/phy/rockchip/phy-rockchip-typec.c @@ -54,6 +54,8 @@ =20 #include #include +#include +#include =20 #define CMN_SSM_BANDGAP (0x21 << 2) #define CMN_SSM_BIAS (0x22 << 2) @@ -286,12 +288,23 @@ #define RX_DIAG_SC2C_DELAY (0x81e1 << 2) =20 #define PMA_LANE_CFG (0xc000 << 2) +#define PMA_LANE3_DP_LANE_SEL(x) (((x) & 0x3) << 14) +#define PMA_LANE3_INTERFACE_SEL(x) (((x) & 0x1) << 12) +#define PMA_LANE2_DP_LANE_SEL(x) (((x) & 0x3) << 10) +#define PMA_LANE2_INTERFACE_SEL(x) (((x) & 0x1) << 8) +#define PMA_LANE1_DP_LANE_SEL(x) (((x) & 0x3) << 6) +#define PMA_LANE1_INTERFACE_SEL(x) (((x) & 0x1) << 4) +#define PMA_LANE0_DP_LANE_SEL(x) (((x) & 0x3) << 2) +#define PMA_LANE0_INTERFACE_SEL(x) (((x) & 0x1) << 0) #define PIPE_CMN_CTRL1 (0xc001 << 2) #define PIPE_CMN_CTRL2 (0xc002 << 2) #define PIPE_COM_LOCK_CFG1 (0xc003 << 2) #define PIPE_COM_LOCK_CFG2 (0xc004 << 2) #define PIPE_RCV_DET_INH (0xc005 << 2) #define DP_MODE_CTL (0xc008 << 2) +#define PHY_DP_POWER_STATE_ACK_MASK GENMASK(7, 4) +#define PHY_DP_POWER_STATE_ACK_SHIFT 4 +#define PHY_DP_POWER_STATE_MASK GENMASK(3, 0) #define DP_CLK_CTL (0xc009 << 2) #define STS (0xc00F << 2) #define PHY_ISO_CMN_CTRL (0xc010 << 2) @@ -327,8 +340,15 @@ =20 #define DP_MODE_A0 BIT(4) #define DP_MODE_A2 BIT(6) -#define DP_MODE_ENTER_A0 0xc101 -#define DP_MODE_ENTER_A2 0xc104 + +#define DP_MODE_MASK 0xf +#define DP_MODE_ENTER_A0 BIT(0) +#define DP_MODE_ENTER_A2 BIT(2) +#define DP_MODE_ENTER_A3 BIT(3) +#define DP_MODE_A0_ACK BIT(4) +#define DP_MODE_A2_ACK BIT(6) +#define DP_MODE_A3_ACK BIT(7) +#define DP_LINK_RESET_DEASSERTED BIT(8) =20 #define PHY_MODE_SET_TIMEOUT 100000 =20 @@ -340,6 +360,31 @@ #define MODE_DFP_USB BIT(1) #define MODE_DFP_DP BIT(2) =20 +enum phy_dp_lane_num { + PHY_DP_LANE_0 =3D 0, + PHY_DP_LANE_1, + PHY_DP_LANE_2, + PHY_DP_LANE_3, +}; + +enum phy_pma_if { + PMA_IF_PIPE_PCS =3D 0, + PMA_IF_PHY_DP, +}; + +enum phy_typec_role { + TYPEC_PHY_USB =3D 0, + TYPEC_PHY_DP, + TYPEC_PHY_MAX, +}; + +enum phy_dp_power_state { + PHY_DP_POWER_STATE_A0 =3D 0, + PHY_DP_POWER_STATE_A1, + PHY_DP_POWER_STATE_A2, + PHY_DP_POWER_STATE_A3, +}; + struct usb3phy_reg { u32 offset; u32 enable_bit; @@ -372,18 +417,22 @@ struct rockchip_typec_phy { struct device *dev; void __iomem *base; struct extcon_dev *extcon; + struct typec_mux_dev *mux; + struct typec_switch_dev *sw; struct regmap *grf_regs; struct clk *clk_core; struct clk *clk_ref; struct reset_control *uphy_rst; struct reset_control *pipe_rst; struct reset_control *tcphy_rst; + struct phy *phys[TYPEC_PHY_MAX]; const struct rockchip_usb3phy_port_cfg *port_cfgs; /* mutex to protect access to individual PHYs */ struct mutex lock; =20 bool flip; u8 mode; + u8 new_mode; }; =20 struct phy_reg { @@ -454,6 +503,99 @@ static const struct rockchip_usb3phy_port_cfg rk3399_u= sb3phy_port_cfgs[] =3D { { /* sentinel */ } }; =20 +static int tcphy_cfg_usb3_to_usb2_only(struct rockchip_typec_phy *tcphy, + bool value); + +static int tcphy_dp_set_power_state(struct rockchip_typec_phy *tcphy, + enum phy_dp_power_state state) +{ + u32 ack, reg, sts =3D BIT(state); + int ret; + + /* + * Power state changes must not be requested until after the cmn_ready + * signal has gone active. + */ + reg =3D readl(tcphy->base + PMA_CMN_CTRL1); + if (!(reg & CMN_READY)) { + dev_err(tcphy->dev, "cmn_ready in the inactive state\n"); + return -EINVAL; + } + + reg =3D readl(tcphy->base + DP_MODE_CTL); + reg &=3D ~PHY_DP_POWER_STATE_MASK; + reg |=3D sts; + writel(reg, tcphy->base + DP_MODE_CTL); + + ret =3D readl_poll_timeout(tcphy->base + DP_MODE_CTL, + ack, (((ack & PHY_DP_POWER_STATE_ACK_MASK) >> + PHY_DP_POWER_STATE_ACK_SHIFT) =3D=3D sts), 10, + PHY_MODE_SET_TIMEOUT); + if (ret < 0) { + dev_err(tcphy->dev, "failed to enter power state %d\n", state); + return ret; + } + + return 0; +} + +/* + * For the TypeC PHY, the 4 lanes are mapping to the USB TypeC receptacle = pins + * as follows: + * ------------------------------------------------------------------- + * PHY Lanes/Module Pins TypeC Receptacle Pins + * ------------------------------------------------------------------- + * Lane0 (tx_p/m_ln_0) TX1+/TX1- (pins A2/A3) + * Lane1 (tx_rx_p/m_ln_1) RX1+/RX1- (pins B11/B10) + * Lane2 (tx_rx_p/m_ln_2) RX2+/RX2- (pins A11/A10) + * Lane3 (tx_p/m_ln_3) TX2+/TX2- (pins B2/B3) + * ------------------------------------------------------------------- + * + * USB and DP lanes mapping to TypeC PHY lanes for each of pin assignment + * options (normal connector orientation) described in the VESA DisplayPort + * Alt Mode on USB TypeC Standard as follows: + * + * ---------------------------------------------------------------------- + * PHY Lanes A B C D E F + * ---------------------------------------------------------------------- + * 0 ML1 SSTX ML2 SSTX ML2 SSTX + * 1 ML3 SSRX ML3 SSRX ML3 SSRX + * 2 ML2 ML1 ML0 ML0 ML0 ML0 + * 3 ML0 ML0 ML1 ML1 ML1 ML1 + * ---------------------------------------------------------------------- + */ +static void tcphy_set_lane_mapping(struct rockchip_typec_phy *tcphy, u8 mo= de) +{ + /* + * The PMA_LANE_CFG register is used to select whether a PMA lane + * is mapped for USB or PHY DP. The PMA_LANE_CFG register is + * configured based on a normal connector orientation. Logic in the + * PHY automatically handles the flipped connector case based on the + * setting of orientation of TypeC PHY. + */ + if (mode =3D=3D MODE_DFP_DP) { + /* This maps to VESA DP Alt Mode pin assignments C and E. */ + writel(PMA_LANE3_DP_LANE_SEL(PHY_DP_LANE_1) | + PMA_LANE3_INTERFACE_SEL(PMA_IF_PHY_DP) | + PMA_LANE2_DP_LANE_SEL(PHY_DP_LANE_0) | + PMA_LANE2_INTERFACE_SEL(PMA_IF_PHY_DP) | + PMA_LANE1_DP_LANE_SEL(PHY_DP_LANE_3) | + PMA_LANE1_INTERFACE_SEL(PMA_IF_PHY_DP) | + PMA_LANE0_DP_LANE_SEL(PHY_DP_LANE_2) | + PMA_LANE0_INTERFACE_SEL(PMA_IF_PHY_DP), + tcphy->base + PMA_LANE_CFG); + } else { + /* This maps to VESA DP Alt Mode pin assignments D and F. */ + writel(PMA_LANE3_DP_LANE_SEL(PHY_DP_LANE_1) | + PMA_LANE3_INTERFACE_SEL(PMA_IF_PHY_DP) | + PMA_LANE2_DP_LANE_SEL(PHY_DP_LANE_0) | + PMA_LANE2_INTERFACE_SEL(PMA_IF_PHY_DP) | + PMA_LANE1_INTERFACE_SEL(PMA_IF_PIPE_PCS) | + PMA_LANE0_INTERFACE_SEL(PMA_IF_PIPE_PCS), + tcphy->base + PMA_LANE_CFG); + } +} + static void tcphy_cfg_24m(struct rockchip_typec_phy *tcphy) { u32 i, rdata; @@ -743,8 +885,10 @@ static int tcphy_phy_init(struct rockchip_typec_phy *t= cphy, u8 mode) tcphy_dp_aux_set_flip(tcphy); =20 tcphy_cfg_24m(tcphy); + tcphy_set_lane_mapping(tcphy, mode); =20 if (mode =3D=3D MODE_DFP_DP) { + tcphy_cfg_usb3_to_usb2_only(tcphy, true); tcphy_cfg_dp_pll(tcphy); for (i =3D 0; i < 4; i++) tcphy_dp_cfg_lane(tcphy, i); @@ -768,7 +912,10 @@ static int tcphy_phy_init(struct rockchip_typec_phy *t= cphy, u8 mode) writel(PIN_ASSIGN_D_F, tcphy->base + PMA_LANE_CFG); } =20 - writel(DP_MODE_ENTER_A2, tcphy->base + DP_MODE_CTL); + val =3D readl(tcphy->base + DP_MODE_CTL); + val &=3D ~DP_MODE_MASK; + val |=3D DP_MODE_ENTER_A2 | DP_LINK_RESET_DEASSERTED; + writel(val, tcphy->base + DP_MODE_CTL); =20 reset_control_deassert(tcphy->uphy_rst); =20 @@ -811,8 +958,9 @@ static int tcphy_get_mode(struct rockchip_typec_phy *tc= phy) u8 mode; int ret, ufp, dp; =20 + /* If extcon not exist, try to use tcpm mode */ if (!edev) - return MODE_DFP_USB; + return tcphy->new_mode; =20 ufp =3D extcon_get_state(edev, EXTCON_USB); dp =3D extcon_get_state(edev, EXTCON_DISP_DP); @@ -850,6 +998,71 @@ static int tcphy_get_mode(struct rockchip_typec_phy *t= cphy) return mode; } =20 +#if IS_ENABLED(CONFIG_TYPEC) +static int tcphy_orien_sw_set(struct typec_switch_dev *sw, + enum typec_orientation orien) +{ + struct rockchip_typec_phy *tcphy =3D typec_switch_get_drvdata(sw); + + mutex_lock(&tcphy->lock); + + if (orien =3D=3D TYPEC_ORIENTATION_NONE) { + tcphy->new_mode =3D MODE_DISCONNECT; + goto unlock_ret; + } + + tcphy->flip =3D (orien =3D=3D TYPEC_ORIENTATION_REVERSE) ? true : false; + +unlock_ret: + mutex_unlock(&tcphy->lock); + return 0; +} + +static void udphy_orien_switch_unregister(void *data) +{ + struct rockchip_typec_phy *tcphy =3D data; + + typec_switch_unregister(tcphy->sw); +} + +static int tcphy_setup_orien_switch(struct rockchip_typec_phy *tcphy) +{ + struct typec_switch_desc sw_desc =3D { }; + struct device_node *np; + int ret =3D 0; + + np =3D of_get_child_by_name(tcphy->dev->of_node, "usb3-port"); + if (!np) + return 0; + + if (!of_property_read_bool(np, "orientation-switch")) + goto put_np; + + sw_desc.drvdata =3D tcphy; + sw_desc.fwnode =3D device_get_named_child_node(tcphy->dev, "usb3-port"); + sw_desc.set =3D tcphy_orien_sw_set; + + tcphy->sw =3D typec_switch_register(tcphy->dev, &sw_desc); + if (IS_ERR(tcphy->sw)) { + dev_err(tcphy->dev, "Error register typec orientation switch: %ld\n", + PTR_ERR(tcphy->sw)); + ret =3D PTR_ERR(tcphy->sw); + goto put_np; + } + + ret =3D devm_add_action_or_reset(tcphy->dev, udphy_orien_switch_unregiste= r, tcphy); + +put_np: + of_node_put(np); + return ret; +} +#else +static int tcphy_setup_orien_switch(struct rockchip_typec_phy *tcphy) +{ + return 0; +} +#endif + static int tcphy_cfg_usb3_to_usb2_only(struct rockchip_typec_phy *tcphy, bool value) { @@ -989,14 +1202,9 @@ static int rockchip_dp_phy_power_on(struct phy *phy) =20 tcphy_dp_aux_calibration(tcphy); =20 - writel(DP_MODE_ENTER_A0, tcphy->base + DP_MODE_CTL); - - ret =3D readx_poll_timeout(readl, tcphy->base + DP_MODE_CTL, - val, val & DP_MODE_A0, 1000, - PHY_MODE_SET_TIMEOUT); - if (ret < 0) { - writel(DP_MODE_ENTER_A2, tcphy->base + DP_MODE_CTL); - dev_err(tcphy->dev, "failed to wait TCPHY enter A0\n"); + ret =3D tcphy_dp_set_power_state(tcphy, PHY_DP_POWER_STATE_A0); + if (ret) { + dev_err(tcphy->dev, "failed to enter A0 power state\n"); goto power_on_finish; } =20 @@ -1013,6 +1221,7 @@ static int rockchip_dp_phy_power_on(struct phy *phy) static int rockchip_dp_phy_power_off(struct phy *phy) { struct rockchip_typec_phy *tcphy =3D phy_get_drvdata(phy); + int ret; =20 mutex_lock(&tcphy->lock); =20 @@ -1021,7 +1230,11 @@ static int rockchip_dp_phy_power_off(struct phy *phy) =20 tcphy->mode &=3D ~MODE_DFP_DP; =20 - writel(DP_MODE_ENTER_A2, tcphy->base + DP_MODE_CTL); + ret =3D tcphy_dp_set_power_state(tcphy, PHY_DP_POWER_STATE_A2); + if (ret) { + dev_err(tcphy->dev, "failed to enter A2 power state\n"); + goto unlock; + } =20 if (tcphy->mode =3D=3D MODE_DISCONNECT) tcphy_phy_deinit(tcphy); @@ -1037,6 +1250,93 @@ static const struct phy_ops rockchip_dp_phy_ops =3D { .owner =3D THIS_MODULE, }; =20 +#if IS_ENABLED(CONFIG_TYPEC) +static int tcphy_typec_mux_set(struct typec_mux_dev *mux, struct typec_mux= _state *state) +{ + struct rockchip_typec_phy *tcphy =3D typec_mux_get_drvdata(mux); + struct typec_displayport_data *data; + int hpd =3D 0; + + mutex_lock(&tcphy->lock); + + switch (state->mode) { + case TYPEC_STATE_SAFE: + fallthrough; + case TYPEC_STATE_USB: + tcphy->new_mode =3D MODE_DFP_USB; + phy_set_bus_width(tcphy->phys[TYPEC_PHY_DP], 0); + break; + case TYPEC_DP_STATE_C: + case TYPEC_DP_STATE_E: + if (state->alt->svid !=3D USB_TYPEC_DP_SID) + break; + tcphy->new_mode =3D MODE_DFP_DP; + data =3D state->data; + hpd =3D !!(data->status & DP_STATUS_HPD_STATE); + phy_set_bus_width(tcphy->phys[TYPEC_PHY_DP], hpd ? 4 : 0); + break; + case TYPEC_DP_STATE_D: + if (state->alt->svid !=3D USB_TYPEC_DP_SID) + break; + tcphy->new_mode =3D MODE_DFP_DP | MODE_DFP_USB; + data =3D state->data; + hpd =3D !!(data->status & DP_STATUS_HPD_STATE); + phy_set_bus_width(tcphy->phys[TYPEC_PHY_DP], hpd ? 2 : 0); + break; + default: + break; + } + + mutex_unlock(&tcphy->lock); + + return 0; +} + +static void tcphy_typec_mux_unregister(void *data) +{ + struct rockchip_typec_phy *tcphy =3D data; + + typec_mux_unregister(tcphy->mux); +} + +static int tcphy_setup_typec_mux(struct rockchip_typec_phy *tcphy) +{ + struct typec_mux_desc mux_desc =3D {}; + struct device_node *np; + int ret =3D 0; + + np =3D of_get_child_by_name(tcphy->dev->of_node, "dp-port"); + if (!np) + return 0; + + if (!of_property_read_bool(np, "mode-switch")) + goto put_np; + + mux_desc.drvdata =3D tcphy; + mux_desc.fwnode =3D device_get_named_child_node(tcphy->dev, "dp-port"); + mux_desc.set =3D tcphy_typec_mux_set; + + tcphy->mux =3D typec_mux_register(tcphy->dev, &mux_desc); + if (IS_ERR(tcphy->mux)) { + dev_err(tcphy->dev, "Error register typec mux: %ld\n", + PTR_ERR(tcphy->mux)); + ret =3D PTR_ERR(tcphy->mux); + goto put_np; + } + + ret =3D devm_add_action_or_reset(tcphy->dev, tcphy_typec_mux_unregister, = tcphy); + +put_np: + of_node_put(np); + return ret; +} +#else +static int tcphy_setup_typec_mux(struct rockchip_typec_phy *tcphy) +{ + return 0; +} +#endif + static int tcphy_parse_dt(struct rockchip_typec_phy *tcphy, struct device *dev) { @@ -1095,6 +1395,25 @@ static void typec_phy_pre_init(struct rockchip_typec= _phy *tcphy) tcphy->mode =3D MODE_DISCONNECT; } =20 +static int typec_dp_lane_get(struct rockchip_typec_phy *tcphy) +{ + int dp_lanes; + + switch (tcphy->new_mode) { + case MODE_DFP_DP: + dp_lanes =3D 4; + break; + case MODE_DFP_DP | MODE_DFP_USB: + dp_lanes =3D 2; + break; + default: + dp_lanes =3D 0; + break; + } + + return dp_lanes; +} + static int rockchip_typec_phy_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; @@ -1142,6 +1461,7 @@ static int rockchip_typec_phy_probe(struct platform_d= evice *pdev) return ret; =20 tcphy->dev =3D dev; + tcphy->new_mode =3D MODE_DFP_USB; platform_set_drvdata(pdev, tcphy); mutex_init(&tcphy->lock); =20 @@ -1151,6 +1471,7 @@ static int rockchip_typec_phy_probe(struct platform_d= evice *pdev) if (IS_ERR(tcphy->extcon)) { if (PTR_ERR(tcphy->extcon) =3D=3D -ENODEV) { tcphy->extcon =3D NULL; + dev_info(dev, "extcon not exist, try to use typec mux\n"); } else { if (PTR_ERR(tcphy->extcon) !=3D -EPROBE_DEFER) dev_err(dev, "Invalid or missing extcon\n"); @@ -1158,19 +1479,34 @@ static int rockchip_typec_phy_probe(struct platform= _device *pdev) } } =20 + ret =3D tcphy_setup_orien_switch(tcphy); + if (ret) + return ret; + + ret =3D tcphy_setup_typec_mux(tcphy); + if (ret) + return ret; + pm_runtime_enable(dev); =20 for_each_available_child_of_node(np, child_np) { struct phy *phy; =20 - if (of_node_name_eq(child_np, "dp-port")) + if (of_node_name_eq(child_np, "dp-port")) { phy =3D devm_phy_create(dev, child_np, &rockchip_dp_phy_ops); - else if (of_node_name_eq(child_np, "usb3-port")) + if (!IS_ERR(phy)) { + tcphy->phys[TYPEC_PHY_DP] =3D phy; + phy_set_bus_width(phy, typec_dp_lane_get(tcphy)); + } + } else if (of_node_name_eq(child_np, "usb3-port")) { phy =3D devm_phy_create(dev, child_np, &rockchip_usb3_phy_ops); - else + if (!IS_ERR(phy)) + tcphy->phys[TYPEC_PHY_USB] =3D phy; + } else { continue; + } =20 if (IS_ERR(phy)) { dev_err(dev, "failed to create phy: %pOFn\n", --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbgeu1.qq.com (smtpbgeu1.qq.com [52.59.177.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E14F22D593C; Thu, 20 Nov 2025 02:24:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=52.59.177.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605484; cv=none; b=OTH2atc3zDLlqn25ng6Ymqb781964h3JEHiTSYkPiB4PCP+0MATpDOjgkTPXYJOU5moAxa/40q/kLgD1/MVAiEnfk6EiU7WNC2lbBioTAIX76EtfGa/DwQz1sHXZCj4JhW3SXMz13pK6SsQq6wOljeo0TN9zRqKFtNY77GDp2uY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605484; c=relaxed/simple; bh=RM5N9mCZiGaQbUvi/9J59FQGOpPt3UlmZ3fpa5o8zec=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=dDNZkUH1DTj8FxXsGo9xRdxHCBdaZ7RT+CqwFiJyM66S6Llvu5OT4LOZ237SAF/r1dlmLSHCy8fGFkhmICLJoDp7Pfw/vmn5lHhFMG9l/05Zn3dzx3Vq48dQTNDlDj8Uh0iXtnJPpN9Pqc+ryvebvJRcvC+XNccn+b0qLA3FcP4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=tjdJQSsV; arc=none smtp.client-ip=52.59.177.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="tjdJQSsV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605463; bh=/IF23AwLHF2BuDE85+w1cIAuWmxkHGHVECAwuwTVkE4=; h=From:To:Subject:Date:Message-Id; b=tjdJQSsVXPgZ5EI5VAD8lTGE/zU6HKgryYWdbL1r5TOAmyEaiNjH5fTowzZMop8Bd Xjpz5eAAzt7VXEs+9LdOaB1cQmUaA0zKV47F4cTphYmZrInRShFHOJ9GqUgEX/wqp4 hLfYBj5FlAp04TsWfj804dLJlBgeHOOtj1ZDw2qE= X-QQ-mid: zesmtpsz5t1763605462t762960bb X-QQ-Originating-IP: hdCmop6+IrM/3+WRb+UwDEmL6vY6WlZjSA0i5Kppr3M= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:24:19 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 6704151892834101465 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 07/11] phy: rockchip: phy-rockchip-typec: Add DRM AUX bridge Date: Thu, 20 Nov 2025 10:23:39 +0800 Message-Id: <20251120022343.250-8-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: MqN/FiDJuNHiNw/y4jqC1wkbajwvJbSZugfFzpxL1HvCY2waR3xFcXe4 9D9gGS8TD6AHxUDwfPe2QnX0uykpBe7jHW+xvjHO1e/sthgtHCMli4nC45zMmjm+abjm0bP kNpKZtAr8KvdVEwGUJRl87vEiweO7MhYpQ9DY+BejuDOEBnb/Bij7c7r30dlYfIBqo5FdV7 wKiCdACFSYnkIQjbf17RrkVhNIAc31pOK5wl+dq4xeFWkQm+XKThir4xI6a/vsErVvWlixJ gHH8bceHnlcyO17vg/iPNEGJy7HOZFMc45uhOAFkfT6vsmyknUd6wrCgMSzXTHF4bBnTBu4 TiCbgMHgMUMsxpiD9+6a78nKHWsyFuqTztF40d2i242YVajpV2wVk3Tyxu1HbwtmmYC2Hrq GEDBrqDHX0NyUZVvSZG0h2jn7JeMohclaiBNs4XiAvtsAaEZNiTwGdLxTt1crFhbdJx1P9O l8BtcjuqvMed/ZHFZQHiXJ86CtW/3YIRVnrX2sAuUE2JNvqVph1jgg13OEgG3slXAt4aNw6 uOyQAbK2lj0d1nwpmf6pc+4GRD9VMVTr9GroQUw9wWTUlst4uLxl9/X2uk3MnmnbMGMrOf0 IwcQYsios/JxBd/M53lfbFf3aFLx8A6GeGS1xf7ysuZwD8Mwd1pqqT1vXVac0qwgc4/cU6t gM9O17C31ImZmuOt4oK5YugS9BmooJvHu7vcTnVP6/9FP8lC344oi9VFA3/rP1tQEExPErl leFlnsnD1VFCdS6bLbWk68aS+DPPOviqYAP81T0n4/VobrrHO6ZdhidsNVbZhN3+WOsYt0V T8eu7kMlsdQGjWRjGP0kQ32i6dj7+00TrzvnpKyndvrw7mHCinev6vj+vIktc6a3QPl45rA XuQ7MGQZHVphATtGASjZYMOn+3MCS1jAihUqcpJOVa2msdR1FHfVOyBNG/DbxCVNzTF6idR pfviUA8NJwyrP37RdiyHhWCINiVMuRD3ZVps6wqSLmnbUg1U0g5UiGoL2c5ZunwQ6Y/A3co XzsSsjI8TgRARPoEx9+LeWf5VmaNM/n5+EWIOfZ+DT0FgSh7jP X-QQ-XMRINFO: OD9hHCdaPRBwq3WW+NvGbIU= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen Using the DRM_AUX_BRIDGE helper to create the transparent DRM bridge device. Signed-off-by: Chaoyi Chen Reviewed-by: Neil Armstrong --- Changes in v10: - Use drm_aux_bridge_register_from_node() instead. (no changes since v7) Changes in v6: - Fix depend in Kconfig.=20 drivers/phy/rockchip/Kconfig | 2 ++ drivers/phy/rockchip/phy-rockchip-typec.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/drivers/phy/rockchip/Kconfig b/drivers/phy/rockchip/Kconfig index db4adc7c53da..bcb5476222fc 100644 --- a/drivers/phy/rockchip/Kconfig +++ b/drivers/phy/rockchip/Kconfig @@ -120,6 +120,8 @@ config PHY_ROCKCHIP_TYPEC tristate "Rockchip TYPEC PHY Driver" depends on OF && (ARCH_ROCKCHIP || COMPILE_TEST) depends on TYPEC || TYPEC=3Dn + depends on DRM || DRM=3Dn + select DRM_AUX_BRIDGE if DRM_BRIDGE select EXTCON select GENERIC_PHY select RESET_CONTROLLER diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c b/drivers/phy/rockch= ip/phy-rockchip-typec.c index 1f5b4142cbe4..e31b778c3537 100644 --- a/drivers/phy/rockchip/phy-rockchip-typec.c +++ b/drivers/phy/rockchip/phy-rockchip-typec.c @@ -56,6 +56,7 @@ #include #include #include +#include =20 #define CMN_SSM_BANDGAP (0x21 << 2) #define CMN_SSM_BIAS (0x22 << 2) @@ -1312,6 +1313,10 @@ static int tcphy_setup_typec_mux(struct rockchip_typ= ec_phy *tcphy) if (!of_property_read_bool(np, "mode-switch")) goto put_np; =20 + ret =3D drm_aux_bridge_register_from_node(tcphy->dev, np); + if (ret) + goto put_np; + mux_desc.drvdata =3D tcphy; mux_desc.fwnode =3D device_get_named_child_node(tcphy->dev, "dp-port"); mux_desc.set =3D tcphy_typec_mux_set; --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbguseast3.qq.com (smtpbguseast3.qq.com [54.243.244.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 61FEA2EE262; Thu, 20 Nov 2025 02:24:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.243.244.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605495; cv=none; b=aZvvHwYIuDqWapqAMZDsfsC+mtD9d+PUkmOmDz2i4r3fSUiEWjjjmnEC03bBrYvk+TOGZhU6209DBuCeo7sk5Jm0Rn9uOBVypkIuKwbZZMPWxyIs2jFv5rZJvk6tWIY6wnFk3pAvUg/muOcxRPBaKV1mwgFQXZ3Oc7X1P2ye3Rg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605495; c=relaxed/simple; bh=ktQe0TBZJXNabRClR1zK2GRlgnwznm7iN6OWZIxNePg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=QZ9PFZS2ONV9npPEuna1TZ3Qke7ObIk0dKGdHgdKz3R6ZNLkHSXoL4WCJEu+BS7lmofCalgAoqnxhvXtRkvNMZ5rezvT2OwCTzvVQ0J+SMv3lACIGHexg0lCv1Fn5HanOVUzjjfMGFyg23VanSwoBc5F2v0xigfC9sswCjuYKMw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=sy5Cjjgr; arc=none smtp.client-ip=54.243.244.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="sy5Cjjgr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605467; bh=sEWMlrnina66f1mkg7MgIF551DMwzRk8lseSsYVXv/E=; h=From:To:Subject:Date:Message-Id; b=sy5CjjgrRSNoz6JzGri3hB9unDsictcalzEIdNvBczLpmMV5G9YehsFi5a1/e6zwU bW/a2r+n9WFMRgd1wZxqky/ZQaVEXITaGmLBfzVcgL8bmujUjSywG1SqxRWPXUHhba btODpMfkP8+1xwf20yisWioL6R8GvHbMj5uHJB4Y= X-QQ-mid: zesmtpsz5t1763605466t8c66b672 X-QQ-Originating-IP: S+B8JF/DgVa037R2Bl9AzL46KN0sWhmzCpkklai7gIY= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:24:23 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 7295887295416375369 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 08/11] drm/rockchip: cdn-dp: Support handle lane info without extcon Date: Thu, 20 Nov 2025 10:23:40 +0800 Message-Id: <20251120022343.250-9-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: OeWvpHj3+EsSv9xKSW9oV9p5r8GBzeR9vIm5VImmWF6yGAt3LbCq426G ppUy96u931h3x2kVEMra0ALyE1vaNFyitlqb2fkHZ4Gkhk2kaJOhJxLA9+KhOAgiCEoPHZf QF39ScXWBpAjYvvE0o/zEX047OQNRRrlZrHzXyyR+4Vu/378MoHtAmkV1kbglHuURAhunp7 KYMMN8T+WHQot8jlauhI0fP/kWS+UfLoEH7E2UtIiL/qCRy8/BAIim1G4q2bjSLkCUWwSPI 6+BlUXcYm/W+C4eblRv/7St9HPfmZFe1ZPJFqvlR+A6hhFFlwJ76inmN514lZZdtK/aiN9A BG8zrdYBq7pafFY6bhvI7wZmsy4qkfCN9zZ3ruOaH3DhAQLnJcnXHOMm25Qqq0anPS+pCYI VyLNOO+bo5uHOcJlw2gqpTRUmTdEwoR+NeXHHZymCkSjNNT4F0rXCegRvvczkXjqh41wts0 YSi2E6nkagkR2D3k6yLSFJ9f0dtNY+rRiQILy7VLL1kpXQL0UKSlgOEJb3Txr4bpgey/Af5 h5hiRfZ6vE5WZLPL5L3gNbiciyIQPHQ0EQsaeMJyOcM3586XhJChOdGPgcq5bJDiqhfZTJT 4uGEg/Evb8nJVqtdaY3Oe1ktC6kNTLjU11pPNU5p7NVqb1UMjX3X0PBDMNLABvE79kzWPQk vSUlrRB/XXgpdvw3czUeBLvJVdyIZl6R5aUNZX9549ES4JyuagN7JDdKx4zsH/vtDTQnlnf Ugz4z0wtaBfLIL7JzsO4hIwUst3EniUouYR/uyzHx/vBr6HMvksFfvVjUcd09dQ2N2inv4L QdjjRGF/2YzIx9skd/a5vqCrWAwjM47c/6MQnxuc+0hM0vQxHsV6laZBzF2kY9Px0820tHg IEDSXAwJMkZwPoZWRYGW8Pk5h+5bdMnJYy4Ar0YmIPKK3i8n0Pr0sY5EmF8Og/wkOjxNiyr dsN8eDzb0TPK8zwh+nFqC71Rt+dQlvAQUZ8q/4n2uwVV7vOQsn8vuUSCAbE6NVSv9E3/TPW f9RBCG4G2Rw2GGEcNDe9lV6YDNj+k= X-QQ-XMRINFO: NS+P29fieYNw95Bth2bWPxk= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen This patch add support for get PHY lane info without help of extcon. There is no extcon needed if the Type-C controller is present. In this case, the lane info can be get from PHY instead of extcon. The extcon device should still be supported if Type-C controller is not present. Signed-off-by: Chaoyi Chen --- (no changes since v5) Changes in v4: - Remove cdn_dp_hpd_notify(). (no changes since v3) Changes in v2: - Ignore duplicate HPD events. drivers/gpu/drm/rockchip/cdn-dp-core.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockc= hip/cdn-dp-core.c index b7e3f5dcf8d5..1e27301584a4 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -156,6 +156,9 @@ static int cdn_dp_get_port_lanes(struct cdn_dp_port *po= rt) int dptx; u8 lanes; =20 + if (!edev) + return phy_get_bus_width(port->phy); + dptx =3D extcon_get_state(edev, EXTCON_DISP_DP); if (dptx > 0) { extcon_get_property(edev, EXTCON_DISP_DP, @@ -219,7 +222,7 @@ static bool cdn_dp_check_sink_connection(struct cdn_dp_= device *dp) * some docks need more time to power up. */ while (time_before(jiffies, timeout)) { - if (!extcon_get_state(port->extcon, EXTCON_DISP_DP)) + if (port->extcon && !extcon_get_state(port->extcon, EXTCON_DISP_DP)) return false; =20 if (!cdn_dp_get_sink_count(dp, &sink_count)) @@ -385,11 +388,14 @@ static int cdn_dp_enable_phy(struct cdn_dp_device *dp= , struct cdn_dp_port *port) goto err_power_on; } =20 - ret =3D extcon_get_property(port->extcon, EXTCON_DISP_DP, - EXTCON_PROP_USB_TYPEC_POLARITY, &property); - if (ret) { - DRM_DEV_ERROR(dp->dev, "get property failed\n"); - goto err_power_on; + property.intval =3D 0; + if (port->extcon) { + ret =3D extcon_get_property(port->extcon, EXTCON_DISP_DP, + EXTCON_PROP_USB_TYPEC_POLARITY, &property); + if (ret) { + DRM_DEV_ERROR(dp->dev, "get property failed\n"); + goto err_power_on; + } } =20 port->lanes =3D cdn_dp_get_port_lanes(port); @@ -1028,6 +1034,9 @@ static int cdn_dp_bind(struct device *dev, struct dev= ice *master, void *data) for (i =3D 0; i < dp->ports; i++) { port =3D dp->port[i]; =20 + if (!port->extcon) + continue; + port->event_nb.notifier_call =3D cdn_dp_pd_event; ret =3D devm_extcon_register_notifier(dp->dev, port->extcon, EXTCON_DISP_DP, @@ -1120,14 +1129,14 @@ static int cdn_dp_probe(struct platform_device *pde= v) PTR_ERR(phy) =3D=3D -EPROBE_DEFER) return -EPROBE_DEFER; =20 - if (IS_ERR(extcon) || IS_ERR(phy)) + if (IS_ERR(phy) || PTR_ERR(extcon) !=3D -ENODEV) continue; =20 port =3D devm_kzalloc(dev, sizeof(*port), GFP_KERNEL); if (!port) return -ENOMEM; =20 - port->extcon =3D extcon; + port->extcon =3D IS_ERR(extcon) ? NULL : extcon; port->phy =3D phy; port->dp =3D dp; port->id =3D i; --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbguseast2.qq.com (smtpbguseast2.qq.com [54.204.34.130]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 857112D6E55; Thu, 20 Nov 2025 02:24:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.204.34.130 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605489; cv=none; b=mE3FfD964802clMJwyKvbUWamF13EEgEuQyCSfxm+D7bMpdPgc3o+fCt8UKTl0oNi2rOeNtKCgM8b2HAdu5pU3X6xc0zNxD3XjdGwdNEMXv83i85de7iV2A076JSR18H/nzLptuxNw+UVyFqi9suB4GNKv9IcASZewwFAsuLgHI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605489; c=relaxed/simple; bh=Oq6zRJtnZOOwMaJZAHrUkdUXQrCERdPnW8AcXyXAKkU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=LGUiM9201aQbAUiHjG0K+aoiq2/wJuSRTmuLWZRjMjJxQ9TcEAOCQ2MRgkWcvh6x5QwlFf6XLkCEbLLcILNTfyEnQwEzoUuKpicXxLeAjz2T+4SAWRYwXaROyHOyWO2S8yaRXlolB8bC9sqYy/aFQ6rptwuf4CNyeH2HxTz/ua8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=eoF3lovC; arc=none smtp.client-ip=54.204.34.130 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="eoF3lovC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605472; bh=1CdDuEJFy+pllWkaossXRq6gESfcFJxn6cRU6++kQ44=; h=From:To:Subject:Date:Message-Id; b=eoF3lovCcdYe2g5Xp8OPH6OCK/FEhttXfZwOA4GfGxfZH9QthvF3AGd2kiFQXXPow mguM6Y+t1421MxajpoN/feBy/4Uq70IQpRkJQ+ra++pL1EmGJOinVO0MIa3/3kGwRd kLcAdxIMVEbPUxfFUARaGrHzOTyRUfp9VprKKQgY= X-QQ-mid: zesmtpsz5t1763605470t430aac0f X-QQ-Originating-IP: eG+Epba9U14spHWoZT7wT+Fu7Ipc/DMf1a9p4VJu07U= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:24:27 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 14259126268699276081 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 09/11] drm/rockchip: cdn-dp: Add multiple bridges to support PHY port selection Date: Thu, 20 Nov 2025 10:23:41 +0800 Message-Id: <20251120022343.250-10-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: Oax1AVrUJxpVcTB2cCRf3kXgFfZoGdvdCgjKaBzSinqJPCtb2Xmj7tCB NMEB7d17VA44nVO6nY+j6WE10qGN+FkAZfOhreV4+iUVcsLOWvmmhHC20/FySEosYpJxmuU luci9UkTBCkddbVDBaKrf06Bne6yM+AjMZy4RXnoO57s6YWvbSGXxGCKBqJ58ewel7BREE2 81ZVyysY7Zu5q6whqgJmU/7vXuOPjtuQqnAlP2fjioksBaq6EdY38i7sByN6c+2RfawkEbe XTKx7A+Mj4sFRe0goJXz4kOYm5YPYtCxg60gOmZSlAFqlz8xYGxQ1PxJRJtUmce2OEQgayD 1DY5DsI3ogAqbQyWBocR3N9FKUGTYqrOPr0hcdG9kd0GyuZKdwhwfcXb9jO3M5YsrXNpotL KwviB6mmmRoK0QpZESFaVHtPGpYjRDwlE8CyDVNx0PNY5/3ywiY6w1NFg86gAAYy32rfBJd SI7FN1FZpyGmWWqyylkw6tJh6AVr1NC00doJeXgbb0OW/FfTxgQSmYzba4AnDsekspzKjnj IJ9oLbcd7GHdSVzApnQqMXnm9X6zXlrQZ+Gy9Y4KSNbSuGrd1wYLHdv4a6+wMzjxFNi5Bln 8dBSwNXYqjgtLo/Z0KSowOtqIvhkZ5NkgMhOJFB17HbSaWiBUeh44KZj+GIastJMIYmRRUG NLc6xFAWBjbIEARDcFANPAMWeAGyroyqeURkzFU9EYkYX+37CBCj3gG4SxrVb5Wh5SpUzgQ rl93h8epkyFsp+okPa0JEgI7hz5IrEGo2B8jg0PkWLclypXceeA2ZK4EY6sUemdNA9BhpgK v12Sge3trhAaaGClrnOy1C5AENFqikVPlk7RRuravQ/WufXL4aVOS+JxIUYYnVYtmchA4Ze fRMp0GLr+LEU62mTfxnwZDzS5MAKpCanWIrqU5hhTWvAUMuzlyAJDZmyylZGnFOsU5ES++c 00Fn6902lx9OSLPIprIgFr2gf2yHommEPx459hRUm/90ci766XpwbMi1gelPixnxfTsi6ux vXlSXxEDlUQ9oW631Qp8qeEOq5L0Z34Xa+5BlYTA== X-QQ-XMRINFO: NyFYKkN4Ny6FSmKK/uo/jdU= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen The RK3399 has two USB/DP combo PHY and one CDN-DP controller. And the CDN-DP can be switched to output to one of the PHYs. If both ports are plugged into DP, DP will select the first port for output. This patch adds support for multiple bridges, enabling users to flexibly select the output port. For each PHY port, a separate encoder and bridge are registered. The change is based on the DRM AUX HPD bridge, rather than the extcon approach. This requires the DT to correctly describe the connections between the first bridge in bridge chain and DP controller. For example, the bridge chain may be like this: PHY aux birdge -> fsa4480 analog audio switch bridge -> onnn,nb7vpq904m USB reminder bridge -> USB-C controller AUX HPD bridge In this case, the connection relationships among the PHY aux bridge and the DP contorller need to be described in DT. In addition, the cdn_dp_parse_next_bridge_dt() will parses it and determines whether to register one or two bridges. Since there is only one DP controller, only one of the PHY ports can output at a time. The key is how to switch between different PHYs, which is handled by cdn_dp_switch_port() and cdn_dp_enable(). There are two cases: 1. Neither bridge is enabled. In this case, both bridges can independently read the EDID, and the PHY port may switch before reading the EDID. 2. One bridge is already enabled. In this case, other bridges are not allowed to read the EDID. So we will try to return the cached EDID. Since the scenario of two ports plug in at the same time is rare, I don't have a board which support two TypeC connector to test this. Therefore, I tested forced switching on a single PHY port, as well as output using a fake PHY port alongside a real PHY port. Signed-off-by: Chaoyi Chen --- Changes in v10: - Fix refcount usage of drm_bridge. - Remove unused cdn_dp_next_bridge type. Changes in v9: - Select DRM_AUX_HPD_BRIDGE when using DP driver. (no changes since v7) Changes in v6: - Rename some variable names. - Attach the DP bridge to the next bridge. Changes in v5: - By parsing the HPD bridge chain, set the connector's of_node to the of_node corresponding to the USB-C connector. - Return EDID cache when other port is already enabled. drivers/gpu/drm/rockchip/Kconfig | 1 + drivers/gpu/drm/rockchip/cdn-dp-core.c | 325 ++++++++++++++++++++----- drivers/gpu/drm/rockchip/cdn-dp-core.h | 18 +- 3 files changed, 287 insertions(+), 57 deletions(-) diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kc= onfig index b7b025814e72..10d9f29a3d44 100644 --- a/drivers/gpu/drm/rockchip/Kconfig +++ b/drivers/gpu/drm/rockchip/Kconfig @@ -56,6 +56,7 @@ config ROCKCHIP_CDN_DP select DRM_DISPLAY_HELPER select DRM_BRIDGE_CONNECTOR select DRM_DISPLAY_DP_HELPER + select DRM_AUX_HPD_BRIDGE help This selects support for Rockchip SoC specific extensions for the cdn DP driver. If you want to enable Dp on diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockc= hip/cdn-dp-core.c index 1e27301584a4..0bc3d248c266 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -27,16 +27,17 @@ #include "cdn-dp-core.h" #include "cdn-dp-reg.h" =20 -static inline struct cdn_dp_device *bridge_to_dp(struct drm_bridge *bridge) +static int cdn_dp_switch_port(struct cdn_dp_device *dp, struct cdn_dp_port= *prev_port, + struct cdn_dp_port *port); + +static inline struct cdn_dp_bridge *bridge_to_dp_bridge(struct drm_bridge = *bridge) { - return container_of(bridge, struct cdn_dp_device, bridge); + return container_of(bridge, struct cdn_dp_bridge, bridge); } =20 -static inline struct cdn_dp_device *encoder_to_dp(struct drm_encoder *enco= der) +static inline struct cdn_dp_device *bridge_to_dp(struct drm_bridge *bridge) { - struct rockchip_encoder *rkencoder =3D to_rockchip_encoder(encoder); - - return container_of(rkencoder, struct cdn_dp_device, encoder); + return bridge_to_dp_bridge(bridge)->parent; } =20 #define GRF_SOC_CON9 0x6224 @@ -191,14 +192,27 @@ static int cdn_dp_get_sink_count(struct cdn_dp_device= *dp, u8 *sink_count) static struct cdn_dp_port *cdn_dp_connected_port(struct cdn_dp_device *dp) { struct cdn_dp_port *port; - int i, lanes; + int i, lanes[MAX_PHY]; =20 for (i =3D 0; i < dp->ports; i++) { port =3D dp->port[i]; - lanes =3D cdn_dp_get_port_lanes(port); - if (lanes) + lanes[i] =3D cdn_dp_get_port_lanes(port); + if (!dp->next_bridge_valid) return port; } + + if (dp->next_bridge_valid) { + /* If more than one port is available, pick the last active port */ + if (dp->active_port > 0 && lanes[dp->active_port]) + return dp->port[dp->active_port]; + + /* If the last active port is not available, pick an available port in o= rder */ + for (i =3D 0; i < dp->bridge_count; i++) { + if (lanes[i]) + return dp->port[i]; + } + } + return NULL; } =20 @@ -253,12 +267,45 @@ static const struct drm_edid * cdn_dp_bridge_edid_read(struct drm_bridge *bridge, struct drm_connector *c= onnector) { struct cdn_dp_device *dp =3D bridge_to_dp(bridge); - const struct drm_edid *drm_edid; + struct cdn_dp_bridge *dp_bridge =3D bridge_to_dp_bridge(bridge); + struct cdn_dp_port *port =3D dp->port[dp_bridge->id]; + struct cdn_dp_port *prev_port; + const struct drm_edid *drm_edid =3D NULL; + int i, ret; =20 mutex_lock(&dp->lock); + + /* More than one port is available */ + if (dp->bridge_count > 1 && !port->phy_enabled) { + for (i =3D 0; i < dp->bridge_count; i++) { + /* Another port already enable */ + if (dp->bridge_list[i] !=3D dp_bridge && dp->bridge_list[i]->enabled) + goto get_cache; + /* Find already enabled port */ + if (dp->port[i]->phy_enabled) + prev_port =3D dp->port[i]; + } + + /* Switch to current port */ + if (prev_port) { + ret =3D cdn_dp_switch_port(dp, prev_port, port); + if (ret) + goto get_cache; + } + } + drm_edid =3D drm_edid_read_custom(connector, cdn_dp_get_edid_block, dp); + /* replace edid cache */ + if (dp->edid_cache[dp_bridge->id]) + drm_edid_free(dp->edid_cache[dp_bridge->id]); + dp->edid_cache[dp_bridge->id] =3D drm_edid_dup(drm_edid); + mutex_unlock(&dp->lock); + return drm_edid; =20 +get_cache: + drm_edid =3D drm_edid_dup(dp->edid_cache[dp_bridge->id]); + mutex_unlock(&dp->lock); return drm_edid; } =20 @@ -267,12 +314,13 @@ cdn_dp_bridge_mode_valid(struct drm_bridge *bridge, const struct drm_display_info *display_info, const struct drm_display_mode *mode) { + struct cdn_dp_bridge *dp_bridge =3D bridge_to_dp_bridge(bridge); struct cdn_dp_device *dp =3D bridge_to_dp(bridge); u32 requested, actual, rate, sink_max, source_max =3D 0; u8 lanes, bpc; =20 /* If DP is disconnected, every mode is invalid */ - if (!dp->connected) + if (!dp_bridge->connected || !dp->connected) return MODE_BAD; =20 switch (display_info->bpc) { @@ -550,6 +598,54 @@ static bool cdn_dp_check_link_status(struct cdn_dp_dev= ice *dp) return drm_dp_channel_eq_ok(link_status, min(port->lanes, sink_lanes)); } =20 +static int cdn_dp_switch_port(struct cdn_dp_device *dp, struct cdn_dp_port= *prev_port, + struct cdn_dp_port *port) +{ + int ret; + + if (dp->active) + return 0; + + ret =3D cdn_dp_disable_phy(dp, prev_port); + if (ret) + goto out; + ret =3D cdn_dp_enable_phy(dp, port); + if (ret) + goto out; + + ret =3D cdn_dp_get_sink_capability(dp); + if (ret) { + cdn_dp_disable_phy(dp, port); + goto out; + } + + dp->active =3D true; + dp->lanes =3D port->lanes; + + if (!cdn_dp_check_link_status(dp)) { + dev_info(dp->dev, "Connected with sink; re-train link\n"); + + ret =3D cdn_dp_train_link(dp); + if (ret) { + dev_err(dp->dev, "Training link failed: %d\n", ret); + goto out; + } + + ret =3D cdn_dp_set_video_status(dp, CONTROL_VIDEO_IDLE); + if (ret) { + dev_err(dp->dev, "Failed to idle video %d\n", ret); + goto out; + } + + ret =3D cdn_dp_config_video(dp); + if (ret) + dev_err(dp->dev, "Failed to configure video: %d\n", ret); + } + +out: + return ret; +} + static void cdn_dp_display_info_update(struct cdn_dp_device *dp, struct drm_display_info *display_info) { @@ -571,6 +667,7 @@ static void cdn_dp_display_info_update(struct cdn_dp_de= vice *dp, static void cdn_dp_bridge_atomic_enable(struct drm_bridge *bridge, struct = drm_atomic_state *state) { struct cdn_dp_device *dp =3D bridge_to_dp(bridge); + struct cdn_dp_bridge *dp_bridge =3D bridge_to_dp_bridge(bridge); struct drm_connector *connector; int ret, val; =20 @@ -580,7 +677,7 @@ static void cdn_dp_bridge_atomic_enable(struct drm_brid= ge *bridge, struct drm_at =20 cdn_dp_display_info_update(dp, &connector->display_info); =20 - ret =3D drm_of_encoder_active_endpoint_id(dp->dev->of_node, &dp->encoder.= encoder); + ret =3D drm_of_encoder_active_endpoint_id(dp->dev->of_node, &dp_bridge->e= ncoder.encoder); if (ret < 0) { DRM_DEV_ERROR(dp->dev, "Could not get vop id, %d", ret); return; @@ -599,6 +696,9 @@ static void cdn_dp_bridge_atomic_enable(struct drm_brid= ge *bridge, struct drm_at =20 mutex_lock(&dp->lock); =20 + if (dp->next_bridge_valid) + dp->active_port =3D dp_bridge->id; + ret =3D cdn_dp_enable(dp); if (ret) { DRM_DEV_ERROR(dp->dev, "Failed to enable bridge %d\n", @@ -631,6 +731,7 @@ static void cdn_dp_bridge_atomic_enable(struct drm_brid= ge *bridge, struct drm_at goto out; } =20 + dp_bridge->enabled =3D true; out: mutex_unlock(&dp->lock); } @@ -638,9 +739,11 @@ static void cdn_dp_bridge_atomic_enable(struct drm_bri= dge *bridge, struct drm_at static void cdn_dp_bridge_atomic_disable(struct drm_bridge *bridge, struct= drm_atomic_state *state) { struct cdn_dp_device *dp =3D bridge_to_dp(bridge); + struct cdn_dp_bridge *dp_bridge =3D bridge_to_dp_bridge(bridge); int ret; =20 mutex_lock(&dp->lock); + dp_bridge->enabled =3D false; =20 if (dp->active) { ret =3D cdn_dp_disable(dp); @@ -827,6 +930,16 @@ static int cdn_dp_audio_mute_stream(struct drm_bridge = *bridge, return ret; } =20 +static void cdn_dp_bridge_hpd_notify(struct drm_bridge *bridge, + enum drm_connector_status status) +{ + struct cdn_dp_bridge *dp_bridge =3D bridge_to_dp_bridge(bridge); + struct cdn_dp_device *dp =3D bridge_to_dp(bridge); + + dp->bridge_list[dp_bridge->id]->connected =3D status =3D=3D connector_sta= tus_connected; + schedule_work(&dp->event_work); +} + static const struct drm_bridge_funcs cdn_dp_bridge_funcs =3D { .atomic_duplicate_state =3D drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, @@ -837,6 +950,7 @@ static const struct drm_bridge_funcs cdn_dp_bridge_func= s =3D { .atomic_disable =3D cdn_dp_bridge_atomic_disable, .mode_valid =3D cdn_dp_bridge_mode_valid, .mode_set =3D cdn_dp_bridge_mode_set, + .hpd_notify =3D cdn_dp_bridge_hpd_notify, =20 .dp_audio_prepare =3D cdn_dp_audio_prepare, .dp_audio_mute_stream =3D cdn_dp_audio_mute_stream, @@ -885,7 +999,8 @@ static void cdn_dp_pd_event_work(struct work_struct *wo= rk) { struct cdn_dp_device *dp =3D container_of(work, struct cdn_dp_device, event_work); - int ret; + bool connected; + int i, ret; =20 mutex_lock(&dp->lock); =20 @@ -944,9 +1059,12 @@ static void cdn_dp_pd_event_work(struct work_struct *= work) =20 out: mutex_unlock(&dp->lock); - drm_bridge_hpd_notify(&dp->bridge, - dp->connected ? connector_status_connected - : connector_status_disconnected); + for (i =3D 0; i < dp->bridge_count; i++) { + connected =3D dp->connected && dp->bridge_list[i]->connected; + drm_bridge_hpd_notify(&dp->bridge_list[i]->bridge, + connected ? connector_status_connected + : connector_status_disconnected); + } } =20 static int cdn_dp_pd_event(struct notifier_block *nb, @@ -966,28 +1084,16 @@ static int cdn_dp_pd_event(struct notifier_block *nb, return NOTIFY_DONE; } =20 -static int cdn_dp_bind(struct device *dev, struct device *master, void *da= ta) +static int cdn_bridge_add(struct device *dev, + struct drm_bridge *bridge, + struct drm_bridge *next_bridge, + struct drm_encoder *encoder) { struct cdn_dp_device *dp =3D dev_get_drvdata(dev); - struct drm_encoder *encoder; + struct drm_device *drm_dev =3D dp->drm_dev; + struct drm_bridge *last_bridge __free(drm_bridge_put) =3D NULL; struct drm_connector *connector; - struct cdn_dp_port *port; - struct drm_device *drm_dev =3D data; - int ret, i; - - ret =3D cdn_dp_parse_dt(dp); - if (ret < 0) - return ret; - - dp->drm_dev =3D drm_dev; - dp->connected =3D false; - dp->active =3D false; - dp->active_port =3D -1; - dp->fw_loaded =3D false; - - INIT_WORK(&dp->event_work, cdn_dp_pd_event_work); - - encoder =3D &dp->encoder.encoder; + int ret; =20 encoder->possible_crtcs =3D drm_of_find_possible_crtcs(drm_dev, dev->of_node); @@ -1002,26 +1108,35 @@ static int cdn_dp_bind(struct device *dev, struct d= evice *master, void *data) =20 drm_encoder_helper_add(encoder, &cdn_dp_encoder_helper_funcs); =20 - dp->bridge.ops =3D - DRM_BRIDGE_OP_DETECT | - DRM_BRIDGE_OP_EDID | - DRM_BRIDGE_OP_HPD | - DRM_BRIDGE_OP_DP_AUDIO; - dp->bridge.of_node =3D dp->dev->of_node; - dp->bridge.type =3D DRM_MODE_CONNECTOR_DisplayPort; - dp->bridge.hdmi_audio_dev =3D dp->dev; - dp->bridge.hdmi_audio_max_i2s_playback_channels =3D 8; - dp->bridge.hdmi_audio_spdif_playback =3D 1; - dp->bridge.hdmi_audio_dai_port =3D -1; - - ret =3D devm_drm_bridge_add(dev, &dp->bridge); + bridge->ops =3D + DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_EDID | + DRM_BRIDGE_OP_HPD | + DRM_BRIDGE_OP_DP_AUDIO; + bridge->of_node =3D dp->dev->of_node; + bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; + bridge->hdmi_audio_dev =3D dp->dev; + bridge->hdmi_audio_max_i2s_playback_channels =3D 8; + bridge->hdmi_audio_spdif_playback =3D 1; + bridge->hdmi_audio_dai_port =3D -1; + + ret =3D devm_drm_bridge_add(dev, bridge); if (ret) return ret; =20 - ret =3D drm_bridge_attach(encoder, &dp->bridge, NULL, DRM_BRIDGE_ATTACH_N= O_CONNECTOR); + ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); if (ret) return ret; =20 + if (next_bridge) { + ret =3D drm_bridge_attach(encoder, next_bridge, bridge, + DRM_BRIDGE_ATTACH_NO_CONNECTOR); + if (ret) + return ret; + + last_bridge =3D drm_bridge_chain_get_last_bridge(bridge->encoder); + } + connector =3D drm_bridge_connector_init(drm_dev, encoder); if (IS_ERR(connector)) { ret =3D PTR_ERR(connector); @@ -1029,8 +1144,100 @@ static int cdn_dp_bind(struct device *dev, struct d= evice *master, void *data) return ret; } =20 + if (last_bridge) + connector->fwnode =3D fwnode_handle_get(of_fwnode_handle(last_bridge->of= _node)); + drm_connector_attach_encoder(connector, encoder); =20 + return 0; +} + +static int cdn_dp_parse_next_bridge_dt(struct cdn_dp_device *dp) +{ + struct device_node *np =3D dp->dev->of_node; + struct device_node *port __free(device_node) =3D of_graph_get_port_by_id(= np, 1); + struct drm_bridge *bridge; + int count =3D 0; + int ret =3D 0; + int i; + + /* If device use extcon, do not use hpd bridge */ + for (i =3D 0; i < dp->ports; i++) { + if (dp->port[i]->extcon) { + dp->bridge_count =3D 1; + return 0; + } + } + + /* One endpoint may correspond to one next bridge. */ + for_each_of_graph_port_endpoint(port, dp_ep) { + struct device_node *next_bridge_node __free(device_node) =3D + of_graph_get_remote_port_parent(dp_ep); + + bridge =3D of_drm_find_bridge(next_bridge_node); + if (!bridge) { + ret =3D -EPROBE_DEFER; + goto out; + } + + drm_bridge_get(bridge); + dp->next_bridge_valid =3D true; + dp->next_bridge_list[count] =3D bridge; + count++; + } + +out: + dp->bridge_count =3D count ? count : 1; + return ret; +} + +static int cdn_dp_bind(struct device *dev, struct device *master, void *da= ta) +{ + struct cdn_dp_device *dp =3D dev_get_drvdata(dev); + struct drm_bridge *bridge, *next_bridge; + struct drm_encoder *encoder; + struct cdn_dp_port *port; + struct drm_device *drm_dev =3D data; + struct cdn_dp_bridge *dp_bridge; + int ret, i; + + ret =3D cdn_dp_parse_dt(dp); + if (ret < 0) + return ret; + + ret =3D cdn_dp_parse_next_bridge_dt(dp); + if (ret) + return ret; + + dp->drm_dev =3D drm_dev; + dp->connected =3D false; + dp->active =3D false; + dp->active_port =3D -1; + dp->fw_loaded =3D false; + + for (i =3D 0; i < dp->bridge_count; i++) { + dp_bridge =3D devm_drm_bridge_alloc(dev, struct cdn_dp_bridge, bridge, + &cdn_dp_bridge_funcs); + if (IS_ERR(dp_bridge)) + return PTR_ERR(dp_bridge); + dp_bridge->id =3D i; + dp_bridge->parent =3D dp; + if (!dp->next_bridge_valid) + dp_bridge->connected =3D true; + dp->bridge_list[i] =3D dp_bridge; + } + + for (i =3D 0; i < dp->bridge_count; i++) { + encoder =3D &dp->bridge_list[i]->encoder.encoder; + bridge =3D &dp->bridge_list[i]->bridge; + next_bridge =3D dp->next_bridge_list[i]; + ret =3D cdn_bridge_add(dev, bridge, next_bridge, encoder); + if (ret) + return ret; + } + + INIT_WORK(&dp->event_work, cdn_dp_pd_event_work); + for (i =3D 0; i < dp->ports; i++) { port =3D dp->port[i]; =20 @@ -1058,10 +1265,18 @@ static int cdn_dp_bind(struct device *dev, struct d= evice *master, void *data) static void cdn_dp_unbind(struct device *dev, struct device *master, void = *data) { struct cdn_dp_device *dp =3D dev_get_drvdata(dev); - struct drm_encoder *encoder =3D &dp->encoder.encoder; + struct drm_encoder *encoder; + int i; =20 cancel_work_sync(&dp->event_work); - encoder->funcs->destroy(encoder); + for (i =3D 0; i < dp->bridge_count; i++) { + encoder =3D &dp->bridge_list[i]->encoder.encoder; + encoder->funcs->destroy(encoder); + drm_bridge_put(dp->next_bridge_list[i]); + } + + for (i =3D 0; i < MAX_PHY; i++) + drm_edid_free(dp->edid_cache[i]); =20 pm_runtime_disable(dev); if (dp->fw_loaded) @@ -1112,10 +1327,10 @@ static int cdn_dp_probe(struct platform_device *pde= v) int ret; int i; =20 - dp =3D devm_drm_bridge_alloc(dev, struct cdn_dp_device, bridge, - &cdn_dp_bridge_funcs); - if (IS_ERR(dp)) - return PTR_ERR(dp); + dp =3D devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); + if (!dp) + return -ENOMEM; + dp->dev =3D dev; =20 match =3D of_match_node(cdn_dp_dt_ids, pdev->dev.of_node); diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.h b/drivers/gpu/drm/rockc= hip/cdn-dp-core.h index e9c30b9fd543..c10e423bbf06 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.h +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.h @@ -38,6 +38,8 @@ enum vic_pxl_encoding_format { Y_ONLY =3D 0x10, }; =20 +struct cdn_dp_device; + struct video_info { bool h_sync_polarity; bool v_sync_polarity; @@ -63,16 +65,28 @@ struct cdn_dp_port { u8 id; }; =20 +struct cdn_dp_bridge { + struct cdn_dp_device *parent; + struct drm_bridge bridge; + struct rockchip_encoder encoder; + bool connected; + bool enabled; + int id; +}; + struct cdn_dp_device { struct device *dev; struct drm_device *drm_dev; - struct drm_bridge bridge; - struct rockchip_encoder encoder; + int bridge_count; + struct cdn_dp_bridge *bridge_list[MAX_PHY]; + struct drm_bridge *next_bridge_list[MAX_PHY]; + const struct drm_edid *edid_cache[MAX_PHY]; struct drm_display_mode mode; struct platform_device *audio_pdev; struct work_struct event_work; =20 struct mutex lock; + bool next_bridge_valid; bool connected; bool active; bool suspended; --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbg154.qq.com (smtpbg154.qq.com [15.184.224.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ABD231898F8; Thu, 20 Nov 2025 02:25:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=15.184.224.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605529; cv=none; b=gH1X83YpjtThjfC7AME6RP8M+v6cRVVZaxxolLTLB93Ov5D+Atc6zujRsEfOpDzqUpPcpSxQLOGRHHQhObetYZNIO+D8sEszsvWd9u/6r41C82ri10Hna8LlX0bKVE4NPbat5KDX4KwypY8GElqBNy9YyAJn/iALuil/08kwMTc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605529; c=relaxed/simple; bh=UYBXRUGpsPucbSnyCek2T6kQGAmNcIEArFxOg+A85iE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=Nn6NI0TKrJJ7D3/9YAxD/mWjaC9tHEeMtBy2YCM+TCPOMjS3rFVTjMCUnLqxyASGCz738cJA2dGzhvRp4pWNzjCw9FMJKd73FbW+gyCqljRP5MJeq50Xdl0yU/pi0PE4GWogCPS676xo8Db7BMPx6Ws6CCQzi6xy1hxERADDdyQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=tfGrBUuO; arc=none smtp.client-ip=15.184.224.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="tfGrBUuO" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605510; bh=pFI7M+6j2JewnD4BwkGRc0QPG+RPFm6rGXiCORxPrVE=; h=From:To:Subject:Date:Message-Id; b=tfGrBUuOPJUpco1zu8sRceRMdZYvazPZBusbEgRCReSDyRXj8OgVXIzCSc8AZxZyM 2JFiu2PZYV1+vxiFmrl+bB4SwukwZDOz6bZEH0o0X0D6Gp6+WbgBmtqiaJUx2YlIYr xl1fR9h8A8RjjLfrkAkEXp7YouT6ezH9wj0UEsBw= X-QQ-mid: zesmtpsz5t1763605475t5758b803 X-QQ-Originating-IP: pDz7EWZhJzQQujm3af9e2JLj4n12gmSAhoVFGhYNXPk= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:24:32 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 15460230959253220818 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 10/11] arm64: dts: rockchip: Add missing dp_out port for RK3399 CDN-DP Date: Thu, 20 Nov 2025 10:23:42 +0800 Message-Id: <20251120022343.250-11-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: MqN/FiDJuNHiNw/y4jqC1wkFSVC+iexlgRuQzGNsdwHXRvigQHUiqJ6z siW+grUV+gBOojILOLb4eb0YIH4IoJhymUG1ZO/rMZ9K/HUWq0RK6l0qF9WTq+weccZRUo5 DkdgnInz16HephMQ/cwRW4zIyuCYoSUiTZZNTaJEaoV9Zk2OLADZjST/3X5lwrNWmHf92QY P2pHHqhAqoebst7TRqLtUOrFvxduKS7Z9qs/+dnJpvQVzmhy+CAk8xhYgTpSUIZXJ3N6QIy Z7VzzGO1T/MJkgb9dz8XqVC4CwFINhQtnusm/l33inzZDwGYG0fzfd3DaM+JaZiXLCh3bHA 7jW7iHagprJrlJiKFGt4ByyfsLWAC6JBwsVqkn4dXJEoECeMnL2zjQtKcQOHnD8xD05SBXp LE5jjNn2qbStAR57G2L7SEbusjXgMrJcAY/nLf6hLUMTbgELlfGGU/Ekox4/o1cpp96IkEz ORkC+zWMc9c+8ucXtfiWRVvt78VUnakqS+H8pM7NoymBONn6WcR2QPf4/B4NnRY4jL7dpkz SuJoBd6Xig6Dj4ePgSPsPGypPKE0z7nPcIku/ecouZbkry1XlFtEeFVlZr7YkKyk0yTdCJD yQsM1xpOlMHstytibVt75C8Zhtw4N2V0XlXNZm9lkdXHE0q0Qkml3CBVXllN3NR1N8PyBnB K2qyDAL7rIvY/KAB4BG45AdontOs6Ezgp+l6JYvthAGDPOI8vXo/uM7U0VV9+j+HlhmNyCJ I4kHuRv2TV1hkHcwFPXzJ9y7Vc7Zesibkyd5hiS50Wd120K1pJsOTLNriD8tiigAq+8itKK vXeJyU8lZx39Zofg12WjZOxeF825SGACRapHSbfw+uaJ0w5zrovO7yyaqRMp7bBeG8AdFL4 aZvnjEOZ0KsH8dYZxNJ97tDI9cqCOXOPQXw0e/jmB3bOpgIrBlm4Zg7BagDvcFIVJFF0V8/ 1RaQMZQqpdDyzteBwiKGWP8cwctPb56yAPYU0KE2TKxtNXHk2WknLjYMWyQjzHPe08lBlu2 r4KoXiDkGItH5uspkJ X-QQ-XMRINFO: OWPUhxQsoeAVDbp3OJHYyFg= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen Let's make the ports nodes of cdn_dp in the same style as the other display interface, and match the style of ports's yaml. Signed-off-by: Chaoyi Chen --- (no changes since v5) Changes in v4: - Remove unnecessary #address/#size-cells (no changes since v1) arch/arm64/boot/dts/rockchip/rk3399-base.dtsi | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3399-base.dtsi b/arch/arm64/boo= t/dts/rockchip/rk3399-base.dtsi index 4dcceb9136b7..93b42820998f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-base.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-base.dtsi @@ -618,7 +618,11 @@ cdn_dp: dp@fec00000 { status =3D "disabled"; =20 ports { - dp_in: port { + #address-cells =3D <1>; + #size-cells =3D <0>; + + dp_in: port@0 { + reg =3D <0>; #address-cells =3D <1>; #size-cells =3D <0>; =20 @@ -632,6 +636,10 @@ dp_in_vopl: endpoint@1 { remote-endpoint =3D <&vopl_out_dp>; }; }; + + dp_out: port@1 { + reg =3D <1>; + }; }; }; =20 --=20 2.51.1 From nobody Tue Dec 2 02:19:39 2025 Received: from smtpbgsg1.qq.com (smtpbgsg1.qq.com [54.254.200.92]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BAF562DCF47; Thu, 20 Nov 2025 02:25:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.254.200.92 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605526; cv=none; b=BwfqKYbKjjnxcFQJhOILZOa9oYr9//B+4TDvU/d2x97qDWLopTKS7btmfkm47efSD5189JbNLQeLPcilDPU2HQ4ZqTUN6BrgedDCGKwEZzWbBcOmdpwnQSnbXRTxew6lnQi84gvqpasGMOW2F+UkaaqSify5cOlYTXJPezO+sgE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763605526; c=relaxed/simple; bh=CogOCq7Dgo3J6O+ahfKV8yupDN4OJqUtveUj18KHbi4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=fIaX9HXygb6/Mn2OS4WQeX/eL6mHBVV8z16VXE7sGSsbBheKslL8HjSU50J0uOlcQRhVB5mTO16UjcFMau4tPm2sXX6YbDpOV+LufYT84k170ioqFzf2khI00wgBi71aiEI4I5XuNv2V1DXzbqe6QUrNgvCKApunBqLu9jwOvxU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com; spf=pass smtp.mailfrom=airkyi.com; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b=F47Tlp0T; arc=none smtp.client-ip=54.254.200.92 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="F47Tlp0T" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1763605517; bh=Xn5Sqf6jlBXaETnSdjcUsZQPPZf1EW7Rcj8pIik+fGE=; h=From:To:Subject:Date:Message-Id; b=F47Tlp0TlguIuuN8WvpVyhM0CNjx3WhTRwGKpluRiKavlYRObCqMG+HHUwHE48xeJ L4N2FB3ZWhLOm+6ElAG4L7qMmDJBnyfYyZSqt1cmKTxUchntLjAXQdkALVUP7Asjeo 1K5QDLJ156ZJ/kkeiL2/Oqmkv3Cis9/yremDpMB8= X-QQ-mid: zesmtpsz5t1763605479t4f566fe8 X-QQ-Originating-IP: u55IejQC99cX06tuNwkUEpyW35B2cmYSlSGFqlYKtDg= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 20 Nov 2025 10:24:36 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 534471061521823290 From: Chaoyi Chen To: Heikki Krogerus , Greg Kroah-Hartman , Dmitry Baryshkov , Peter Chen , Luca Ceresoli , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Peter Robinson Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH v10 11/11] arm64: dts: rockchip: rk3399-evb-ind: Add support for DisplayPort Date: Thu, 20 Nov 2025 10:23:43 +0800 Message-Id: <20251120022343.250-12-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251120022343.250-1-kernel@airkyi.com> References: <20251120022343.250-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: NtksVjXir1Sb6sQ5D/1nQfdIoldl/JaU00sxOQbjTG4AL2yif0yU2QQW EAZ8EdeOE2uq27vFq/Pat57+n5fGXxK4u4jpr1PuJ9STkQRfypt3Rp1PFXGaQip6wFJ7bk5 1Dbdi+0lDDB+hRp4T/52z/ytoEwzN/2Q1xhCeggnAwbbF8xoJKLFnzoeSp1Y8D2fW0IaYkC ZMgKH0k9i/yog315t8ziJvn43C54FFLDzS0Y+eSdBToWxaiz53a91ABGsyBHCXpp9Qz/sKn xhzzD8RwU/HknuzK0+ZyQiw67BzTiIQvZ12XSt29k1gtuPGHFzH0W0xoOEQH8ScGJboO52z lVrFVnVIyu5otIwELUNbGJ/8148xDH/GpRqgVxSTc0GpNnj3HIPOReaTUCbvs4Sfo7hs3IJ gRFFjlzyBtb9InkAnXiuGICeM5ecmCVIncv6lDC7duf+XsRRmbj3FyaJDx68c4cQbNn1w8Y UgE4LXB9w3nIsjd/7aCoO2jOPQw24an+WDbpajHnou/UzjBpXf1TY7ro5nG9fscIQeoHTIK MbY4WcEnH2Xh/8Db7Y34kwNdbvSfFJNIY706G0q+090fNjyeOqIzQJBfjJdmxbzhAVu5YbJ 1/vss1ixpXhHlH5Ri/Ey7AckWNxIiU5PexlWp4Chv6kBcL3LVdI4RaQasWNHvbJBSyjnHe3 OJEoaLeG9+h729S/OaDwBr8r6WHX2i9L/8EwBW/pUWrvnTZG/1VC5CI9465/DzFbvsup2+P z1ZLaygpwp7Jd38YNnqcY31AOYaN5dRrpH7vsQHuXn8p8STPTa0Eh3VdDuGwLgRjhFLkwm5 ZNIbTeZKc3wQeC3bSek7TNlpEZfe6RU3c8MphHdSbatPC43BKoRbqVLwMJBknXfA4FJ9+2q /JFkSQp9+gHYwdttMS7iA0+INcrxzEKbd9WWKj4X/rTG8xhTGB8bjiNVwBp64k5Se46BcmW liSGoQ7woHFE6Qjy2FFqrTMtRAHR2nJflR373o8k6SIpH/wUo4Gy6D8gCni1XcQSqSxsiec 4gCvNBxmnlzxBgoLAeuD4AxG5uJ3NdfOG/2JNZXg== X-QQ-XMRINFO: Mp0Kj//9VHAxr69bL5MkOOs= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen The RK3399 EVB IND board has a Type-C interface DisplayPort. It use fusb302 chip as Type-C controller. fusb302 chip ---> USB/DP PHY0 <----> CDN-DP controller Signed-off-by: Chaoyi Chen --- (no changes since v10) Changes in v9: - Add usb role switch for Type-C. - Remove USB2 PHY in Type-C connection. (no changes since v4) Changes in v3: - Fix wrong vdo value. - Fix port node in usb-c-connector. Changes in v2: - Add endpoint to link DP PHY and DP controller. - Fix devicetree coding style. .../boot/dts/rockchip/rk3399-evb-ind.dts | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dts b/arch/arm64/b= oot/dts/rockchip/rk3399-evb-ind.dts index 70aee1ab904c..be1e90f7a453 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dts +++ b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dts @@ -4,6 +4,7 @@ */ =20 /dts-v1/; +#include #include "rk3399.dtsi" =20 / { @@ -19,6 +20,21 @@ chosen { stdout-path =3D "serial2:1500000n8"; }; =20 + sound: sound { + compatible =3D "rockchip,rk3399-gru-sound"; + rockchip,cpu =3D <&i2s0 &spdif>; + }; + + vbus_typec: regulator-vbus-typec { + compatible =3D "regulator-fixed"; + enable-active-high; + gpio =3D <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>; + pinctrl-names =3D "default"; + pinctrl-0 =3D <&vcc5v0_typec0_en>; + regulator-name =3D "vbus_typec"; + vin-supply =3D <&vcc5v0_sys>; + }; + vcc5v0_sys: regulator-vcc5v0-sys { compatible =3D "regulator-fixed"; enable-active-high; @@ -31,6 +47,11 @@ vcc5v0_sys: regulator-vcc5v0-sys { }; }; =20 +&cdn_dp { + phys =3D <&tcphy0_dp>; + status =3D "okay"; +}; + &cpu_b0 { cpu-supply =3D <&vdd_cpu_b>; }; @@ -55,6 +76,12 @@ &cpu_l3 { cpu-supply =3D <&vdd_cpu_l>; }; =20 +&dp_out { + dp_controller_output: endpoint { + remote-endpoint =3D <&dp_phy_in>; + }; +}; + &emmc_phy { status =3D "okay"; }; @@ -341,6 +368,71 @@ regulator-state-mem { }; }; =20 +&i2c4 { + i2c-scl-rising-time-ns =3D <475>; + i2c-scl-falling-time-ns =3D <26>; + status =3D "okay"; + + usbc0: typec-portc@22 { + compatible =3D "fcs,fusb302"; + reg =3D <0x22>; + interrupt-parent =3D <&gpio1>; + interrupts =3D ; + pinctrl-names =3D "default"; + pinctrl-0 =3D <&usbc0_int>; + vbus-supply =3D <&vbus_typec>; + + usb_con: connector { + compatible =3D "usb-c-connector"; + label =3D "USB-C"; + data-role =3D "dual"; + power-role =3D "dual"; + try-power-role =3D "sink"; + op-sink-microwatt =3D <1000000>; + sink-pdos =3D + ; + source-pdos =3D + ; + + altmodes { + displayport { + svid =3D /bits/ 16 <0xff01>; + vdo =3D <0x00001c46>; + }; + }; + + ports { + #address-cells =3D <1>; + #size-cells =3D <0>; + + port@0 { + reg =3D <0>; + + usbc0_orien_sw: endpoint { + remote-endpoint =3D <&tcphy0_orientation_switch>; + }; + }; + + port@1 { + reg =3D <1>; + + usbc0_role_sw: endpoint { + remote-endpoint =3D <&dwc3_0_role_switch>; + }; + }; + + port@2 { + reg =3D <2>; + + dp_altmode_mux: endpoint { + remote-endpoint =3D <&tcphy0_typec_dp>; + }; + }; + }; + }; + }; +}; + &i2s2 { status =3D "okay"; }; @@ -354,6 +446,16 @@ &io_domains { }; =20 &pinctrl { + usb-typec { + usbc0_int: usbc0-int { + rockchip,pins =3D <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>; + }; + + vcc5v0_typec0_en: vcc5v0-typec0-en { + rockchip,pins =3D <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + pmic { pmic_int_l: pmic-int-l { rockchip,pins =3D <1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>; @@ -400,10 +502,48 @@ &sdmmc { status =3D "okay"; }; =20 +&sound { + rockchip,codec =3D <&cdn_dp>; + status =3D "okay"; +}; + +&spdif { + status =3D "okay"; +}; + &tcphy0 { status =3D "okay"; }; =20 +&tcphy0_dp { + mode-switch; + + port { + #address-cells =3D <1>; + #size-cells =3D <0>; + + tcphy0_typec_dp: endpoint@0 { + reg =3D <0>; + remote-endpoint =3D <&dp_altmode_mux>; + }; + + dp_phy_in: endpoint@1 { + reg =3D <1>; + remote-endpoint =3D <&dp_controller_output>; + }; + }; +}; + +&tcphy0_usb3 { + orientation-switch; + + port { + tcphy0_orientation_switch: endpoint { + remote-endpoint =3D <&usbc0_orien_sw>; + }; + }; +}; + &tcphy1 { status =3D "okay"; }; @@ -461,7 +601,14 @@ &usb_host1_ohci { }; =20 &usbdrd_dwc3_0 { + usb-role-switch; status =3D "okay"; + + port { + dwc3_0_role_switch: endpoint { + remote-endpoint =3D <&usbc0_role_sw>; + }; + }; }; =20 &usbdrd3_0 { --=20 2.51.1