const struct thermal_trip_desc *td;
        struct thermal_instance *instance;
 
+       /* If the code below has run already, nothing needs to be done. */
+       if (tz->governor_data)
+               return;
+
        for_each_trip_desc(tz, td) {
                const struct thermal_trip *trip = &td->trip;
 
                                bang_bang_set_instance_target(instance, 0);
                }
        }
+
+       tz->governor_data = (void *)true;
+}
+
+static void bang_bang_update_tz(struct thermal_zone_device *tz,
+                               enum thermal_notify_event reason)
+{
+       /*
+        * Let bang_bang_manage() know that it needs to walk trips after binding
+        * a new cdev and after system resume.
+        */
+       if (reason == THERMAL_TZ_BIND_CDEV || reason == THERMAL_TZ_RESUME)
+               tz->governor_data = NULL;
 }
 
 static struct thermal_governor thermal_gov_bang_bang = {
        .name           = "bang_bang",
        .trip_crossed   = bang_bang_control,
        .manage         = bang_bang_manage,
+       .update_tz      = bang_bang_update_tz,
 };
 THERMAL_GOVERNOR_DECLARE(thermal_gov_bang_bang);
 
 
        thermal_debug_tz_resume(tz);
        thermal_zone_device_init(tz);
-       __thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
+       thermal_governor_update_tz(tz, THERMAL_TZ_RESUME);
+       __thermal_zone_device_update(tz, THERMAL_TZ_RESUME);
 
        complete(&tz->resume);
        tz->resuming = false;
 
        THERMAL_TZ_BIND_CDEV, /* Cooling dev is bind to the thermal zone */
        THERMAL_TZ_UNBIND_CDEV, /* Cooling dev is unbind from the thermal zone */
        THERMAL_INSTANCE_WEIGHT_CHANGED, /* Thermal instance weight changed */
+       THERMAL_TZ_RESUME, /* Thermal zone is resuming after system sleep */
 };
 
 /**