All patches automatically rebased Build system: x86_64 Build-tested: bcm2711/RPi4B, mt7622/RT3200 Run-tested: bcm2711/RPi4B, mt7622/RT3200 Signed-off-by: John Audia <therealgraysky@proton.me>
		
			
				
	
	
		
			152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From cc7262a6c84f9a19c61307587d441e3347962388 Mon Sep 17 00:00:00 2001
 | 
						|
From: Maxime Ripard <maxime@cerno.tech>
 | 
						|
Date: Mon, 17 Jan 2022 17:19:30 +0100
 | 
						|
Subject: [PATCH] clk: bcm: rpi: Add variant structure
 | 
						|
 | 
						|
We only export a bunch of firmware clocks, and some of them require
 | 
						|
special treatment.
 | 
						|
 | 
						|
This has been do so far using some tests on the clock id in various
 | 
						|
places, but this is fairly hard to extend and doesn't scale very well.
 | 
						|
 | 
						|
Since we'll need some more cases in the next patches, let's switch to a
 | 
						|
variant structure that defines the behaviour we need to have for a given
 | 
						|
clock.
 | 
						|
 | 
						|
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
 | 
						|
---
 | 
						|
 drivers/clk/bcm/clk-raspberrypi.c | 76 +++++++++++++++++++++++--------
 | 
						|
 1 file changed, 56 insertions(+), 20 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/clk/bcm/clk-raspberrypi.c
 | 
						|
+++ b/drivers/clk/bcm/clk-raspberrypi.c
 | 
						|
@@ -58,6 +58,8 @@ static char *rpi_firmware_clk_names[] =
 | 
						|
 #define RPI_FIRMWARE_STATE_ENABLE_BIT	BIT(0)
 | 
						|
 #define RPI_FIRMWARE_STATE_WAIT_BIT	BIT(1)
 | 
						|
 
 | 
						|
+struct raspberrypi_clk_variant;
 | 
						|
