Skip to content

Commit 55d0ca3

Browse files
kettenisjannau
authored andcommitted
drm: apple: backlight: force backlight update after resume
If the DCP firmware indicates that it didn't restore the brightness, schedule an update. Wait for 1 frame duration and check if the brightness update has been taken care of by a swap that happened in the meantime. Fixes restoring the brightness after resume when running on a dumb framebuffer where swaps may not happen for a very long time. Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
1 parent bb85648 commit 55d0ca3

4 files changed

Lines changed: 32 additions & 13 deletions

File tree

drivers/gpu/drm/apple/dcp-internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ struct apple_dcp {
212212
/* Workqueue for updating the initial initial brightness */
213213
struct work_struct bl_register_wq;
214214
struct mutex bl_register_mutex;
215+
/* Workqueue for updating the brightness */
216+
struct work_struct bl_update_wq;
215217

216218
/* integrated panel if present */
217219
struct dcp_panel panel;
@@ -241,6 +243,7 @@ struct apple_dcp {
241243
};
242244

243245
int dcp_backlight_register(struct apple_dcp *dcp);
246+
int dcp_backlight_update(struct apple_dcp *dcp);
244247
bool dcp_has_panel(struct apple_dcp *dcp);
245248

246249
#define DCP_AUDIO_MAX_CHANS 15

drivers/gpu/drm/apple/dcp.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,15 @@ static void dcp_work_register_backlight(struct work_struct *work)
515515
mutex_unlock(&dcp->bl_register_mutex);
516516
}
517517

518+
static void dcp_work_update_backlight(struct work_struct *work)
519+
{
520+
struct apple_dcp *dcp;
521+
522+
dcp = container_of(work, struct apple_dcp, bl_update_wq);
523+
524+
dcp_backlight_update(dcp);
525+
}
526+
518527
static int dcp_create_piodma_iommu_dev(struct apple_dcp *dcp)
519528
{
520529
int ret;
@@ -835,6 +844,7 @@ static int dcp_comp_bind(struct device *dev, struct device *main, void *data)
835844
dcp->connector_type = DRM_MODE_CONNECTOR_eDP;
836845
INIT_WORK(&dcp->bl_register_wq, dcp_work_register_backlight);
837846
mutex_init(&dcp->bl_register_mutex);
847+
INIT_WORK(&dcp->bl_update_wq, dcp_work_update_backlight);
838848
} else if (of_property_match_string(dev->of_node, "apple,connector-type", "HDMI-A") >= 0)
839849
dcp->connector_type = DRM_MODE_CONNECTOR_HDMIA;
840850
else if (of_property_match_string(dev->of_node, "apple,connector-type", "DP") >= 0)

drivers/gpu/drm/apple/dcp_backlight.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -172,20 +172,8 @@ static int drm_crtc_set_brightness(struct apple_dcp *dcp)
172172
return ret;
173173
}
174174

175-
static int dcp_set_brightness(struct backlight_device *bd)
175+
int dcp_backlight_update(struct apple_dcp *dcp)
176176
{
177-
int ret = 0;
178-
struct apple_dcp *dcp = bl_get_data(bd);
179-
struct drm_modeset_acquire_ctx ctx;
180-
int brightness = backlight_get_brightness(bd);
181-
182-
DRM_MODESET_LOCK_ALL_BEGIN(dcp->crtc->base.dev, ctx, 0, ret);
183-
184-
dcp->brightness.dac = calculate_dac(dcp, brightness);
185-
dcp->brightness.update = true;
186-
187-
DRM_MODESET_LOCK_ALL_END(dcp->crtc->base.dev, ctx, ret);
188-
189177
/*
190178
* Do not actively try to change brightness if no mode is set.
191179
* TODO: should this be reflected the in backlight's power property?
@@ -202,6 +190,23 @@ static int dcp_set_brightness(struct backlight_device *bd)
202190
return drm_crtc_set_brightness(dcp);
203191
}
204192

193+
static int dcp_set_brightness(struct backlight_device *bd)
194+
{
195+
int ret = 0;
196+
struct apple_dcp *dcp = bl_get_data(bd);
197+
struct drm_modeset_acquire_ctx ctx;
198+
int brightness = backlight_get_brightness(bd);
199+
200+
DRM_MODESET_LOCK_ALL_BEGIN(dcp->crtc->base.dev, ctx, 0, ret);
201+
202+
dcp->brightness.dac = calculate_dac(dcp, brightness);
203+
dcp->brightness.update = true;
204+
205+
DRM_MODESET_LOCK_ALL_END(dcp->crtc->base.dev, ctx, ret);
206+
207+
return dcp_backlight_update(dcp);
208+
}
209+
205210
static const struct backlight_ops dcp_backlight_ops = {
206211
.options = BL_CORE_SUSPENDRESUME,
207212
.get_brightness = dcp_get_brightness,

drivers/gpu/drm/apple/iomfb_template.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ static void iomfbep_cb_enable_backlight_message_ap_gated(struct apple_dcp *dcp,
497497
* syslog: "[BrightnessLCD.cpp:743][AFK]nitsToDBV: iDAC out of range"
498498
*/
499499
dcp->brightness.update = true;
500+
schedule_work(&dcp->bl_update_wq);
500501
}
501502

502503
/* Chunked data transfer for property dictionaries */

0 commit comments

Comments
 (0)