summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/armada/armada_fbdev.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/drivers/gpu/drm/armada/armada_fbdev.c b/drivers/gpu/drm/armada/armada_fbdev.c
index 0e44f53e9fa4..303c55704225 100644
--- a/drivers/gpu/drm/armada/armada_fbdev.c
+++ b/drivers/gpu/drm/armada/armada_fbdev.c
@@ -117,6 +117,32 @@ static const struct drm_fb_helper_funcs armada_fb_helper_funcs = {
.fb_probe = armada_fb_probe,
};
+/*
+ * Fbdev client and struct drm_client_funcs
+ */
+
+static void armada_fbdev_client_unregister(struct drm_client_dev *client)
+{ }
+
+static int armada_fbdev_client_restore(struct drm_client_dev *client)
+{
+ drm_fb_helper_lastclose(client->dev);
+
+ return 0;
+}
+
+static int armada_fbdev_client_hotplug(struct drm_client_dev *client)
+{
+ return 0;
+}
+
+static const struct drm_client_funcs armada_fbdev_client_funcs = {
+ .owner = THIS_MODULE,
+ .unregister = armada_fbdev_client_unregister,
+ .restore = armada_fbdev_client_restore,
+ .hotplug = armada_fbdev_client_hotplug,
+};
+
int armada_fbdev_init(struct drm_device *dev)
{
struct armada_private *priv = drm_to_armada_dev(dev);
@@ -131,22 +157,30 @@ int armada_fbdev_init(struct drm_device *dev)
drm_fb_helper_prepare(dev, fbh, 32, &armada_fb_helper_funcs);
+ ret = drm_client_init(dev, &fbh->client, "armada-fbdev",
+ &armada_fbdev_client_funcs);
+ if (ret)
+ goto err_drm_fb_helper_unprepare;
+
ret = drm_fb_helper_init(dev, fbh);
if (ret) {
DRM_ERROR("failed to initialize drm fb helper\n");
- goto err_fb_helper;
+ goto err_drm_client_release;
}
ret = drm_fb_helper_initial_config(fbh);
if (ret) {
DRM_ERROR("failed to set initial config\n");
- goto err_fb_setup;
+ goto err_drm_fb_helper_fini;
}
return 0;
- err_fb_setup:
+
+err_drm_fb_helper_fini:
drm_fb_helper_fini(fbh);
- err_fb_helper:
+err_drm_client_release:
+ drm_client_release(&fbh->client);
+err_drm_fb_helper_unprepare:
drm_fb_helper_unprepare(fbh);
priv->fbdev = NULL;
return ret;
@@ -161,6 +195,7 @@ void armada_fbdev_fini(struct drm_device *dev)
drm_fb_helper_unregister_info(fbh);
drm_fb_helper_fini(fbh);
+ drm_client_release(&fbh->client);
if (fbh->fb)
fbh->fb->funcs->destroy(fbh->fb);