Browse Source

drm/nouveau/therm: update target fanspeed outside of therm lock

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs 11 years ago
parent
commit
682b1fc793
1 changed files with 8 additions and 6 deletions
  1. 8 6
      drivers/gpu/drm/nouveau/core/subdev/therm/base.c

+ 8 - 6
drivers/gpu/drm/nouveau/core/subdev/therm/base.c

@@ -92,8 +92,9 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
 	struct nouveau_timer *ptimer = nouveau_timer(therm);
 	struct nouveau_therm_priv *priv = (void *)therm;
 	unsigned long flags;
+	bool immd = true;
 	bool poll = true;
-	int duty;
+	int duty = -1;
 
 	spin_lock_irqsave(&priv->lock, flags);
 	if (mode < 0)
@@ -119,21 +120,22 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
 			duty = priv->cstate;
 			poll = false;
 		}
+		immd = false;
 		break;
 	case NOUVEAU_THERM_CTRL_NONE:
 	default:
 		ptimer->alarm_cancel(ptimer, &priv->alarm);
 		poll = false;
-		goto done;
 	}
 
-	nv_debug(therm, "FAN target request: %d%%\n", duty);
-	nouveau_therm_fan_set(therm, (mode != NOUVEAU_THERM_CTRL_AUTO), duty);
-
-done:
 	if (list_empty(&priv->alarm.head) && poll)
 		ptimer->alarm(ptimer, 1000000000ULL, &priv->alarm);
 	spin_unlock_irqrestore(&priv->lock, flags);
+
+	if (duty >= 0) {
+		nv_debug(therm, "FAN target request: %d%%\n", duty);
+		nouveau_therm_fan_set(therm, immd, duty);
+	}
 }
 
 int