drm/ast: Managed cursor release
authorThomas Zimmermann <tzimmermann@suse.de>
Thu, 2 Jul 2020 11:50:25 +0000 (13:50 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 7 Jul 2020 09:11:51 +0000 (11:11 +0200)
Register a release function to finalize cursors. The _fini() function
gets un-exported from the source file.

The function ast_mode_fini() is now empty and will be removed by a
later patch.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200702115029.5281-11-tzimmermann@suse.de
drivers/gpu/drm/ast/ast_cursor.c
drivers/gpu/drm/ast/ast_drv.h
drivers/gpu/drm/ast/ast_mode.c

index 3568040..acf0d23 100644 (file)
  */
 
 #include <drm/drm_gem_vram_helper.h>
+#include <drm/drm_managed.h>
 
 #include "ast_drv.h"
 
+static void ast_cursor_fini(struct ast_private *ast)
+{
+       size_t i;
+       struct drm_gem_vram_object *gbo;
+
+       for (i = 0; i < ARRAY_SIZE(ast->cursor.gbo); ++i) {
+               gbo = ast->cursor.gbo[i];
+               drm_gem_vram_vunmap(gbo, ast->cursor.vaddr[i]);
+               drm_gem_vram_unpin(gbo);
+               drm_gem_vram_put(gbo);
+       }
+}
+
+static void ast_cursor_release(struct drm_device *dev, void *ptr)
+{
+       struct ast_private *ast = dev->dev_private;
+
+       ast_cursor_fini(ast);
+}
+
 /*
  * Allocate cursor BOs and pins them at the end of VRAM.
  */
@@ -68,7 +89,7 @@ int ast_cursor_init(struct ast_private *ast)
                ast->cursor.vaddr[i] = vaddr;
        }
 
-       return 0;
+       return drmm_add_action_or_reset(dev, ast_cursor_release, NULL);
 
 err_drm_gem_vram_put:
        while (i) {
@@ -77,25 +98,10 @@ err_drm_gem_vram_put:
                drm_gem_vram_vunmap(gbo, ast->cursor.vaddr[i]);
                drm_gem_vram_unpin(gbo);
                drm_gem_vram_put(gbo);
-               ast->cursor.gbo[i] = NULL;
-               ast->cursor.vaddr[i] = NULL;
        }
        return ret;
 }
 
-void ast_cursor_fini(struct ast_private *ast)
-{
-       size_t i;
-       struct drm_gem_vram_object *gbo;
-
-       for (i = 0; i < ARRAY_SIZE(ast->cursor.gbo); ++i) {
-               gbo = ast->cursor.gbo[i];
-               drm_gem_vram_vunmap(gbo, ast->cursor.vaddr[i]);
-               drm_gem_vram_unpin(gbo);
-               drm_gem_vram_put(gbo);
-       }
-}
-
 static void update_cursor_image(u8 __iomem *dst, const u8 *src, int width, int height)
 {
        union {
index f465e0c..ea4de3d 100644 (file)
@@ -317,7 +317,6 @@ void ast_release_firmware(struct drm_device *dev);
 
 /* ast_cursor.c */
 int ast_cursor_init(struct ast_private *ast);
-void ast_cursor_fini(struct ast_private *ast);
 int ast_cursor_blit(struct ast_private *ast, struct drm_framebuffer *fb);
 void ast_cursor_page_flip(struct ast_private *ast);
 void ast_cursor_show(struct ast_private *ast, int x, int y,
index 8fdc464..4724a38 100644 (file)
@@ -1108,9 +1108,6 @@ int ast_mode_init(struct drm_device *dev)
 
 void ast_mode_fini(struct drm_device *dev)
 {
-       struct ast_private *ast = to_ast_private(dev);
-
-       ast_cursor_fini(ast);
 }
 
 static int get_clock(void *i2c_priv)