int duty;
 
        spin_lock_irqsave(&priv->lock, flags);
+       nv_debug(therm, "FAN speed check\n");
        if (mode < 0)
                mode = priv->mode;
        priv->mode = mode;
 
        switch (mode) {
        case NOUVEAU_THERM_CTRL_MANUAL:
+               ptimer->alarm_cancel(ptimer, &priv->alarm);
                duty = nouveau_therm_fan_get(therm);
                if (duty < 0)
                        duty = 100;
                break;
        case NOUVEAU_THERM_CTRL_NONE:
        default:
+               ptimer->alarm_cancel(ptimer, &priv->alarm);
                goto done;
        }
 
 done:
        if (list_empty(&priv->alarm.head) && (mode == NOUVEAU_THERM_CTRL_AUTO))
                ptimer->alarm(ptimer, 1000000000ULL, &priv->alarm);
+       else if (!list_empty(&priv->alarm.head))
+               nv_debug(therm, "therm fan alarm list is not empty\n");
        spin_unlock_irqrestore(&priv->lock, flags);
 }
 
 
                nouveau_therm_fan_mode(therm, priv->suspend);
        }
-       priv->sensor.program_alarms(therm);
+       nouveau_therm_sensor_init(therm);
+       nouveau_therm_fan_init(therm);
        return 0;
 }
 
        struct nouveau_therm *therm = (void *)object;
        struct nouveau_therm_priv *priv = (void *)therm;
 
+       nouveau_therm_fan_fini(therm, suspend);
+       nouveau_therm_sensor_fini(therm, suspend);
        if (suspend) {
                priv->suspend = priv->mode;
                priv->mode = NOUVEAU_THERM_CTRL_NONE;
 
                priv->fan->bios.min_duty = priv->fan->bios.max_duty;
 }
 
+int
+nouveau_therm_fan_init(struct nouveau_therm *therm)
+{
+       return 0;
+}
+
+int
+nouveau_therm_fan_fini(struct nouveau_therm *therm, bool suspend)
+{
+       struct nouveau_therm_priv *priv = (void *)therm;
+       struct nouveau_timer *ptimer = nouveau_timer(therm);
+
+       if (suspend)
+               ptimer->alarm_cancel(ptimer, &priv->fan->alarm);
+       return 0;
+}
+
 int
 nouveau_therm_fan_ctor(struct nouveau_therm *therm)
 {
 
 int nouveau_therm_sensor_ctor(struct nouveau_therm *therm);
 
 int nouveau_therm_fan_ctor(struct nouveau_therm *therm);
+int nouveau_therm_fan_init(struct nouveau_therm *therm);
+int nouveau_therm_fan_fini(struct nouveau_therm *therm, bool suspend);
 int nouveau_therm_fan_get(struct nouveau_therm *therm);
 int nouveau_therm_fan_set(struct nouveau_therm *therm, bool now, int percent);
 int nouveau_therm_fan_user_get(struct nouveau_therm *therm);
 
 int nouveau_therm_preinit(struct nouveau_therm *);
 
+int nouveau_therm_sensor_init(struct nouveau_therm *therm);
+int nouveau_therm_sensor_fini(struct nouveau_therm *therm, bool suspend);
 void nouveau_therm_sensor_preinit(struct nouveau_therm *);
 void nouveau_therm_sensor_set_threshold_state(struct nouveau_therm *therm,
                                             enum nouveau_therm_thrs thrs,
 
 
        spin_lock_irqsave(&priv->sensor.alarm_program_lock, flags);
 
+       nv_debug(therm, "polling the internal temperature\n");
+
        nouveau_therm_threshold_hyst_polling(therm, &sensor->thrs_fan_boost,
                                             NOUVEAU_THERM_THRS_FANBOOST);
 
        alarm_timer_callback(&priv->sensor.therm_poll_alarm);
 }
 
+int
+nouveau_therm_sensor_init(struct nouveau_therm *therm)
+{
+       struct nouveau_therm_priv *priv = (void *)therm;
+       priv->sensor.program_alarms(therm);
+       return 0;
+}
+
+int
+nouveau_therm_sensor_fini(struct nouveau_therm *therm, bool suspend)
+{
+       struct nouveau_therm_priv *priv = (void *)therm;
+       struct nouveau_timer *ptimer = nouveau_timer(therm);
+
+       if (suspend)
+               ptimer->alarm_cancel(ptimer, &priv->sensor.therm_poll_alarm);
+       return 0;
+}
+
 void
 nouveau_therm_sensor_preinit(struct nouveau_therm *therm)
 {