diff options
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.patch | 151 |
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; |