drm: apple: backlight: force backlight update after resume
authorkettenis <kettenis@openbsd.org>
Tue, 23 Jan 2024 15:48:28 +0000 (15:48 +0000)
committerkettenis <kettenis@openbsd.org>
Tue, 23 Jan 2024 15:48:28 +0000 (15:48 +0000)
From Mark Kettenis
fcad9f366ba0c934f877662ee8199051b636d2e1 in jannau's bits/200-dcp

sys/dev/pci/drm/apple/dcp-internal.h
sys/dev/pci/drm/apple/dcp.c
sys/dev/pci/drm/apple/dcp_backlight.c
sys/dev/pci/drm/apple/iomfb_template.c

index 55d6303..a8425da 100644 (file)
@@ -212,6 +212,8 @@ struct apple_dcp {
        /* Workqueue for updating the initial initial brightness */
        struct work_struct bl_register_wq;
        struct rwlock bl_register_mutex;
+       /* Workqueue for updating the brightness */
+       struct work_struct bl_update_wq;
 
        /* integrated panel if present */
        struct dcp_panel panel;
@@ -241,6 +243,7 @@ struct apple_dcp {
 };
 
 int dcp_backlight_register(struct apple_dcp *dcp);
+int dcp_backlight_update(struct apple_dcp *dcp);
 bool dcp_has_panel(struct apple_dcp *dcp);
 
 #define DCP_AUDIO_MAX_CHANS 15
index 6eb2d55..bf797bc 100644 (file)
@@ -516,6 +516,15 @@ out_unlock:
        mutex_unlock(&dcp->bl_register_mutex);
 }
 
+static void dcp_work_update_backlight(struct work_struct *work)
+{
+       struct apple_dcp *dcp;
+
+       dcp = container_of(work, struct apple_dcp, bl_update_wq);
+
+       dcp_backlight_update(dcp);
+}
+
 static int dcp_create_piodma_iommu_dev(struct apple_dcp *dcp)
 {
        int ret;
@@ -836,6 +845,7 @@ static int dcp_comp_bind(struct device *dev, struct device *main, void *data)
                dcp->connector_type = DRM_MODE_CONNECTOR_eDP;
                INIT_WORK(&dcp->bl_register_wq, dcp_work_register_backlight);
                rw_init(&dcp->bl_register_mutex, "dcpbl");
+               INIT_WORK(&dcp->bl_update_wq, dcp_work_update_backlight);
        } else if (of_property_match_string(dev->of_node, "apple,connector-type", "HDMI-A") >= 0)
                dcp->connector_type = DRM_MODE_CONNECTOR_HDMIA;
        else if (of_property_match_string(dev->of_node, "apple,connector-type", "DP") >= 0)
index d3e9a33..54bbaec 100644 (file)
@@ -172,20 +172,8 @@ done:
        return ret;
 }
 
-static int dcp_set_brightness(struct backlight_device *bd)
+int dcp_backlight_update(struct apple_dcp *dcp)
 {
-       int ret = 0;
-       struct apple_dcp *dcp = bl_get_data(bd);
-       struct drm_modeset_acquire_ctx ctx;
-       int brightness = backlight_get_brightness(bd);
-
-       DRM_MODESET_LOCK_ALL_BEGIN(dcp->crtc->base.dev, ctx, 0, ret);
-
-       dcp->brightness.dac = calculate_dac(dcp, brightness);
-       dcp->brightness.update = true;
-
-       DRM_MODESET_LOCK_ALL_END(dcp->crtc->base.dev, ctx, ret);
-
        /*
         * Do not actively try to change brightness if no mode is set.
         * TODO: should this be reflected the in backlight's power property?
@@ -202,6 +190,23 @@ static int dcp_set_brightness(struct backlight_device *bd)
        return drm_crtc_set_brightness(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);
+
+       DRM_MODESET_LOCK_ALL_BEGIN(dcp->crtc->base.dev, ctx, 0, ret);
+
+       dcp->brightness.dac = calculate_dac(dcp, brightness);
+       dcp->brightness.update = true;
+
+       DRM_MODESET_LOCK_ALL_END(dcp->crtc->base.dev, ctx, ret);
+
+       return dcp_backlight_update(dcp);
+}
+
 static const struct backlight_ops dcp_backlight_ops = {
        .options = BL_CORE_SUSPENDRESUME,
        .get_brightness = dcp_get_brightness,
index 7c8dc5a..c2f8dc0 100644 (file)
@@ -497,6 +497,7 @@ static void iomfbep_cb_enable_backlight_message_ap_gated(struct apple_dcp *dcp,
         * syslog: "[BrightnessLCD.cpp:743][AFK]nitsToDBV: iDAC out of range"
         */
        dcp->brightness.update = true;
+       schedule_work(&dcp->bl_update_wq);
 }
 
 /* Chunked data transfer for property dictionaries */