aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2013-08-02 08:05:25 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2013-08-02 19:17:49 -0400
commit2e5155ecbb729d3a2e7d1cea7c18493516fec55a (patch)
treea608024b297cfb14ea4713fb409d9119dc454e68
parent9a6a36d19c9d24479300511e23933876a4a9cf82 (diff)
fbdev: vesafb: bind to platform-framebuffer device
x86 creates platform-framebuffer platform devices for every system framebuffer. Use these instead of creating a dummy device. This requires us to remove the __init annotations as hotplugging may occur during runtime. Signed-off-by: David Herrmann <dh.herrmann@gmail.com> Link: http://lkml.kernel.org/r/1375445127-15480-7-git-send-email-dh.herrmann@gmail.com Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r--drivers/video/vesafb.c55
1 files changed, 16 insertions, 39 deletions
diff --git a/drivers/video/vesafb.c b/drivers/video/vesafb.c
index 501b3406c6d5..bd83233ec227 100644
--- a/drivers/video/vesafb.c
+++ b/drivers/video/vesafb.c
@@ -29,7 +29,7 @@
29 29
30/* --------------------------------------------------------------------- */ 30/* --------------------------------------------------------------------- */
31 31
32static struct fb_var_screeninfo vesafb_defined __initdata = { 32static struct fb_var_screeninfo vesafb_defined = {
33 .activate = FB_ACTIVATE_NOW, 33 .activate = FB_ACTIVATE_NOW,
34 .height = -1, 34 .height = -1,
35 .width = -1, 35 .width = -1,
@@ -40,7 +40,7 @@ static struct fb_var_screeninfo vesafb_defined __initdata = {
40 .vmode = FB_VMODE_NONINTERLACED, 40 .vmode = FB_VMODE_NONINTERLACED,
41}; 41};
42 42
43static struct fb_fix_screeninfo vesafb_fix __initdata = { 43static struct fb_fix_screeninfo vesafb_fix = {
44 .id = "VESA VGA", 44 .id = "VESA VGA",
45 .type = FB_TYPE_PACKED_PIXELS, 45 .type = FB_TYPE_PACKED_PIXELS,
46 .accel = FB_ACCEL_NONE, 46 .accel = FB_ACCEL_NONE,
@@ -48,8 +48,8 @@ static struct fb_fix_screeninfo vesafb_fix __initdata = {
48 48
49static int inverse __read_mostly; 49static int inverse __read_mostly;
50static int mtrr __read_mostly; /* disable mtrr */ 50static int mtrr __read_mostly; /* disable mtrr */
51static int vram_remap __initdata; /* Set amount of memory to be used */ 51static int vram_remap; /* Set amount of memory to be used */
52static int vram_total __initdata; /* Set total amount of memory */ 52static int vram_total; /* Set total amount of memory */
53static int pmi_setpal __read_mostly = 1; /* pmi for palette changes ??? */ 53static int pmi_setpal __read_mostly = 1; /* pmi for palette changes ??? */
54static int ypan __read_mostly; /* 0..nothing, 1..ypan, 2..ywrap */ 54static int ypan __read_mostly; /* 0..nothing, 1..ypan, 2..ywrap */
55static void (*pmi_start)(void) __read_mostly; 55static void (*pmi_start)(void) __read_mostly;
@@ -192,7 +192,7 @@ static struct fb_ops vesafb_ops = {
192 .fb_imageblit = cfb_imageblit, 192 .fb_imageblit = cfb_imageblit,
193}; 193};
194 194
195static int __init vesafb_setup(char *options) 195static int vesafb_setup(char *options)
196{ 196{
197 char *this_opt; 197 char *this_opt;
198 198
@@ -226,13 +226,18 @@ static int __init vesafb_setup(char *options)
226 return 0; 226 return 0;
227} 227}
228 228
229static int __init vesafb_probe(struct platform_device *dev) 229static int vesafb_probe(struct platform_device *dev)
230{ 230{
231 struct fb_info *info; 231 struct fb_info *info;
232 int i, err; 232 int i, err;
233 unsigned int size_vmode; 233 unsigned int size_vmode;
234 unsigned int size_remap; 234 unsigned int size_remap;
235 unsigned int size_total; 235 unsigned int size_total;
236 char *option = NULL;
237
238 /* ignore error return of fb_get_options */
239 fb_get_options("vesafb", &option);
240 vesafb_setup(option);
236 241
237 if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB) 242 if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB)
238 return -ENODEV; 243 return -ENODEV;
@@ -496,40 +501,12 @@ err:
496} 501}
497 502
498static struct platform_driver vesafb_driver = { 503static struct platform_driver vesafb_driver = {
499 .driver = { 504 .driver = {
500 .name = "vesafb", 505 .name = "vesa-framebuffer",
506 .owner = THIS_MODULE,
501 }, 507 },
508 .probe = vesafb_probe,
502}; 509};
503 510
504static struct platform_device *vesafb_device; 511module_platform_driver(vesafb_driver);
505
506static int __init vesafb_init(void)
507{
508 int ret;
509 char *option = NULL;
510
511 /* ignore error return of fb_get_options */
512 fb_get_options("vesafb", &option);
513 vesafb_setup(option);
514
515 vesafb_device = platform_device_alloc("vesafb", 0);
516 if (!vesafb_device)
517 return -ENOMEM;
518
519 ret = platform_device_add(vesafb_device);
520 if (!ret) {
521 ret = platform_driver_probe(&vesafb_driver, vesafb_probe);
522 if (ret)
523 platform_device_del(vesafb_device);
524 }
525
526 if (ret) {
527 platform_device_put(vesafb_device);
528 vesafb_device = NULL;
529 }
530
531 return ret;
532}
533module_init(vesafb_init);
534
535MODULE_LICENSE("GPL"); 512MODULE_LICENSE("GPL");