On Thu, May 28, 2026 at 2:41 PM Dominique Belhachemi <[email protected]> wrote:
>
> The segment_addr and ddc_addr fields need to be reset per I2C transfer
> to avoid stale values. The reset wasn't required on simple displays with
> only one segment, but modern displays with two or more segments end up
> with corrupt EDIDs.
>
> This was found on a StarFive VisionFive 2 SBC.
>
> Signed-off-by: Dominique Belhachemi <[email protected]>
> ---
>  drivers/gpu/drm/bridge/inno-hdmi.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/drivers/gpu/drm/bridge/inno-hdmi.c 
> b/drivers/gpu/drm/bridge/inno-hdmi.c
> index 5fa533a4eb342..297be02bbd58d 100644
> --- a/drivers/gpu/drm/bridge/inno-hdmi.c
> +++ b/drivers/gpu/drm/bridge/inno-hdmi.c
> @@ -989,6 +989,10 @@ static int inno_hdmi_i2c_xfer(struct i2c_adapter *adap,
>
>         mutex_lock(&i2c->lock);
>
> +       /* Reset segment_addr and ddc_addr at the start of every I2C transfer 
> */
> +       i2c->ddc_addr = 0;
> +       i2c->segment_addr = 0;
> +
>         /* Clear the EDID interrupt flag and unmute the interrupt */
>         hdmi_writeb(hdmi, HDMI_INTERRUPT_MASK1, m_INT_EDID_READY);
>         hdmi_writeb(hdmi, HDMI_INTERRUPT_STATUS1, m_INT_EDID_READY);
> --

Hi, Is there anything else I can provide to get this merged?

Thanks
-Dominique

Reply via email to