diff --git a/drivers/gpu/drm/apple/dcp_backlight.c b/drivers/gpu/drm/apple/dcp_backlight.c index 9eb0c7d4eb5345..18fb0099d4a265 100644 --- a/drivers/gpu/drm/apple/dcp_backlight.c +++ b/drivers/gpu/drm/apple/dcp_backlight.c @@ -142,41 +142,42 @@ static int drm_crtc_set_brightness(struct apple_dcp *dcp) struct drm_crtc_state *crtc_state; struct drm_modeset_acquire_ctx ctx; struct drm_crtc *crtc = &dcp->crtc->base; - int ret = 0; + int ret; + + state = drm_atomic_state_alloc(crtc->dev); + if (!state) + return -ENOMEM; drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); + state->acquire_ctx = &ctx; +retry: ret = drm_modeset_lock(&crtc->mutex, &ctx); - if (ret == -EDEADLK) { - drm_modeset_backoff(&ctx); - return -EDEADLK; - } else if (ret == -ERESTARTSYS) { - return -ERESTARTSYS; - } + if (ret) + goto out; if (!dcp->brightness.update) - goto done; - - state = drm_atomic_state_alloc(crtc->dev); - if (!state) { - ret = -ENOMEM; - goto done; - } + goto out; - state->acquire_ctx = &ctx; crtc_state = drm_atomic_get_crtc_state(state, crtc); if (IS_ERR(crtc_state)) { ret = PTR_ERR(crtc_state); - goto fail; + goto out; } crtc_state->color_mgmt_changed |= true; ret = drm_atomic_commit(state); +out: + if (ret == -EDEADLK) { + drm_atomic_state_clear(state); + ret = drm_modeset_backoff(&ctx); + if (!ret) + goto retry; + } -fail: drm_atomic_state_put(state); -done: drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); return ret; } @@ -201,24 +202,18 @@ int dcp_backlight_update(struct apple_dcp *dcp) static int dcp_set_brightness(struct backlight_device *bd) { - int ret = 0; struct apple_dcp *dcp = bl_get_data(bd); - struct drm_modeset_acquire_ctx ctx; int brightness = backlight_get_brightness(bd); + int ret; - drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); - ret = drm_modeset_lock(&dcp->crtc->base.mutex, &ctx); - if (ret == -EDEADLK) { - drm_modeset_backoff(&ctx); - return -EDEADLK; - } else if (ret == -ERESTARTSYS) { - return -ERESTARTSYS; - } + ret = drm_modeset_lock_single_interruptible(&dcp->crtc->base.mutex); + if (ret) + return ret; dcp->brightness.dac = calculate_dac(dcp, brightness); dcp->brightness.update = true; - drm_modeset_drop_locks(&ctx); + drm_modeset_unlock(&dcp->crtc->base.mutex); return dcp_backlight_update(dcp); }