mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
98 lines
2.7 KiB
Diff
98 lines
2.7 KiB
Diff
|
From 289c29b96fcc6cbe5c966fb0cc9e1bb8efbdd9dc Mon Sep 17 00:00:00 2001
|
||
|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||
|
Date: Thu, 26 Mar 2020 15:32:19 +0000
|
||
|
Subject: [PATCH] drm/vc4: Kick the core clock up during a mode change
|
||
|
|
||
|
Experimental commit to kick the core clock up during mode
|
||
|
switching. This makes mode switching far more reliable, and
|
||
|
mimics what the firmware does.
|
||
|
|
||
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||
|
---
|
||
|
arch/arm/boot/dts/bcm2711.dtsi | 1 +
|
||
|
drivers/gpu/drm/vc4/vc4_drv.h | 2 ++
|
||
|
drivers/gpu/drm/vc4/vc4_hvs.c | 7 +++++++
|
||
|
drivers/gpu/drm/vc4/vc4_kms.c | 6 ++++++
|
||
|
4 files changed, 16 insertions(+)
|
||
|
|
||
|
--- a/arch/arm/boot/dts/bcm2711.dtsi
|
||
|
+++ b/arch/arm/boot/dts/bcm2711.dtsi
|
||
|
@@ -306,6 +306,7 @@
|
||
|
};
|
||
|
|
||
|
hvs@7e400000 {
|
||
|
+ clocks = <&firmware_clocks 4>;
|
||
|
interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
|
||
|
};
|
||
|
|
||
|
--- a/drivers/gpu/drm/vc4/vc4_drv.h
|
||
|
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
|
||
|
@@ -326,6 +326,8 @@ struct vc4_hvs {
|
||
|
void __iomem *regs;
|
||
|
u32 __iomem *dlist;
|
||
|
|
||
|
+ struct clk *core_clk;
|
||
|
+
|
||
|
/* Memory manager for CRTCs to allocate space in the display
|
||
|
* list. Units are dwords.
|
||
|
*/
|
||
|
--- a/drivers/gpu/drm/vc4/vc4_hvs.c
|
||
|
+++ b/drivers/gpu/drm/vc4/vc4_hvs.c
|
||
|
@@ -19,6 +19,7 @@
|
||
|
* each CRTC.
|
||
|
*/
|
||
|
|
||
|
+#include <linux/clk.h>
|
||
|
#include <linux/component.h>
|
||
|
#include <linux/platform_device.h>
|
||
|
|
||
|
@@ -239,6 +240,12 @@ static int vc4_hvs_bind(struct device *d
|
||
|
hvs->regset.regs = hvs_regs;
|
||
|
hvs->regset.nregs = ARRAY_SIZE(hvs_regs);
|
||
|
|
||
|
+ hvs->core_clk = devm_clk_get(&pdev->dev, NULL);
|
||
|
+ if (IS_ERR(hvs->core_clk)) {
|
||
|
+ dev_err(&pdev->dev, "Couldn't get core clock\n");
|
||
|
+ return PTR_ERR(hvs->regs);
|
||
|
+ }
|
||
|
+
|
||
|
hvs_version = readl(hvs->regs + SCALER_DISPLSTAT) >> 24;
|
||
|
if (hvs_version >= 0x40)
|
||
|
hvs->hvs5 = true;
|
||
|
--- a/drivers/gpu/drm/vc4/vc4_kms.c
|
||
|
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
|
||
|
@@ -13,6 +13,7 @@
|
||
|
|
||
|
#include <linux/bitfield.h>
|
||
|
#include <linux/bitops.h>
|
||
|
+#include <linux/clk.h>
|
||
|
|
||
|
#include <drm/drm_atomic.h>
|
||
|
#include <drm/drm_atomic_helper.h>
|
||
|
@@ -222,6 +223,7 @@ vc4_atomic_complete_commit(struct drm_at
|
||
|
{
|
||
|
struct drm_device *dev = state->dev;
|
||
|
struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||
|
+ struct vc4_hvs *hvs = vc4->hvs;
|
||
|
struct vc4_crtc *vc4_crtc;
|
||
|
int i;
|
||
|
|
||
|
@@ -237,6 +239,8 @@ vc4_atomic_complete_commit(struct drm_at
|
||
|
vc4_hvs_mask_underrun(dev, vc4_crtc_state->assigned_channel);
|
||
|
}
|
||
|
|
||
|
+ clk_set_rate(hvs->core_clk, 500000000);
|
||
|
+
|
||
|
drm_atomic_helper_wait_for_fences(dev, state, false);
|
||
|
|
||
|
drm_atomic_helper_wait_for_dependencies(state);
|
||
|
@@ -262,6 +266,8 @@ vc4_atomic_complete_commit(struct drm_at
|
||
|
|
||
|
drm_atomic_helper_commit_cleanup_done(state);
|
||
|
|
||
|
+ clk_set_rate(hvs->core_clk, 200000000);
|
||
|
+
|
||
|
drm_atomic_state_put(state);
|
||
|
|
||
|
up(&vc4->async_modeset);
|