Add HDMI for Gameforce Ace
Subsystems (6)
cover Add HDMI for Gameforce Ace
From: Chris Morgan <[email protected]>
Add support for the micro HDMI port for the Gameforce Ace. This port does not have a HPD pin so it requires making changes to the HDMI controller to support this configuration.
Chris Morgan (3):
dt-bindings: display: rockchip: Add no-hpd for dw-hdmi-qp controller drm/bridge: dw-hdmi-qp: Add support for missing HPD
arm64: dts: rockchip: Add HDMI to Gameforce Ace
.../rockchip/rockchip,rk3588-dw-hdmi-qp.yaml | 6 ++ .../dts/rockchip/rk3588s-gameforce-ace.dts | 63 +++++++++++++++++++ drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 35 +++++++++-- 3 files changed, 100 insertions(+), 4 deletions(-)
Signature · 1 line
2.43.0
PATCH 1/3 dt-bindings: display: rockchip: Add no-hpd for dw-hdmi-qp controller
From: Chris Morgan <[email protected]>
Add an attribute of "no-hpd" for the Rockchip dw-hdmi-qp controller. This is used to describe implementations where the HPD pin is not connected or used for other purposes, such as in the RK3588S based Gameforce Ace which repurposed the GPIO for an additional face button.
The "no-hpd" option was chosen to be consistent with other devices which already define this parameter for broken or missing hpd functionality.
--- .../display/rockchip/rockchip,rk3588-dw-hdmi-qp.yaml | 6 ++++++ 1 file changed, 6 insertions(+)
Documentation/devicetree/bindings/display/rockchip/rockchip,rk3588-dw-hdmi-qp.yaml +6 -0
@@ -69,6 +69,12 @@ properties: - const: main - const: hpd + no-hpd: + type: boolean + description: + The HPD pin is not present or used for another purpose, and the EDID + must be polled instead to determine if a device is attached. + phys: maxItems: 1 description: The HDMI/eDP PHY
Signature · 1 line
2.43.0
Re: [PATCH 1/3] dt-bindings: display: rockchip: Add no-hpd for dw-hdmi-qp controller
Quoted 11 lines · Chris Morgan
From: Chris Morgan <[email protected]>
Add an attribute of "no-hpd" for the Rockchip dw-hdmi-qp controller. This is used to describe implementations where the HPD pin is not connected or used for other purposes, such as in the RK3588S based Gameforce Ace which repurposed the GPIO for an additional face button.
The "no-hpd" option was chosen to be consistent with other devices which already define this parameter for broken or missing hpd functionality.
Glad you mentioned this, so we could avoid the "why have you no vendor prefix" conversation :)
pw-bot: not-applicable
PATCH 2/3 drm/bridge: dw-hdmi-qp: Add support for missing HPD
In reply to Chris MorganFrom: Chris Morgan <[email protected]>
Add support for the dw-hdmi-qp driver to handle devices with missing HPD pins.
Since in this situation we are now polling for the EDID data via i2c change the error message to a debug message when we are unable to complete an i2c read, as a disconnected device would otherwise fill dmesg with i2c read errors.
--- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 35 +++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +31 -4
@@ -145,6 +145,7 @@ struct dw_hdmi_qp {struct regmap *regm;unsigned long tmds_char_rate; +bool no_hpd; }; static void dw_hdmi_qp_write(struct dw_hdmi_qp *hdmi, unsigned int val,
@@ -520,6 +521,11 @@ static int dw_hdmi_qp_i2c_read(struct dw_hdmi_qp *hdmi, i2c->is_regaddr = true; } +/* +* Mark errors as debug messages when using no_hpd so no device +* attached does not fill up dmesg. +*/ +while (length--) {reinit_completion (&i2c->cmp);
@@ -535,14 +541,20 @@ static int dw_hdmi_qp_i2c_read(struct dw_hdmi_qp *hdmi, stat =wait_for_completion_timeout (&i2c->cmp,HZ /10 );if (!stat) { -dev_err (hdmi->dev,"i2c read timed out\n" ); +if (hdmi->no_hpd) +dev_dbg (hdmi->dev,"i2c read timed out\n" ); +else +dev_err (hdmi->dev,"i2c read timed out\n" );dw_hdmi_qp_write (hdmi,0x01 ,I2CM_CONTROL0 );return -EAGAIN ; }/* Check for error condition on the bus */ if (i2c->stat &I2CM_NACK_RCVD_IRQ ) { -dev_err (hdmi->dev,"i2c read error\n" ); +if (hdmi->no_hpd) +dev_dbg (hdmi->dev,"i2c read error\n" ); +else +dev_err (hdmi->dev,"i2c read error\n" );dw_hdmi_qp_write (hdmi,0x01 ,I2CM_CONTROL0 );return -EIO ; }
@@ -879,6 +891,15 @@ static enum drm_connector_status dw_hdmi_qp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector) { struct dw_hdmi_qp *hdmi = bridge->driver_private; +const struct drm_edid *drm_edid; + +if (hdmi->no_hpd) { + drm_edid =drm_edid_read_ddc (connector, bridge->ddc); +if (drm_edid) +return connector_status_connected; +else +return connector_status_disconnected; + }return hdmi->phy.ops->read_hpd (hdmi, hdmi->phy.data); }
@@ -1074,12 +1095,18 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev,if (ret)return ERR_PTR (ret); +if (of_property_present (pdev->dev.of_node,"no-hpd" )) + hdmi->no_hpd =1 ; +else + hdmi->no_hpd =0 ; + hdmi->bridge.driver_private = hdmi; hdmi->bridge.ops =DRM_BRIDGE_OP_DETECT |DRM_BRIDGE_OP_EDID |DRM_BRIDGE_OP_HDMI | -DRM_BRIDGE_OP_HDMI_AUDIO | -DRM_BRIDGE_OP_HPD ; +DRM_BRIDGE_OP_HDMI_AUDIO ; +if (!hdmi->no_hpd) + hdmi->bridge.ops |=DRM_BRIDGE_OP_HPD ; hdmi->bridge.of_node = pdev->dev.of_node; hdmi->bridge.type =DRM_MODE_CONNECTOR_HDMIA ; hdmi->bridge.vendor ="Synopsys" ;
Signature · 1 line
2.43.0
Heiko Stuebner
maintainerRe: [PATCH 2/3] drm/bridge: dw-hdmi-qp: Add support for missing HPD
Am Donnerstag, 6. November 2025, 19:09:13 Mitteleuropäische Normalzeit schrieb Chris Morgan:
Quoted 13 lines
From: Chris Morgan <[email protected]>
Add support for the dw-hdmi-qp driver to handle devices with missing HPD pins.
Since in this situation we are now polling for the EDID data via i2c change the error message to a debug message when we are unable to complete an i2c read, as a disconnected device would otherwise fill dmesg with i2c read errors.
Signed-off-by Chris Morgan <[email protected]>
drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev, · line 1102
Quoted 8 lines
drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +5
-0@@ -1074,12 +1095,18 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev,if (ret)return ERR_PTR (ret); +if (of_property_present (pdev->dev.of_node,"no-hpd" )) + hdmi->no_hpd =1 ; +else + hdmi->no_hpd =0 ; +
what is the argument against
hdmi->no_hpd = of_property_read_bool(pdev->dev.of_node, "no-hpd")); ?
Re: [PATCH 2/3] drm/bridge: dw-hdmi-qp: Add support for missing HPD
Quoted 25 lines · Heiko Stuebner
Am Donnerstag, 6. November 2025, 19:09:13 Mitteleuropäische Normalzeit schrieb Chris Morgan:
Quoted 13 lines
From: Chris Morgan <[email protected]>
Add support for the dw-hdmi-qp driver to handle devices with missing HPD pins.
Since in this situation we are now polling for the EDID data via i2c change the error message to a debug message when we are unable to complete an i2c read, as a disconnected device would otherwise fill dmesg with i2c read errors.
Signed-off-by Chris Morgan <[email protected]>drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev, · line 1102
Quoted 8 lines
drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +5
-0@@ -1074,12 +1095,18 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev,if (ret)return ERR_PTR (ret); +if (of_property_present (pdev->dev.of_node,"no-hpd" )) + hdmi->no_hpd =1 ; +else + hdmi->no_hpd =0 ; +what is the argument against
Quoted 2 lines
hdmi->no_hpd=of_property_read_bool(pdev->dev.of_node, "no-hpd")); ?
I'm a self taught and not always that efficient? :-p I'll make the change for the next version.
Thank you,
Chris
Quoted 4 lines
Re: [PATCH 2/3] drm/bridge: dw-hdmi-qp: Add support for missing HPD
In reply to Heiko StuebnerHi,
Quoted 25 lines · Heiko Stuebner
Am Donnerstag, 6. November 2025, 19:09:13 Mitteleuropäische Normalzeit schrieb Chris Morgan:
Quoted 13 lines
From: Chris Morgan <[email protected]>
Add support for the dw-hdmi-qp driver to handle devices with missing HPD pins.
Since in this situation we are now polling for the EDID data via i2c change the error message to a debug message when we are unable to complete an i2c read, as a disconnected device would otherwise fill dmesg with i2c read errors.
Signed-off-by Chris Morgan <[email protected]>drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev, · line 1102
Quoted 8 lines
drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +5
-0@@ -1074,12 +1095,18 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev,if (ret)return ERR_PTR (ret); +if (of_property_present (pdev->dev.of_node,"no-hpd" )) + hdmi->no_hpd =1 ; +else + hdmi->no_hpd =0 ; +what is the argument against
Quoted 1 line
hdmi->no_hpd=of_property_read_bool(pdev->dev.of_node, "no-hpd")); ?
Would be even better to use this, which avoids adding DT specific code to the bridge driver:
hdmi->no_hpd = device_property_read_bool(pdev->dev, "no-hpd");
Greetings,
-- Sebastian
PATCH 3/3 arm64: dts: rockchip: Add HDMI to Gameforce Ace
In reply to Chris MorganFrom: Chris Morgan <[email protected]>
Add support for the HDMI port for the Gameforce Ace. The HDMI port has no HPD pin present (the manufacturer's devicetree states the pin is reused for an additional face button) so add the attribute of no_hpd to poll for connected devices.
--- .../dts/rockchip/rk3588s-gameforce-ace.dts | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+)
arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts +63 -0
@@ -300,6 +300,20 @@ amp_headphone: headphone-amplifier { sound-name-prefix = "Headphones Amplifier"; }; + hdmi0-con { + compatible = "hdmi-connector"; + ddc-en-gpios = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>; + pinctrl-0 = <&hdmi0_en>; + pinctrl-names = "default"; + type = "d"; + + port { + hdmi0_con_in: endpoint { + remote-endpoint = <&hdmi0_out_con>; + }; + }; + }; + pwm_fan: pwm-fan { compatible = "pwm-fan"; #cooling-cells = <2>;
@@ -498,6 +512,34 @@ &gpu { status = "okay"; }; +&hdmi0 { + no-hpd; + pinctrl-0 = <&hdmim0_tx0_cec>, <&hdmim0_tx0_scl>, + <&hdmim0_tx0_sda>; + pinctrl-names = "default"; + status = "okay"; +}; + +&hdmi0_in { + hdmi0_in_vp0: endpoint { + remote-endpoint = <&vp0_out_hdmi0>; + }; +}; + +&hdmi0_out { + hdmi0_out_con: endpoint { + remote-endpoint = <&hdmi0_con_in>; + }; +}; + +&hdmi0_sound { + status = "okay"; +}; + +&hdptxphy0 { + status = "okay"; +}; + &i2c0 { pinctrl-0 = <&i2c0m2_xfer>; pinctrl-names = "default";
@@ -746,6 +788,10 @@ &i2s0_sdi0 status = "okay"; }; +&i2s5_8ch { + status = "okay"; +}; + &mipidcphy0 { status = "okay"; };
@@ -842,6 +888,13 @@ charger_int_h: charger-int-h { }; }; + hdmi { + hdmi0_en: hdmi0-en { + rockchip,pins = + <4 RK_PB3 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + hym8563 { hym8563_int: hym8563-int { rockchip,pins =
@@ -1416,6 +1469,16 @@ &vop_mmu { status = "okay"; }; +&vp0 { + #address-cells = <1>; + #size-cells = <0>; + + vp0_out_hdmi0: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { + reg = <ROCKCHIP_VOP2_EP_HDMI0>; + remote-endpoint = <&hdmi0_in_vp0>; + }; +}; + &vp3 { #address-cells = <1>; #size-cells = <0>;
Signature · 1 line
2.43.0