Message ID | 20181128212713.43500-3-noralf@tronnes.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/cma-helper drivers: Use drm_fbdev_generic_setup() | expand |
Den 28.11.2018 22.27, skrev Noralf Trønnes: > 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. > > Cc: Marek Vasut <marex@denx.de> > Signed-off-by: Noralf Trønnes <noralf@tronnes.org> > Acked-by: Sam Ravnborg <sam@ravnborg.org> > --- Applied to drm-misc-next. Noralf. > drivers/gpu/drm/mxsfb/mxsfb_drv.c | 26 ++------------------------ > drivers/gpu/drm/mxsfb/mxsfb_drv.h | 1 - > 2 files changed, 2 insertions(+), 25 deletions(-) > > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c > index 88ba003979e6..13e778825098 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c > +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c > @@ -263,23 +263,12 @@ static int mxsfb_load(struct drm_device *drm, unsigned long flags) > > drm_kms_helper_poll_init(drm); > > - mxsfb->fbdev = drm_fbdev_cma_init(drm, 32, > - drm->mode_config.num_connector); > - if (IS_ERR(mxsfb->fbdev)) { > - ret = PTR_ERR(mxsfb->fbdev); > - mxsfb->fbdev = NULL; > - dev_err(drm->dev, "Failed to init FB CMA area\n"); > - goto err_cma; > - } > - > platform_set_drvdata(pdev, drm); > > drm_helper_hpd_irq_event(drm); > > return 0; > > -err_cma: > - drm_irq_uninstall(drm); > err_irq: > drm_panel_detach(mxsfb->panel); > err_vblank: > @@ -290,11 +279,6 @@ static int mxsfb_load(struct drm_device *drm, unsigned long flags) > > static void mxsfb_unload(struct drm_device *drm) > { > - struct mxsfb_drm_private *mxsfb = drm->dev_private; > - > - if (mxsfb->fbdev) > - drm_fbdev_cma_fini(mxsfb->fbdev); > - > drm_kms_helper_poll_fini(drm); > drm_mode_config_cleanup(drm); > > @@ -307,13 +291,6 @@ static void mxsfb_unload(struct drm_device *drm) > pm_runtime_disable(drm->dev); > } > > -static void mxsfb_lastclose(struct drm_device *drm) > -{ > - struct mxsfb_drm_private *mxsfb = drm->dev_private; > - > - drm_fbdev_cma_restore_mode(mxsfb->fbdev); > -} > - > static void mxsfb_irq_preinstall(struct drm_device *drm) > { > struct mxsfb_drm_private *mxsfb = drm->dev_private; > @@ -347,7 +324,6 @@ static struct drm_driver mxsfb_driver = { > .driver_features = DRIVER_GEM | DRIVER_MODESET | > DRIVER_PRIME | DRIVER_ATOMIC | > DRIVER_HAVE_IRQ, > - .lastclose = mxsfb_lastclose, > .irq_handler = mxsfb_irq_handler, > .irq_preinstall = mxsfb_irq_preinstall, > .irq_uninstall = mxsfb_irq_preinstall, > @@ -412,6 +388,8 @@ static int mxsfb_probe(struct platform_device *pdev) > if (ret) > goto err_unload; > > + drm_fbdev_generic_setup(drm, 32); > + > return 0; > > err_unload: > diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.h b/drivers/gpu/drm/mxsfb/mxsfb_drv.h > index 5d0883fc805b..bedd6801edca 100644 > --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.h > +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.h > @@ -37,7 +37,6 @@ struct mxsfb_drm_private { > struct drm_simple_display_pipe pipe; > struct drm_connector connector; > struct drm_panel *panel; > - struct drm_fbdev_cma *fbdev; > }; > > int mxsfb_setup_crtc(struct drm_device *dev); >
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c index 88ba003979e6..13e778825098 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c @@ -263,23 +263,12 @@ static int mxsfb_load(struct drm_device *drm, unsigned long flags) drm_kms_helper_poll_init(drm); - mxsfb->fbdev = drm_fbdev_cma_init(drm, 32, - drm->mode_config.num_connector); - if (IS_ERR(mxsfb->fbdev)) { - ret = PTR_ERR(mxsfb->fbdev); - mxsfb->fbdev = NULL; - dev_err(drm->dev, "Failed to init FB CMA area\n"); - goto err_cma; - } - platform_set_drvdata(pdev, drm); drm_helper_hpd_irq_event(drm); return 0; -err_cma: - drm_irq_uninstall(drm); err_irq: drm_panel_detach(mxsfb->panel); err_vblank: @@ -290,11 +279,6 @@ static int mxsfb_load(struct drm_device *drm, unsigned long flags) static void mxsfb_unload(struct drm_device *drm) { - struct mxsfb_drm_private *mxsfb = drm->dev_private; - - if (mxsfb->fbdev) - drm_fbdev_cma_fini(mxsfb->fbdev); - drm_kms_helper_poll_fini(drm); drm_mode_config_cleanup(drm); @@ -307,13 +291,6 @@ static void mxsfb_unload(struct drm_device *drm) pm_runtime_disable(drm->dev); } -static void mxsfb_lastclose(struct drm_device *drm) -{ - struct mxsfb_drm_private *mxsfb = drm->dev_private; - - drm_fbdev_cma_restore_mode(mxsfb->fbdev); -} - static void mxsfb_irq_preinstall(struct drm_device *drm) { struct mxsfb_drm_private *mxsfb = drm->dev_private; @@ -347,7 +324,6 @@ static struct drm_driver mxsfb_driver = { .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC | DRIVER_HAVE_IRQ, - .lastclose = mxsfb_lastclose, .irq_handler = mxsfb_irq_handler, .irq_preinstall = mxsfb_irq_preinstall, .irq_uninstall = mxsfb_irq_preinstall, @@ -412,6 +388,8 @@ static int mxsfb_probe(struct platform_device *pdev) if (ret) goto err_unload; + drm_fbdev_generic_setup(drm, 32); + return 0; err_unload: diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.h b/drivers/gpu/drm/mxsfb/mxsfb_drv.h index 5d0883fc805b..bedd6801edca 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.h +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.h @@ -37,7 +37,6 @@ struct mxsfb_drm_private { struct drm_simple_display_pipe pipe; struct drm_connector connector; struct drm_panel *panel; - struct drm_fbdev_cma *fbdev; }; int mxsfb_setup_crtc(struct drm_device *dev);