On Mon, 3 Apr 2023 at 11:41, Thomas Zimmermann <tzimmermann@xxxxxxx> wrote: > > Move code from ad-hoc fbdev callbacks into DRM client functions > and remove the old callbacks. The functions instruct the client > to poll for changed output or restore the display. The DRM core > calls both, the old callbacks and the new client helpers, from > the same places. The new functions perform the same operation as > before, so there's no change in functionality. > > Replace all code that initializes or releases fbdev emulation > throughout the driver. Instead initialize the fbdev client by a > single call to omapdrm_fbdev_setup() after omapdrm has registered > its DRM device. As in most drivers, omapdrm's fbdev emulation now > acts like a regular DRM client. > > The fbdev client setup consists of the initial preparation and the > hot-plugging of the display. The latter creates the fbdev device > and sets up the fbdev framebuffer. The setup performs display > hot-plugging once. If no display can be detected, DRM probe helpers > re-run the detection on each hotplug event. > > A call to drm_dev_unregister() releases the client automatically. > No further action is required within omapdrm. If the fbdev > framebuffer has been fully set up, struct fb_ops.fb_destroy > implements the release. For partially initialized emulation, the > fbdev client reverts the initial setup. > > v2: > * init drm_client in this patch (Tomi) > * don't handle non-atomic modesetting (Tomi) > > Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx> > Reviewed-by: Tomi Valkeinen <tomi.valkeinen@xxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/omapdrm/omap_drv.c | 11 +-- > drivers/gpu/drm/omapdrm/omap_fbdev.c | 132 +++++++++++++++++---------- > drivers/gpu/drm/omapdrm/omap_fbdev.h | 9 +- > 3 files changed, 90 insertions(+), 62 deletions(-) > > +static void omap_fbdev_fb_destroy(struct fb_info *info) > +{ > + struct drm_fb_helper *helper = info->par; > + struct drm_framebuffer *fb = helper->fb; > + struct drm_gem_object *bo = drm_gem_fb_get_obj(fb, 0); > + struct omap_fbdev *fbdev = to_omap_fbdev(helper); > + > + DBG(); > + What a lovely little surprise. It's a pre-existing "feature", so let's ignore that for now ;-) > + drm_fb_helper_fini(helper); > + > + omap_gem_unpin(bo); > + drm_framebuffer_remove(fb); > + > + drm_client_release(&helper->client); > + drm_fb_helper_unprepare(helper); > + kfree(fbdev); > +} > -void omap_fbdev_fini(struct drm_device *dev) > +static const struct drm_client_funcs omap_fbdev_client_funcs = { > + .owner = THIS_MODULE, > + .unregister = omap_fbdev_client_unregister, > + .restore = omap_fbdev_client_restore, > + .hotplug = omap_fbdev_client_hotplug, AFAICT the fbdev client helpers above are identical to the generic ones in drm_fbdev_generic.c. Why aren't we reusing those but copy/pasting them in the driver? Thanks Emil