Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 24 additions & 29 deletions drivers/gpu/drm/apple/dcp_backlight.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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);
}
Expand Down