Skip to content

Commit 4d5b7da

Browse files
hsinyi527dianders
authored andcommitted
drm/bridge: anx7625: Ensure bridge is suspended in disable()
Similar to commit 26db46b ("drm/bridge: parade-ps8640: Ensure bridge is suspended in .post_disable()"). Add a mutex to ensure that aux transfer won't race with atomic_disable by holding the PM reference and prevent the bridge from suspend. Also we need to use pm_runtime_put_sync_suspend() to suspend the bridge instead of idle with pm_runtime_put_sync(). Fixes: 3203e49 ("drm/bridge: anx7625: Synchronously run runtime suspend.") Fixes: adca62e ("drm/bridge: anx7625: Support reading edid through aux channel") Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> Tested-by: Xuxin Xiong <xuxinxiong@huaqin.corp-partner.google.com> Reviewed-by: Pin-yen Lin <treapking@chromium.org> Reviewed-by: Douglas Anderson <dianders@chromium.org> Signed-off-by: Douglas Anderson <dianders@chromium.org> Link: https://patchwork.freedesktop.org/patch/msgid/20240118015916.2296741-1-hsinyi@chromium.org
1 parent 4b5581f commit 4d5b7da

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

drivers/gpu/drm/bridge/analogix/anx7625.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1762,6 +1762,7 @@ static ssize_t anx7625_aux_transfer(struct drm_dp_aux *aux,
17621762
u8 request = msg->request & ~DP_AUX_I2C_MOT;
17631763
int ret = 0;
17641764

1765+
mutex_lock(&ctx->aux_lock);
17651766
pm_runtime_get_sync(dev);
17661767
msg->reply = 0;
17671768
switch (request) {
@@ -1778,6 +1779,7 @@ static ssize_t anx7625_aux_transfer(struct drm_dp_aux *aux,
17781779
msg->size, msg->buffer);
17791780
pm_runtime_mark_last_busy(dev);
17801781
pm_runtime_put_autosuspend(dev);
1782+
mutex_unlock(&ctx->aux_lock);
17811783

17821784
return ret;
17831785
}
@@ -2474,7 +2476,9 @@ static void anx7625_bridge_atomic_disable(struct drm_bridge *bridge,
24742476
ctx->connector = NULL;
24752477
anx7625_dp_stop(ctx);
24762478

2477-
pm_runtime_put_sync(dev);
2479+
mutex_lock(&ctx->aux_lock);
2480+
pm_runtime_put_sync_suspend(dev);
2481+
mutex_unlock(&ctx->aux_lock);
24782482
}
24792483

24802484
static enum drm_connector_status
@@ -2668,6 +2672,7 @@ static int anx7625_i2c_probe(struct i2c_client *client)
26682672

26692673
mutex_init(&platform->lock);
26702674
mutex_init(&platform->hdcp_wq_lock);
2675+
mutex_init(&platform->aux_lock);
26712676

26722677
INIT_DELAYED_WORK(&platform->hdcp_work, hdcp_check_work_func);
26732678
platform->hdcp_workqueue = create_workqueue("hdcp workqueue");

drivers/gpu/drm/bridge/analogix/anx7625.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,8 @@ struct anx7625_data {
475475
struct workqueue_struct *hdcp_workqueue;
476476
/* Lock for hdcp work queue */
477477
struct mutex hdcp_wq_lock;
478+
/* Lock for aux transfer and disable */
479+
struct mutex aux_lock;
478480
char edid_block;
479481
struct display_timing dt;
480482
u8 display_timing_valid;

0 commit comments

Comments
 (0)