On Fri, Jul 21, 2023 at 8:28 AM Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> wrote: > > Samsung DSIM used in older Exynos SoCs (like Exynos 4210, 4x12, 3250) > doesn't report empty level of packer header FIFO. In case of those SoCs, > use the old way of waiting for empty command tranfsfer FIFO, removed > recently by commit 14806c641582 ("Drain command transfer FIFO before > transfer"). > > Fixes: 14806c641582 ("Drain command transfer FIFO before transfer") Nitpick: the Subject of the commit log is not complete. Fixes: 14806c641582 ("drm: bridge: samsung-dsim: Drain command transfer FIFO before transfer") > Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > --- > v2: > - added additional delay when workaround is used as suggested by Marek Vasut > > v1: https://lore.kernel.org/all/20230718131859.3114135-1-m.szyprowski@xxxxxxxxxxx/ > --- > drivers/gpu/drm/bridge/samsung-dsim.c | 18 ++++++++++++++++-- > include/drm/bridge/samsung-dsim.h | 1 + > 2 files changed, 17 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c > index 9b7a00bafeaa..d06401de637c 100644 > --- a/drivers/gpu/drm/bridge/samsung-dsim.c > +++ b/drivers/gpu/drm/bridge/samsung-dsim.c > @@ -412,6 +412,7 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = { > .m_min = 41, > .m_max = 125, > .min_freq = 500, > + .has_broken_fifoctrl_emptyhdr = 1, > }; > > static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = { > @@ -428,6 +429,7 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = { > .m_min = 41, > .m_max = 125, > .min_freq = 500, > + .has_broken_fifoctrl_emptyhdr = 1, > }; > > static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = { > @@ -1009,8 +1011,20 @@ static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi) > do { > u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); > > - if (reg & DSIM_SFR_HEADER_EMPTY) > - return 0; > + if (!dsi->driver_data->has_broken_fifoctrl_emptyhdr) { > + if (reg & DSIM_SFR_HEADER_EMPTY) > + return 0; > + } else { > + if (!(reg & DSIM_SFR_HEADER_FULL)) { > + /* > + * Wait a little bit, so the pending data can > + * actually leave the FIFO to avoid overflow. > + */ > + if (!cond_resched()) > + usleep_range(950, 1050); > + return 0; > + } > + } > > if (!cond_resched()) > usleep_range(950, 1050); > diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h > index 05100e91ecb9..18017b3e5d9e 100644 > --- a/include/drm/bridge/samsung-dsim.h > +++ b/include/drm/bridge/samsung-dsim.h > @@ -62,6 +62,7 @@ struct samsung_dsim_driver_data { > const unsigned int *reg_values; > u16 m_min; > u16 m_max; > + unsigned int has_broken_fifoctrl_emptyhdr; > }; > > struct samsung_dsim_host_ops { > -- > 2.34.1 >