bcm27xx-userland: update to latest version
[openwrt/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0616-drm-vc4-Kick-the-core-clock-up-during-a-mode-change.patch
1 From 289c29b96fcc6cbe5c966fb0cc9e1bb8efbdd9dc Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dave.stevenson@raspberrypi.com>
3 Date: Thu, 26 Mar 2020 15:32:19 +0000
4 Subject: [PATCH] drm/vc4: Kick the core clock up during a mode change
5
6 Experimental commit to kick the core clock up during mode
7 switching. This makes mode switching far more reliable, and
8 mimics what the firmware does.
9
10 Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
11 ---
12 arch/arm/boot/dts/bcm2711.dtsi | 1 +
13 drivers/gpu/drm/vc4/vc4_drv.h | 2 ++
14 drivers/gpu/drm/vc4/vc4_hvs.c | 7 +++++++
15 drivers/gpu/drm/vc4/vc4_kms.c | 6 ++++++
16 4 files changed, 16 insertions(+)
17
18 --- a/arch/arm/boot/dts/bcm2711.dtsi
19 +++ b/arch/arm/boot/dts/bcm2711.dtsi
20 @@ -306,6 +306,7 @@
21 };
22
23 hvs@7e400000 {
24 + clocks = <&firmware_clocks 4>;
25 interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
26 };
27
28 --- a/drivers/gpu/drm/vc4/vc4_drv.h
29 +++ b/drivers/gpu/drm/vc4/vc4_drv.h
30 @@ -326,6 +326,8 @@ struct vc4_hvs {
31 void __iomem *regs;
32 u32 __iomem *dlist;
33
34 + struct clk *core_clk;
35 +
36 /* Memory manager for CRTCs to allocate space in the display
37 * list. Units are dwords.
38 */
39 --- a/drivers/gpu/drm/vc4/vc4_hvs.c
40 +++ b/drivers/gpu/drm/vc4/vc4_hvs.c
41 @@ -19,6 +19,7 @@
42 * each CRTC.
43 */
44
45 +#include <linux/clk.h>
46 #include <linux/component.h>
47 #include <linux/platform_device.h>
48
49 @@ -239,6 +240,12 @@ static int vc4_hvs_bind(struct device *d
50 hvs->regset.regs = hvs_regs;
51 hvs->regset.nregs = ARRAY_SIZE(hvs_regs);
52
53 + hvs->core_clk = devm_clk_get(&pdev->dev, NULL);
54 + if (IS_ERR(hvs->core_clk)) {
55 + dev_err(&pdev->dev, "Couldn't get core clock\n");
56 + return PTR_ERR(hvs->regs);
57 + }
58 +
59 hvs_version = readl(hvs->regs + SCALER_DISPLSTAT) >> 24;
60 if (hvs_version >= 0x40)
61 hvs->hvs5 = true;
62 --- a/drivers/gpu/drm/vc4/vc4_kms.c
63 +++ b/drivers/gpu/drm/vc4/vc4_kms.c
64 @@ -13,6 +13,7 @@
65
66 #include <linux/bitfield.h>
67 #include <linux/bitops.h>
68 +#include <linux/clk.h>
69
70 #include <drm/drm_atomic.h>
71 #include <drm/drm_atomic_helper.h>
72 @@ -222,6 +223,7 @@ vc4_atomic_complete_commit(struct drm_at
73 {
74 struct drm_device *dev = state->dev;
75 struct vc4_dev *vc4 = to_vc4_dev(dev);
76 + struct vc4_hvs *hvs = vc4->hvs;
77 struct vc4_crtc *vc4_crtc;
78 int i;
79
80 @@ -237,6 +239,8 @@ vc4_atomic_complete_commit(struct drm_at
81 vc4_hvs_mask_underrun(dev, vc4_crtc_state->assigned_channel);
82 }
83
84 + clk_set_rate(hvs->core_clk, 500000000);
85 +
86 drm_atomic_helper_wait_for_fences(dev, state, false);
87
88 drm_atomic_helper_wait_for_dependencies(state);
89 @@ -262,6 +266,8 @@ vc4_atomic_complete_commit(struct drm_at
90
91 drm_atomic_helper_commit_cleanup_done(state);
92
93 + clk_set_rate(hvs->core_clk, 200000000);
94 +
95 drm_atomic_state_put(state);
96
97 up(&vc4->async_modeset);