Created
June 2, 2025 16:39
-
-
Save macromorgan/86fd6fbe6f7437fdd6de670a6eea8bd8 to your computer and use it in GitHub Desktop.
Gameforce Ace Panel
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 37912cc137743229bc616765c5f518a827b96c41 Mon Sep 17 00:00:00 2001 | |
From: Detlev Casanova <[email protected]> | |
Date: Fri, 15 Nov 2024 11:20:40 -0500 | |
Subject: [PATCH 1/8] dt-bindings: display: vop2: Add VP clock resets | |
Add the documentation for VOP2 video ports reset clocks. | |
One reset can be set per video port. | |
Reviewed-by: Conor Dooley <[email protected]> | |
Signed-off-by: Detlev Casanova <[email protected]> | |
--- | |
.../display/rockchip/rockchip-vop2.yaml | 48 +++++++++++++++++++ | |
1 file changed, 48 insertions(+) | |
diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml | |
index f546d481b7e5..761852338c57 100644 | |
--- a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml | |
+++ b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml | |
@@ -82,6 +82,26 @@ properties: | |
- const: pll_hdmiphy0 | |
- const: pll_hdmiphy1 | |
+ resets: | |
+ minItems: 5 | |
+ items: | |
+ - description: AXI clock reset. | |
+ - description: AHB clock reset. | |
+ - description: Pixel clock reset for video port 0. | |
+ - description: Pixel clock reset for video port 1. | |
+ - description: Pixel clock reset for video port 2. | |
+ - description: Pixel clock reset for video port 3. | |
+ | |
+ reset-names: | |
+ minItems: 5 | |
+ items: | |
+ - const: aclk | |
+ - const: hclk | |
+ - const: dclk_vp0 | |
+ - const: dclk_vp1 | |
+ - const: dclk_vp2 | |
+ - const: dclk_vp3 | |
+ | |
rockchip,grf: | |
$ref: /schemas/types.yaml#/definitions/phandle | |
description: | |
@@ -153,6 +173,12 @@ allOf: | |
interrupt-names: false | |
+ resets: | |
+ maxItems: 5 | |
+ | |
+ reset-names: | |
+ maxItems: 5 | |
+ | |
ports: | |
required: | |
- port@0 | |
@@ -186,6 +212,12 @@ allOf: | |
interrupt-names: | |
minItems: 4 | |
+ resets: | |
+ maxItems: 5 | |
+ | |
+ reset-names: | |
+ maxItems: 5 | |
+ | |
ports: | |
required: | |
- port@0 | |
@@ -219,6 +251,12 @@ allOf: | |
interrupt-names: false | |
+ resets: | |
+ minItems: 6 | |
+ | |
+ reset-names: | |
+ minItems: 6 | |
+ | |
ports: | |
required: | |
- port@0 | |
@@ -257,6 +295,16 @@ examples: | |
"dclk_vp0", | |
"dclk_vp1", | |
"dclk_vp2"; | |
+ resets = <&cru SRST_A_VOP>, | |
+ <&cru SRST_H_VOP>, | |
+ <&cru SRST_VOP0>, | |
+ <&cru SRST_VOP1>, | |
+ <&cru SRST_VOP2>; | |
+ reset-names = "aclk", | |
+ "hclk", | |
+ "dclk_vp0", | |
+ "dclk_vp1", | |
+ "dclk_vp2"; | |
power-domains = <&power RK3568_PD_VO>; | |
rockchip,grf = <&grf>; | |
iommus = <&vop_mmu>; | |
-- | |
2.43.0 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From c42b0b3c7c97daeb51854b4bb87e48d5b3753489 Mon Sep 17 00:00:00 2001 | |
From: Detlev Casanova <[email protected]> | |
Date: Fri, 15 Nov 2024 11:20:41 -0500 | |
Subject: [PATCH 2/8] drm/rockchip: vop2: Add clock resets support | |
At the end of initialization, each VP clock needs to be reset before | |
they can be used. | |
Failing to do so can put the VOP in an undefined state where the | |
generated HDMI signal is either lost or not matching the selected mode. | |
This issue can be reproduced by switching modes multiple times. | |
Depending on the setup, after about 10 mode switches, the signal will be | |
lost and the value in register 0x890 (VSYNCWIDTH + VFRONT) will take the value | |
`0x0000018c`. | |
That makes VSYNCWIDTH=0, which is wrong. | |
Adding the clock resets after the VOP configuration fixes the issue. | |
Signed-off-by: Detlev Casanova <[email protected]> | |
--- | |
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 28 ++++++++++++++++++++ | |
drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | 1 + | |
2 files changed, 29 insertions(+) | |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | |
index d0f5fea15e21..94da5a4943c1 100644 | |
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | |
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | |
@@ -17,6 +17,7 @@ | |
#include <linux/platform_device.h> | |
#include <linux/pm_runtime.h> | |
#include <linux/regmap.h> | |
+#include <linux/reset.h> | |
#include <linux/swab.h> | |
#include <drm/drm.h> | |
@@ -1615,6 +1616,26 @@ static int us_to_vertical_line(struct drm_display_mode *mode, int us) | |
return us * mode->clock / mode->htotal / 1000; | |
} | |
+static int vop2_clk_reset(struct vop2_video_port *vp) | |
+{ | |
+ struct reset_control *rstc = vp->dclk_rst; | |
+ struct vop2 *vop2 = vp->vop2; | |
+ int ret; | |
+ | |
+ if (!rstc) | |
+ return 0; | |
+ | |
+ ret = reset_control_assert(rstc); | |
+ if (ret < 0) | |
+ drm_warn(vop2->drm, "failed to assert reset\n"); | |
+ udelay(10); | |
+ ret = reset_control_deassert(rstc); | |
+ if (ret < 0) | |
+ drm_warn(vop2->drm, "failed to deassert reset\n"); | |
+ | |
+ return ret; | |
+} | |
+ | |
static void vop2_crtc_atomic_enable(struct drm_crtc *crtc, | |
struct drm_atomic_state *state) | |
{ | |
@@ -1793,6 +1814,8 @@ static void vop2_crtc_atomic_enable(struct drm_crtc *crtc, | |
vop2_vp_write(vp, RK3568_VP_DSP_CTRL, dsp_ctrl); | |
+ vop2_clk_reset(vp); | |
+ | |
vop2_crtc_atomic_try_set_gamma(vop2, vp, crtc, crtc_state); | |
drm_crtc_vblank_on(crtc); | |
@@ -2367,6 +2390,11 @@ static int vop2_create_crtcs(struct vop2 *vop2) | |
vp->id = vp_data->id; | |
vp->data = vp_data; | |
+ vp->dclk_rst = devm_reset_control_get_optional(vop2->dev, dclk_name); | |
+ if (IS_ERR(vp->dclk_rst)) | |
+ return dev_err_probe(drm->dev, PTR_ERR(vp->dclk_rst), | |
+ "failed to get %s reset\n", dclk_name); | |
+ | |
snprintf(dclk_name, sizeof(dclk_name), "dclk_vp%d", vp->id); | |
vp->dclk = devm_clk_get(vop2->dev, dclk_name); | |
if (IS_ERR(vp->dclk)) | |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | |
index fc3ecb9fcd95..a0818f9f8b04 100644 | |
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | |
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | |
@@ -239,6 +239,7 @@ struct vop2_video_port { | |
struct vop2 *vop2; | |
struct clk *dclk; | |
struct clk *dclk_src; | |
+ struct reset_control *dclk_rst; | |
unsigned int id; | |
const struct vop2_video_port_data *data; | |
-- | |
2.43.0 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 8ef7b2ab0f69928cc038099a29605345888ced30 Mon Sep 17 00:00:00 2001 | |
From: Detlev Casanova <[email protected]> | |
Date: Fri, 15 Nov 2024 11:20:42 -0500 | |
Subject: [PATCH 3/8] arm64: dts: rockchip: Add VOP clock resets for rk3588s | |
This adds the needed clock resets for all rk3588(s) based SOCs. | |
Signed-off-by: Detlev Casanova <[email protected]> | |
--- | |
arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 12 ++++++++++++ | |
1 file changed, 12 insertions(+) | |
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | |
index 70f03e68ba55..db3674f6be75 100644 | |
--- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | |
+++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | |
@@ -1288,6 +1288,18 @@ vop: vop@fdd90000 { | |
"pll_hdmiphy0"; | |
iommus = <&vop_mmu>; | |
power-domains = <&power RK3588_PD_VOP>; | |
+ resets = <&cru SRST_A_VOP>, | |
+ <&cru SRST_H_VOP>, | |
+ <&cru SRST_D_VOP0>, | |
+ <&cru SRST_D_VOP1>, | |
+ <&cru SRST_D_VOP2>, | |
+ <&cru SRST_D_VOP3>; | |
+ reset-names = "aclk", | |
+ "hclk", | |
+ "dclk_vp0", | |
+ "dclk_vp1", | |
+ "dclk_vp2", | |
+ "dclk_vp3"; | |
rockchip,grf = <&sys_grf>; | |
rockchip,vop-grf = <&vop_grf>; | |
rockchip,vo1-grf = <&vo1_grf>; | |
-- | |
2.43.0 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From c86df8c72ba97fadc699390cbc8f2477846880b2 Mon Sep 17 00:00:00 2001 | |
From: Sebastian Reichel <[email protected]> | |
Date: Thu, 14 Nov 2024 17:36:18 +0100 | |
Subject: [PATCH 4/8] drm/rockchip: vop2: Add core reset support | |
A previous from Detlev Casanova adds reset handling for the | |
video ports. This also resets the AHB and AXI interface when | |
the system binds the VOP2 controller. | |
This fixes issues when the bootloader (or a previously running | |
kernel when using kexec) left the VOP2 initialized to some degree. | |
Signed-off-by: Sebastian Reichel <[email protected]> | |
--- | |
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 15 +++++++++++++++ | |
drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | 8 ++++++++ | |
2 files changed, 23 insertions(+) | |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | |
index 94da5a4943c1..b8c77d7fac17 100644 | |
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | |
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | |
@@ -2669,6 +2669,21 @@ static int vop2_bind(struct device *dev, struct device *master, void *data) | |
dev_set_drvdata(dev, vop2); | |
+ vop2->resets[RST_ACLK].id = "aclk"; | |
+ vop2->resets[RST_HCLK].id = "hclk"; | |
+ ret = devm_reset_control_bulk_get_optional_exclusive(vop2->dev, | |
+ RST_VOP2_MAX, vop2->resets); | |
+ if (ret) | |
+ return dev_err_probe(drm->dev, ret, "failed to get resets\n"); | |
+ | |
+ ret = reset_control_bulk_assert(RST_VOP2_MAX, vop2->resets); | |
+ if (ret < 0) | |
+ drm_warn(vop2->drm, "failed to assert resets\n"); | |
+ udelay(10); | |
+ ret = reset_control_bulk_deassert(RST_VOP2_MAX, vop2->resets); | |
+ if (ret < 0) | |
+ drm_warn(vop2->drm, "failed to deassert resets\n"); | |
+ | |
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vop"); | |
if (!res) | |
return dev_err_probe(drm->dev, -EINVAL, | |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | |
index a0818f9f8b04..63a86068680b 100644 | |
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | |
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | |
@@ -8,6 +8,7 @@ | |
#define _ROCKCHIP_DRM_VOP2_H | |
#include <linux/regmap.h> | |
+#include <linux/reset.h> | |
#include <drm/drm_modes.h> | |
#include <dt-bindings/soc/rockchip,vop2.h> | |
#include "rockchip_drm_drv.h" | |
@@ -166,6 +167,12 @@ enum vop2_win_regs { | |
VOP2_WIN_MAX_REG, | |
}; | |
+enum { | |
+ RST_ACLK, | |
+ RST_HCLK, | |
+ RST_VOP2_MAX | |
+}; | |
+ | |
struct vop2_regs_dump { | |
const char *name; | |
u32 base; | |
@@ -331,6 +338,7 @@ struct vop2 { | |
struct clk *pclk; | |
struct clk *pll_hdmiphy0; | |
struct clk *pll_hdmiphy1; | |
+ struct reset_control_bulk_data resets[RST_VOP2_MAX]; | |
/* optional internal rgb encoder */ | |
struct rockchip_rgb *rgb; | |
-- | |
2.43.0 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 816547414d30b6f6769cd52fed488a9d580ae8f5 Mon Sep 17 00:00:00 2001 | |
From: Chris Morgan <[email protected]> | |
Date: Mon, 2 Jun 2025 11:15:36 -0500 | |
Subject: [PATCH 5/8] dt-bindings: vendor-prefixes: Add prefix for Huiling | |
Shenzhen Huiling Information Technology Co. Ltd. specializes in the | |
research and manufacturing of display and touch screens for industrial | |
usage. https://en.szhuiling.com/ | |
Signed-off-by: Chris Morgan <[email protected]> | |
--- | |
Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ | |
1 file changed, 2 insertions(+) | |
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml | |
index c01adbaacbbb..d5fef99a3490 100644 | |
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml | |
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml | |
@@ -672,6 +672,8 @@ patternProperties: | |
description: Huawei Technologies Co., Ltd. | |
"^hugsun,.*": | |
description: Shenzhen Hugsun Technology Co. Ltd. | |
+ "^huiling,.*": | |
+ description: Shenzhen Huiling Information Technology Co., Ltd. | |
"^hwacom,.*": | |
description: HwaCom Systems Inc. | |
"^hxt,.*": | |
-- | |
2.43.0 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From ea24b04c7d1242f53271c46d4e187e7794302bdf Mon Sep 17 00:00:00 2001 | |
From: Chris Morgan <[email protected]> | |
Date: Mon, 2 Jun 2025 11:18:40 -0500 | |
Subject: [PATCH 6/8] dt-bindings: display: himax-hx8394: Add Huiling | |
hl055fhav028c | |
Add compatible string for the Huiling hl055fhav028c. This panel is | |
based on the Himax HX8399C display controller which is extremely | |
similar to the existing HX8394. Add a new constant for | |
himax,hx8399c for this new display controller as well. | |
Signed-off-by: Chris Morgan <[email protected]> | |
--- | |
.../bindings/display/panel/himax,hx8394.yaml | 17 +++++++++++------ | |
1 file changed, 11 insertions(+), 6 deletions(-) | |
diff --git a/Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml b/Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml | |
index 75ccabff308b..5725a587e35c 100644 | |
--- a/Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml | |
+++ b/Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml | |
@@ -17,12 +17,17 @@ description: | |
properties: | |
compatible: | |
- items: | |
- - enum: | |
- - hannstar,hsd060bhw4 | |
- - microchip,ac40t08a-mipi-panel | |
- - powkiddy,x55-panel | |
- - const: himax,hx8394 | |
+ oneOf: | |
+ - items: | |
+ - enum: | |
+ - hannstar,hsd060bhw4 | |
+ - microchip,ac40t08a-mipi-panel | |
+ - powkiddy,x55-panel | |
+ - const: himax,hx8394 | |
+ - items: | |
+ - enum: | |
+ - huiling,hl055fhav028c | |
+ - const: himax,hx8399c | |
reg: | |
maxItems: 1 | |
-- | |
2.43.0 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 3fc8f9b2eb6566f6ea304c37b24e556ac7c017ea Mon Sep 17 00:00:00 2001 | |
From: Chris Morgan <[email protected]> | |
Date: Mon, 2 Jun 2025 11:22:23 -0500 | |
Subject: [PATCH 7/8] drm/panel: himax-hx8394: Add Support for Huiling | |
hl055fhav028c | |
Add support for the Huiling hl055fhav028c panel as used on the | |
Gameforce Ace handheld gaming console. This panel uses a Himax HX8399C | |
display controller and requires a sparsely documented vendor provided | |
init sequence. The display resolution is 1080x1920 and is 70mm by 127mm | |
as stated in the manufacturer's documentation. | |
Signed-off-by: Chris Morgan <[email protected]> | |
--- | |
drivers/gpu/drm/panel/panel-himax-hx8394.c | 142 +++++++++++++++++++++ | |
1 file changed, 142 insertions(+) | |
diff --git a/drivers/gpu/drm/panel/panel-himax-hx8394.c b/drivers/gpu/drm/panel/panel-himax-hx8394.c | |
index ff994bf0e3cc..16e450b156b7 100644 | |
--- a/drivers/gpu/drm/panel/panel-himax-hx8394.c | |
+++ b/drivers/gpu/drm/panel/panel-himax-hx8394.c | |
@@ -477,6 +477,147 @@ static const struct hx8394_panel_desc mchp_ac40t08a_desc = { | |
.init_sequence = mchp_ac40t08a_init_sequence, | |
}; | |
+/* | |
+ * HL055FHAV028C is based on Himax HX8399, so datasheet pages are | |
+ * slightly different than HX8394 based panels. | |
+ */ | |
+static void hl055fhav028c_init_sequence(struct mipi_dsi_multi_context *dsi_ctx) | |
+{ | |
+ /* 6.3.6 SETEXTC: Set extension command (B9h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETEXTC, | |
+ 0xff, 0x83, 0x99); | |
+ | |
+ /* 6.3.17 SETOFFSET: Set offset voltage (D2h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETOFFSET, | |
+ 0x77); | |
+ | |
+ /* 6.3.1 SETPOWER: Set power (B1h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETPOWER, | |
+ 0x02, 0x04, 0x74, 0x94, 0x01, 0x32, | |
+ 0x33, 0x11, 0x11, 0xab, 0x4d, 0x56, | |
+ 0x73, 0x02, 0x02); | |
+ | |
+ /* 6.3.2 SETDISP: Set display related register (B2h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETDISP, | |
+ 0x00, 0x80, 0x80, 0xae, 0x05, 0x07, | |
+ 0x5a, 0x11, 0x00, 0x00, 0x10, 0x1e, | |
+ 0x70, 0x03, 0xd4); | |
+ | |
+ /* 6.3.3 SETCYC: Set display waveform cycles (B4h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETCYC, | |
+ 0x00, 0xff, 0x02, 0xc0, 0x02, 0xc0, | |
+ 0x00, 0x00, 0x08, 0x00, 0x04, 0x06, | |
+ 0x00, 0x32, 0x04, 0x0a, 0x08, 0x21, | |
+ 0x03, 0x01, 0x00, 0x0f, 0xb8, 0x8b, | |
+ 0x02, 0xc0, 0x02, 0xc0, 0x00, 0x00, | |
+ 0x08, 0x00, 0x04, 0x06, 0x00, 0x32, | |
+ 0x04, 0x0a, 0x08, 0x01, 0x00, 0x0f, | |
+ 0xb8, 0x01); | |
+ | |
+ /* 6.3.18 SETGIP0: Set GIP Option0 (D3h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETGIP0, | |
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
+ 0x06, 0x00, 0x00, 0x10, 0x04, 0x00, | |
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, | |
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | |
+ 0x00, 0x05, 0x05, 0x07, 0x00, 0x00, | |
+ 0x00, 0x05, 0x40); | |
+ | |
+ /* 6.3.19 Set GIP Option1 (D5h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETGIP1, | |
+ 0x18, 0x18, 0x19, 0x19, 0x18, 0x18, | |
+ 0x21, 0x20, 0x01, 0x00, 0x07, 0x06, | |
+ 0x05, 0x04, 0x03, 0x02, 0x18, 0x18, | |
+ 0x18, 0x18, 0x18, 0x18, 0x2f, 0x2f, | |
+ 0x30, 0x30, 0x31, 0x31, 0x18, 0x18, | |
+ 0x18, 0x18); | |
+ | |
+ /* 6.3.20 Set GIP Option2 (D6h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETGIP2, | |
+ 0x18, 0x18, 0x19, 0x19, 0x40, 0x40, | |
+ 0x20, 0x21, 0x02, 0x03, 0x04, 0x05, | |
+ 0x06, 0x07, 0x00, 0x01, 0x40, 0x40, | |
+ 0x40, 0x40, 0x40, 0x40, 0x2f, 0x2f, | |
+ 0x30, 0x30, 0x31, 0x31, 0x40, 0x40, | |
+ 0x40, 0x40); | |
+ | |
+ /* 6.3.21 Set GIP Option3 (D8h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_UNKNOWN4, | |
+ 0xa2, 0xaa, 0x02, 0xa0, 0xa2, 0xa8, | |
+ 0x02, 0xa0, 0xb0, 0x00, 0x00, 0x00, | |
+ 0xb0, 0x00, 0x00, 0x00); | |
+ | |
+ /* 6.3.9 Set register bank (BDh) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETREGBANK, | |
+ 0x01); | |
+ | |
+ /* 6.3.21 Set GIP Option3 (D8h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_UNKNOWN4, | |
+ 0xb0, 0x00, 0x00, 0x00, 0xb0, 0x00, | |
+ 0x00, 0x00, 0xe2, 0xaa, 0x03, 0xf0, | |
+ 0xe2, 0xaa, 0x03, 0xf0); | |
+ | |
+ /* 6.3.9 Set register bank (BDh) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETREGBANK, | |
+ 0x02); | |
+ | |
+ /* 6.3.21 Set GIP Option3 (D8h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_UNKNOWN4, | |
+ 0xe2, 0xaa, 0x03, 0xf0, 0xe2, 0xaa, | |
+ 0x03, 0xf0); | |
+ | |
+ /* 6.3.9 Set register bank (BDh) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETREGBANK, | |
+ 0x00); | |
+ | |
+ /* 6.3.4 SETVCOM: Set VCOM voltage (B6h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETVCOM, | |
+ 0x7a, 0x7a); | |
+ | |
+ /* 6.3.26 SETGAMMA: Set gamma curve related setting (E0h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETGAMMA, | |
+ 0x00, 0x18, 0x27, 0x24, 0x5a, 0x68, | |
+ 0x79, 0x78, 0x81, 0x8a, 0x92, 0x99, | |
+ 0x9e, 0xa7, 0xaf, 0xb4, 0xb9, 0xc3, | |
+ 0xc7, 0xd1, 0xc6, 0xd4, 0xd5, 0x6c, | |
+ 0x67, 0x71, 0x77, 0x00, 0x00, 0x18, | |
+ 0x27, 0x24, 0x5a, 0x68, 0x79, 0x78, | |
+ 0x81, 0x8a, 0x92, 0x99, 0x9e, 0xa7, | |
+ 0xaf, 0xb4, 0xb9, 0xc3, 0xc7, 0xd1, | |
+ 0xc6, 0xd4, 0xd5, 0x6c, 0x67, 0x77); | |
+ | |
+ /* Unknown command, not listed in the HX8399-C datasheet (C6h) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_UNKNOWN2, | |
+ 0xff, 0xf9); | |
+ | |
+ /* 6.3.16 SETPANEL (CCh) */ | |
+ mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX8394_CMD_SETPANEL, | |
+ 0x08); | |
+} | |
+ | |
+static const struct drm_display_mode hl055fhav028c_mode = { | |
+ .hdisplay = 1080, | |
+ .hsync_start = 1080 + 32, | |
+ .hsync_end = 1080 + 32 + 8, | |
+ .htotal = 1080 + 32 + 8 + 32, | |
+ .vdisplay = 1920, | |
+ .vsync_start = 1920 + 16, | |
+ .vsync_end = 1920 + 16 + 2, | |
+ .vtotal = 1920 + 16 + 2 + 14, | |
+ .clock = 134920, | |
+ .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, | |
+ .width_mm = 70, | |
+ .height_mm = 127, | |
+}; | |
+ | |
+static const struct hx8394_panel_desc hl055fhav028c_desc = { | |
+ .mode = &hl055fhav028c_mode, | |
+ .lanes = 4, | |
+ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST, | |
+ .format = MIPI_DSI_FMT_RGB888, | |
+ .init_sequence = hl055fhav028c_init_sequence, | |
+}; | |
+ | |
static int hx8394_enable(struct drm_panel *panel) | |
{ | |
struct hx8394 *ctx = panel_to_hx8394(panel); | |
@@ -683,6 +824,7 @@ static void hx8394_remove(struct mipi_dsi_device *dsi) | |
static const struct of_device_id hx8394_of_match[] = { | |
{ .compatible = "hannstar,hsd060bhw4", .data = &hsd060bhw4_desc }, | |
+ { .compatible = "huiling,hl055fhav028c", .data = &hl055fhav028c_desc }, | |
{ .compatible = "powkiddy,x55-panel", .data = &powkiddy_x55_desc }, | |
{ .compatible = "microchip,ac40t08a-mipi-panel", .data = &mchp_ac40t08a_desc }, | |
{ /* sentinel */ } | |
-- | |
2.43.0 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 64633142b96b4ba14c8add721fc5b0632b0a44bc Mon Sep 17 00:00:00 2001 | |
From: Chris Morgan <[email protected]> | |
Date: Mon, 2 Jun 2025 11:27:46 -0500 | |
Subject: [PATCH 8/8] arm64: dts: rockchip: Add DSI panel support for | |
gameforce-ace | |
Enable the DSI controller, DSI DCPHY, and Huiling hl055fhav028c | |
1080x1920 panel for the Gameforce Ace. | |
Signed-off-by: Chris Morgan <[email protected]> | |
--- | |
.../dts/rockchip/rk3588s-gameforce-ace.dts | 66 +++++++++++++++++++ | |
1 file changed, 66 insertions(+) | |
diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts b/arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts | |
index 873a2bd6a6de..bb7c1b732cc2 100644 | |
--- a/arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts | |
+++ b/arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts | |
@@ -7,6 +7,7 @@ | |
#include <dt-bindings/leds/common.h> | |
#include <dt-bindings/pinctrl/rockchip.h> | |
#include <dt-bindings/pwm/pwm.h> | |
+#include <dt-bindings/soc/rockchip,vop2.h> | |
#include <dt-bindings/thermal/thermal.h> | |
#include <dt-bindings/usb/pd.h> | |
#include "rk3588s.dtsi" | |
@@ -456,6 +457,42 @@ &cpu_b3 { | |
cpu-supply = <&vdd_cpu_big1_s0>; | |
}; | |
+&dsi0 { | |
+ #address-cells = <1>; | |
+ #size-cells = <0>; | |
+ status = "okay"; | |
+ | |
+ panel@0 { | |
+ compatible = "huiling,hl055fhav028c", "himax,hx8399c"; | |
+ reg = <0>; | |
+ backlight = <&backlight>; | |
+ iovcc-supply = <&vcc3v3_lcd0_n>; | |
+ pinctrl-0 = <&lcd_rst>; | |
+ pinctrl-names = "default"; | |
+ reset-gpios = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>; | |
+ rotation = <90>; | |
+ vcc-supply = <&vcc3v3_lcd0_n>; | |
+ | |
+ port { | |
+ mipi_panel_in: endpoint { | |
+ remote-endpoint = <&dsi0_out_panel>; | |
+ }; | |
+ }; | |
+ }; | |
+}; | |
+ | |
+&dsi0_in { | |
+ dsi0_in_vp3: endpoint { | |
+ remote-endpoint = <&vp3_out_dsi0>; | |
+ }; | |
+}; | |
+ | |
+&dsi0_out { | |
+ dsi0_out_panel: endpoint { | |
+ remote-endpoint = <&mipi_panel_in>; | |
+ }; | |
+}; | |
+ | |
&gpu { | |
mali-supply = <&vdd_gpu_s0>; | |
status = "okay"; | |
@@ -633,6 +670,10 @@ &i2s0_sdi0 | |
status = "okay"; | |
}; | |
+&mipidcphy0 { | |
+ status = "okay"; | |
+}; | |
+ | |
&package_thermal { | |
polling-delay = <1000>; | |
@@ -769,6 +810,13 @@ lcd_bl_en: lcd-bl-en { | |
}; | |
}; | |
+ lcd_rst { | |
+ lcd_rst: lcd-rst { | |
+ rockchip,pins = | |
+ <1 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>; | |
+ }; | |
+ }; | |
+ | |
pcie-pins { | |
pcie_rst: pcie-rst { | |
rockchip,pins = | |
@@ -1239,3 +1287,21 @@ bluetooth { | |
shutdown-gpios = <&gpio3 RK_PB7 GPIO_ACTIVE_HIGH>; | |
}; | |
}; | |
+ | |
+&vop { | |
+ status = "okay"; | |
+}; | |
+ | |
+&vop_mmu { | |
+ status = "okay"; | |
+}; | |
+ | |
+&vp3 { | |
+ #address-cells = <1>; | |
+ #size-cells = <0>; | |
+ | |
+ vp3_out_dsi0: endpoint@ROCKCHIP_VOP2_EP_MIPI0 { | |
+ reg = <ROCKCHIP_VOP2_EP_MIPI0>; | |
+ remote-endpoint = <&dsi0_in_vp3>; | |
+ }; | |
+}; | |
-- | |
2.43.0 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment