Message ID | 20240301134448.31289-5-tzimmermann@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915: Convert fbdev to DRM client | expand |
On Fri, 2024-03-01 at 14:42 +0100, Thomas Zimmermann wrote: > Initialize i915's fbdev client by giving an instance of struct > drm_client_funcs to drm_client_init(). Also clean up with > drm_client_release(). > > Doing this in i915 prevents fbdev helpers from initializing and > releasing the client internally (see drm_fb_helper_init()). No > functional change yet; the client callbacks will be filled later. > > v6: > * rename client to "intel-fbdev" (Jouni) > v2: > * call drm_fb_helper_unprepare() in error handling (Jani) > * fix typo in commit message (Sam) > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Jouni Högander <jouni.hogander@intel.com> > --- > drivers/gpu/drm/i915/display/intel_fbdev.c | 43 > ++++++++++++++++++++-- > 1 file changed, 39 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c > b/drivers/gpu/drm/i915/display/intel_fbdev.c > index 76c0e89bf25e8..32aeb5faf706b 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbdev.c > +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c > @@ -286,6 +286,7 @@ static void intel_fbdev_destroy(struct > intel_fbdev *ifbdev) > if (ifbdev->fb) > drm_framebuffer_remove(&ifbdev->fb->base); > > + drm_client_release(&ifbdev->helper.client); > drm_fb_helper_unprepare(&ifbdev->helper); > kfree(ifbdev); > } > @@ -579,6 +580,30 @@ void intel_fbdev_restore_mode(struct > drm_i915_private *dev_priv) > intel_fbdev_invalidate(ifbdev); > } > > +/* > + * Fbdev client and struct drm_client_funcs > + */ > + > +static void intel_fbdev_client_unregister(struct drm_client_dev > *client) > +{ } > + > +static int intel_fbdev_client_restore(struct drm_client_dev *client) > +{ > + return 0; > +} > + > +static int intel_fbdev_client_hotplug(struct drm_client_dev *client) > +{ > + return 0; > +} > + > +static const struct drm_client_funcs intel_fbdev_client_funcs = { > + .owner = THIS_MODULE, > + .unregister = intel_fbdev_client_unregister, > + .restore = intel_fbdev_client_restore, > + .hotplug = intel_fbdev_client_hotplug, > +}; > + > int intel_fbdev_init(struct drm_device *dev) > { > struct drm_i915_private *dev_priv = to_i915(dev); > @@ -600,16 +625,26 @@ int intel_fbdev_init(struct drm_device *dev) > else > ifbdev->preferred_bpp = ifbdev->helper.preferred_bpp; > > + ret = drm_client_init(dev, &ifbdev->helper.client, "intel- > fbdev", > + &intel_fbdev_client_funcs); > + if (ret) > + goto err_drm_fb_helper_unprepare; > + > ret = drm_fb_helper_init(dev, &ifbdev->helper); > - if (ret) { > - kfree(ifbdev); > - return ret; > - } > + if (ret) > + goto err_drm_client_release; > > dev_priv->display.fbdev.fbdev = ifbdev; > INIT_WORK(&dev_priv->display.fbdev.suspend_work, > intel_fbdev_suspend_worker); > > return 0; > + > +err_drm_client_release: > + drm_client_release(&ifbdev->helper.client); > +err_drm_fb_helper_unprepare: > + drm_fb_helper_unprepare(&ifbdev->helper); > + kfree(ifbdev); > + return ret; > } > > static void intel_fbdev_initial_config(void *data, async_cookie_t > cookie)
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c index 76c0e89bf25e8..32aeb5faf706b 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c @@ -286,6 +286,7 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev) if (ifbdev->fb) drm_framebuffer_remove(&ifbdev->fb->base); + drm_client_release(&ifbdev->helper.client); drm_fb_helper_unprepare(&ifbdev->helper); kfree(ifbdev); } @@ -579,6 +580,30 @@ void intel_fbdev_restore_mode(struct drm_i915_private *dev_priv) intel_fbdev_invalidate(ifbdev); } +/* + * Fbdev client and struct drm_client_funcs + */ + +static void intel_fbdev_client_unregister(struct drm_client_dev *client) +{ } + +static int intel_fbdev_client_restore(struct drm_client_dev *client) +{ + return 0; +} + +static int intel_fbdev_client_hotplug(struct drm_client_dev *client) +{ + return 0; +} + +static const struct drm_client_funcs intel_fbdev_client_funcs = { + .owner = THIS_MODULE, + .unregister = intel_fbdev_client_unregister, + .restore = intel_fbdev_client_restore, + .hotplug = intel_fbdev_client_hotplug, +}; + int intel_fbdev_init(struct drm_device *dev) { struct drm_i915_private *dev_priv = to_i915(dev); @@ -600,16 +625,26 @@ int intel_fbdev_init(struct drm_device *dev) else ifbdev->preferred_bpp = ifbdev->helper.preferred_bpp; + ret = drm_client_init(dev, &ifbdev->helper.client, "intel-fbdev", + &intel_fbdev_client_funcs); + if (ret) + goto err_drm_fb_helper_unprepare; + ret = drm_fb_helper_init(dev, &ifbdev->helper); - if (ret) { - kfree(ifbdev); - return ret; - } + if (ret) + goto err_drm_client_release; dev_priv->display.fbdev.fbdev = ifbdev; INIT_WORK(&dev_priv->display.fbdev.suspend_work, intel_fbdev_suspend_worker); return 0; + +err_drm_client_release: + drm_client_release(&ifbdev->helper.client); +err_drm_fb_helper_unprepare: + drm_fb_helper_unprepare(&ifbdev->helper); + kfree(ifbdev); + return ret; } static void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
Initialize i915's fbdev client by giving an instance of struct drm_client_funcs to drm_client_init(). Also clean up with drm_client_release(). Doing this in i915 prevents fbdev helpers from initializing and releasing the client internally (see drm_fb_helper_init()). No functional change yet; the client callbacks will be filled later. v6: * rename client to "intel-fbdev" (Jouni) v2: * call drm_fb_helper_unprepare() in error handling (Jani) * fix typo in commit message (Sam) Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> --- drivers/gpu/drm/i915/display/intel_fbdev.c | 43 ++++++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-)