Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 682b1fc7 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

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



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 208cf0b7
Loading
Loading
Loading
Loading
+8 −6
Original line number Original line Diff line number Diff line
@@ -92,8 +92,9 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
	struct nouveau_timer *ptimer = nouveau_timer(therm);
	struct nouveau_timer *ptimer = nouveau_timer(therm);
	struct nouveau_therm_priv *priv = (void *)therm;
	struct nouveau_therm_priv *priv = (void *)therm;
	unsigned long flags;
	unsigned long flags;
	bool immd = true;
	bool poll = true;
	bool poll = true;
	int duty;
	int duty = -1;


	spin_lock_irqsave(&priv->lock, flags);
	spin_lock_irqsave(&priv->lock, flags);
	if (mode < 0)
	if (mode < 0)
@@ -119,21 +120,22 @@ nouveau_therm_update(struct nouveau_therm *therm, int mode)
			duty = priv->cstate;
			duty = priv->cstate;
			poll = false;
			poll = false;
		}
		}
		immd = false;
		break;
		break;
	case NOUVEAU_THERM_CTRL_NONE:
	case NOUVEAU_THERM_CTRL_NONE:
	default:
	default:
		ptimer->alarm_cancel(ptimer, &priv->alarm);
		ptimer->alarm_cancel(ptimer, &priv->alarm);
		poll = false;
		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)
	if (list_empty(&priv->alarm.head) && poll)
		ptimer->alarm(ptimer, 1000000000ULL, &priv->alarm);
		ptimer->alarm(ptimer, 1000000000ULL, &priv->alarm);
	spin_unlock_irqrestore(&priv->lock, flags);
	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
int