aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0858-clk-bcm-rpi-Add-variant-structure.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0858-clk-bcm-rpi-Add-variant-structure.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0858-clk-bcm-rpi-Add-variant-structure.patch151
1 files changed, 151 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0858-clk-bcm-rpi-Add-variant-structure.patch b/target/linux/bcm27xx/patches-5.15/950-0858-clk-bcm-rpi-Add-variant-structure.patch
new file mode 100644
index 0000000000..3fde2c951a
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0858-clk-bcm-rpi-Add-variant-structure.patch
@@ -0,0 +1,151 @@
+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);
+@@ -266,30 +305,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;