From nobody Mon Oct 6 17:06:46 2025 Received: from smtpbg151.qq.com (smtpbg151.qq.com [18.169.211.239]) (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 89A2A1F1537; Fri, 18 Jul 2025 06:26:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=18.169.211.239 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820012; cv=none; b=MspFW8hu3OBrgWiH3AueuSp0MjZJ6LpVuAbYuRv2Ig0CeJT7IEZbI9RyC1N6axpnEoFJUFuNtcnqt5hLN1QynUQ9p7BU0HSyqqM9BY3j8DF8uMpMcK5dnCgKBrLpmPFfoQx79mhm8eMeyv9mT9cBBszU1VvZOhBqKaYvU97cr/M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820012; c=relaxed/simple; bh=cMI243em/Iua13FhAOHwdU6NhJAGp+wNFbIqwJW/Prc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=JYV8oqOVGz3sjzBubgS8nUfInXmFOndVkxpjK/tSqq5wKkX48m9mnDTQX9mz657KX0LJiHGcN6fyRDKzfl5k0vLxrEKy1ad3qGCccwJ38EVQ8+n8wNyjgV2D9xJimd91SEucD4m9uD9AXk70QCc63RpmjdEGDEdb+vce7YHXh1k= 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=D2KjmatZ; arc=none smtp.client-ip=18.169.211.239 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="D2KjmatZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1752819994; bh=SfD49mysx56ByrkZgSzhxvm/5yDPMJ1rme9Y1NDR4zs=; h=From:To:Subject:Date:Message-Id; b=D2KjmatZ2jq70gbNVldHQTvwcVnCd3nSODRvsISXyV5nhccL8xt4yZ2Ovh82et8TY nKQCIdY/3Z2NmH8iEA0fnI5s6vmf+hoIrqpPJAppg14552Qt5AHKL0oNZuoRQJAoSB /KnsHLVjf4uLSCDuzo10MGDN7BwoWhkWQz8ZrNM4= X-QQ-mid: zesmtpgz7t1752819989t339e2657 X-QQ-Originating-IP: eoutYZ05PQmrVxRHP07fLErhbre+iSdNkklahpAft/g= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 18 Jul 2025 14:26:27 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 5159759228802639268 From: Chaoyi Chen To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Greg Kroah-Hartman , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Dmitry Baryshkov Cc: 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 v2 1/5] dt-bindings: phy: rockchip: rk3399-typec-phy: Support mode-switch Date: Fri, 18 Jul 2025 14:26:15 +0800 Message-Id: <20250718062619.99-2-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20250718062619.99-1-kernel@airkyi.com> References: <20250718062619.99-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:airkyi.com:qybglogicsvrsz:qybglogicsvrsz4a-0 X-QQ-XMAILINFO: M7SN0LSU40tUh1tbWjviPABbAKjH73lD45JHVl5BG1a5/djikRK9bBZH cKK99v+VmD018no2MPSZxvrN6rBmQ14L093c3u+VH+psPXQxc/mL5SZECbBBbclaLynDgwk OU1Hgjb1qP4Nb91rO9Dk0Xy/cVm9ixNFcPx6uyicskYxBIELZPR1EXzZed4AdH5db5RwGL/ K+vf9vjvfubqdCLOM5+vuds8EWtwjEFGpQR8UqkLectFa9a61X80ZEuTCvR5CA8FXVCvWrJ he/aDah8GWBwZrSaHjqk5HeuAJIONozUuSdPBn52q9peoQxBTkqv7FPoqFZUUdpuGnRla7l +y+X3jLwgl6hOIlXSt/DByvDl4OOMV9HuFPithabFs4YvlV5Kp4ocQwpbPzNnzu/ZnbrADT lqdwHOgXKlP8djMKDCY53m6OpmiRQxfbfG6McAoStT4lMG1U54A4nhPWJ2EDVCkYYGWnYAi BCQ5Tb2JgU91fuEMSyAJAZgni9JYc/1bQHUPnHfkufrURB8aAgPrtVyWfbt03mgUh70v3cP 1RkYSWQFqvtIqM13/syrhy5Fdc7i41nMEPVnVAF30IFNwYcurlDdfAj334Gp8BPCe9DONbA GMSqX0z+Ta4GUsKamrPE1/wXWFTXc7JPXpUDHVyO10giJwvGe8gxvAq/6IMKbPpVZ/OMLpA RtfSMIdfA3GzP8EBBmQAERrF7a03KZkVREAbfP2MCh5tAA/2wZw++JdocTOhZPL9CuCJThv UJQQFqCNbn77QhqZ0AVI8UXjgx86OYBqNJRTr5TyRkHUPPHJ/iHdXGs5RBJHRIb20Qmexot lwXXgUBN6oI203ZYtnrH5J52cwt/aIe34aMd0K7Ha3tN8dholOWYbyIlrBoUaXT5NJoMleQ oLBQy/Nm+ckXQvuguETaXwmu0fLIUM5h5GJKpGDon3b0wKBmUNaHxcTmEAFfjG+OsDGKJ5k Bj0YAlvt97hwczLXLAtXAPpBpqyuMr/JQXUVOcr4Jrvuh1g== 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 RK3399 has two USB/DP combo PHY. With the help of external Type-C controller, the PHY can switch altmode between USB and DP. Their connection diagram is shown below: external Type-C Chip0 ---> USB/DP PHY0 ---+ | <----> CDN-DP controller external Type-C Chip1 ---> USB/DP PHY1 ---+ This patch add new "mode-switch" property for dp-port to indicate whether the PHY can handle altmode switching. Signed-off-by: Chaoyi Chen --- Changes in v2: - Reuse dp-port/usb3-port in rk3399-typec-phy binding. .../devicetree/bindings/phy/rockchip,rk3399-typec-phy.yaml | 4 ++++ 1 file changed, 4 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..d503de7c7569 100644 --- a/Documentation/devicetree/bindings/phy/rockchip,rk3399-typec-phy.yaml +++ b/Documentation/devicetree/bindings/phy/rockchip,rk3399-typec-phy.yaml @@ -51,6 +51,10 @@ properties: '#phy-cells': const: 0 =20 + mode-switch: + description: Flag the port as possible handler of altmode switching + type: boolean + port: $ref: /schemas/graph.yaml#/properties/port description: Connection to USB Type-C connector --=20 2.49.0 From nobody Mon Oct 6 17:06:46 2025 Received: from smtpbgsg1.qq.com (smtpbgsg1.qq.com [54.254.200.92]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B9AE81FDA7B; Fri, 18 Jul 2025 06:26:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.254.200.92 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820014; cv=none; b=lzfMoup/xleeYqXnhSyVKRndY2A/tov1H/mWM3C8l0BuHaqYPoJ75FyvmvPJpkwNcw/PWYNsB+/sl47lTCDKXyNzs8GDEpw/gUdecR5f0/6c5P9TN/ZCXdUx9d2tLmnzLrBzPwXOCmzay73aTVlcan2i9b7QJcC/+ALKvKSlChA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820014; c=relaxed/simple; bh=kao6e67FwuWhRp3tmeOcRGXVaWDwmRRDtZyieoCHzc8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=rdqTqWSYPoBnYp+tIPn7qO3ifAItGSDJKCO3QORelAtD5Jbmkx/7KPr/uS8iIQTtREE3HxYLWtT4RhlfIXpp8aSSxm8H9Ej1WyvhYt/9sRimBmQF+zvhscVRQR6Lk89qT5ptQnPk45AoXjl+johG8nlDzDmruRsTx5EHzfYtp8E= 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=jV9PIM1/; arc=none smtp.client-ip=54.254.200.92 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="jV9PIM1/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1752819998; bh=VW/DdTwl5TYpA6II4CfgMFAA4Ijg7k0ban6dV6D8At4=; h=From:To:Subject:Date:Message-Id; b=jV9PIM1/Oe77qlMbbjag64aBJ8dz4QUYeYSKI1uu51Br7kk+1AUXDZayxXME3G2Uu WaVNQ61VBYpPwbTEAmg/SKtNJrjV2mSVBB3A2OsMcH0x0i8qE4UKb2tVOx1wLz2K4A x/Y63NcGHZR6NFOl4J6/k8uxLocs6yL6GFwUHR+k= X-QQ-mid: zesmtpgz7t1752819993t6b0e562e X-QQ-Originating-IP: +gJonnQ7O7BakBts+IUTs8kU9SWmF8nzJxzvh/HCExI= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 18 Jul 2025 14:26:31 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 4584569076607827313 From: Chaoyi Chen To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Greg Kroah-Hartman , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Dmitry Baryshkov Cc: 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 v2 2/5] phy: rockchip: phy-rockchip-typec: Add typec_mux/typec_switch support Date: Fri, 18 Jul 2025 14:26:16 +0800 Message-Id: <20250718062619.99-3-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20250718062619.99-1-kernel@airkyi.com> References: <20250718062619.99-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:airkyi.com:qybglogicsvrsz:qybglogicsvrsz4a-0 X-QQ-XMAILINFO: NEaes6yu2o+mFnx7+1TQr1VJUcedwC6+veNornBguqZUCKeN8YfIMwH+ E2MR0WOlY4age+JUTspm701cY5ohhS8glg5ycuPvj9Z4HO8yBwy2kLcccPGyTo1kI0KUI7K 1N/pWXf3v9H2ncot2jlsPuZBDhUfJ0xuDo5j66FvFUX3qTrpxcjkzVbnl7WzNhBPkHX2Ceg Ra8nTRVNxyOEbDgbD/JJ4xWeEtV9jECLug8Pbn+EK6be4w0SL9w3JzpYIyQ6vGMO/8bKuUs PS8n5+VCVwiJjWqQRPUyWDA5RP3Ew29G4pIOmrYGjqrXD6bPyJxgiUEHoWzE14LwT9m8L8D 46gnU1BKrz6A+cACsfdsqmfQ37eSRaxfiMfyhZIPEWDKCrabz5CfnqMdnK+f6yZAY3jBC6n diAzPI11ADTIOa3cXGR3mi3h3M0b4mukw53Jusv+TK6u3NMaaA1iRkYk56gLKMQbI+xZ470 e1DxCUpt1oq+oBHzXz3+Od8MUyl2Twsgr7mHF1B0tuKvqGU4vcSda3lL5WOZ3+EyxFVIhMD Du5l4tP3eHsuZihgofjpSFTjmmQYDal1zo6tti+7UxAff/DpkOkyDUnOuxnwjO8wioNMsDk hXT77dx8faRUOzWQqjDoIgFuiaQLx3/2qZU0Pz0F6F2Hjk2v+KI2RcyD7KCbknmwdFqw9M/ l6I3JlOA0c3ZA6BVNa/c6KY/1CIIxtjrrFvpELO7zM+wHU5ziq1UEY879XfvwdE8NDA50gf UwwCxQqk1LZY0a6v6M7Dqox5UDoZ4ExnX8AqP1hUSajVoi6KBfJ9brG7t6bPr3eiBiKhfun ddd9JiS12WHsBxHIvopRkMDQRHeSnEht8oLy9hUOnkNxYwZ4rAkqTZyHgsNX57H9f+qpchj 6AONQpDkjNYpLhZFnzy/28fbySqNCsN4VHojxHoeZ8PRY02lzszHi+EEwVmPhdNjNM8bNza 7rZ/gQS/aSJLvDstrjjcSSGQ/6ciMT4C5D0xLIKoKvNLNqg== 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 --- Changes in v2: - Fix compile error when CONFIG_TYPEC is not enabled. - Notify DP HPD state by USB/DP PHY. drivers/phy/rockchip/phy-rockchip-typec.c | 403 +++++++++++++++++++++- 1 file changed, 387 insertions(+), 16 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c b/drivers/phy/rockch= ip/phy-rockchip-typec.c index d9701b6106d5..6334953a225e 100644 --- a/drivers/phy/rockchip/phy-rockchip-typec.c +++ b/drivers/phy/rockchip/phy-rockchip-typec.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -54,6 +55,9 @@ =20 #include #include +#include +#include +#include =20 #define CMN_SSM_BANDGAP (0x21 << 2) #define CMN_SSM_BIAS (0x22 << 2) @@ -286,12 +290,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 +342,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 +362,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 +419,23 @@ struct rockchip_typec_phy { struct device *dev; void __iomem *base; struct extcon_dev *extcon; + struct fwnode_handle *connector_fwnode; + 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 +506,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 +888,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 +915,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 +961,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 +1001,72 @@ static int tcphy_get_mode(struct rockchip_typec_phy *= tcphy) 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; + tcphy->new_mode =3D MODE_DFP_USB; + +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 +1206,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 +1225,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 +1234,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 +1254,94 @@ 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: + 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: + 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); + + if (state->alt && state->alt->svid =3D=3D USB_TYPEC_DP_SID) + drm_connector_oob_hotplug_event(tcphy->connector_fwnode, + hpd ? connector_status_connected : + connector_status_disconnected); + + 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 +1400,53 @@ 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 void rockchip_dp_connector_fwnode_get(struct rockchip_typec_phy *tc= phy) +{ + struct device *dev =3D tcphy->dev; + struct device_node *np =3D dev->of_node; + struct device_node *dp_port; + struct device_node *ep; + struct device_node *remote; + + dp_port =3D of_get_child_by_name(np, "dp-port"); + if (!dp_port) + return; + + ep =3D of_graph_get_endpoint_by_regs(dp_port, -1, 1); /* endpoint@1 */ + if (!ep) + goto put_dp_port; + + remote =3D of_graph_get_remote_port_parent(ep); + if (!remote) + goto put_ep; + + tcphy->connector_fwnode =3D fwnode_handle_get(of_fwnode_handle(remote)); + +put_ep: + of_node_put(ep); +put_dp_port: + of_node_put(dp_port); +} + static int rockchip_typec_phy_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; @@ -1142,6 +1494,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 +1504,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 +1512,36 @@ 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; + + rockchip_dp_connector_fwnode_get(tcphy); + 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.49.0 From nobody Mon Oct 6 17:06:46 2025 Received: from smtpbgsg1.qq.com (smtpbgsg1.qq.com [54.254.200.92]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6AFE6207A08; Fri, 18 Jul 2025 06:26:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.254.200.92 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820016; cv=none; b=mVfUzFzpLTOa3zMB5sRvHcemgkSF35DMkYkIT9QvFnIC8S/+4CFhGCKIycLGMnqzSZIvmW7X1lfes9kOOjUjteQEUjs8umGsQefVYyz6yjZeGFCekOF8v6wQOV0AmxbJ8BsqXVWad9eojPgSXcFkoYuonkvdthEY4aSxR4OaZyQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820016; c=relaxed/simple; bh=ObLvx2l/ijQLa5xRrPNGnhM9n5LhIgt+A4KmOOJyhZo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=L2wctuymezUN4ZnX46qIkzzuY6cR/17j3cxA9d7oHpXmCS9i7CZeL9xAXTmqlAzNOi5Ukx97SROCzL1UjoF+41Bg2PssTEdq/FKeuRsTkuRJp2IXf6pTQVpsb1WD7vN6VPBbubNapbFBxHsCi9kJnLGM7pj8bAbkeXo/qjFZa+8= 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=pBn2lw6B; arc=none smtp.client-ip=54.254.200.92 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="pBn2lw6B" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1752820001; bh=RN1WwuxpO4LBAyRHMTh9poQETUIZdvEm0QRwkE/4D2M=; h=From:To:Subject:Date:Message-Id; b=pBn2lw6B3Sg7GitpCCucGLDo2HXaKxT6IJZnb7TOtGHl3MbQwBL2s141WB64ML/xp //AMo4MmOOXSL1mmol3WbWZROsPv11yMazXUijs8SBgWeIAsEAbg61Bgu9Rfkmxn+7 DesfWrLb4sYTj+lsMkS9AZ3hcvzlwLBaWcG3BFAw= X-QQ-mid: zesmtpgz7t1752819996t97191eb6 X-QQ-Originating-IP: kzXOt25riktyxVYSJcZnz65OhKPsh6RSYah7TO6HhiY= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 18 Jul 2025 14:26:34 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 10748363964261664298 From: Chaoyi Chen To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Greg Kroah-Hartman , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Dmitry Baryshkov Cc: 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 v2 3/5] drm/rockchip: cdn-dp: Support handle lane info and HPD without extcon Date: Fri, 18 Jul 2025 14:26:17 +0800 Message-Id: <20250718062619.99-4-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20250718062619.99-1-kernel@airkyi.com> References: <20250718062619.99-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:airkyi.com:qybglogicsvrsz:qybglogicsvrsz4a-0 X-QQ-XMAILINFO: MgfWL/YQZpWPbLmgi8KmaCxOgn85GbPN6a+MriCJECfwqv9Q8ec0wr9f 9B+/C3TZNYMBRg9dD4Ivptnd/kFY/dO8G8kLxDkqEWkPUE4STw3mp/uiU9dEVsP1EZyIwI4 Wo8HgOrowOVHJZd6qUj2khhQaoCVETeurrmvQkHOtDx9AtFUQa3PnAtr1N7HaIy40bhtFkv G7V76dfyRzRjsS7XB953PorBZi/QpQT6Aj9DulTVZihy7Gmb3GZhgIjA/WfPKzIqNFLcP6g 5uNhP8tl8GcnXQGX90TsQMMF9Mam3kudxvv5lXabVVM8YgoiFGONk0I4umplbhkgZJSFacG a4tNLwORMs0eoM8SlCC8+Ai479274HSCpvJNv+bHuGWPycoKR55nQKYKnGKeiNeXC26bJCe 85KrxEnAlXgUqqKjXsYbMlY2mXJHhLRCXxobfsy6OOZiXgZI5+xOrcEspO0GRiHhkfOxYym AmkciVFC4ArxLzaZZUls+SF2SA+Y5AqC9N1gmvaF5MslL96cUDDC9ip8xpAgVdZ0Tk+MA0/ CfyDsajERz7TsNasugNxlC/JPQ7BDlR/9Sblmb2bHwVYLnAzWWYVuq51LDaqq1b8oH+Ker8 MaIi9Dc/V/elagkH49f4McfA04JHsI8MDEfR62sNTryfI7C9Mk0vD8kMWQSKTTTPIPYXJoL NVuZoolJj6TThxKv50ncCilf9DUI2Q8dIovZWU/Lin4udzsiiWf4IoQ80mZZtFVhhoqfhAx uzN78wrpnlGi+X1GUB43BTNevU4I+v7qtIkm0X+efiAkBX1cmLidK8rIkpBaFFwCEbfTzum yNr2eOxnW2vMETeYXY6VCfSEYt3DaRr7TRzipikViU75FwarQwZQsn0s5VbDjV40ZB5kVYB E2bpvH1k0/2RUEgm5DW39fK2Cj+D2Lb7ilRowyADvpCU7jZgprOQPfN6txsaLftvNbTyxto hm0ZuqQb2HObuIkgDvMkwGiCL0J+QFc9blCxgj4UzYhzwjW4/fyJqfkyQpev8XI+X8iiTIu 3bemNrKQ== 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 This patch add support for get PHY lane info and handle HPD state without help of extcon. There is no extcon needed if the Type-C controller is present. In this case, cdn_dp_hpd_notify() will handle HPD event from USB/DP combo PHY, and 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 --- Changes in v2: - Ignore duplicate HPD events. drivers/gpu/drm/rockchip/cdn-dp-core.c | 37 ++++++++++++++++++++------ 1 file changed, 29 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 24f6b3879f4b..b574b059b58d 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); @@ -821,6 +827,17 @@ static int cdn_dp_audio_mute_stream(struct drm_connect= or *connector, return ret; } =20 +static void cdn_dp_hpd_notify(struct drm_bridge *bridge, + enum drm_connector_status status) +{ + struct cdn_dp_device *dp =3D bridge_to_dp(bridge); + enum drm_connector_status last_status =3D + dp->connected ? connector_status_connected : connector_status_disconnect= ed; + + if (last_status !=3D status) + 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, @@ -831,6 +848,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_hpd_notify, =20 .dp_audio_prepare =3D cdn_dp_audio_prepare, .dp_audio_mute_stream =3D cdn_dp_audio_mute_stream, @@ -1028,6 +1046,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 +1141,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.49.0 From nobody Mon Oct 6 17:06:46 2025 Received: from smtpbgsg1.qq.com (smtpbgsg1.qq.com [54.254.200.92]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9386A213E74; Fri, 18 Jul 2025 06:26:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.254.200.92 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820017; cv=none; b=tCZejIqiw/6DXuUhGCXk+Mr0JUBKUKqzs+DkGeAKADL23oCj/IeLkx1c7H5Wsw3/rJjGGjw1dbI3JIOJTlkmdmtBeyKYhWwbQH8lpayqi1BqdjnVoDoZ6pufXiT76nV14kUFajIid9oy+fOefaE8GVw0fNipE1f2kCeMKCx3b4o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820017; c=relaxed/simple; bh=IFjBh/IsLkSBy3BP+55MVOlJYanvu03dU7s+TFtZgr4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=kybqrsuq4SnOcLb6/LqisWeE5oALnreWNNqU1jxsy381GVmekygG4yPvK9jLGcBkZtx+YFa/rA1Hf2mb/at1/5u1MMXKX4EnIcTAv2UXUAqf6cMhzIR0zYhS0JuwoPHjJaLDQ6vGT5bo0xY10ymWSa8RfyFydXwrxe2Dyo61rVY= 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=l4mIGL+F; arc=none smtp.client-ip=54.254.200.92 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="l4mIGL+F" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1752820004; bh=cVsfyWOIHeXBsAv/pI+LuirkOLN75phRnl2QMAl6n60=; h=From:To:Subject:Date:Message-Id; b=l4mIGL+F6y8UuFoyzqQfhL1bxsyUOc9qsEey6Ekc8hEi7X5HWbN5OulmZ4e/HDONn PYfHII8iQ8emmwJZ8OvfqPypCSnhZnSsfAmmaKdSMHbMhLPHaDbCqVWxMKT/p3LHIb WNj7I7qDsCasYpcqzf9EzLr5KK8jaVTmT5i59FCM= X-QQ-mid: zesmtpgz7t1752820000tf3acf635 X-QQ-Originating-IP: 3Esvg81Z8Km/8FLlclkdOlva9JVeBii6w+oXvk+xVbQ= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 18 Jul 2025 14:26:37 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 15425296164838630341 From: Chaoyi Chen To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Greg Kroah-Hartman , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Dmitry Baryshkov Cc: 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 v2 4/5] arm64: dts: rockchip: Add missing dp_out port for RK3399 CDN-DP Date: Fri, 18 Jul 2025 14:26:18 +0800 Message-Id: <20250718062619.99-5-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20250718062619.99-1-kernel@airkyi.com> References: <20250718062619.99-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:airkyi.com:qybglogicsvrsz:qybglogicsvrsz4a-0 X-QQ-XMAILINFO: OE2SNMSfMbmORXJFDxgWUZpy1G24zUdJJv8O1MCVDzCHzFQ6gH26sYAI iSuMmxklI1OPRYsn8wanpC9cOzHAUHKtjaNIrFi2v3LLTNjNhtBfjk4qWBvk3fFSMdNO2by zVZ7Hxq/v60RT9aAqAGGxmpkIRGnpTzHRCBNEDGwB3F06xN6Q83dyfAVCsp5vpl63o500M3 8gRp2YfQwcQYLrUdf4iyN2o3S3YPaRMmmvs9mB/ZPqZ9J8zI0C0z/WtP9Gxt5VpJMn8zkvq GedSi7Q0p0WvnXUYGz74iauEAiBcPFvKh1TT6zKWjF/UC4NKybxV4qG5uVJGbawa7MviNYr ZWxMUwKxl2+bcnGX0P6s6inUrXFmBpyrs3OsZaM8h1bNGbPvO+oW/tl2Gxa45psc82+Dwgu ZUmBA03lN/3LAPZfJjWMFirF57AX74HQWIDr0nR1XEpmqUaYh8bFfIfCYdHhKZGewwnKUko WNkbxOzMGFif7A/S/Eo/1ETDMeBdtRsESGWatvWjqsl8YOxsEXSLag1Wus+ajuOz8dC45KQ mdI6QzYUbCAsbIJIAhzmnZqE1RjMReLqI29yx/IgP2szC97wV/ekHkk9jDaryaoLJSxUCGo MVHYTQdZ4DqN0J2bsYS6dlTdip5//nz+HN+KzP1PBChcPiN1nEx5EoBIWN1y8BlzgOkpMjK fnKxEJAsDRsiXpBmKhK5vyBque2nJXaEgbUvCE7FmSTW7O6a0XUzZgUD68o/CZUNEv+P8X6 SXG75c+v/2m7NGvERr0VY1Cg2Lulevf8n/Tqtzp58CochtgLUu2tXhyow0Ad8wahAKvuM3V cqhWbth/Kyn2gp07YoPyTtqAZ26PzH3EuYK1k1UFMHvV1xJnzH3ou6al3siAz3UnKK5JyY2 fTRx6judLz5hKdWmAxkN9JklxSBSbp1jvg9pMcDYyqSKejd3wNkSpXtp/LTP4yRKWLUERiD ioDH2961frAVTKBO+9Wml/FRsglrB7P5mDrcdKO9OJeBK7cvYRDj33Qm6741eRnsMpDg= 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 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 --- arch/arm64/boot/dts/rockchip/rk3399-base.dtsi | 12 +++++++++++- 1 file changed, 11 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 9d5f5b083e3c..edeb177bc433 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,12 @@ dp_in_vopl: endpoint@1 { remote-endpoint =3D <&vopl_out_dp>; }; }; + + dp_out: port@1 { + reg =3D <1>; + #address-cells =3D <1>; + #size-cells =3D <0>; + }; }; }; =20 --=20 2.49.0 From nobody Mon Oct 6 17:06:46 2025 Received: from smtpbguseast2.qq.com (smtpbguseast2.qq.com [54.204.34.130]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 09869218585; Fri, 18 Jul 2025 06:26:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.204.34.130 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820020; cv=none; b=I2SYTupL2+H6gpWUVx5CdF3T3S7HMbCS/CTjUjXeKjs33qpHzvshYOsqd1MI9fUIwu+aNoHRFgoEDCIE9SlcNbBL+Cy2g53JfN8OL5JLDrWWzTCJVwpOSppc3f2To3esdRlWWVhohSYExMQj/uCcuSq6nj35ZSPjE2mtWj/Culc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752820020; c=relaxed/simple; bh=rkOcGha0NMpMENS7IkiGhpncLZ4UIcZCejQJKMH8xbU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=aDW8NxvQKo6gfKM8kOyUFJevBPk2mFJHjspwssa6KAPXKYhepkUXxdwsvgNF1zK7rQGPw9wMxGhyPFMFi3iaMbwDqnoVUHlkA1wJ6H5WZyOAmvwKklGIh4mOY9e2nDQBbhGhMbJ8P8+qK1is+fus1Z956VAHD1gZl69VaB+YDIg= 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=vYsQY2ri; arc=none smtp.client-ip=54.204.34.130 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=airkyi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=airkyi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=airkyi.com header.i=@airkyi.com header.b="vYsQY2ri" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=airkyi.com; s=altu2504; t=1752820008; bh=8L/77Mn5XZ7DUkt0B8rv59NyXI2YcZ6+wGLcoXpyR/Q=; h=From:To:Subject:Date:Message-Id; b=vYsQY2riBWkmGaO7770GZDHqylL5YI7Sm7H92HHx1pjBgW2wcjvfaFWC+y77KLjtx FqpQsiY53GaCcszGWEZwouWSWNUqfZAAlcMq9OBjm2oBehCEjWMKepVlLbrcImApVK wx1bZW4iQRiutcsAZPcnAdIvLNGZOqCqYaDMrz6E= X-QQ-mid: zesmtpgz7t1752820003ta854dc60 X-QQ-Originating-IP: KmGNRB8zsZXB6SadBHY3Wx3w3DveaOIbchoBOWYeHkY= Received: from DESKTOP-8BT1A2O.localdomain ( [58.22.7.114]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 18 Jul 2025 14:26:41 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 18356592917221095869 From: Chaoyi Chen To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Heiko Stuebner , Sandy Huang , Andy Yan , Yubing Zhang , Frank Wang , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Amit Sunil Dhamne , Greg Kroah-Hartman , Chaoyi Chen , Dragan Simic , Johan Jonker , Diederik de Haas , Dmitry Baryshkov Cc: 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 v2 5/5] arm64: dts: rockchip: rk3399-evb-ind: Add support for DisplayPort Date: Fri, 18 Jul 2025 14:26:19 +0800 Message-Id: <20250718062619.99-6-kernel@airkyi.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20250718062619.99-1-kernel@airkyi.com> References: <20250718062619.99-1-kernel@airkyi.com> X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:airkyi.com:qybglogicsvrsz:qybglogicsvrsz4a-0 X-QQ-XMAILINFO: N1nOGOj+zup8sZKgPtkkpvi2oiEaPwBax0+hXlyIoAIAjuLrnB4/d9Uz 3zcowUe097pOTqDERnE6WHhuj9PZOuW0JyxFUbHfms4gvboyPuECOb1sxn0xeMIU6BoD6ZX GeaizEWNvCnXR5WmmJA6BpKaA1/9b/7IBD/If/crVCVV7qrNpFgULWwMIHkvy1ElQ43lbQh jyK5W6A0RngtNwGgpKGLDfVRAkug+KwjOk2HozFbBrlefl+9ZvRJ0oLXy5KBxOsqUja3Ln0 GMMtUKgEts4YyY4uhlyXKfekgu1hRgBgF5Ew45Ux0itZvVHvLAyXD7/uWqUvLAkew6u2q+c 4MJ3pu4j8GGi1gyZSU32YTHC7CB7Y0aoAx+KsIcELMSUdcdG61ZB8i/XB2VMdJ4AKTeFLPy 7VlYsHAqK1GLsCoEFFYAvsjeWQvrMU8HVFyrfu3fkn6jifxI8qjsJ/YB7CFgXp8np+5LFQ1 rCZ+ex0UZllOUuRWy2pA77C5x98qtb4+TJa7hTRxAs03QOm4r0j5YyW9vqjQ2Fg1yiU9Qxr djIba0mtCqsSssRBVY/pSX/eL1B+54y/9wJBvYDBYvdF6oSjgg/8sB++BWSvzOcNb/KLAkt 3E1Yx8kO+WyiH2Nlt5KW+XeUsnY7TdDXGbXOvrjZyDYBrMt4Q5KMKHRFGPK5nQbEnRkB7Wn kYWgaQpvhkJXKbTlpcH+idTj29DzilCsMWeaacMV48REkv0jIXWFC1MOcDbyCCOFPefUGdZ W3uH/UfeZav0gHHX/zp5MRjGhyOjJh7OhAiay05cVXx5FIyZb56UvF4IyLcz1YWPO7UvX6V FeJkLRoTmtSVgdTrpZk3NIa5dLTXvbGkI9swPuc4kd6bs1RRNsSJGDsBShZBQ7nPjVYCb8n TO6JKMBR/sr/zsp0NwsLdCPR3Bjzw08A5UB4ddAqiTELq4B7ZjhIcWr6k5vWYevDfFUf+dS yY4j5+VGXZILugX5DHfMsI5fkJMO1shYpvQ5+jOvWMlcZ31x0WVrWswUp12bPd+5Qjw1U85 /e59CYBqm1phbwk/zy X-QQ-XMRINFO: Mp0Kj//9VHAxr69bL5MkOOs= X-QQ-RECHKSPAM: 0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Chaoyi Chen The RK3399 EVB IND board has a Type-C interface DisplayPort. It use fusb302 chip as Type-C controller. fusb302 chip ---> USB/DP PHY0 <----> CDN-DP controller Signed-off-by: Chaoyi Chen --- Changes in v2: - Add endpoint to link DP PHY and DP controller. - Fix devicetree coding style. .../boot/dts/rockchip/rk3399-evb-ind.dts | 133 ++++++++++++++++++ 1 file changed, 133 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..997b822a57ff 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,63 @@ 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 <0xffffffff>; + }; + }; + + 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>; + + dp_mode_sw: endpoint { + remote-endpoint =3D <&tcphy_dp_altmode_switch>; + }; + }; + }; + }; + }; +}; + &i2s2 { status =3D "okay"; }; @@ -354,6 +438,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 +494,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>; + + tcphy_dp_altmode_switch: endpoint@0 { + reg =3D <0>; + remote-endpoint =3D <&dp_mode_sw>; + }; + + 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,6 +593,7 @@ &usb_host1_ohci { }; =20 &usbdrd_dwc3_0 { + usb-role-switch; status =3D "okay"; }; =20 --=20 2.49.0