]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/nouveau/core/subdev/therm/base.c
drm/nouveau/therm: survive to suspend/resume cycles
[karo-tx-linux.git] / drivers / gpu / drm / nouveau / core / subdev / therm / base.c
index 2ada3d71312f9512198e6dc6a0a2be6088c78d4c..f1de7a9c572be624d607d450081499a447d919ca 100644 (file)
@@ -95,12 +95,14 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
        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;
@@ -113,6 +115,7 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
                break;
        case NOUVEAU_THERM_CTRL_NONE:
        default:
+               ptimer->alarm_cancel(ptimer, &priv->alarm);
                goto done;
        }
 
@@ -122,6 +125,8 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
 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);
 }
 
@@ -274,7 +279,8 @@ _nouveau_therm_init(struct nouveau_object *object)
 
                nouveau_therm_fan_mode(therm, priv->suspend);
        }
-       priv->sensor.program_alarms(therm);
+       nouveau_therm_sensor_init(therm);
+       nouveau_therm_fan_init(therm);
        return 0;
 }
 
@@ -284,6 +290,8 @@ _nouveau_therm_fini(struct nouveau_object *object, bool suspend)
        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;