| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- From cc7262a6c84f9a19c61307587d441e3347962388 Mon Sep 17 00:00:00 2001
- From: Maxime Ripard <[email protected]>
- 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 <[email protected]>
- ---
- 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;
|