+
 | 
						|
 struct raspberrypi_clk {
 | 
						|
 	struct device *dev;
 | 
						|
 	struct rpi_firmware *firmware;
 | 
						|
@@ -68,10 +70,45 @@ struct raspberrypi_clk_data {
 | 
						|
 	struct clk_hw hw;
 | 
						|
 
 | 
						|
 	unsigned int id;
 | 
						|
+	struct raspberrypi_clk_variant *variant;
 | 
						|
 
 | 
						|
 	struct raspberrypi_clk *rpi;
 | 
						|
 };
 | 
						|
 
 | 
						|
+struct raspberrypi_clk_variant {
 | 
						|
+	bool		export;
 | 
						|
+	char		*clkdev;
 | 
						|
+};
 | 
						|
+
 | 
						|
+static struct raspberrypi_clk_variant
 | 
						|
+raspberrypi_clk_variants[RPI_FIRMWARE_NUM_CLK_ID] = {
 | 
						|
+	[RPI_FIRMWARE_ARM_CLK_ID] = {
 | 
						|
+		.export = true,
 | 
						|
+		.clkdev = "cpu0",
 | 
						|
+	},
 | 
						|
+	[RPI_FIRMWARE_CORE_CLK_ID] = {
 | 
						|
+		.export = true,
 | 
						|
+	},
 | 
						|
+	[RPI_FIRMWARE_M2MC_CLK_ID] = {
 | 
						|
+		.export = true,
 | 
						|
+	},
 | 
						|
+	[RPI_FIRMWARE_V3D_CLK_ID] = {
 | 
						|
+		.export = true,
 | 
						|
+	},
 | 
						|
+	[RPI_FIRMWARE_HEVC_CLK_ID] = {
 | 
						|
+		.export = true,
 | 
						|
+	},
 | 
						|
+	[RPI_FIRMWARE_PIXEL_BVB_CLK_ID] = {
 | 
						|
+		.export = true,
 | 
						|
+	},
 | 
						|
+	[RPI_FIRMWARE_VEC_CLK_ID] = {
 | 
						|
+		.export = true,
 | 
						|
+	},
 | 
						|
+	[RPI_FIRMWARE_PIXEL_CLK_ID] = {
 | 
						|
+		.export = true,
 | 
						|
+	},
 | 
						|
+};
 | 
						|
+
 | 
						|
 /*
 | 
						|
  * Structure of the message passed to Raspberry Pi's firmware in order to
 | 
						|
  * change clock rates. The 'disable_turbo' option is only available to the ARM
 | 
						|
@@ -185,7 +222,8 @@ static const struct clk_ops raspberrypi_
 | 
						|
 
 | 
						|
 static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
 | 
						|
 					       unsigned int parent,
 | 
						|
-					       unsigned int id)
 | 
						|
+					       unsigned int id,
 | 
						|
+					       struct raspberrypi_clk_variant *variant)
 | 
						|
 {
 | 
						|
 	struct raspberrypi_clk_data *data;
 | 
						|
 	struct clk_init_data init = {};
 | 
						|
@@ -197,6 +235,7 @@ static struct clk_hw *raspberrypi_clk_re
 | 
						|
 		return ERR_PTR(-ENOMEM);
 | 
						|
 	data->rpi = rpi;
 | 
						|
 	data->id = id;
 | 
						|
+	data->variant = variant;
 | 
						|
 
 | 
						|
 	init.name = devm_kasprintf(rpi->dev, GFP_KERNEL,
 | 
						|
 				   "fw-clk-%s",
 | 
						|
@@ -230,9 +269,9 @@ static struct clk_hw *raspberrypi_clk_re
 | 
						|
 
 | 
						|
 	clk_hw_set_rate_range(&data->hw, min_rate, max_rate);
 | 
						|
 
 | 
						|
-	if (id == RPI_FIRMWARE_ARM_CLK_ID) {
 | 
						|
+	if (variant->clkdev) {
 | 
						|
 		ret = devm_clk_hw_register_clkdev(rpi->dev, &data->hw,
 | 
						|
-						  NULL, "cpu0");
 | 
						|
+						  NULL, variant->clkdev);
 | 
						|
 		if (ret) {
 | 
						|
 			dev_err(rpi->dev, "Failed to initialize clkdev\n");
 | 
						|
 			return ERR_PTR(ret);
 | 
						|
@@ -271,30 +310,27 @@ static int raspberrypi_discover_clocks(s
 | 
						|
 		return ret;
 | 
						|
 
 | 
						|
 	while (clks->id) {
 | 
						|
-		struct clk_hw *hw;
 | 
						|
+		struct raspberrypi_clk_variant *variant;
 | 
						|
+
 | 
						|
+		if (clks->id > RPI_FIRMWARE_NUM_CLK_ID) {
 | 
						|
+			dev_err(rpi->dev, "Unknown clock id: %u", clks->id);
 | 
						|
+			return -EINVAL;
 | 
						|
+		}
 | 
						|
+
 | 
						|
+		variant = &raspberrypi_clk_variants[clks->id];
 | 
						|
+		if (variant->export) {
 | 
						|
+			struct clk_hw *hw;
 | 
						|
 
 | 
						|
-		switch (clks->id) {
 | 
						|
-		case RPI_FIRMWARE_ARM_CLK_ID:
 | 
						|
-		case RPI_FIRMWARE_CORE_CLK_ID:
 | 
						|
-		case RPI_FIRMWARE_M2MC_CLK_ID:
 | 
						|
-		case RPI_FIRMWARE_V3D_CLK_ID:
 | 
						|
-		case RPI_FIRMWARE_HEVC_CLK_ID:
 | 
						|
-		case RPI_FIRMWARE_PIXEL_BVB_CLK_ID:
 | 
						|
-		case RPI_FIRMWARE_VEC_CLK_ID:
 | 
						|
-		case RPI_FIRMWARE_PIXEL_CLK_ID:
 | 
						|
 			hw = raspberrypi_clk_register(rpi, clks->parent,
 | 
						|
-						      clks->id);
 | 
						|
+						      clks->id, variant);
 | 
						|
 			if (IS_ERR(hw))
 | 
						|
 				return PTR_ERR(hw);
 | 
						|
 
 | 
						|
 			data->hws[clks->id] = hw;
 | 
						|
 			data->num = clks->id + 1;
 | 
						|
-			fallthrough;
 | 
						|
-
 | 
						|
-		default:
 | 
						|
-			clks++;
 | 
						|
-			break;
 | 
						|
 		}
 | 
						|
+
 | 
						|
+		clks++;
 | 
						|
 	}
 | 
						|
 
 | 
						|
 	return 0;
 |