Hi,
On 5/20/24 19:13, Dmitry Baryshkov wrote:
On Mon, 20 May 2024 at 14:11, Sui Jingfeng <sui.jingfeng@xxxxxxxxx> wrote:
Hi,
On 5/20/24 06:11, Dmitry Baryshkov wrote:
On Thu, May 16, 2024 at 06:10:06PM +0800, Liu Ying wrote:
Commit f3d9683346d6 ("drm/bridge: adv7511: Allow IRQ to share GPIO pins")
fails to consider the case where adv7511->i2c_main->irq is zero, i.e.,
no interrupt requested at all.
Without interrupt, adv7511_wait_for_edid() could return -EIO sometimes,
because it polls adv7511->edid_read flag by calling adv7511_irq_process()
a few times, but adv7511_irq_process() happens to refuse to handle
interrupt by returning -ENODATA. Hence, EDID retrieval fails randomly.
Fix the issue by checking adv7511->i2c_main->irq before exiting interrupt
handling from adv7511_irq_process().
Fixes: f3d9683346d6 ("drm/bridge: adv7511: Allow IRQ to share GPIO pins")
Signed-off-by: Liu Ying <victor.liu@xxxxxxx>
---
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index 6089b0bb9321..2074fa3c1b7b 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -479,7 +479,8 @@ static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd)
return ret;
/* If there is no IRQ to handle, exit indicating no IRQ data */
- if (!(irq0 & (ADV7511_INT0_HPD | ADV7511_INT0_EDID_READY)) &&
+ if (adv7511->i2c_main->irq &&
+ !(irq0 & (ADV7511_INT0_HPD | ADV7511_INT0_EDID_READY)) &&
!(irq1 & ADV7511_INT1_DDC_ERROR))
return -ENODATA;
I think it might be better to handle -ENODATA in adv7511_wait_for_edid()
instead. WDYT?
I think this is may deserve another patch.
My point is that the IRQ handler is fine to remove -ENODATA here,
[...]
there is no pending IRQ that can be handled.
But there may has other things need to do in the adv7511_irq_process()
function.
So instead of continuing
the execution when we know that IRQ bits are not set,
Even when IRQ bits are not set, it just means that there is no HPD
and no EDID ready-to-read signal. HDMI CEC interrupts still need
to process.
it's better to
ignore -ENODATA in the calling code and go on with msleep().
So, It's confusing to ignore the -ENODATA here.
--
Best regards
Sui