]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/bridge: anx7625: Make hpd workqueue freezable
authorPi-Hsun Shih <pihsun@chromium.org>
Tue, 15 Jun 2021 03:29:24 +0000 (11:29 +0800)
committerRobert Foss <robert.foss@linaro.org>
Fri, 18 Jun 2021 12:23:15 +0000 (14:23 +0200)
There were still a race condition between hpd work and suspend, since
the workqueue work can still be run after anx7625 had powered off in
suspend.

Since we never want hpd work to run while suspending, and there's no
harm to delay them to be run after resume, mark the workqueue as
WQ_FREEZABLE so all works won't run while suspending.

Fixes: 409776fa3c42 ("drm/bridge: anx7625: add suspend / resume hooks")
Signed-off-by: Pi-Hsun Shih <pihsun@chromium.org>
Reviewed-by: Tzung-Bi Shih <tzungbi@google.com>
Signed-off-by: Robert Foss <robert.foss@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210615032937.2328468-1-pihsun@chromium.org
drivers/gpu/drm/bridge/analogix/anx7625.c

index 98e17551b00924499c7b9dcb441e97de194234ac..a3d82377066bb49b249ae5854e9bffc054e8235e 100644 (file)
@@ -1730,7 +1730,6 @@ static int __maybe_unused anx7625_suspend(struct device *dev)
        if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) {
                anx7625_runtime_pm_suspend(dev);
                disable_irq(ctx->pdata.intp_irq);
-               flush_workqueue(ctx->workqueue);
        }
 
        return 0;
@@ -1790,7 +1789,8 @@ static int anx7625_i2c_probe(struct i2c_client *client,
        platform->pdata.intp_irq = client->irq;
        if (platform->pdata.intp_irq) {
                INIT_WORK(&platform->work, anx7625_work_func);
-               platform->workqueue = create_workqueue("anx7625_work");
+               platform->workqueue = alloc_workqueue("anx7625_work",
+                                                     WQ_FREEZABLE | WQ_MEM_RECLAIM, 1);
                if (!platform->workqueue) {
                        DRM_DEV_ERROR(dev, "fail to create work queue\n");
                        ret = -ENOMEM;