@@ -68,13 +68,15 @@ struct raspberrypi_clk_variant {
6868 char * clkdev ;
6969 unsigned long min_rate ;
7070 bool minimize ;
71+ u32 flags ;
7172};
7273
7374static struct raspberrypi_clk_variant
7475raspberrypi_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+
268320static 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