Skip to content

Commit d267024

Browse files
6by9popcornmix
authored andcommitted
Revert "Revert "clk: bcm: rpi: Turn firmware clock on/off when preparing/unpreparing""
This reverts commit 3946b86.
1 parent f9b85c8 commit d267024

File tree

1 file changed

+55
-1
lines changed

1 file changed

+55
-1
lines changed

drivers/clk/bcm/clk-raspberrypi.c

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,15 @@ struct raspberrypi_clk_variant {
6868
char *clkdev;
6969
unsigned long min_rate;
7070
bool minimize;
71+
u32 flags;
7172
};
7273

7374
static struct raspberrypi_clk_variant
7475
raspberrypi_clk_variants[RPI_FIRMWARE_NUM_CLK_ID] = {
7576
[RPI_FIRMWARE_ARM_CLK_ID] = {
7677
.export = true,
7778
.clkdev = "cpu0",
79+
.flags = CLK_IS_CRITICAL,
7880
},
7981
[RPI_FIRMWARE_CORE_CLK_ID] = {
8082
.export = true,
@@ -90,6 +92,12 @@ raspberrypi_clk_variants[RPI_FIRMWARE_NUM_CLK_ID] = {
9092
* always use the minimum the drivers will let us.
9193
*/
9294
.minimize = true,
95+
96+
/*
97+
* It should never be disabled as it drives the bus for
98+
* everything else.
99+
*/
100+
.flags = CLK_IS_CRITICAL,
93101
},
94102
[RPI_FIRMWARE_M2MC_CLK_ID] = {
95103
.export = true,
@@ -115,6 +123,15 @@ raspberrypi_clk_variants[RPI_FIRMWARE_NUM_CLK_ID] = {
115123
* drivers will let us.
116124
*/
117125
.minimize = true,
126+
127+
/*
128+
* As mentioned above, this clock is disabled during boot,
129+
* the firmware will skip the HSM initialization, resulting
130+
* in a bus lockup. Therefore, make sure it's enabled
131+
* during boot, but after it, it can be enabled/disabled
132+
* by the driver.
133+
*/
134+
.flags = CLK_IGNORE_UNUSED,
118135
},
119136
[RPI_FIRMWARE_V3D_CLK_ID] = {
120137
.export = true,
@@ -123,10 +140,12 @@ raspberrypi_clk_variants[RPI_FIRMWARE_NUM_CLK_ID] = {
123140
[RPI_FIRMWARE_PIXEL_CLK_ID] = {
124141
.export = true,
125142
.minimize = true,
143+
.flags = CLK_IS_CRITICAL,
126144
},
127145
[RPI_FIRMWARE_HEVC_CLK_ID] = {
128146
.export = true,
129147
.minimize = true,
148+
.flags = CLK_IS_CRITICAL,
130149
},
131150
[RPI_FIRMWARE_ISP_CLK_ID] = {
132151
.export = true,
@@ -135,6 +154,7 @@ raspberrypi_clk_variants[RPI_FIRMWARE_NUM_CLK_ID] = {
135154
[RPI_FIRMWARE_PIXEL_BVB_CLK_ID] = {
136155
.export = true,
137156
.minimize = true,
157+
.flags = CLK_IS_CRITICAL,
138158
},
139159
[RPI_FIRMWARE_VEC_CLK_ID] = {
140160
.export = true,
@@ -265,7 +285,41 @@ static int raspberrypi_fw_dumb_determine_rate(struct clk_hw *hw,
265285
return 0;
266286
}
267287

288+
static int raspberrypi_fw_prepare(struct clk_hw *hw)
289+
{
290+
const struct raspberrypi_clk_data *data = clk_hw_to_data(hw);
291+
struct raspberrypi_clk *rpi = data->rpi;
292+
u32 state = RPI_FIRMWARE_STATE_ENABLE_BIT;
293+
int ret;
294+
295+
ret = raspberrypi_clock_property(rpi->firmware, data,
296+
RPI_FIRMWARE_SET_CLOCK_STATE, &state);
297+
if (ret)
298+
dev_err_ratelimited(rpi->dev,
299+
"Failed to set clock %s state to on: %d\n",
300+
clk_hw_get_name(hw), ret);
301+
302+
return ret;
303+
}
304+
305+
static void raspberrypi_fw_unprepare(struct clk_hw *hw)
306+
{
307+
const struct raspberrypi_clk_data *data = clk_hw_to_data(hw);
308+
struct raspberrypi_clk *rpi = data->rpi;
309+
u32 state = 0;
310+
int ret;
311+
312+
ret = raspberrypi_clock_property(rpi->firmware, data,
313+
RPI_FIRMWARE_SET_CLOCK_STATE, &state);
314+
if (ret)
315+
dev_err_ratelimited(rpi->dev,
316+
"Failed to set clock %s state to off: %d\n",
317+
clk_hw_get_name(hw), ret);
318+
}
319+
268320
static const struct clk_ops raspberrypi_firmware_clk_ops = {
321+
.prepare = raspberrypi_fw_prepare,
322+
.unprepare = raspberrypi_fw_unprepare,
269323
.is_prepared = raspberrypi_fw_is_prepared,
270324
.recalc_rate = raspberrypi_fw_get_rate,
271325
.determine_rate = raspberrypi_fw_dumb_determine_rate,
@@ -295,7 +349,7 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
295349
if (!init.name)
296350
return ERR_PTR(-ENOMEM);
297351
init.ops = &raspberrypi_firmware_clk_ops;
298-
init.flags = CLK_GET_RATE_NOCACHE;
352+
init.flags = variant->flags | CLK_GET_RATE_NOCACHE;
299353

300354
data->hw.init = &init;
301355

0 commit comments

Comments
 (0)