Hi Jagan, On 09.12.2022 16:23, Jagan Teki wrote: > The existing drm panels and bridges in Exynos required host > initialization during the first DSI command transfer even though > the initialization was done before. > > This host reinitialization is handled via DSIM_STATE_REINITIALIZED > flag and triggers from host transfer. > > Do this exclusively for Exynos. > > Initial logic is derived from Marek Szyprowski changes. > > Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > Signed-off-by: Jagan Teki <jagan@xxxxxxxxxxxxxxxxxxxx> > --- > Changes from v9: > - derived from v8 > - added comments > > drivers/gpu/drm/bridge/samsung-dsim.c | 15 ++++++++++++++- > include/drm/bridge/samsung-dsim.h | 5 +++-- > 2 files changed, 17 insertions(+), 3 deletions(-) The following chunk is missing compared to v8: diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c index 6e9ad955ebd3..6a9403cb92ae 100644 --- a/drivers/gpu/drm/bridge/samsung-dsim.c +++ b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -1315,7 +1315,9 @@ static int samsung_dsim_init(struct samsung_dsim *dsi, unsigned int flag) return 0; samsung_dsim_reset(dsi); - samsung_dsim_enable_irq(dsi); + + if (!(dsi->state & DSIM_STATE_INITIALIZED)) + samsung_dsim_enable_irq(dsi); if (driver_data->reg_values[RESET_TYPE] == DSIM_FUNCRST) samsung_dsim_enable_lane(dsi, BIT(dsi->lanes) - 1); > diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c > index 2e15d753fdd0..ec3ab679afd9 100644 > --- a/drivers/gpu/drm/bridge/samsung-dsim.c > +++ b/drivers/gpu/drm/bridge/samsung-dsim.c > @@ -1254,6 +1254,19 @@ static int samsung_dsim_init(struct samsung_dsim *dsi, unsigned int flag) > { > const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; > > + /* > + * FIXME: > + * The existing drm panels and bridges in Exynos required host > + * initialization during the first DSI command transfer even though > + * the initialization was done before. > + * > + * This host reinitialization is handled via DSIM_STATE_REINITIALIZED > + * flag and triggers from host transfer. Do this exclusively for Exynos. > + */ > + if ((dsi->plat_data->hw_type == SAMSUNG_DSIM_TYPE_IMX8MM) && > + dsi->state & DSIM_STATE_REINITIALIZED) > + return 0; > + > if (dsi->state & flag) > return 0; > > @@ -1467,7 +1480,7 @@ static ssize_t samsung_dsim_host_transfer(struct mipi_dsi_host *host, > if (!(dsi->state & DSIM_STATE_ENABLED)) > return -EINVAL; > > - ret = samsung_dsim_init(dsi, DSIM_STATE_INITIALIZED); > + ret = samsung_dsim_init(dsi, DSIM_STATE_REINITIALIZED); > if (ret) > return ret; > > diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h > index b8132bf8e36f..0c5a905f3de7 100644 > --- a/include/drm/bridge/samsung-dsim.h > +++ b/include/drm/bridge/samsung-dsim.h > @@ -17,8 +17,9 @@ struct samsung_dsim; > > #define DSIM_STATE_ENABLED BIT(0) > #define DSIM_STATE_INITIALIZED BIT(1) > -#define DSIM_STATE_CMD_LPM BIT(2) > -#define DSIM_STATE_VIDOUT_AVAILABLE BIT(3) > +#define DSIM_STATE_REINITIALIZED BIT(2) > +#define DSIM_STATE_CMD_LPM BIT(3) > +#define DSIM_STATE_VIDOUT_AVAILABLE BIT(4) > > enum samsung_dsim_type { > SAMSUNG_DSIM_TYPE_EXYNOS3250, Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland