Skip to content

Commit a16f6ba

Browse files
committed
drm/client: Add client free callback to unprepare fb_helper
Add free callback to struct drm_client_funcs. Invoke function to free the client memory as part of the release process. Implement free for fbdev emulation. Fbdev emulation allocates and prepares client memory in drm_fbdev_client_setup(). The release happens in fb_destroy from struct fb_ops. Multiple implementations of this callback exist in the various drivers that provide an fbdev implementation. Each of them needs to follow the implementation details of the fbdev setup code. Adding a free callback for the client puts the unprepare and release of the fbdev client in a single place. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> # core, msm Acked-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> # omapdrm Acked-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> # gma500 Acked-by: Alex Deucher <alexander.deucher@amd.com> Link: https://lore.kernel.org/r/20251009132006.45834-2-tzimmermann@suse.de
1 parent 550f4dd commit a16f6ba

14 files changed

Lines changed: 29 additions & 27 deletions

File tree

drivers/gpu/drm/armada/armada_fbdev.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ static void armada_fbdev_fb_destroy(struct fb_info *info)
2828
fbh->fb->funcs->destroy(fbh->fb);
2929

3030
drm_client_release(&fbh->client);
31-
drm_fb_helper_unprepare(fbh);
32-
kfree(fbh);
3331
}
3432

3533
static const struct fb_ops armada_fb_ops = {

drivers/gpu/drm/clients/drm_fbdev_client.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,28 @@
1313
* struct drm_client_funcs
1414
*/
1515

16+
static void drm_fbdev_client_free(struct drm_client_dev *client)
17+
{
18+
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
19+
20+
drm_fb_helper_unprepare(fb_helper);
21+
kfree(fb_helper);
22+
}
23+
1624
static void drm_fbdev_client_unregister(struct drm_client_dev *client)
1725
{
1826
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
1927

2028
if (fb_helper->info) {
29+
/*
30+
* Fully probed framebuffer device
31+
*/
2132
drm_fb_helper_unregister_info(fb_helper);
2233
} else {
34+
/*
35+
* Partially initialized client, no framebuffer device yet
36+
*/
2337
drm_client_release(&fb_helper->client);
24-
drm_fb_helper_unprepare(fb_helper);
25-
kfree(fb_helper);
2638
}
2739
}
2840

@@ -82,6 +94,7 @@ static int drm_fbdev_client_resume(struct drm_client_dev *client)
8294

8395
static const struct drm_client_funcs drm_fbdev_client_funcs = {
8496
.owner = THIS_MODULE,
97+
.free = drm_fbdev_client_free,
8598
.unregister = drm_fbdev_client_unregister,
8699
.restore = drm_fbdev_client_restore,
87100
.hotplug = drm_fbdev_client_hotplug,

drivers/gpu/drm/drm_client.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,10 @@ void drm_client_release(struct drm_client_dev *client)
168168

169169
drm_client_modeset_free(client);
170170
drm_client_close(client);
171+
172+
if (client->funcs && client->funcs->free)
173+
client->funcs->free(client);
174+
171175
drm_dev_put(dev);
172176
}
173177
EXPORT_SYMBOL(drm_client_release);

drivers/gpu/drm/drm_fbdev_dma.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
5757
drm_client_buffer_vunmap(fb_helper->buffer);
5858
drm_client_framebuffer_delete(fb_helper->buffer);
5959
drm_client_release(&fb_helper->client);
60-
drm_fb_helper_unprepare(fb_helper);
61-
kfree(fb_helper);
6260
}
6361

6462
static const struct fb_ops drm_fbdev_dma_fb_ops = {
@@ -92,8 +90,6 @@ static void drm_fbdev_dma_shadowed_fb_destroy(struct fb_info *info)
9290
drm_client_buffer_vunmap(fb_helper->buffer);
9391
drm_client_framebuffer_delete(fb_helper->buffer);
9492
drm_client_release(&fb_helper->client);
95-
drm_fb_helper_unprepare(fb_helper);
96-
kfree(fb_helper);
9793
}
9894

9995
static const struct fb_ops drm_fbdev_dma_shadowed_fb_ops = {

drivers/gpu/drm/drm_fbdev_shmem.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@ static void drm_fbdev_shmem_fb_destroy(struct fb_info *info)
6565
drm_client_buffer_vunmap(fb_helper->buffer);
6666
drm_client_framebuffer_delete(fb_helper->buffer);
6767
drm_client_release(&fb_helper->client);
68-
drm_fb_helper_unprepare(fb_helper);
69-
kfree(fb_helper);
7068
}
7169

7270
static const struct fb_ops drm_fbdev_shmem_fb_ops = {

drivers/gpu/drm/drm_fbdev_ttm.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ static void drm_fbdev_ttm_fb_destroy(struct fb_info *info)
5353
drm_client_framebuffer_delete(fb_helper->buffer);
5454

5555
drm_client_release(&fb_helper->client);
56-
drm_fb_helper_unprepare(fb_helper);
57-
kfree(fb_helper);
5856
}
5957

6058
static const struct fb_ops drm_fbdev_ttm_fb_ops = {

drivers/gpu/drm/exynos/exynos_drm_fbdev.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ static void exynos_drm_fb_destroy(struct fb_info *info)
4242
drm_framebuffer_remove(fb);
4343

4444
drm_client_release(&fb_helper->client);
45-
drm_fb_helper_unprepare(fb_helper);
46-
kfree(fb_helper);
4745
}
4846

4947
static const struct fb_ops exynos_drm_fb_ops = {

drivers/gpu/drm/gma500/fbdev.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ static void psb_fbdev_fb_destroy(struct fb_info *info)
8484
drm_gem_object_put(obj);
8585

8686
drm_client_release(&fb_helper->client);
87-
88-
drm_fb_helper_unprepare(fb_helper);
89-
kfree(fb_helper);
9087
}
9188

9289
static const struct fb_ops psb_fbdev_fb_ops = {

drivers/gpu/drm/i915/display/intel_fbdev.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,6 @@ static void intel_fbdev_fb_destroy(struct fb_info *info)
146146
drm_framebuffer_remove(fb_helper->fb);
147147

148148
drm_client_release(&fb_helper->client);
149-
drm_fb_helper_unprepare(fb_helper);
150-
kfree(fb_helper);
151149
}
152150

153151
__diag_push();

drivers/gpu/drm/msm/msm_fbdev.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ static void msm_fbdev_fb_destroy(struct fb_info *info)
5252
drm_framebuffer_remove(fb);
5353

5454
drm_client_release(&helper->client);
55-
drm_fb_helper_unprepare(helper);
56-
kfree(helper);
5755
}
5856

5957
static const struct fb_ops msm_fb_ops = {

0 commit comments

Comments
 (0)