Skip to content

Commit 929c81a

Browse files
t-8chhdeller
authored andcommitted
fbdev: Introduce devm_register_framebuffer()
Introduce a device-managed variant of register_framebuffer() which automatically unregisters the framebuffer on device destruction. This can simplify the error handling and resource management in drivers. Signed-off-by: Thomas Weißschuh <[email protected]> Signed-off-by: Helge Deller <[email protected]>
1 parent 2451a28 commit 929c81a

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

drivers/video/fbdev/core/fbmem.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,36 @@ unregister_framebuffer(struct fb_info *fb_info)
544544
}
545545
EXPORT_SYMBOL(unregister_framebuffer);
546546

547+
static void devm_unregister_framebuffer(void *data)
548+
{
549+
struct fb_info *info = data;
550+
551+
unregister_framebuffer(info);
552+
}
553+
554+
/**
555+
* devm_register_framebuffer - resource-managed frame buffer device registration
556+
* @dev: device the framebuffer belongs to
557+
* @fb_info: frame buffer info structure
558+
*
559+
* Registers a frame buffer device @fb_info to device @dev.
560+
*
561+
* Returns negative errno on error, or zero for success.
562+
*
563+
*/
564+
int
565+
devm_register_framebuffer(struct device *dev, struct fb_info *fb_info)
566+
{
567+
int ret;
568+
569+
ret = register_framebuffer(fb_info);
570+
if (ret)
571+
return ret;
572+
573+
return devm_add_action_or_reset(dev, devm_unregister_framebuffer, fb_info);
574+
}
575+
EXPORT_SYMBOL(devm_register_framebuffer);
576+
547577
/**
548578
* fb_set_suspend - low level driver signals suspend
549579
* @info: framebuffer affected

include/linux/fb.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,7 @@ extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf,
601601
/* fbmem.c */
602602
extern int register_framebuffer(struct fb_info *fb_info);
603603
extern void unregister_framebuffer(struct fb_info *fb_info);
604+
extern int devm_register_framebuffer(struct device *dev, struct fb_info *fb_info);
604605
extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size);
605606
extern void fb_pad_unaligned_buffer(u8 *dst, u32 d_pitch, u8 *src, u32 idx,
606607
u32 height, u32 shift_high, u32 shift_low, u32 mod);

0 commit comments

Comments
 (0)