From: Marcin Slusarz Date: Sun, 3 Feb 2013 18:28:14 +0000 (+0100) Subject: drm/nouveau/therm: use workqueue to shutdown the machine X-Git-Tag: upstream/snapshot3+hdmi~5652^2~10^2~40 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=07df30435eecce98961dabbac16787969975a080;p=platform%2Fadaptation%2Frenesas_rcar%2Frenesas_kernel.git drm/nouveau/therm: use workqueue to shutdown the machine orderly_poweroff cannot be called from atomic context. Signed-off-by: Marcin Slusarz Acked-by: Martin Peres Signed-off-by: Ben Skeggs --- diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/temp.c b/drivers/gpu/drm/nouveau/core/subdev/therm/temp.c index 8f27b44..b37624a 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/therm/temp.c +++ b/drivers/gpu/drm/nouveau/core/subdev/therm/temp.c @@ -90,6 +90,13 @@ nouveau_therm_sensor_get_threshold_state(struct nouveau_therm *therm, return priv->sensor.alarm_state[thrs]; } +static void +nv_poweroff_work(struct work_struct *work) +{ + orderly_poweroff(true); + kfree(work); +} + void nouveau_therm_sensor_event(struct nouveau_therm *therm, enum nouveau_therm_thrs thrs, enum nouveau_therm_thrs_direction dir) @@ -128,8 +135,15 @@ void nouveau_therm_sensor_event(struct nouveau_therm *therm, priv->emergency.pause(therm, active); break; case NOUVEAU_THERM_THRS_SHUTDOWN: - if (active) - orderly_poweroff(true); + if (active) { + struct work_struct *work; + + work = kmalloc(sizeof(*work), GFP_ATOMIC); + if (work) { + INIT_WORK(work, nv_poweroff_work); + schedule_work(work); + } + } break; case NOUVEAU_THERM_THRS_NR: break;