mirror of
git://git.openwrt.org/openwrt/openwrt.git
synced 2024-12-23 23:23:31 +00:00
20ea6adbf1
Build system: x86_64 Build-tested: bcm2708, bcm2709, bcm2710, bcm2711 Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B Signed-off-by: Marty Jones <mj8263788@gmail.com> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
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);
|
|
@@ -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;
|