mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 08:01:12 +02:00
drm/bridge: ti-sn65dsi83: Fix error handling in sn65dsi83_reset_work()
The error handling of sn65dsi83_reset_pipe() in sn65dsi83_reset_work() has seen a couple of changes that seems to cause a bit of confusion. While sn65dsi83_reset_work() has implemented an early exit if sn65dsi83_reset_pipe() fails since it was added, when a commit from Maxime Ripard switched to use drm_bridge_helper_reset_crtc() [1] the sn65dsi83_reset_pipe() function would no longer return an error code, so the early exit was then a no-op, and even on sn65dsi83_reset_pipe() failure, enable_irq() has been called. When drm_bridge_enter()/drm_bridge_exit() resource protection was added, the drm_bridge_exit() incidentally was always called, which is the correct approach. But only because the early exit in sn65dsi83_reset_pipe() was never hit because sn65dsi83_reset_pipe() always returns 0. In order get back to a situation where enable_irq() is not called on sn65dsi83_reset_pipe() failure, which should help protect against irq storms, we need to reintroduce a non-zero return value from sn65dsi83_reset_pipe() on error, and fix sn65dsi83_reset_work() so that we always exit the DRM bridge critical section with drm_bridge_exit(). [1] commite17fadff7a("drm/bridge: ti-sn65dsi83: Switch to drm_bridge_helper_reset_crtc") [2] commitd2e8d1bc84("drm/bridge: ti-sn65dsi83: protect device resources on unplug") Fixes:e17fadff7a("drm/bridge: ti-sn65dsi83: Switch to drm_bridge_helper_reset_crtc") Cc: stable@vger.kernel.org Signed-off-by: Esben Haabendal <esben@geanix.com> Reviewed-by: Herve Codina <herve.codina@bootlin.com> Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Link: https://patch.msgid.link/20260831-ti-sn65dsi83-fixes-v5-1-e712765d6c4f@geanix.com Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
This commit is contained in:
parent
ed761e0693
commit
4600b4d1a9
|
|
@ -403,7 +403,7 @@ static int sn65dsi83_reset_pipe(struct sn65dsi83 *sn65dsi83)
|
|||
drm_modeset_drop_locks(&ctx);
|
||||
drm_modeset_acquire_fini(&ctx);
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static void sn65dsi83_reset_work(struct work_struct *ws)
|
||||
|
|
@ -419,11 +419,13 @@ static void sn65dsi83_reset_work(struct work_struct *ws)
|
|||
ret = sn65dsi83_reset_pipe(ctx);
|
||||
if (ret) {
|
||||
dev_err(ctx->dev, "reset pipe failed %pe\n", ERR_PTR(ret));
|
||||
return;
|
||||
goto bridge_exit;
|
||||
}
|
||||
|
||||
if (ctx->irq)
|
||||
enable_irq(ctx->irq);
|
||||
|
||||
bridge_exit:
|
||||
drm_bridge_exit(idx);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user