From nobody Mon Dec 15 19:01:13 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 A13B81DEFE7; Mon, 8 Dec 2025 01:55:35 +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=1765158941; cv=none; b=Bs4MvV6nzxluoORHHSNBjq5pWH+Gvcu/13mhFgb/KOCWX/bQR78sFARykO2+27fEiDXVwxaxw7PEzgAr+1Qk0Df+rcdUY6RQ4OFR6MmyplMgDInw55RIQDJ/IpI4ru1zQ3HYPXmrP9z+RFz7yj1F1BEpW31Nhcxgk4cGY2H/P5I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158941; c=relaxed/simple; bh=iTOIohy0qYK7kDrH+uxGnHTytFnZLZ1YxBwa438QSBY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=LSQa+cpnqwggMIxLr/8YqyMHku53GeWaJAqmAu+/tPp0k7QhwXLRq54ZXUE97m/vCFu6yG9U1urZmAxl7BceVgD6wU5PZtsdSwgPfS/ZeMtDYctFB49vbf0fvYT4GQdwPSBpo9fBqrR6gOkzuoHAXL3NW2Zhw72qL6gjW5TupBM= 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=Va7P5i+v; 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="Va7P5i+v" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765158917; bh=NjznxNMb9W4+bQ7ntUiXziepx5/AkGT/NQmAlFvr1gE=; h=From:To:Subject:Date:Message-Id; b=Va7P5i+v//Tut9/jSxkocgCsdyMimck7KOrV0/n7OnJ0hzC/xBnzouILyj5WVMTuS smZtDAqvooenLva3IXtpP7Mp2zZNnjeM26dvE8rWLhIccHCSrhkS9vUpG/8F2wFFty tqtIDZJacTZkFOKpOhGxWHavKSGgAvMlPwVOkfs4= X-QQ-mid: esmtpsz19t1765158915tc2fa3784 X-QQ-Originating-IP: 28n/h0UQlAPWnyV58UwgT/hhI9KDq+Wze+u53KAkaPw= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:12 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 4550680813706724546 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 v13 01/11] usb: typec: Set the bus also for the port and plug altmodes Date: Mon, 8 Dec 2025 09:54:50 +0800 Message-Id: <20251208015500.94-2-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: Mi+38GKm5OhVJjZtHqVKxvYrjOp7q6a4Njdlf9D1Qmqz7FDyRO8M6SNn b2P6FJ33gwhIxDA4ckYbAImpE8E2jo6szCkiUnSe7KgFkpflsQ9ldTyeDpYqr2U4eeJit++ HI963MQn2n48V5+fANDgGXnb1UJEpWkvHK4Q1NZGYPEmQFJ286rtfpP8j+8sGpkCu2jXqC/ XunQFtRQ66z+GLG5hlH8CRO3XYf/nZCOMr+zBKuSEAfaSD9l9moS2rirHGH/0xi/qtUMDR6 VUpcZdqjp90NqZeMyEmHRGqpZ9v1R7mEvs5FA7Y8IJ7cjsiQvl8N/+7ayETra9zAFfkEwII NTlRsfxy4rdUacBUmEQLawBda1UNI/sITygCOyTUSDD+NWuKrsXFl8lSRcSvpWj9KxI4ven uDmhLI/Pp0CTchn4pSYi2oNrlGmzK0fER5tSKMLadRwO0Ptn0ZQFlXfO9Q+A1nqcl4GEHa5 EiJjoOkKJS655NATkkiVDKXUttcfGg5FLKNZhyUJTFXDF9SfIp3qj3AnuExV/GgRwtiOVMF tkYR57eue9TBGNCTMc1HtBNkjYlUszAUc4Npy9D88cyuDQw7iWycKi5JvJ/rN+g5G0nJ5EI eR0MqAKzC8JqXWMWkgD93qVQttrPaRNCCDFoGXdrfxX1h1whNamlwZztc4D4WSZEBTuvtqD Z+uTUeuRXk+5SImpttbv6GPSH4iDscOla0dq58NNBdNi2K+syrIDV9AJyqzMLreuWGkrUrG 2w514QkVXqOmv4fVutNSks/zMoStKst7ZKO/Q4Mf+defeEbYz7kfbi+Ybv92IuY2uJJ/Dc+ NNG9P5deTWbvpxEv6jOR4yxWEArrQulV1cvdDmUM9aA+2WpYLyoVkjwpJ1X6co3jmzvinvH 4LO+xsM2tsA7KLfUYdR1gyNOhxtATyMIAWmdaqQjaUsshKt5/RHlI3RdrLamS/zm035Kj1J 01ykw6WMtZaCOj6WR7u/Mq9LpwtoLUvRjLhg4RpnZMki4ZfPbkuKRPOJZibPDPIpowUkGfW vNVDfPkTlNze1eF7LF/Mu/DLQaXzqSTZPukUTYoKnPDLPw2PgkzSorqqDaTzY= X-QQ-XMRINFO: NI4Ajvh11aEj8Xl/2s1/T8w= 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: Heikki Krogerus The port and plug altmodes can't be bound to the altmode drivers because the altmode drivers are meant for partner communication using the VDM (vendor defined messages), but they can still be part of the bus. The bus will make sure that the normal bus notifications are available also with the port altmodes. The previously used common device type for all alternate modes is replaced with separate dedicated device types for port, plug, and partner alternate modes. Signed-off-by: Heikki Krogerus Signed-off-by: Chaoyi Chen --- (no changes since v13) Changes in v12: - Add missing Signed-off-by line. drivers/usb/typec/bus.c | 24 +++++++++++++++++++++++- drivers/usb/typec/bus.h | 8 ++++++-- drivers/usb/typec/class.c | 33 ++++++++++++++++++++++----------- 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/drivers/usb/typec/bus.c b/drivers/usb/typec/bus.c index a884cec9ab7e..a33da7f458a5 100644 --- a/drivers/usb/typec/bus.c +++ b/drivers/usb/typec/bus.c @@ -445,7 +445,23 @@ static struct attribute *typec_attrs[] =3D { &dev_attr_description.attr, NULL }; -ATTRIBUTE_GROUPS(typec); + +static umode_t typec_is_visible(struct kobject *kobj, struct attribute *at= tr, int n) +{ + if (is_typec_partner_altmode(kobj_to_dev(kobj))) + return attr->mode; + return 0; +} + +static const struct attribute_group typec_group =3D { + .is_visible =3D typec_is_visible, + .attrs =3D typec_attrs, +}; + +static const struct attribute_group *typec_groups[] =3D { + &typec_group, + NULL +}; =20 static int typec_match(struct device *dev, const struct device_driver *dri= ver) { @@ -453,6 +469,9 @@ static int typec_match(struct device *dev, const struct= device_driver *driver) struct typec_altmode *altmode =3D to_typec_altmode(dev); const struct typec_device_id *id; =20 + if (!is_typec_partner_altmode(dev)) + return 0; + for (id =3D drv->id_table; id->svid; id++) if (id->svid =3D=3D altmode->svid) return 1; @@ -463,6 +482,9 @@ static int typec_uevent(const struct device *dev, struc= t kobj_uevent_env *env) { const struct typec_altmode *altmode =3D to_typec_altmode(dev); =20 + if (!is_typec_partner_altmode(dev)) + return 0; + if (add_uevent_var(env, "SVID=3D%04X", altmode->svid)) return -ENOMEM; =20 diff --git a/drivers/usb/typec/bus.h b/drivers/usb/typec/bus.h index 643b8c81786d..b58e131450d1 100644 --- a/drivers/usb/typec/bus.h +++ b/drivers/usb/typec/bus.h @@ -29,8 +29,12 @@ struct altmode { #define to_altmode(d) container_of(d, struct altmode, adev) =20 extern const struct bus_type typec_bus; -extern const struct device_type typec_altmode_dev_type; +extern const struct device_type typec_port_altmode_dev_type; +extern const struct device_type typec_plug_altmode_dev_type; +extern const struct device_type typec_partner_altmode_dev_type; =20 -#define is_typec_altmode(_dev_) (_dev_->type =3D=3D &typec_altmode_dev_typ= e) +#define is_typec_port_altmode(dev) ((dev)->type =3D=3D &typec_port_altmode= _dev_type) +#define is_typec_plug_altmode(dev) ((dev)->type =3D=3D &typec_plug_altmode= _dev_type) +#define is_typec_partner_altmode(dev) ((dev)->type =3D=3D &typec_partner_a= ltmode_dev_type) =20 #endif /* __USB_TYPEC_ALTMODE_H__ */ diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index 9b2647cb199b..d6b88317f8a4 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -235,7 +235,7 @@ static int altmode_match(struct device *dev, const void= *data) struct typec_altmode *adev =3D to_typec_altmode(dev); const struct typec_device_id *id =3D data; =20 - if (!is_typec_altmode(dev)) + if (!is_typec_port_altmode(dev)) return 0; =20 return (adev->svid =3D=3D id->svid); @@ -532,15 +532,28 @@ static void typec_altmode_release(struct device *dev) kfree(alt); } =20 -const struct device_type typec_altmode_dev_type =3D { - .name =3D "typec_alternate_mode", +const struct device_type typec_port_altmode_dev_type =3D { + .name =3D "typec_port_alternate_mode", + .groups =3D typec_altmode_groups, + .release =3D typec_altmode_release, +}; + +const struct device_type typec_plug_altmode_dev_type =3D { + .name =3D "typec_plug_alternate_mode", + .groups =3D typec_altmode_groups, + .release =3D typec_altmode_release, +}; + +const struct device_type typec_partner_altmode_dev_type =3D { + .name =3D "typec_partner_alternate_mode", .groups =3D typec_altmode_groups, .release =3D typec_altmode_release, }; =20 static struct typec_altmode * typec_register_altmode(struct device *parent, - const struct typec_altmode_desc *desc) + const struct typec_altmode_desc *desc, + const struct device_type *type) { unsigned int id =3D altmode_id_get(parent); bool is_port =3D is_typec_port(parent); @@ -575,7 +588,7 @@ typec_register_altmode(struct device *parent, =20 alt->adev.dev.parent =3D parent; alt->adev.dev.groups =3D alt->groups; - alt->adev.dev.type =3D &typec_altmode_dev_type; + alt->adev.dev.type =3D type; dev_set_name(&alt->adev.dev, "%s.%u", dev_name(parent), id); =20 get_device(alt->adev.dev.parent); @@ -584,9 +597,7 @@ typec_register_altmode(struct device *parent, if (!is_port) typec_altmode_set_partner(alt); =20 - /* The partners are bind to drivers */ - if (is_typec_partner(parent)) - alt->adev.dev.bus =3D &typec_bus; + alt->adev.dev.bus =3D &typec_bus; =20 /* Plug alt modes need a class to generate udev events. */ if (is_typec_plug(parent)) @@ -963,7 +974,7 @@ struct typec_altmode * typec_partner_register_altmode(struct typec_partner *partner, const struct typec_altmode_desc *desc) { - return typec_register_altmode(&partner->dev, desc); + return typec_register_altmode(&partner->dev, desc, &typec_partner_altmode= _dev_type); } EXPORT_SYMBOL_GPL(typec_partner_register_altmode); =20 @@ -1193,7 +1204,7 @@ struct typec_altmode * typec_plug_register_altmode(struct typec_plug *plug, const struct typec_altmode_desc *desc) { - return typec_register_altmode(&plug->dev, desc); + return typec_register_altmode(&plug->dev, desc, &typec_plug_altmode_dev_t= ype); } EXPORT_SYMBOL_GPL(typec_plug_register_altmode); =20 @@ -2493,7 +2504,7 @@ typec_port_register_altmode(struct typec_port *port, return ERR_CAST(retimer); } =20 - adev =3D typec_register_altmode(&port->dev, desc); + adev =3D typec_register_altmode(&port->dev, desc, &typec_port_altmode_dev= _type); if (IS_ERR(adev)) { typec_retimer_put(retimer); typec_mux_put(mux); --=20 2.51.1 From nobody Mon Dec 15 19:01:13 2025 Received: from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166]) (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 9D904221FBB; Mon, 8 Dec 2025 01:55:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.206.16.166 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158943; cv=none; b=fLarRv3HIn4wbVFVgIjSaPm6e0wS8rSOY7OSIH0xoNGkeStDU7l9crjb0Ntzli6nUalD1rkVVHMMmGEy0rTS16+932tNkyTNPrRA3z0zVi3T7rxzk9dZ1b2gBlQnb5b8hZZXCvhVix7PqG/GgpThQnwc9jFqPVe7b9iB7sJ1Sjo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158943; c=relaxed/simple; bh=24ZV9PMvWgnyzhnzV3dKRBUKT7t77bARzRvCWHiAGZA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=JLITTEOSKlHIY3n9Cz+6pjQkRQJrU4e3P5IwgTaqWGtqMWPxkJnhagsmVGSRs3LPOSGzVauTwDYHkWntF+8lEJs8xNrkGyInF8/QmY8g4FAZBFx0orp7Ui9JHRwZs5LUk6TtsXMD/6qrNkt3R+K/Isl/zD/EXoHiFLyBWjE1CBM= 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=GP23+h5V; arc=none smtp.client-ip=54.206.16.166 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="GP23+h5V" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765158921; bh=yduhPWdEryQOAmGdcqOwD6+bqzN4khXB1pWrS++U2Ac=; h=From:To:Subject:Date:Message-Id; b=GP23+h5VhW6nMw7WaTFTf5xRS8EguoHzWr4TvKjJWR3ebfJYFAahm5viG80w8S0dW Y3/eUKYl5sTkzliThkePVVBsGyhfFNR2mf8j8bffhNB3DqSjotq6os+BRqi/DS0ohD 5NZZH6o1BTX/WpJLyzfvRZp85Gfn4ediJtOJf2g4= X-QQ-mid: esmtpsz19t1765158919t97d72f03 X-QQ-Originating-IP: Gj8s0/eHq01JGQQD6y5farK7KZ/tS0eZm6qo7o7KPhc= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:16 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 7821749842743038252 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 v13 02/11] usb: typec: Export typec bus and typec altmode device type Date: Mon, 8 Dec 2025 09:54:51 +0800 Message-Id: <20251208015500.94-3-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: Oe8iwmjPdG65a1XEBofZbDbNJ3qoT4PU+XnfufOCK185lJNdbSlSC9XH EGsf3J+FVyrrHcB2imCOD5s6dlRNW57kCaRH973OuXWBTKdlzHDpYYASerStgZDG+yAXc0I 20r6fUPmtI6W8zwgUElzk93Sth0V15ttVSrIOEqv0UCMS73uRvfJ2DOvoWJUheUEkpOE3LG VN0Y4VM8HBUgDYStmxRtcM6CQExGz0j6LGPigSTQSojfQDnhvItjhTwuJNbT+bdqfsFMgUZ JXLh0J5Jjazv4meHb8k5kLejJ1XfSxfMSFnPIurpR71plSAox/Hhi7pzMyUC3/K1UQ6tZ9H fmIou6UCARJ0gSEDcnOyOgQD6n/7fF9sYS+qLPuHc01cpQQ8Pl3BDWIZod/U55Xv7hKzlEW UDISGZOznsTFiQ1xW/gfpPdsIOmNWE2Pn8NJMI2eNJ3x1yA5M8zJrGdxGYWEcgL7wizUrJZ igDBZFsGKUqsD+QuuWWBVjYlbirJXxswLuQdnqgvmyEgjgM2gYKWXyPF8Is9ZoYAxmnTIBF mIyUMDOc7wPqLBjCXb1tH2u6YGC/XBl4BJ3UdyJS7d3G3mVyVhNWCQvQtns9mue6DzmUOsc F0E+4p5uhn0GcEQYT6POT+dmAd0mij1NeqwZ49dKT8Af3DZ6Dl1BhTMrVkzUy3i4XyOnHcY NpgmezsL3/W0BWQPPPgZ7flcWbRnUk/tDBrFFZA+tcl07vYoxj3hpjiuwJTQgrHH0y/Wvz8 e/NjnK+I4PG7+nPulWFxClHMhtS1Ydv+S5KzHxSU3HBdzbJkXumiyajn9I+2unCGBOc1F1d RnEh9dUthWYq3c3Q05wPPMMxRq7lAmkksQscfRxYyUCmo5NeGic2A1aMPArWvIbzMVu9W5z 9kx8tWSLnhYpO8RuZ3P75UqOhu+ZkJ6+FUdLrPACqdp4eykaMNxo9T4aimmo6B0sWXkbxYR 4uCh1H4VW4+ps+KSfNJf+piju1NBglJHb5XUOPni/yGMQvTV07r6Lkhw6WO3q54d+XxNWj4 6/ykm4zg== 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 The DRM may want to register a notifier on the typec bus to know when a typec altmode device is added, and distinguish between different types of typec altmode device. Export these things. Signed-off-by: Chaoyi Chen Reviewed-by: Heikki Krogerus --- (no changes since v12) Changes in v11: - Also export typec bus. - Add more detailed comments. (no changes since v9) drivers/usb/typec/bus.c | 1 + drivers/usb/typec/bus.h | 10 ---------- drivers/usb/typec/class.c | 3 +++ include/linux/usb/typec.h | 3 +++ include/linux/usb/typec_altmode.h | 8 ++++++++ 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/drivers/usb/typec/bus.c b/drivers/usb/typec/bus.c index a33da7f458a5..e84b134a3381 100644 --- a/drivers/usb/typec/bus.c +++ b/drivers/usb/typec/bus.c @@ -569,3 +569,4 @@ const struct bus_type typec_bus =3D { .probe =3D typec_probe, .remove =3D typec_remove, }; +EXPORT_SYMBOL_GPL(typec_bus); diff --git a/drivers/usb/typec/bus.h b/drivers/usb/typec/bus.h index b58e131450d1..7df5deb1dd3a 100644 --- a/drivers/usb/typec/bus.h +++ b/drivers/usb/typec/bus.h @@ -5,7 +5,6 @@ =20 #include =20 -struct bus_type; struct typec_mux; struct typec_retimer; =20 @@ -28,13 +27,4 @@ struct altmode { =20 #define to_altmode(d) container_of(d, struct altmode, adev) =20 -extern const struct bus_type typec_bus; -extern const struct device_type typec_port_altmode_dev_type; -extern const struct device_type typec_plug_altmode_dev_type; -extern const struct device_type typec_partner_altmode_dev_type; - -#define is_typec_port_altmode(dev) ((dev)->type =3D=3D &typec_port_altmode= _dev_type) -#define is_typec_plug_altmode(dev) ((dev)->type =3D=3D &typec_plug_altmode= _dev_type) -#define is_typec_partner_altmode(dev) ((dev)->type =3D=3D &typec_partner_a= ltmode_dev_type) - #endif /* __USB_TYPEC_ALTMODE_H__ */ diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index d6b88317f8a4..c4ff4310ff58 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -537,18 +537,21 @@ const struct device_type typec_port_altmode_dev_type = =3D { .groups =3D typec_altmode_groups, .release =3D typec_altmode_release, }; +EXPORT_SYMBOL_GPL(typec_port_altmode_dev_type); =20 const struct device_type typec_plug_altmode_dev_type =3D { .name =3D "typec_plug_alternate_mode", .groups =3D typec_altmode_groups, .release =3D typec_altmode_release, }; +EXPORT_SYMBOL_GPL(typec_plug_altmode_dev_type); =20 const struct device_type typec_partner_altmode_dev_type =3D { .name =3D "typec_partner_alternate_mode", .groups =3D typec_altmode_groups, .release =3D typec_altmode_release, }; +EXPORT_SYMBOL_GPL(typec_partner_altmode_dev_type); =20 static struct typec_altmode * typec_register_altmode(struct device *parent, diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h index 309251572e2e..c6fd46902fce 100644 --- a/include/linux/usb/typec.h +++ b/include/linux/usb/typec.h @@ -20,12 +20,15 @@ struct typec_port; struct typec_altmode_ops; struct typec_cable_ops; =20 +struct bus_type; struct fwnode_handle; struct device; =20 struct usb_power_delivery; struct usb_power_delivery_desc; =20 +extern const struct bus_type typec_bus; + enum typec_port_type { TYPEC_PORT_SRC, TYPEC_PORT_SNK, diff --git a/include/linux/usb/typec_altmode.h b/include/linux/usb/typec_al= tmode.h index f7db3bd4c90e..9197a4637a93 100644 --- a/include/linux/usb/typec_altmode.h +++ b/include/linux/usb/typec_altmode.h @@ -9,6 +9,14 @@ =20 #define MODE_DISCOVERY_MAX 6 =20 +extern const struct device_type typec_port_altmode_dev_type; +extern const struct device_type typec_plug_altmode_dev_type; +extern const struct device_type typec_partner_altmode_dev_type; + +#define is_typec_port_altmode(dev) ((dev)->type =3D=3D &typec_port_altmode= _dev_type) +#define is_typec_plug_altmode(dev) ((dev)->type =3D=3D &typec_plug_altmode= _dev_type) +#define is_typec_partner_altmode(dev) ((dev)->type =3D=3D &typec_partner_a= ltmode_dev_type) + struct typec_altmode_ops; =20 /** --=20 2.51.1 From nobody Mon Dec 15 19:01:13 2025 Received: from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166]) (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 845DB1D5147; Mon, 8 Dec 2025 01:55:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.206.16.166 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158945; cv=none; b=r+aMK9tKY5iHxVq7UzMrmd2TaPQU89agyFjokWTF93oFwmY9NDlqLpR5GENMyZiSoBbrwLiHo7daf+3V0e3aeqwhwuBxF7+YTIJjRWDMmjiQI4UnpGHhrom3DsXIFnAWTjVc7RgMS3Dv0SC47rR4JBhzVtXwQzuUBr8NvHDLmLc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158945; c=relaxed/simple; bh=oZxAKY069oSsoQIE/uXBSrlabu075v/j9Xbnbn4CQOw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=t00fHYoKAh9kr/nBRvEB70PvGIrOZL+ifBGXDNtmwqxFQgtoCzGAGQrMY3xqOTVsayNFmyi36pwPdFauIhQhB6av+T9hPU6DpXfRUDQ5unEHVC+e7/41ime1vOkjhPt9bByhlvKKJYIiwGi+Bvfe7C9c9CxIqPCbAbwnrGb5H7s= 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=an/MTlNQ; arc=none smtp.client-ip=54.206.16.166 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="an/MTlNQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765158925; bh=/ITohFNSR7lZRzb2jcZzCyseW4V9moYl6cPe0u/7eVQ=; h=From:To:Subject:Date:Message-Id; b=an/MTlNQtQs7hnsabvNn2iZxYiEQSpdGeYMNqu8huMHYHX4iHibOvJDfwLCAiOiks 5yeUAptyhV7OkXa6AHwI+cS4pMNDGyHYN7LDr4dmt1bOo0JsHdc8OmxoasnMXlw1Om Q5pa0u0TND1y/WrPFkrHwMIOEvI0Z+s3UVPYYGA4= X-QQ-mid: esmtpsz19t1765158924t760755d5 X-QQ-Originating-IP: 3roZbY8eqQltdEXFqjutnrbNDJ5RRJ4S3DkEoxdunYw= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:21 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 10138295490961143045 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 v13 03/11] drm/bridge: Implement generic USB Type-C DP HPD bridge Date: Mon, 8 Dec 2025 09:54:52 +0800 Message-Id: <20251208015500.94-4-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: N4WhQbLQyIqSeMUvU2ikqO791RQnK4HKCJbvtZL2wTXWNNHCbSD1lMp5 txuz6BJFxYzn94HxTd+zuGPGDgtVBNRqGvdDhTi0IA/rIKmqJ1dS61GUmCnIuru0Wc5JGhv qZakWYH+V9AhmhD2R7xtM8fcA9bFP/eRPFcb45rOS3e35Yg4/k7cae/Jgu4zfeHSuvwwuSf fTEhFWYBkk+x7E9nr8NhrTR0iL/ZFRZSS+60QLz0HK8WL+HRyRMbDPDJ+PGzKMRKep5Ju7A lRazjpSSIzVK+BRBGH1CRck+w0xLZA4JTXCUTHw887EGGQz1qmSGEYGnwceJFcjAEad1Gi3 7y36dPOI1s0cicwcpwciVcex0mMUbmyJCLRQXsgNKfWkqO3GHccPx1BuGixzRTiMcWFIEuT iqe9eT4/lPNzjCxECoko2M4KLo/+YeoC0eWweZ+XsAU2wYnQrwdGMmm+Y/1SgXvTYOC0D48 QTDRXYLVN9fY9UNgUbD/LyDjwLBFH+2dHUD5GE/tTcJl+ld//5yTmE8UGfo/uOImaxWg4hG +OiGsxMai4NL6d0GGj+RlIJINM/xCSDzjUfGNjotw93KWHePShd6rjCL1WwPDwNo1vlNEjg 6NT+snu5e1SNO3965z1UcFADvSNZF7LMrfoRh62RSnVxB1LsQmeurpK3tMKr0sZD5ViDd5u syqxbqlryK4h5m0JDcw078IZtoqiVwbH32wfk+tvuuc2l+kOC/Wm62QycFmsy7Eda6eTwDE 6P/WKUFsfNBbUoKm9sn/Fx3lQvFTNCBkocnE08a4nrG32Er4sfg8MvifHRel+wJae2qbp+Z ZHySk8TF+miJHUJB3ny66DECVfw+rwQcpcUJ3YTKf/9SUpXdyV9RARs2HqhoJy3kr63eM0Z 5yPAdEGs2MsmvBtuVtINKUCG0hOFCIkZrhW1BrNLG7U/aI9fHrAQLNLBlu1uDdtQ+D4V9Tv TMTfMMVCeVaGFgH/01BP85+n4vmUtQ4XzPBxCH2iWv+8YmWjA5mAxMmiheGpWc1QVZGuKHY TAa6Ayjg== 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 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 --- Changes in v13: - Only register drm dp hpd bridge for typec port altmode device. (no changes since v12) Changes in v11: - Switch to using typec bus notifiers. (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 | 49 +++++++++++++++++++ 3 files changed, 60 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..d915e0fb0668 --- /dev/null +++ b/drivers/gpu/drm/bridge/aux-hpd-typec-dp-bridge.c @@ -0,0 +1,49 @@ +// 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 device *dev =3D (struct device *)data; + struct typec_altmode *alt =3D to_typec_altmode(dev); + + if (action !=3D BUS_NOTIFY_ADD_DEVICE) + goto done; + + /* + * alt->dev.parent->parent : USB-C controller device + * alt->dev.parent : USB-C connector device + */ + if (is_typec_port_altmode(&alt->dev) && alt->svid =3D=3D USB_TYPEC_DP_SID) + 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) +{ + bus_unregister_notifier(&typec_bus, &drm_typec_event_nb); +} + +static int __init drm_aux_hpd_typec_dp_bridge_module_init(void) +{ + bus_register_notifier(&typec_bus, &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 Mon Dec 15 19:01:13 2025 Received: from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166]) (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 8A6C3242D98; Mon, 8 Dec 2025 01:55:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.206.16.166 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158946; cv=none; b=O0nyMdHm1yADvXllCW9ZiMQrC1Btt4hJMwzgL06VQwcXoTvMikLfhtOcjNF5K+LWvfXJMTeEGaIfqxDBj/ktsnJFBTz4TrOVMe0YabmQlzzcTFQWe64dxmUTdckquGmCVU7FuKIP6N8tnmpyUUkzu3/uoPSaGCnJ9RbeNffC04g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158946; c=relaxed/simple; bh=er8jqugAOtZH14+xsvNPaWFL5/vXyjQ3XZItkrwqyNA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=rD12Sz+MJKDU86m3IVoURFgjH9WQ46zvuwI7mWFO94cPRbG1U8YIyEtpl4gLCqRkgZnZCZKxZQxVDJCXvimapdRxUlwy/23wjVr37X7kVPrkM0/jXXCBeZfJirEMzDjapap4TluipDSyr4aKuqgWv6ttlKnFd373IKrubD8K7CU= 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=lyRPzx08; arc=none smtp.client-ip=54.206.16.166 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="lyRPzx08" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765158930; bh=RCoApW58uwU2PDY/YzjUBVlUXFHY8idxqTE/wHC6S8g=; h=From:To:Subject:Date:Message-Id; b=lyRPzx08NxIJiY9L6U9EipOSloT79349AJAORhsq9lppMlqtzGAlwRvEnJh0+h6bY Zf9yQQrFybvkSQ2+uC0ko1yF/l1DoTcABWqFPjWWgstcds052UNrsrQp+wlSTAuYOp ZlTC3YtAu9CV2BUfk5azFNOfZI/Nblq3WXmoESy4= X-QQ-mid: esmtpsz19t1765158928te5f51995 X-QQ-Originating-IP: kcxCGZPPcU96TfidxkPp4h6SAeMB0/ABmBp+GsBCCJo= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:25 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 12888051069085088122 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 v13 04/11] drm/bridge: aux: Add drm_aux_bridge_register_from_node() Date: Mon, 8 Dec 2025 09:54:53 +0800 Message-Id: <20251208015500.94-5-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: NDRJhlKLIrRL+NIQ68Wi+BYoMjn8X7rPAg5zBmu4cK7UZrkbLdgeyAe6 1cSFFlke0TsnJWHkIXk6iVOWxR5ZB2lv0Llhq7XD1xml2LABkqP0MFIjvh+wCxo009ubdTK gkCRPDfnjz2VKrlNje/lj/TSvNi+fY0kJ/YnPD06XmvWMsWF6bUNharJ59ZS14LH6U5eRbj zjf4AsrhyX6A02UQsHbU1OJiaGIHm0IBdLq0KAdM2/aTJhlXLGgbZgGAZpMOGH3qjIUJQGX 1G0evQ+pqJBfhbajAlzftDNPIaywXADa9KLw3r8sW1ytRCd91BHzvdVTlcctxv4uN/HAypO sq/93fQNqlVQEXOYrZjo8D0EJUZ7y6rgZwQzqoAQ5IAervr7KIywCj+hgII9nYOnO0AVcJI nuXuZqKf80GOis8G2qmwxHLS3KYh0myRL23M4+HYCKSBxxzS+acj99r3gQCFYz2FBHimp8R nLdXbk54O1qcyoUvYXTTWqbMm7Eod3m98pnbXLcuc8kTBQc+zV2uBef8PgXRoFCV/CEsCIs kNGKJEi6ApdmKwCnA+0GyqllLsWtP4+8nQoHHQTq/JEHGp1fXdfoWRX1DOb83Eb+ooKlp0/ z/N7baN2NUbT+zkisKxEkuTV+IsG5OQWoB7gfqxrLza6bNeY5AYdF8C2KBWHMcrIkNU+e8s sB2Gx7WwgvZrACUJ/U0slQdB/SEAHn1IDoe0kyURM1guJmNaaDXf/3n7WRnxcXAr67t5Vmy oR1cQ2xDCtkynJaXIVsVX3qUoKoIPU+QY/93s1SG5urixWtAMoaFRY7IigmI4G1hCQlU1B0 Dwf3VZEDLZdZF67mSQvR7H42f5pF6hp45WaqrKcjA6hcOyx/7rEbDfocg3PwPHuqk3TX5g2 gcBE/ZPLinP1d/lHGivnekGouRMFGIhKWtSoZwwtSmg60GCqYMF0W71FgR0SAfoZfvDhxuy w4ZQTx8RAY7A6TSuH6TjOiOXpdIlPtCJLrvRGre0ORrIMydnveK28tEiXKu+pDe9stOWV6d EdkCZvNyy174R5ZqYYAvM4JFWm/YA= X-QQ-XMRINFO: Nq+8W0+stu50PRdwbJxPCL0= 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 --- (no changes since v11) 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 Mon Dec 15 19:01:13 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 23B3623D7FF; Mon, 8 Dec 2025 01:55:41 +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=1765158945; cv=none; b=oQG2tgD3mWtUFlb+Zrgu2c/eeCdaeht1M0GLNq+hox0Gk9jiBMyvkRwFIlW6w/kM2dnyEqsCuU1kZBLFM+fJkLoc4KY2g6fIpZeZJp6Ys+bwJ2BKhD9jC56ABQnH2AVuDUm/KdY0qMc2MqO2Bb29yrN5RoBEVLy/+Jp/2xF5wW0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158945; c=relaxed/simple; bh=PZVWV9La4AVAK585StcPgOtfdN1ZVMCq4aFPpEmKQzo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=DKpWQoewtFJmGHDJsoYiVQk6dP5v8uOjrwD4jyIkBAqfaW4HdCvoWM4JF/40hynDsnoGuGlS6jxjsI9ma3RCJxzPIn5A1z/rc/phTWQis4eQv5QsWUcVtjwsRHY/WyZ/f6m0AYNrW4ZZ2shLsjY3B0YmsEh0cK5D+yz6ycqe/6w= 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=m5OfjLA/; 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="m5OfjLA/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765158934; bh=26BNys9MtzTfRweLMQzeXqwDzhVXLyZIh9kJ9w6YpoA=; h=From:To:Subject:Date:Message-Id; b=m5OfjLA/w4B0AgiE+5kPJ+F7EcQ7/5Hpu3r+VrFtmG3K7mtbhNa5gIpKTxVU5H0km L3MQbu5j12ZvoveBAefKlffdyoDbJDRizA0yVk8MpVNKTjXs4uR+jHT9layYD3MIPL Pp/5f9psdNDlET0PXRC289Clh71rknZS/YSGfxX8= X-QQ-mid: esmtpsz19t1765158932t5038dae8 X-QQ-Originating-IP: A0v0FaGYKIPVoze7Vm4qC1xZ0nc+XoFwr/1hG633FZU= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:29 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 5449390531767649988 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 v13 05/11] dt-bindings: phy: rockchip: rk3399-typec-phy: Support mode-switch Date: Mon, 8 Dec 2025 09:54:54 +0800 Message-Id: <20251208015500.94-6-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: OI6yGjxefbMXXkTMtD3zx1Sj4oI5QEq6y+G3d9voC+VOEcjgF38xCtot Zg28QG9UlPWuMumU9AD+8R04Htr184efaWYEr5zMeTZQq4tHFk6pH1OizaaIwM60EnY+k/P +WQznx0DiL7z716YbjpnXnfgpGRcUeV2hSHHUOv1FhJ3nSUWo9bVLd30CT/f8KeW+5A1t1m 0H/5z/0uNXAyY1gvx0s7pCiP6hAXxUoeYapDE4TSscrFfksj4EcfBGBQBsZufrDqANFXJO9 +iwvl8clS9u3uY4m7Hq0M4v4Pe7ZGLLXGxZXNX9Ij6WUUAx2D/OF8CsmoqB2jWUc1RHxocx MShqoOfcLhleUjh6wRucP0uoHITNjCs9/U71o6+eeUMJij7W+LqzAlHmIyUPCgkcHToiE7a B3Tul7UlVy+sxTypozisDU7azcB4aJczUNAqi+8KXLLJ8GGuRCfpOpro9r0UflaFzsO8+mk W4J04TnZpSbhgrrVDJ0oMC5b+Y5UuiaSi+uBYauUN1qpd/3O13WurySrIyMNG6i1wZSacn4 x63hPs79RRWE3QxxKGPT+GPnvNuT/CLasrzKQHRSA+kjRVqgylAV7L+AH1J+tadrg7FDwYD WDjwMA6JofZgKD+bt4KxwqPjiKTwLYi6tQjXVIYKfBPaai+ktDcDfacKNE4/5wRvGUL/xv2 cmcWeRyPLdD6ps9CmTpnnjtY7DvsamaznccKfib9HteLYFUpjd16bxDwAERLOET34iWykD4 uH+6iU9LM1Ul1ILgZGDK59xg+EfaFe36H884yBjnF9bODrqd/HQinWog4xNCP2duDO7Z5Bd mByuJb+PEheiSC6Q4ByMpYPYvCd6j8i8uvPg+KCGXm6tcJpQjP/sa6gkoaAQIYCCFMNt0hU iRE0JE+/2IJ7bJL2zCmSGinKcy0Y5EQlrWPIhAjZzSsDBdbjdEvI9IbLlfiLfbRAaoGWD1h jJ5iQ8k5OJSYviLfQwlFeWKEwIid/DjcT3UOodWpBYsSQ34myUN/qcRZROLyANdaOBvMZbq vuM4f+7Q== 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 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 Mon Dec 15 19:01:13 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 6B0EC3B8D54; Mon, 8 Dec 2025 01:57:47 +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=1765159072; cv=none; b=UHNxwhE6kG52tB/b40aqLRi9Pd+aLxkX4TkgEtfBN8qGlJ38KUUGdgUP7uWSCAmY8DZw5mPYzlziV+EUYXqxuRMW2jYRAu7ThACqkQRpXkwvAbRCS9c+qTbHLDOfQNrJkwbdl9RWBBVbwox+pRWs7gAnY0kSyZsCZk6Djw2MwL0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765159072; c=relaxed/simple; bh=R3heeE9hR3co2ACiydh9o+HhTZMeJ1YRf5V1MBmv3DU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=EAEYMK5h20HdEXdndnvsRzDKEqJi2rLJVCrS7b1NUXI5hvSJIP4ay+TQv15vHJ/pvnvqkgsLgZzdCmr/vLWdCCbQvLReWROD24RGZaBj07OqOySmLF0hjayciCEdyQcoVl9zNdQXE1c21kQox5UAGH2L2MwufUclKje/ioitrfk= 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=etkU/hoL; 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="etkU/hoL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765159065; bh=frpOn7dhVQ6Nxp3VUESgJ6aTlZPf3p22en66tauvZ1I=; h=From:To:Subject:Date:Message-Id; b=etkU/hoLNjMIAqbH9zBb2l9m6MJRsiXOrkJm1dkCYoEcX+2SUg1kW2qdq3RfhKnsm ilLZ8keDkjehK90On5f27vvOUTuyknQm0ueKAQ0/NsU28+o2W5KNBBoJ75LA6Genav UkzOsTqDz2CVppRQjDvonKovlwAO5Y9QFLsAfYgY= X-QQ-mid: esmtpsz19t1765158936t3f560edf X-QQ-Originating-IP: aZWMZCT3sbVio8bY6XdM9k+TQYCKjig5q76fW2P52OA= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:33 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 17018748767333659618 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 v13 06/11] phy: rockchip: phy-rockchip-typec: Add typec_mux/typec_switch support Date: Mon, 8 Dec 2025 09:54:55 +0800 Message-Id: <20251208015500.94-7-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: MZBJ53NGE19pgEdrPRZvITJZcEPbEwbSzqY398fSnVJ1SkKmwQsqwKX4 NDOhqszIkCoii/BfywTFiSruNsgk6p2O5XyYVF3jEZN/lDP5TD1US48sR+umRJSmdcPDvYZ TPV4ms4FSXxkAT+ZoLUBaOpw2TjZg77Ir7G19wcLHsar9sDC9/K0ZFn6qk9fZ2qWMaaSR3R cFLalciAi/HKsV1QIyiALyyLbBaExwaYU9pB2uqkb9UeGZXDNlYYalVozZ5SiZc1mp3QtBz DMSeo5nc9nUIchNpOViqEtT9S1jCVqeg4WRut4zHqm7JVj155S1GVWZHdfm/wC9XZHie+T9 D6c40/verDKRsOWaUaMh/Cyo45YrLNnvdGYijl9BFf2cSDxRbHP1M2tYMhLV1I2uh5PKas/ hnfQExNEOVuU/hkoXR0dSfb0KNZNkiKYvNfXGCh6035M0k2LRfo4AuKrvl3jVkLaRXxciK8 c6Vo3kNZax4H6XHPWNbjY0kkaiE/kAPNL4tVVOpj97Yv3rycWqqzMW6d9D7ozhk1SjtAMFL MyZnb9Bqy5PuPfCiIhsc+Fk0TBA8iDIQUDnYSGhk0xcJ/QCh2v/AxGzJvQG/3MRQNhSvslW LJZVOlsfdNNkjZxAx5xnZSkjdg2G06o3SuLrtyxbXSt3uBwJbDbwiELy/WoCOrZ0Q0ImCzn u/X/tB5CGFdNPOeMcdpl1oT6YNLEwib3yAWjxF17rpwz7T3RitgHiWkAb9Mvy8KB6VGIwD7 umtTmhqCb6TB1b2+hhndyc5XmCXL1M6V/52esD7wbHagcCuusTv+h0z4yLu97/kCkFv93xp KZme5tmEja2UOOL0AtNo5oUsQrHrIdzksOuIYG6RM8FepA8l7Xiy6NUNcOCg9hr+4ojOOB7 HWg2ZVtFp9NPXnsnvSq6K0w+NJc+0h1JfN0/4X/NZNnwm6iTV1rkFitN77fui5MtqWNpeo4 mnJ2ukOpJ0xtd+PdQa3CK1cm2W6xlEICoyuZV4A5vU4BABW261DPE/u1EHF6tCGtKYHfoN8 e6MRQjZT2AXXJ/objKmHRX/k1Lrnk= X-QQ-XMRINFO: Nq+8W0+stu50PRdwbJxPCL0= 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 Mon Dec 15 19:01:13 2025 Received: from smtpbguseast1.qq.com (smtpbguseast1.qq.com [54.204.34.129]) (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 56C0023F413; Mon, 8 Dec 2025 01:57:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.204.34.129 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765159075; cv=none; b=gUB7ba5ggYzrAU9f8jJeNYVD+Hscb7g4tMhp11U9Ps1EIuCQIUgE04CiRGgyVW8xC4yxJtCQYvxvVclQIX9DRCpbjcoZ6dG5LPW7d+LHX2hr9SrCc/w0CMSW8JDgr++TlR+tNvOGRG6nzsuOjgYP124xr4XxUKPpKgmMdd+6BjM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765159075; c=relaxed/simple; bh=xQWi5hMui5VLl4tahRe1U8Mp6lrTVfX1Yy/sdF1ONzs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=nfdATkOlq7K+igjSbZDLMIC8LS+VDx5Gf/4G75jCa3qUx52I37f9xWzDgfPnJ2ETSj9rwo+GGDv3oCZiYl82KYD74IeIYYAj/CJWagnE9GuQiZAbQFAj4f0KQR2sCqXEse/6Av0cSoCyGS2aqIbdFj8jCLn8GkXax1ZI7fKxBJI= 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=L9GVwrdm; arc=none smtp.client-ip=54.204.34.129 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="L9GVwrdm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765159051; bh=BnSe20UyFWhCBwFpCZUGVdKqrQwY3y7cLZdXieRNPhI=; h=From:To:Subject:Date:Message-Id; b=L9GVwrdm49GhRYhMB7cDtSxS6hAxNj5AADXWnc4uFd9cJqm7jTW6RvvwT43SqhfKj 1Mbx9OZNWPygCVP+UegddpEP9ZOKhi2ocpDmrdrgm0ltKHcpmDpuXKwSM+gognWA5z UmyrykVQ1z1SDgVnv4FTU0GfvBTLkoIYVfcjb5rg= X-QQ-mid: esmtpsz19t1765158940t25fd4027 X-QQ-Originating-IP: Z7MP6ExgaN3mQHGany79bTHA+lgk9L8tcXkCb4brfTU= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:37 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 3174573280846271733 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 v13 07/11] phy: rockchip: phy-rockchip-typec: Add DRM AUX bridge Date: Mon, 8 Dec 2025 09:54:56 +0800 Message-Id: <20251208015500.94-8-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: M1POTEwfcn6kFgN8V7aS8nScAjuH+uDeIrR9wB10V7Rj27Y0G8Ftbe5Q A9ZLryqSH39vrOfZY4hC199/PWALrC59SJ+Fg9a+yL6uBhPB0ue4muGtmld+NOnUvBJLrv+ +jQbJlnDYqbbe/bPd2CKrS8nsXQKalJpYgm+vjaZfcTKkKH3jH3DPwsTM7UlAO7Q6i3mjmh 1GrDsMIuCBLTdy4bk7irdV8vJpr59EevHa3X7ks9JitQ+tI7/Rxc7dGfBmD/M9i4reDJns7 mHMvgc4nW6LysSTTpjQkKePLIVAAK9uljwpcOq/jlXhPs1U3Pc6cjD/V1dYaQBSf75lDhza wbYT9OSoVQbjwvJTPVO2KMqe2NQMFa5G6iYXhNjkp79PWs3sGjVpbAJLwffTNV9bU/1R2sQ bQ2AUs0BAtj7sBcdwseD6mCi4bI0mp/yZppZjkDYDuZ6cY9hamo20/twpig+3y9iFN1t4pn oc3cP6nmye3jeI6SpbbXWdNePQfn8AVLgtfnXf2b6pkz0kQxSrwmJCEvoxbNT2EXbqcpvIz cj5RAm0XhkUoe62kV77RMi6I+8vdHCx+bMlbFhXi1fsJa+aa27PjQAcz93814XeWh12xant HkE3reMQJ19+C/XOfSGjltwXEX0zMPAlMD9QTdXBMFV34q0RNxFp75kDIBhzAPoDRinPekZ Az0MXQxxOybO48Cl4VuVdxnxkSKHzu8vBe2gNTloIayLHCOLcPY0UJOmkY4aTCqNI/wNrQ2 DFmbgEhQKmZqU6G3RV6HcCJAlc+AWwWP+jMhXXH3UbEEVe34qgSga5FGhvSyJ7pmSV0tB0b pDj0metwcRzgMTfbg+DcH87H0WMOxuXsBPEbJEL5+XPs8G2w3vmIQpsoaC7YzeAbkBGbg+Z Zgl1N9qqGETSOVjDogp6FKGHtNXOwh77ZhMEnrLoVIQIR0CRfg4Fyc0nS9++nDR3aM1lLvj 8uIkQC1T1m7KuTdAevmjcqU/JOIL5dLKHlBuCjjicSTFZ40I28zewoG3WoC4yXbjpsopJn8 Yv+u7JRqCKh8qnuOP3DoYLISTykWw= 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 Using the DRM_AUX_BRIDGE helper to create the transparent DRM bridge device. Signed-off-by: Chaoyi Chen Reviewed-by: Neil Armstrong --- (no changes since v11) Changes in v10: - Use drm_aux_bridge_register_from_node() instead. (no changes since v7) Changes in v6: - Fix depend in Kconfig. 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 Mon Dec 15 19:01:13 2025 Received: from smtpbgbr2.qq.com (smtpbgbr2.qq.com [54.207.22.56]) (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 214A821CC7B; Mon, 8 Dec 2025 01:56:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.207.22.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158968; cv=none; b=FM1ua4Z8WOiL/CQ2QOzaG9rXhzLHy8WWoudmLAjO99/0Z6lZCjW5uJymVKlMIOg56u4Ov8eFwhuSeksdd7CpRJNphsGDmctmhNIzaqvLGcKbpIh3cyL/4ZmC1kMKNmnGMI2Oi3VaZV6DGECxUFqZGey9nzxn+kNfu/uqMw0S76Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158968; c=relaxed/simple; bh=ktQe0TBZJXNabRClR1zK2GRlgnwznm7iN6OWZIxNePg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=SejHaIo6AOVhs2XbBeJnVDWjZ40a7QBITMhZK7CWd90hvXQgJhoHWNR4s5+68JzMLEIEck/nsneAPbvcHxDPlrOwvp5ixO/9TVpmYwjQkaL6qwwkaVofVAnwUzaB+5x3630/yRv1y2MPVlCKx3zxIDlopvSmpL90slB398TswOw= 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=AABAJCHo; arc=none smtp.client-ip=54.207.22.56 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="AABAJCHo" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765158947; bh=sEWMlrnina66f1mkg7MgIF551DMwzRk8lseSsYVXv/E=; h=From:To:Subject:Date:Message-Id; b=AABAJCHoAT9gtWhnuzzQBfRlUkHiuGZ9ex2JhRAOmn6KKlFOh5CVNQ7Es6ARLzc7C jGnp4Juhi9EwxtiXJMueMmQl+SLng2gHK2fg3QzRMZ4L0VNiBqef3HDOfteHxzWMkj rDouv7H8K9Pl/xTGKBuW+65Xo+oYKQweIV7t6dkM= X-QQ-mid: esmtpsz19t1765158945t702c369c X-QQ-Originating-IP: YhWIQ0V3ycG7CDzXdW5g+odsXgIz2Zc7DYufLSVOhgU= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:42 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 3081592596976670402 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 v13 08/11] drm/rockchip: cdn-dp: Support handle lane info without extcon Date: Mon, 8 Dec 2025 09:54:57 +0800 Message-Id: <20251208015500.94-9-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: N9DIJtFs/avns4hvy0i9PlTO1llTc6+s5Akmp3sFsxKLt3Bxl13jQioL e5tuEpL+kjb3vgFom0lP+QI4HOK6fS+eS7txmoRx7kO1ZeKy9c4uFQkIvuTxIKPuV6pmQuB aRwiuLyqgaK6OSrCWZom9fy/fOFFA50SyU47GAvOpsr6XgscYbgHytExEuxd07EB1uk90uZ ij7P0t7vgqT7jPUemHLQKM95gZwNBx7HpVxL+1EhUQZSgUEchLDprZIu8GDqxH9ewm/fDZX 2KUzW36QnG1fw9bEDmNGF9OuAMlY+6be5wC7LrOhcZ28mb3fo3eDP5byS+DeiqnpPCs0kvo FPQHYQq/fDgzvV5UaOYO/bpLt+NBgjz9mnHkFQmfAwCdGDOUs+5H13roVnMy5petBV6MFYf UB1g1IG/xWPypYcDV6/+x8hLxEj220Ro+dwGGL6VnPeIkVgXMocxlUYXXWK4zEDkrDRTl1Y tU3U9qSYWxpYfCBaQUJnKieCO27NiblSyCVtZ2zUnCiJGxFg65drftjaFdrlzS5b67u2vzj 6tnbRVPBZHjyjK6JPlT2KC6wS+jj76GqD/o5uywiwoQqnuxtnPCrHTs8XDkD5CfJM7frjHs uqKK4pFIQ4SgayCpsdfwCGRPCk9ck+zAe+VGbLn2mJ13oO1EjFIVAmEerJUZXWncrO/O0ju nkdkR9v78i5Fsvn0RQhUWl3l+O2FfQJAhWCH52jmH5onJGHDfUs0NOB2tIIm5RRU1aiSvho IfGmgXRYwkF55u5e9AcwJY3TMHEwLmnuboeWsFUWaJ9tURRFEqCWMCr4i/HJS6xadu0IrKk Gz4oqpRQ+9zxrgEZj7YyMy4HeUNdB0Wr/ZmFzUf4GPRO2UX+WjCRVSoBv8sQGcWG2+za/lJ hqeIuONZpFDDMZpsojbr+EaGRgNpnMyJmU3JEmprahijiOTWqqrbmtTBJRTi6Q73l6ymKPi tMEYK89MnBRUKaLPgW1t7STLlAb8XYGMjSqLxtP229V9AXLo6RXeOxnTZJqlaf0SKAvANXx QcU42cax2cP97XEo31lB4nRnfYbm8= X-QQ-XMRINFO: MPJ6Tf5t3I/ycC2BItcBVIA= 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 Mon Dec 15 19:01:13 2025 Received: from smtpbgbr2.qq.com (smtpbgbr2.qq.com [54.207.22.56]) (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 0C7961DEFE7; Mon, 8 Dec 2025 01:56:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.207.22.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158972; cv=none; b=Hkg5PslP8d9YgdnHD3Hg+yRRRZ1ovbKznhxRaIBbCg9drW7kS2UUpOuS0PwS887rnL5D8wa0MJUKe66T8c+qHPCLk+iQsMZf0RK9wrogluy/H9u9wjvWGz1KcW1PtBGORXm81YeY3dD5u8NNC4f/RlD+qw84a77rYNLNgr1MgNk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765158972; c=relaxed/simple; bh=xKOtosGRO+V/LPFU6/AR5gtKUkNW2D2GmLuC+1KL1jw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=D8+gElxtO+rJsaviDw1foJsoPaS4gBcgtkiaW3lLSsCRX6N+SCrS7/GowB3Pi5B3/Bk2mGshlrKmUh71G9m1aR2/Unjn68gh+5kLBFM3VF66gYc/ni5cDNj97Xe2zvyqhj+fEaL9XpbTsGMwTL46BzYl/00VLwajXyA6pkRXeZI= 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=kbgzojg+; arc=none smtp.client-ip=54.207.22.56 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="kbgzojg+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765158950; bh=R10bkjuPSii+di3DJ/7/HyLR3MYRhybQHpfIyymW3jY=; h=From:To:Subject:Date:Message-Id; b=kbgzojg+iB05gWbvTvgCFTwc/2wuzMDWjZR/BslTK3xacTuWgytqc22WTnyTUY3PX F2r1XYHuc/ssHiA8XM6/cPNeXUT71RY4FvXlkdMKRhdZZq6ymtbSA0wBaDNYLczGmF X0Gx+a7Xd3GvuqcHmL+3JoOqwFs8V9is52+Evs6A= X-QQ-mid: esmtpsz19t1765158949t96b2a8af X-QQ-Originating-IP: pIqlD0ApAcxVqPNEs8x/hBmgPEou68kqIO7aKqdKtFE= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:46 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 12343573440653606480 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 v13 09/11] drm/rockchip: cdn-dp: Add multiple bridges to support PHY port selection Date: Mon, 8 Dec 2025 09:54:58 +0800 Message-Id: <20251208015500.94-10-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: NyMcZNLslEFVL5C1SrWKp2ICwCUIaKgNrW6J+kSZ9NJoa/PfV4Au0wFN ovuuT/hMqwvdnzG3kC2bI9+XPCG9t3GD7VWQSTTxhy7H1Njs4SKKFbnP5R1vb7UtLbibldE vkTdEf97XxFLpbDzI0wMhDZ/c0RByzlbiIeAe1GNytqoZO5K+CoqpJvSuB2Pj81XQ/+6if2 3EM3uKdM0/REE+dMIZz3ied7hiN6Znh2ELRONX2L9/YUNbWe/ZioOGvWuphic1TSWZ4LrRq 21oLiy59h4SPJLs7XJRS9+0JiL38B27WHzmj8hCBCAM3OxylPnjixyEa0saH8DkbnoNA4p6 PT7505ZXecG36SKJzdsDWLn2+5MndbSN/o9U/TbO15uLnPXZOZuav3P0xpGzZvoMFrC942w qv3P/03OF+ckKR/kbovIPyiNPXYJSQM7YRexUCR4ro+hvz24H7Hxo8/n0MSzS/Ul27L73F0 jAlYqp5oMZkSqsDjctpYpl0YALFdd81bN73IdVJGFV6+EeJCWXdF7z9+9QiLsFXPIUNcLAX WoiGCc0sam459Aa5+DMScRHFi7q74VIyqVH164GrToXRmGiFwY3oVodYxgActucP87bF9a1 xB05P28V31AzbPUoUJrYUWuLa0bJI24AW+tpmSjFV1vgViR0Dzo/pZaijIXlkTXx51kcUUG 0HG6uEqqBxb1yBK6YFr+7GQTxsX3dYXjzo+vHJLrEuo2sNp7FDk2yEcDrs5BCoEnm4dSczE FjHjY5UqBSvjMnjXEEuYagPLiMNWsUYhjPKOyXhHx/35IGJQm2kEyK79In0LCOOc4A6uT8+ uQ+fbdPdt7hbz6u/zSq5i5U7vGgmWfxuYPf3OLZuKrvUUeuhX7SlossFYA4iKLjweWWa9gN qtNyf7BmhV5LvxZu+eVV97VJMJ1JHqgYiJ9YBsw6XFxy5muz3cb1lMBfTxDyut7HRCFxh7B rzJRITStqWCA9BcZ3W5a4Q875Utc7DV+1LMbqO1Dvb39iTfvp7o9miOONkopoGWTDK1MpIU 9rkMFg9nZolY4pQHwXCL5QGHEXQuR3Ubt3PFSjNA== X-QQ-XMRINFO: NI4Ajvh11aEj8Xl/2s1/T8w= 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 --- (no changes since v11) 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 Mon Dec 15 19:01:13 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 C997E1FA859; Mon, 8 Dec 2025 01:56:54 +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=1765159020; cv=none; b=H38XFQaF2sLxPK5Qf6rlHR7hMJAu0Mw80cWMfMfT861Jx7R9l/ioKj5EO/CO8CA9vA8vXG2ZWg0kK+e4C3h49BaYg0rb3vVU3C8hs+5wzuAhbXcgSevxJsJjyJtxJcfBC6Xo90pzo2n1o02SdkfJoKhVcS+V5CCtSVK9+CAqjCk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765159020; c=relaxed/simple; bh=UYBXRUGpsPucbSnyCek2T6kQGAmNcIEArFxOg+A85iE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=exfpWToR51k5+qKlzqNc/hBqUUHG2zq9fQ1sv1B2CcRuB0loBpuI8ieu3JI9cZHm1YCXisLMitEJn8k6BjhrBsS4vSB9KGDnB4FQ9GXUAtMMPrYiLcKIkyp1J8IO2vpdPl5vKpWqqBWMAazBZtt6pB+YKRx4JBZopPvUlriWG6U= 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=oWq6T8kI; 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="oWq6T8kI" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765158998; bh=pFI7M+6j2JewnD4BwkGRc0QPG+RPFm6rGXiCORxPrVE=; h=From:To:Subject:Date:Message-Id; b=oWq6T8kIy5ueg7QDuWwDeHh1L81tQ6d8PCjG6PCPaAd5GZ+UDZ/qunGrmoKJx573s HuPpqmu2W/J1QXLQaRbCBQ/QG5xq+2cWt6vty5SsHGG9ZJkBEF0ZmhAOaF3686/NkT j+PS6fgFhZiGGC+ayRozrJ7NzTKTvo5eRPb/TB+w= X-QQ-mid: esmtpsz19t1765158953tcdb9152f X-QQ-Originating-IP: +8lPfsUXAmh9xGsf2UaKv/ckJ50+L2F5xe64/BgJqIw= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:50 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 7419382156516590338 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 v13 10/11] arm64: dts: rockchip: Add missing dp_out port for RK3399 CDN-DP Date: Mon, 8 Dec 2025 09:54:59 +0800 Message-Id: <20251208015500.94-11-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: NMuAyYK0STFJRzmbuvCgY3S3V7n2KZuzRA9KA/15YsvdICNejfr5bqQG Pqxkmm5uJIB9vYdXruPHKNJADq6IyaIrPZn3c5LHgsR929pQlinB7CrfY22a6tbdLq1pD6S dfq5rCJ60YA7q18sOpEKK12OmPp3bHKUs2qRo+kxWMt9PqvaQd1DLCXR4EMCaESgYwFfCNi FtjqelLiikdjy2YLb0L4ZRJ0jwo2Kj2L92YyRQWVcRW8bw0DmYL7WKgU+x7DdB65SqyJr3J +Njf+2Fir7XmQxd56n1A9n1+7Drwrb+xfqFRWQRj3o+R8i8gXacEzMngF2ICj4Us15BrPgp vnPXSgQ4bvIVBKqQtli1ahLUoXBctuYqCQ/7Fw0CoN3jdvwcgbW/dHnfMsT54z20He1UlY3 UYmlMCnf841ny4E+hF/r1qmaIAmBMCfi6FpHsIjFDbHWOhrIOYngnTvPnnQGoSA/tM4Ot6y 97kNWHCVML5l6uSj1Q2aqVWEXxMj8JTXkzU0Bf20VnnaNlX1E+G7t7nHrk0mzV7rGsLcFA6 gyyOTrnLkF3v1BfgpXqzWp9YTnAgTvZuOEhvqNWekbd/6Lg5kItQ5RtpVA4TN/QoGyVNn/Q 5iqGfYEwSoZzrWqi7oV9y754k8PZ7DwdQkzhhDeJkq1ZieWbshTupwT6cr/7mBCyjdD8vnQ xg+m7QlhEXBqjuApJYJ+rbo4d+9KZJ2kbIcy4URl5S7CedBwIMwW3haAebkSTSlKoNOGL9P pHzL7sY0wtkWEzmPETlU5uKXkQBYSBVu23qG0MP281xlUQzNHBcm/3Vt25UKJ5EQyDrppih IKUrrOVXDHoMluVuGmbuO0gBjAPsE1UBAtd6VrvGCYWKkMkUcp3n1tGbxNJ/HiaQZfpzDVa tAsgASSkgADfm64peIjweMtQtMwXMH2xm+QDvTkpBHyZfrzDaQDa/9Ykwd+VqgfKRCduu4n 9XaLDiPKHL8q3gyI9C7boQhimLeyGsBUsS9XKTLMEu4cgBPvF3iJIXfGHJYF0Lqv1KhPN1E qiznOwdnWmHl6E/phLCueFr0AodcU= 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 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 Mon Dec 15 19:01:13 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 AE042242D79; Mon, 8 Dec 2025 01:57:00 +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=1765159027; cv=none; b=HnphAHeRRIwv0g4jJQ2BqByYyF/ZiWOrzB2oxZcNOF3eNM6aWG+S9gi7v26RtdzwPlcDUmDbj512fck72N4OFT6bJvS1e7u/1OxpX0H1Q7cc61Kf2lS+79qZmS8+xIeASL+NGdvVqvHionxSpArC4dk01mWVbZ38llYfb2nsPaU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765159027; c=relaxed/simple; bh=CogOCq7Dgo3J6O+ahfKV8yupDN4OJqUtveUj18KHbi4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=jnA8Ys/iGcsfZ0ClaShjORQ1MgTUbHRsf8jC7NdXnDGWj5ds0HaetQo5FC+aqJgtFcUEMsceYD74bZBEP114bUGY5XjllcFqRFKNu5MYvart5+lAlkeOXlN9lni8FiGlvi4WPHitCjHIBlY47KzEbHAFNWLQml2M4voDX5N9p7w= 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=SAOHj2o6; 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="SAOHj2o6" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1765159005; bh=Xn5Sqf6jlBXaETnSdjcUsZQPPZf1EW7Rcj8pIik+fGE=; h=From:To:Subject:Date:Message-Id; b=SAOHj2o6kz9zQ17DSoXMOhRW32U597NuwHkPdkmKmB3mr3EKTCQn2Zzxb3DdjwGJn wzSh4M7Hh5s6JPXpkc3UPYYCa0L/ueMZR/NvpYQjPVH3kyDmcrubXBf/kokxvHC76K IFhgriWxw6HggM7x8gnREWuKBfWcrWNUhKGMsDWc= X-QQ-mid: esmtpsz19t1765158957t8b042638 X-QQ-Originating-IP: 0VDHYm/TNOZJ8x5lMA+cNxsISV6uedyVhGjPFC9wx+4= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 08 Dec 2025 09:55:54 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 6033129153185589897 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 v13 11/11] arm64: dts: rockchip: rk3399-evb-ind: Add support for DisplayPort Date: Mon, 8 Dec 2025 09:55:00 +0800 Message-Id: <20251208015500.94-12-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20251208015500.94-1-kernel@airkyi.com> References: <20251208015500.94-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:airkyi.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: MJWNsjxQgzaE4KWEtMpIYLZcqkbQGL+snOj5Wof542RW4w4PlGqHuFRC giWq1Ae6DES/4vzSxMQZw4WI1XoalWnqj0oiGbt4DPwOgdc/DQ9dutCVe9Mfyv8qREaw0et XTdSMbYwmSrT1auYbu4HyYsF9PLNAVeqrOSMEnWSIHI3dj3hNoPrWoeeM5uy67DKTCEIv5R It5eiNS+uKzEPfnNWpBBH7LKDBjsywvaOLpnF2s4MusqLSU1ppIOWcV61LinPclWBEGf7HF uxFuzEjlBM9HhowkqdJ34lfY/UI3UymATo66sJqev2QBEYv/v8XGdNwAEojws4Du00eKW4f +KLfRkO2od74YzgghVCHM4PspSVSg3oOpL+F4qh8XkyMJfFXPQun1WjCtTltWzX1ZeNFB1y VAFZnYe7TP+8zKb1kdYCwngIkILeG1nZebfmCzjcNqEZIVhsuWPjlsLztdRXDQ5L49POG4A y/UZJvED69xTrJ9O+Cfk7SdUykyRG/6McCh6fY/Z2P7w1bOsC3mVm3z8hV3hNnjSbISP0dh i16t7VqrCUhcnr9iPt4uBspoqcJqsvEpzga0ELruiRSupPAhHE2pNOjGhMnFctNxUo0ntO1 iYohn3Z0m3fB1MSUgApkNhPBfw2yR4fmNzSZP5MCwFOW5vrZ+BSFjMuSkxmgiR6HdtyYvRo cz1GA9kOe+tBQfe8WRvHgPWCEOin8DB5lXF64qZWVc2DbHEmAoc4AgaImt0hD2f7myPWM7Z qAhz0ToUtoM5QdBkYvfsY5bPT9RP594L9rAJ+6ktfwd0lDR8LYVXQr0xV0HLm4YAv/5Fsfj NFeVDAAKzpwA0EuyoMBGlLhb0II65HEDD+zdOQIT0X55l0PJVVDednIRBZnNKX1Ex29un1p EHrymtE4cKK23Q6jQsmM2B/3ObvOojB5qunwdIHzAl7y1i7DexjXpUcb4kW5vpmQv8fMe2j Lngk6FTt3QvQo05OZUXzGgsYB+yrfCCyC87iwannZ/q/852ttQYSXXYZ8nnNLzgIc7W7W3A OE/x5cLeVAd9Mj2Os2gQA55YJPkHkJd3TS1eW85Q== X-QQ-XMRINFO: NI4Ajvh11aEj8Xl/2s1/T8w= 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