aboutsummaryrefslogtreecommitdiff
path: root/target/linux/bcm27xx/patches-6.1/950-0421-drm-v3d-Switch-clock-setting-to-new-api.patch
blob: 8339d44fa4e183216e7473eb5aba12f987365778 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
From fd72b430d69e0352214449cccf3c111b0390ee99 Mon Sep 17 00:00:00 2001
From: Dom Cobley <popcornmix@gmail.com>
Date: Wed, 20 Apr 2022 18:08:38 +0100
Subject: [PATCH] drm/v3d: Switch clock setting to new api

Signed-off-by: Dom Cobley <popcornmix@gmail.com>

drm/v3d: Convert to new clock range API

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
---
 drivers/gpu/drm/v3d/v3d_drv.c | 22 ++++++++++++++++++++--
 drivers/gpu/drm/v3d/v3d_gem.c |  4 ++--
 2 files changed, 22 insertions(+), 4 deletions(-)

--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -24,6 +24,9 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_managed.h>
+
+#include <soc/bcm2835/raspberrypi-firmware.h>
+
 #include <uapi/drm/v3d_drm.h>
 
 #include "v3d_drv.h"
@@ -207,6 +210,8 @@ map_regs(struct v3d_dev *v3d, void __iom
 static int v3d_platform_drm_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
+	struct rpi_firmware *firmware;
+	struct device_node *node;
 	struct drm_device *drm;
 	struct v3d_dev *v3d;
 	int ret;
@@ -266,7 +271,20 @@ static int v3d_platform_drm_probe(struct
 			dev_err(dev, "Failed to get clock (%ld)\n", PTR_ERR(v3d->clk));
 		return PTR_ERR(v3d->clk);
 	}
-	v3d->clk_up_rate = clk_get_rate(v3d->clk);
+
+	node = rpi_firmware_find_node();
+	if (!node)
+		return -EINVAL;
+
+	firmware = rpi_firmware_get(node);
+	of_node_put(node);
+	if (!firmware)
+		return -EPROBE_DEFER;
+
+	v3d->clk_up_rate = rpi_firmware_clk_get_max_rate(firmware,
+							 RPI_FIRMWARE_V3D_CLK_ID);
+	rpi_firmware_put(firmware);
+
 	/* For downclocking, drop it to the minimum frequency we can get from
 	 * the CPRMAN clock generator dividing off our parent.  The divider is
 	 * 4 bits, but ask for just higher than that so that rounding doesn't
@@ -300,7 +318,7 @@ static int v3d_platform_drm_probe(struct
 	if (ret)
 		goto irq_disable;
 
-	ret = clk_set_rate(v3d->clk, v3d->clk_down_rate);
+	ret = clk_set_min_rate(v3d->clk, v3d->clk_down_rate);
 	WARN_ON_ONCE(ret != 0);
 
 	return 0;
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -25,7 +25,7 @@ v3d_clock_down_work(struct work_struct *
 		container_of(work, struct v3d_dev, clk_down_work.work);
 	int ret;
 
-	ret = clk_set_rate(v3d->clk, v3d->clk_down_rate);
+	ret = clk_set_min_rate(v3d->clk, v3d->clk_down_rate);
 	v3d->clk_up = false;
 	WARN_ON_ONCE(ret != 0);
 }
@@ -39,7 +39,7 @@ v3d_clock_up_get(struct v3d_dev *v3d)
 		if (!v3d->clk_up)  {
 			int ret;
 
-			ret = clk_set_rate(v3d->clk, v3d->clk_up_rate);
+			ret = clk_set_min_rate(v3d->clk, v3d->clk_up_rate);
 			WARN_ON_ONCE(ret != 0);
 			v3d->clk_up = true;
 		}