Skip to content

Commit 12c90f3

Browse files
mripardbebarino
authored andcommitted
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> Link: https://lore.kernel.org/r/20220225143534.405820-9-maxime@cerno.tech Signed-off-by: Stephen Boyd <sboyd@kernel.org>
1 parent c974484 commit 12c90f3

File tree

1 file changed

+47
-17
lines changed

1 file changed

+47
-17
lines changed

drivers/clk/bcm/clk-raspberrypi.c

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ static char *rpi_firmware_clk_names[] = {
5656
#define RPI_FIRMWARE_STATE_ENABLE_BIT BIT(0)
5757
#define RPI_FIRMWARE_STATE_WAIT_BIT BIT(1)
5858

59+
struct raspberrypi_clk_variant;
60+
5961
struct raspberrypi_clk {
6062
struct device *dev;
6163
struct rpi_firmware *firmware;
@@ -66,10 +68,36 @@ struct raspberrypi_clk_data {
6668
struct clk_hw hw;
6769

6870
unsigned int id;
71+
struct raspberrypi_clk_variant *variant;
6972

7073
struct raspberrypi_clk *rpi;
7174
};
7275

76+
struct raspberrypi_clk_variant {
77+
bool export;
78+
char *clkdev;
79+
};
80+
81+
static struct raspberrypi_clk_variant
82+
raspberrypi_clk_variants[RPI_FIRMWARE_NUM_CLK_ID] = {
83+
[RPI_FIRMWARE_ARM_CLK_ID] = {
84+
.export = true,
85+
.clkdev = "cpu0",
86+
},
87+
[RPI_FIRMWARE_CORE_CLK_ID] = {
88+
.export = true,
89+
},
90+
[RPI_FIRMWARE_M2MC_CLK_ID] = {
91+
.export = true,
92+
},
93+
[RPI_FIRMWARE_V3D_CLK_ID] = {
94+
.export = true,
95+
},
96+
[RPI_FIRMWARE_PIXEL_BVB_CLK_ID] = {
97+
.export = true,
98+
},
99+
};
100+
73101
/*
74102
* Structure of the message passed to Raspberry Pi's firmware in order to
75103
* change clock rates. The 'disable_turbo' option is only available to the ARM
@@ -183,7 +211,8 @@ static const struct clk_ops raspberrypi_firmware_clk_ops = {
183211

184212
static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
185213
unsigned int parent,
186-
unsigned int id)
214+
unsigned int id,
215+
struct raspberrypi_clk_variant *variant)
187216
{
188217
struct raspberrypi_clk_data *data;
189218
struct clk_init_data init = {};
@@ -195,6 +224,7 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
195224
return ERR_PTR(-ENOMEM);
196225
data->rpi = rpi;
197226
data->id = id;
227+
data->variant = variant;
198228

199229
init.name = devm_kasprintf(rpi->dev, GFP_KERNEL,
200230
"fw-clk-%s",
@@ -228,9 +258,9 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
228258

229259
clk_hw_set_rate_range(&data->hw, min_rate, max_rate);
230260

231-
if (id == RPI_FIRMWARE_ARM_CLK_ID) {
261+
if (variant->clkdev) {
232262
ret = devm_clk_hw_register_clkdev(rpi->dev, &data->hw,
233-
NULL, "cpu0");
263+
NULL, variant->clkdev);
234264
if (ret) {
235265
dev_err(rpi->dev, "Failed to initialize clkdev\n");
236266
return ERR_PTR(ret);
@@ -264,27 +294,27 @@ static int raspberrypi_discover_clocks(struct raspberrypi_clk *rpi,
264294
return ret;
265295

266296
while (clks->id) {
267-
struct clk_hw *hw;
268-
269-
switch (clks->id) {
270-
case RPI_FIRMWARE_ARM_CLK_ID:
271-
case RPI_FIRMWARE_CORE_CLK_ID:
272-
case RPI_FIRMWARE_M2MC_CLK_ID:
273-
case RPI_FIRMWARE_V3D_CLK_ID:
274-
case RPI_FIRMWARE_PIXEL_BVB_CLK_ID:
297+
struct raspberrypi_clk_variant *variant;
298+
299+
if (clks->id > RPI_FIRMWARE_NUM_CLK_ID) {
300+
dev_err(rpi->dev, "Unknown clock id: %u", clks->id);
301+
return -EINVAL;
302+
}
303+
304+
variant = &raspberrypi_clk_variants[clks->id];
305+
if (variant->export) {
306+
struct clk_hw *hw;
307+
275308
hw = raspberrypi_clk_register(rpi, clks->parent,
276-
clks->id);
309+
clks->id, variant);
277310
if (IS_ERR(hw))
278311
return PTR_ERR(hw);
279312

280313
data->hws[clks->id] = hw;
281314
data->num = clks->id + 1;
282-
fallthrough;
283-
284-
default:
285-
clks++;
286-
break;
287315
}
316+
317+
clks++;
288318
}
289319

290320
return 0;

0 commit comments

Comments
 (0)