if (vc4->is_vc5) {
                unsigned long state_rate = max(old_hvs_state->core_clock_rate,
                                               new_hvs_state->core_clock_rate);
-               unsigned long core_rate = max_t(unsigned long,
-                                               500000000, state_rate);
+               unsigned long core_rate = clamp_t(unsigned long, state_rate,
+                                                 500000000, hvs->max_core_rate);
 
                drm_dbg(dev, "Raising the core clock at %lu Hz\n", core_rate);
 
        drm_atomic_helper_cleanup_planes(dev, state);
 
        if (vc4->is_vc5) {
-               drm_dbg(dev, "Running the core clock at %lu Hz\n",
-                       new_hvs_state->core_clock_rate);
+               unsigned long core_rate = min_t(unsigned long,
+                                               hvs->max_core_rate,
+                                               new_hvs_state->core_clock_rate);
+
+               drm_dbg(dev, "Running the core clock at %lu Hz\n", core_rate);
 
                /*
                 * Request a clock rate based on the current HVS
                 * requirements.
                 */
-               WARN_ON(clk_set_min_rate(hvs->core_clk, new_hvs_state->core_clock_rate));
+               WARN_ON(clk_set_min_rate(hvs->core_clk, core_rate));
 
                drm_dbg(dev, "Core clock actual rate: %lu Hz\n",
                        clk_get_rate(hvs->core_clk));