Commit 3143c0c9 authored by Thomas Zimmermann's avatar Thomas Zimmermann Committed by Jani Nikula
Browse files

drm/i915: Initialize fbdev DRM client with callback functions



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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJouni Högander <jouni.hogander@intel.com>
Acked-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240409081029.17843-4-tzimmermann@suse.de


Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 7d4e13bd
Loading
Loading
Loading
Loading
+39 −4
Original line number Diff line number Diff line
@@ -291,6 +291,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);
}
@@ -584,6 +585,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);
@@ -605,16 +630,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)