mirror of
https://github.com/andreili/SBC_builder.git
synced 2025-08-23 19:04:06 +02:00
253 lines
8.7 KiB
Diff
253 lines
8.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
Date: Sat, 16 Nov 2024 03:19:43 +0200
|
|
Subject: dt-bindings: display: vop2: Add optional PLL clock properties
|
|
|
|
On RK3588, HDMI PHY PLL can be used as an alternative and more accurate
|
|
pixel clock source for VOP2 video ports 0, 1 and 2.
|
|
|
|
Document the optional PLL clock properties corresponding to the two HDMI
|
|
PHYs available on the SoC.
|
|
|
|
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
---
|
|
Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml | 4 ++++
|
|
1 file changed, 4 insertions(+)
|
|
|
|
diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml
|
|
index 111111111111..222222222222 100644
|
|
--- a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml
|
|
+++ b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml
|
|
@@ -53,6 +53,8 @@ properties:
|
|
- description: Pixel clock for video port 2.
|
|
- description: Pixel clock for video port 3.
|
|
- description: Peripheral(vop grf/dsi) clock.
|
|
+ - description: Alternative pixel clock provided by HDMI0 PHY PLL.
|
|
+ - description: Alternative pixel clock provided by HDMI1 PHY PLL.
|
|
|
|
clock-names:
|
|
minItems: 5
|
|
@@ -64,6 +66,8 @@ properties:
|
|
- const: dclk_vp2
|
|
- const: dclk_vp3
|
|
- const: pclk_vop
|
|
+ - const: pll_hdmiphy0
|
|
+ - const: pll_hdmiphy1
|
|
|
|
rockchip,grf:
|
|
$ref: /schemas/types.yaml#/definitions/phandle
|
|
--
|
|
Armbian
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
Date: Tue, 12 Nov 2024 02:27:35 +0200
|
|
Subject: drm/rockchip: vop2: Drop unnecessary if_pixclk_rate computation
|
|
|
|
The if_pixclk_rate variable is not being used outside of the if-block in
|
|
rk3588_calc_cru_cfg(), hence move the superfluous assignment from the
|
|
first branch to the inner comment-block.
|
|
|
|
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
---
|
|
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
@@ -1905,8 +1905,8 @@ static unsigned long rk3588_calc_cru_cfg(struct vop2_video_port *vp, int id,
|
|
K = 2;
|
|
}
|
|
|
|
- if_pixclk_rate = (dclk_core_rate << 1) / K;
|
|
/*
|
|
+ * if_pixclk_rate = (dclk_core_rate << 1) / K;
|
|
* if_dclk_rate = dclk_core_rate / K;
|
|
* *if_pixclk_div = dclk_rate / if_pixclk_rate;
|
|
* *if_dclk_div = dclk_rate / if_dclk_rate;
|
|
--
|
|
Armbian
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
Date: Fri, 3 Nov 2023 19:58:02 +0200
|
|
Subject: drm/rockchip: vop2: Improve display modes handling on RK3588 HDMI0
|
|
|
|
The RK3588 specific implementation is currently quite limited in terms
|
|
of handling the full range of display modes supported by the connected
|
|
screens, e.g. 2560x1440@75Hz, 2048x1152@60Hz, 1024x768@60Hz are just a
|
|
few of them.
|
|
|
|
Additionally, it doesn't cope well with non-integer refresh rates like
|
|
59.94, 29.97, 23.98, etc.
|
|
|
|
Make use of HDMI0 PHY PLL as a more accurate DCLK source to handle
|
|
all display modes up to 4K@60Hz.
|
|
|
|
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
---
|
|
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 34 ++++++++++
|
|
1 file changed, 34 insertions(+)
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
@@ -159,6 +159,7 @@ struct vop2_video_port {
|
|
struct drm_crtc crtc;
|
|
struct vop2 *vop2;
|
|
struct clk *dclk;
|
|
+ struct clk *dclk_src;
|
|
unsigned int id;
|
|
const struct vop2_video_port_data *data;
|
|
|
|
@@ -214,6 +215,7 @@ struct vop2 {
|
|
struct clk *hclk;
|
|
struct clk *aclk;
|
|
struct clk *pclk;
|
|
+ struct clk *pll_hdmiphy0;
|
|
|
|
/* optional internal rgb encoder */
|
|
struct rockchip_rgb *rgb;
|
|
@@ -222,6 +224,8 @@ struct vop2 {
|
|
struct vop2_win win[];
|
|
};
|
|
|
|
+#define VOP2_MAX_DCLK_RATE 600000000
|
|
+
|
|
#define vop2_output_if_is_hdmi(x) ((x) == ROCKCHIP_VOP2_EP_HDMI0 || \
|
|
(x) == ROCKCHIP_VOP2_EP_HDMI1)
|
|
|
|
@@ -1155,6 +1159,9 @@ static void vop2_crtc_atomic_disable(struct drm_crtc *crtc,
|
|
|
|
vop2_crtc_disable_irq(vp, VP_INT_DSP_HOLD_VALID);
|
|
|
|
+ if (vp->dclk_src)
|
|
+ clk_set_parent(vp->dclk, vp->dclk_src);
|
|
+
|
|
clk_disable_unprepare(vp->dclk);
|
|
|
|
vop2->enable_count--;
|
|
@@ -2259,6 +2266,27 @@ static void vop2_crtc_atomic_enable(struct drm_crtc *crtc,
|
|
|
|
vop2_vp_write(vp, RK3568_VP_MIPI_CTRL, 0);
|
|
|
|
+ /*
|
|
+ * Switch to HDMI PHY PLL as DCLK source for display modes up
|
|
+ * to 4K@60Hz, if available, otherwise keep using the system CRU.
|
|
+ */
|
|
+ if (vop2->pll_hdmiphy0 && clock <= VOP2_MAX_DCLK_RATE) {
|
|
+ drm_for_each_encoder_mask(encoder, crtc->dev, crtc_state->encoder_mask) {
|
|
+ struct rockchip_encoder *rkencoder = to_rockchip_encoder(encoder);
|
|
+
|
|
+ if (rkencoder->crtc_endpoint_id == ROCKCHIP_VOP2_EP_HDMI0) {
|
|
+ if (!vp->dclk_src)
|
|
+ vp->dclk_src = clk_get_parent(vp->dclk);
|
|
+
|
|
+ ret = clk_set_parent(vp->dclk, vop2->pll_hdmiphy0);
|
|
+ if (ret < 0)
|
|
+ drm_warn(vop2->drm,
|
|
+ "Could not switch to HDMI0 PHY PLL: %d\n", ret);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
clk_set_rate(vp->dclk, clock);
|
|
|
|
vop2_post_config(crtc);
|
|
@@ -3699,6 +3727,12 @@ static int vop2_bind(struct device *dev, struct device *master, void *data)
|
|
return PTR_ERR(vop2->pclk);
|
|
}
|
|
|
|
+ vop2->pll_hdmiphy0 = devm_clk_get_optional(vop2->dev, "pll_hdmiphy0");
|
|
+ if (IS_ERR(vop2->pll_hdmiphy0)) {
|
|
+ drm_err(vop2->drm, "failed to get pll_hdmiphy0\n");
|
|
+ return PTR_ERR(vop2->pll_hdmiphy0);
|
|
+ }
|
|
+
|
|
vop2->irq = platform_get_irq(pdev, 0);
|
|
if (vop2->irq < 0) {
|
|
drm_err(vop2->drm, "cannot find irq for vop2\n");
|
|
--
|
|
Armbian
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
Date: Tue, 16 Jan 2024 03:13:38 +0200
|
|
Subject: arm64: dts: rockchip: Enable HDMI0 PHY clk provider on RK3588
|
|
|
|
Since commit c4b09c562086 ("phy: phy-rockchip-samsung-hdptx: Add clock
|
|
provider support"), the HDMI PHY PLL can be used as an alternative and
|
|
more accurate pixel clock source for VOP2 to improve display modes
|
|
handling on RK3588 SoC.
|
|
|
|
Add the missing #clock-cells property to allow using the clock provider
|
|
functionality of HDMI0 PHY.
|
|
|
|
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
---
|
|
arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 1 +
|
|
1 file changed, 1 insertion(+)
|
|
|
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
|
|
index 111111111111..222222222222 100644
|
|
--- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
|
|
+++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
|
|
@@ -2812,6 +2812,7 @@ hdptxphy_hdmi0: phy@fed60000 {
|
|
reg = <0x0 0xfed60000 0x0 0x2000>;
|
|
clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>, <&cru PCLK_HDPTX0>;
|
|
clock-names = "ref", "apb";
|
|
+ #clock-cells = <0>;
|
|
#phy-cells = <0>;
|
|
resets = <&cru SRST_HDPTX0>, <&cru SRST_P_HDPTX0>,
|
|
<&cru SRST_HDPTX0_INIT>, <&cru SRST_HDPTX0_CMN>,
|
|
--
|
|
Armbian
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
Date: Sat, 16 Nov 2024 04:33:46 +0200
|
|
Subject: arm64: dts: rockchip: Add HDMI0 PHY PLL clock source to VOP2 on
|
|
RK3588
|
|
|
|
VOP2 on RK3588 is able to use the HDMI PHY PLL as an alternative and
|
|
more accurate pixel clock source to improve handling of display modes up
|
|
to 4K@60Hz on video ports 0, 1 and 2.
|
|
|
|
For now only HDMI0 output is supported, hence add the related PLL clock.
|
|
|
|
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
---
|
|
arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 6 ++++--
|
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
|
|
index 111111111111..222222222222 100644
|
|
--- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
|
|
+++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
|
|
@@ -1261,14 +1261,16 @@ vop: vop@fdd90000 {
|
|
<&cru DCLK_VOP1>,
|
|
<&cru DCLK_VOP2>,
|
|
<&cru DCLK_VOP3>,
|
|
- <&cru PCLK_VOP_ROOT>;
|
|
+ <&cru PCLK_VOP_ROOT>,
|
|
+ <&hdptxphy_hdmi0>;
|
|
clock-names = "aclk",
|
|
"hclk",
|
|
"dclk_vp0",
|
|
"dclk_vp1",
|
|
"dclk_vp2",
|
|
"dclk_vp3",
|
|
- "pclk_vop";
|
|
+ "pclk_vop",
|
|
+ "pll_hdmiphy0";
|
|
iommus = <&vop_mmu>;
|
|
power-domains = <&power RK3588_PD_VOP>;
|
|
rockchip,grf = <&sys_grf>;
|
|
--
|
|
Armbian
|
|
|