fbdev/vga16fb: Create EGA/VGA devices in sysfb code

Move the device-creation from vga16fb to sysfb code. The driver's
videomode checks are independent from device creation, so move them
into vga16fb's probe function. This will allow to create the module
init/exit code automatically.

The vga16fb driver requires a screen_info for type VIDEO_TYPE_VGAC
or VIDEO_TYPE_EGAC. Such code is nowhere present in the kernel, except
for some MIPS systems. It's not clear if the vga16fb driver actually
works in practice.

v2:
	* keep driver name to "vga16fb" (Javier)
	* give rational for moving mode checks (Javier)

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220718072322.8927-3-tzimmermann@suse.de
This commit is contained in:
Thomas Zimmermann 2022-07-18 09:23:13 +02:00
parent 729d687209
commit 0db5b61e0d
2 changed files with 31 additions and 30 deletions

View File

@ -94,6 +94,10 @@ static __init int sysfb_init(void)
name = "efi-framebuffer";
else if (si->orig_video_isVGA == VIDEO_TYPE_VLFB)
name = "vesa-framebuffer";
else if (si->orig_video_isVGA == VIDEO_TYPE_VGAC)
name = "vga-framebuffer";
else if (si->orig_video_isVGA == VIDEO_TYPE_EGAC)
name = "ega-framebuffer";
else
name = "platform-framebuffer";

View File

@ -185,19 +185,19 @@ static inline void setindex(int index)
}
/* Check if the video mode is supported by the driver */
static inline int check_mode_supported(void)
static inline int check_mode_supported(const struct screen_info *si)
{
/* non-x86 architectures treat orig_video_isVGA as a boolean flag */
#if defined(CONFIG_X86)
/* only EGA and VGA in 16 color graphic mode are supported */
if (screen_info.orig_video_isVGA != VIDEO_TYPE_EGAC &&
screen_info.orig_video_isVGA != VIDEO_TYPE_VGAC)
if (si->orig_video_isVGA != VIDEO_TYPE_EGAC &&
si->orig_video_isVGA != VIDEO_TYPE_VGAC)
return -ENODEV;
if (screen_info.orig_video_mode != 0x0D && /* 320x200/4 (EGA) */
screen_info.orig_video_mode != 0x0E && /* 640x200/4 (EGA) */
screen_info.orig_video_mode != 0x10 && /* 640x350/4 (EGA) */
screen_info.orig_video_mode != 0x12) /* 640x480/4 (VGA) */
if (si->orig_video_mode != 0x0D && /* 320x200/4 (EGA) */
si->orig_video_mode != 0x0E && /* 640x200/4 (EGA) */
si->orig_video_mode != 0x10 && /* 640x350/4 (EGA) */
si->orig_video_mode != 0x12) /* 640x480/4 (VGA) */
return -ENODEV;
#endif
return 0;
@ -1321,11 +1321,20 @@ static int __init vga16fb_setup(char *options)
static int vga16fb_probe(struct platform_device *dev)
{
struct screen_info *si;
struct fb_info *info;
struct vga16fb_par *par;
int i;
int ret = 0;
si = dev_get_platdata(&dev->dev);
if (!si)
return -ENODEV;
ret = check_mode_supported(si);
if (ret)
return ret;
printk(KERN_DEBUG "vga16fb: initializing\n");
info = framebuffer_alloc(sizeof(struct vga16fb_par), &dev->dev);
@ -1352,10 +1361,10 @@ static int vga16fb_probe(struct platform_device *dev)
par = info->par;
#if defined(CONFIG_X86)
par->isVGA = screen_info.orig_video_isVGA == VIDEO_TYPE_VGAC;
par->isVGA = si->orig_video_isVGA == VIDEO_TYPE_VGAC;
#else
/* non-x86 architectures treat orig_video_isVGA as a boolean flag */
par->isVGA = screen_info.orig_video_isVGA;
par->isVGA = si->orig_video_isVGA;
#endif
par->palette_blanked = 0;
par->vesa_blanked = 0;
@ -1425,16 +1434,21 @@ static int vga16fb_remove(struct platform_device *dev)
return 0;
}
static const struct platform_device_id vga16fb_driver_id_table[] = {
{"ega-framebuffer", 0},
{"vga-framebuffer", 0},
{ }
};
static struct platform_driver vga16fb_driver = {
.probe = vga16fb_probe,
.remove = vga16fb_remove,
.driver = {
.name = "vga16fb",
},
.id_table = vga16fb_driver_id_table,
};
static struct platform_device *vga16fb_device;
static int __init vga16fb_init(void)
{
int ret;
@ -1447,32 +1461,15 @@ static int __init vga16fb_init(void)
vga16fb_setup(option);
#endif
ret = check_mode_supported();
ret = platform_driver_register(&vga16fb_driver);
if (ret)
return ret;
ret = platform_driver_register(&vga16fb_driver);
if (!ret) {
vga16fb_device = platform_device_alloc("vga16fb", 0);
if (vga16fb_device)
ret = platform_device_add(vga16fb_device);
else
ret = -ENOMEM;
if (ret) {
platform_device_put(vga16fb_device);
platform_driver_unregister(&vga16fb_driver);
}
}
return ret;
return 0;
}
static void __exit vga16fb_exit(void)
{
platform_device_unregister(vga16fb_device);
platform_driver_unregister(&vga16fb_driver);
}