On 08.09.2018 15:46, Noralf Trønnes wrote: > The CMA helper is already using the drm_fb_helper_generic_probe part of > the generic fbdev emulation. This patch makes full use of the generic > fbdev emulation by using its drm_client callbacks. This means that > drm_mode_config_funcs->output_poll_changed and drm_driver->lastclose are > now handled by the emulation code. Additionally fbdev unregister happens > automatically on drm_dev_unregister(). > > The drm_fbdev_generic_setup() call is put after drm_dev_register() in the > driver. This is done to highlight the fact that fbdev emulation is an > internal client that makes use of the driver, it is not part of the > driver as such. If fbdev setup fails, an error is printed, but the driver > succeeds probing. I think the last sentence is currently not implemented, I think it will silently succeed probing. Can we add something like this, similar to tinydrm-core.c? if (ret) DRM_ERROR("Failed to initialize fbdev: %d\n", ret); -- Stefan > > Cc: Stefan Agner <stefan@xxxxxxxx> > Cc: Alison Wang <alison.wang@xxxxxxx> > Signed-off-by: Noralf Trønnes <noralf@xxxxxxxxxxx> > --- > drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 25 +++---------------------- > drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h | 1 - > 2 files changed, 3 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c > b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c > index 80232321a244..15816141e5fb 100644 > --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c > +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c > @@ -26,6 +26,7 @@ > #include <drm/drm_atomic_helper.h> > #include <drm/drm_crtc_helper.h> > #include <drm/drm_fb_cma_helper.h> > +#include <drm/drm_fb_helper.h> > #include <drm/drm_gem_cma_helper.h> > #include <drm/drm_modeset_helper.h> > > @@ -89,20 +90,11 @@ static int fsl_dcu_load(struct drm_device *dev, > unsigned long flags) > "Invalid legacyfb_depth. Defaulting to 24bpp\n"); > legacyfb_depth = 24; > } > - fsl_dev->fbdev = drm_fbdev_cma_init(dev, legacyfb_depth, 1); > - if (IS_ERR(fsl_dev->fbdev)) { > - ret = PTR_ERR(fsl_dev->fbdev); > - fsl_dev->fbdev = NULL; > - goto done; > - } > > return 0; > done: > drm_kms_helper_poll_fini(dev); > > - if (fsl_dev->fbdev) > - drm_fbdev_cma_fini(fsl_dev->fbdev); > - > drm_mode_config_cleanup(dev); > drm_irq_uninstall(dev); > dev->dev_private = NULL; > @@ -112,14 +104,9 @@ static int fsl_dcu_load(struct drm_device *dev, > unsigned long flags) > > static void fsl_dcu_unload(struct drm_device *dev) > { > - struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; > - > drm_atomic_helper_shutdown(dev); > drm_kms_helper_poll_fini(dev); > > - if (fsl_dev->fbdev) > - drm_fbdev_cma_fini(fsl_dev->fbdev); > - > drm_mode_config_cleanup(dev); > drm_irq_uninstall(dev); > > @@ -147,19 +134,11 @@ static irqreturn_t fsl_dcu_drm_irq(int irq, void *arg) > return IRQ_HANDLED; > } > > -static void fsl_dcu_drm_lastclose(struct drm_device *dev) > -{ > - struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; > - > - drm_fbdev_cma_restore_mode(fsl_dev->fbdev); > -} > - > DEFINE_DRM_GEM_CMA_FOPS(fsl_dcu_drm_fops); > > static struct drm_driver fsl_dcu_drm_driver = { > .driver_features = DRIVER_HAVE_IRQ | DRIVER_GEM | DRIVER_MODESET > | DRIVER_PRIME | DRIVER_ATOMIC, > - .lastclose = fsl_dcu_drm_lastclose, > .load = fsl_dcu_load, > .unload = fsl_dcu_unload, > .irq_handler = fsl_dcu_drm_irq, > @@ -355,6 +334,8 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev) > if (ret < 0) > goto unref; > > + drm_fbdev_generic_setup(drm, legacyfb_depth); > + > return 0; > > unref: > diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h > b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h > index 93bfb98012d4..cb87bb74cb87 100644 > --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h > +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h > @@ -191,7 +191,6 @@ struct fsl_dcu_drm_device { > /*protects hardware register*/ > spinlock_t irq_lock; > struct drm_device *drm; > - struct drm_fbdev_cma *fbdev; > struct drm_crtc crtc; > struct drm_encoder encoder; > struct fsl_dcu_drm_connector connector; _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel