On 31/12/2021 00:55, Martin Blumenstingl wrote: > Use this to simplify the driver shutdown. It will also come handy when > fixing the error handling in meson_drv_bind_master(). > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@xxxxxxxxxxxxxx> > --- > drivers/gpu/drm/meson/meson_drv.c | 6 ++-- > drivers/gpu/drm/meson/meson_osd_afbcd.c | 41 ++++++++++++++++--------- > drivers/gpu/drm/meson/meson_osd_afbcd.h | 1 + > 3 files changed, 30 insertions(+), 18 deletions(-) > > diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c > index 80f1d439841a..b919271a6e50 100644 > --- a/drivers/gpu/drm/meson/meson_drv.c > +++ b/drivers/gpu/drm/meson/meson_drv.c > @@ -385,10 +385,8 @@ static void meson_drv_unbind(struct device *dev) > free_irq(priv->vsync_irq, drm); > drm_dev_put(drm); > > - if (priv->afbcd.ops) { > - priv->afbcd.ops->reset(priv); > - meson_rdma_free(priv); > - } > + if (priv->afbcd.ops) > + priv->afbcd.ops->exit(priv); > } > > static const struct component_master_ops meson_drv_master_ops = { > diff --git a/drivers/gpu/drm/meson/meson_osd_afbcd.c b/drivers/gpu/drm/meson/meson_osd_afbcd.c > index ffc6b584dbf8..0cdbe899402f 100644 > --- a/drivers/gpu/drm/meson/meson_osd_afbcd.c > +++ b/drivers/gpu/drm/meson/meson_osd_afbcd.c > @@ -79,11 +79,6 @@ static bool meson_gxm_afbcd_supported_fmt(u64 modifier, uint32_t format) > return meson_gxm_afbcd_pixel_fmt(modifier, format) >= 0; > } > > -static int meson_gxm_afbcd_init(struct meson_drm *priv) > -{ > - return 0; > -} > - > static int meson_gxm_afbcd_reset(struct meson_drm *priv) > { > writel_relaxed(VIU_SW_RESET_OSD1_AFBCD, > @@ -93,6 +88,16 @@ static int meson_gxm_afbcd_reset(struct meson_drm *priv) > return 0; > } > > +static int meson_gxm_afbcd_init(struct meson_drm *priv) > +{ > + return 0; > +} > + > +static void meson_gxm_afbcd_exit(struct meson_drm *priv) > +{ > + meson_gxm_afbcd_reset(priv); > +} > + > static int meson_gxm_afbcd_enable(struct meson_drm *priv) > { > writel_relaxed(FIELD_PREP(OSD1_AFBCD_ID_FIFO_THRD, 0x40) | > @@ -172,6 +177,7 @@ static int meson_gxm_afbcd_setup(struct meson_drm *priv) > > struct meson_afbcd_ops meson_afbcd_gxm_ops = { > .init = meson_gxm_afbcd_init, > + .exit = meson_gxm_afbcd_exit, > .reset = meson_gxm_afbcd_reset, > .enable = meson_gxm_afbcd_enable, > .disable = meson_gxm_afbcd_disable, > @@ -269,6 +275,18 @@ static bool meson_g12a_afbcd_supported_fmt(u64 modifier, uint32_t format) > return meson_g12a_afbcd_pixel_fmt(modifier, format) >= 0; > } > > +static int meson_g12a_afbcd_reset(struct meson_drm *priv) > +{ > + meson_rdma_reset(priv); > + > + meson_rdma_writel_sync(priv, VIU_SW_RESET_G12A_AFBC_ARB | > + VIU_SW_RESET_G12A_OSD1_AFBCD, > + VIU_SW_RESET); > + meson_rdma_writel_sync(priv, 0, VIU_SW_RESET); > + > + return 0; > +} > + > static int meson_g12a_afbcd_init(struct meson_drm *priv) > { > int ret; > @@ -286,16 +304,10 @@ static int meson_g12a_afbcd_init(struct meson_drm *priv) > return 0; > } > > -static int meson_g12a_afbcd_reset(struct meson_drm *priv) > +static void meson_g12a_afbcd_exit(struct meson_drm *priv) > { > - meson_rdma_reset(priv); > - > - meson_rdma_writel_sync(priv, VIU_SW_RESET_G12A_AFBC_ARB | > - VIU_SW_RESET_G12A_OSD1_AFBCD, > - VIU_SW_RESET); > - meson_rdma_writel_sync(priv, 0, VIU_SW_RESET); > - > - return 0; > + meson_g12a_afbcd_reset(priv); > + meson_rdma_free(priv); > } > > static int meson_g12a_afbcd_enable(struct meson_drm *priv) > @@ -380,6 +392,7 @@ static int meson_g12a_afbcd_setup(struct meson_drm *priv) > > struct meson_afbcd_ops meson_afbcd_g12a_ops = { > .init = meson_g12a_afbcd_init, > + .exit = meson_g12a_afbcd_exit, > .reset = meson_g12a_afbcd_reset, > .enable = meson_g12a_afbcd_enable, > .disable = meson_g12a_afbcd_disable, > diff --git a/drivers/gpu/drm/meson/meson_osd_afbcd.h b/drivers/gpu/drm/meson/meson_osd_afbcd.h > index 5e5523304f42..e77ddeb6416f 100644 > --- a/drivers/gpu/drm/meson/meson_osd_afbcd.h > +++ b/drivers/gpu/drm/meson/meson_osd_afbcd.h > @@ -14,6 +14,7 @@ > > struct meson_afbcd_ops { > int (*init)(struct meson_drm *priv); > + void (*exit)(struct meson_drm *priv); > int (*reset)(struct meson_drm *priv); > int (*enable)(struct meson_drm *priv); > int (*disable)(struct meson_drm *priv); > Acked-by: Neil Armstrong <narmstrong@xxxxxxxxxxxx> Thanks for fixing this Neil