diff options
| -rw-r--r-- | drivers/video/hgafb.c | 107 |
1 files changed, 78 insertions, 29 deletions
diff --git a/drivers/video/hgafb.c b/drivers/video/hgafb.c index b37cea7d1094..4e39035cf335 100644 --- a/drivers/video/hgafb.c +++ b/drivers/video/hgafb.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <linux/fb.h> | 42 | #include <linux/fb.h> |
| 43 | #include <linux/init.h> | 43 | #include <linux/init.h> |
| 44 | #include <linux/ioport.h> | 44 | #include <linux/ioport.h> |
| 45 | #include <linux/platform_device.h> | ||
| 45 | #include <asm/io.h> | 46 | #include <asm/io.h> |
| 46 | #include <asm/vga.h> | 47 | #include <asm/vga.h> |
| 47 | 48 | ||
| @@ -107,7 +108,7 @@ static DEFINE_SPINLOCK(hga_reg_lock); | |||
| 107 | 108 | ||
| 108 | /* Framebuffer driver structures */ | 109 | /* Framebuffer driver structures */ |
| 109 | 110 | ||
| 110 | static struct fb_var_screeninfo hga_default_var = { | 111 | static struct fb_var_screeninfo __initdata hga_default_var = { |
| 111 | .xres = 720, | 112 | .xres = 720, |
| 112 | .yres = 348, | 113 | .yres = 348, |
| 113 | .xres_virtual = 720, | 114 | .xres_virtual = 720, |
| @@ -121,7 +122,7 @@ static struct fb_var_screeninfo hga_default_var = { | |||
| 121 | .width = -1, | 122 | .width = -1, |
| 122 | }; | 123 | }; |
| 123 | 124 | ||
| 124 | static struct fb_fix_screeninfo hga_fix = { | 125 | static struct fb_fix_screeninfo __initdata hga_fix = { |
| 125 | .id = "HGA", | 126 | .id = "HGA", |
| 126 | .type = FB_TYPE_PACKED_PIXELS, /* (not sure) */ | 127 | .type = FB_TYPE_PACKED_PIXELS, /* (not sure) */ |
| 127 | .visual = FB_VISUAL_MONO10, | 128 | .visual = FB_VISUAL_MONO10, |
| @@ -131,8 +132,6 @@ static struct fb_fix_screeninfo hga_fix = { | |||
| 131 | .accel = FB_ACCEL_NONE | 132 | .accel = FB_ACCEL_NONE |
| 132 | }; | 133 | }; |
| 133 | 134 | ||
| 134 | static struct fb_info fb_info; | ||
| 135 | |||
| 136 | /* Don't assume that tty1 will be the initial current console. */ | 135 | /* Don't assume that tty1 will be the initial current console. */ |
| 137 | static int release_io_port = 0; | 136 | static int release_io_port = 0; |
| 138 | static int release_io_ports = 0; | 137 | static int release_io_ports = 0; |
| @@ -549,10 +548,9 @@ static struct fb_ops hgafb_ops = { | |||
| 549 | * Initialization | 548 | * Initialization |
| 550 | */ | 549 | */ |
| 551 | 550 | ||
| 552 | static int __init hgafb_init(void) | 551 | static int __init hgafb_probe(struct device *device) |
| 553 | { | 552 | { |
| 554 | if (fb_get_options("hgafb", NULL)) | 553 | struct fb_info *info; |
| 555 | return -ENODEV; | ||
| 556 | 554 | ||
| 557 | if (! hga_card_detect()) { | 555 | if (! hga_card_detect()) { |
| 558 | printk(KERN_INFO "hgafb: HGA card not detected.\n"); | 556 | printk(KERN_INFO "hgafb: HGA card not detected.\n"); |
| @@ -564,41 +562,95 @@ static int __init hgafb_init(void) | |||
| 564 | printk(KERN_INFO "hgafb: %s with %ldK of memory detected.\n", | 562 | printk(KERN_INFO "hgafb: %s with %ldK of memory detected.\n", |
| 565 | hga_type_name, hga_vram_len/1024); | 563 | hga_type_name, hga_vram_len/1024); |
| 566 | 564 | ||
| 565 | info = framebuffer_alloc(0, NULL); | ||
| 566 | if (!info) { | ||
| 567 | iounmap(hga_vram); | ||
| 568 | return -ENOMEM; | ||
| 569 | } | ||
| 570 | |||
| 567 | hga_fix.smem_start = (unsigned long)hga_vram; | 571 | hga_fix.smem_start = (unsigned long)hga_vram; |
| 568 | hga_fix.smem_len = hga_vram_len; | 572 | hga_fix.smem_len = hga_vram_len; |
| 569 | 573 | ||
| 570 | fb_info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; | 574 | info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; |
| 571 | fb_info.var = hga_default_var; | 575 | info->var = hga_default_var; |
| 572 | fb_info.fix = hga_fix; | 576 | info->fix = hga_fix; |
| 573 | fb_info.monspecs.hfmin = 0; | 577 | info->monspecs.hfmin = 0; |
| 574 | fb_info.monspecs.hfmax = 0; | 578 | info->monspecs.hfmax = 0; |
| 575 | fb_info.monspecs.vfmin = 10000; | 579 | info->monspecs.vfmin = 10000; |
| 576 | fb_info.monspecs.vfmax = 10000; | 580 | info->monspecs.vfmax = 10000; |
| 577 | fb_info.monspecs.dpms = 0; | 581 | info->monspecs.dpms = 0; |
| 578 | fb_info.fbops = &hgafb_ops; | 582 | info->fbops = &hgafb_ops; |
| 579 | fb_info.screen_base = hga_vram; | 583 | info->screen_base = hga_vram; |
| 580 | 584 | ||
| 581 | if (register_framebuffer(&fb_info) < 0) { | 585 | if (register_framebuffer(info) < 0) { |
| 586 | framebuffer_release(info); | ||
| 582 | iounmap(hga_vram); | 587 | iounmap(hga_vram); |
| 583 | return -EINVAL; | 588 | return -EINVAL; |
| 584 | } | 589 | } |
| 585 | 590 | ||
| 586 | printk(KERN_INFO "fb%d: %s frame buffer device\n", | 591 | printk(KERN_INFO "fb%d: %s frame buffer device\n", |
| 587 | fb_info.node, fb_info.fix.id); | 592 | info->node, info->fix.id); |
| 593 | dev_set_drvdata(device, info); | ||
| 588 | return 0; | 594 | return 0; |
| 589 | } | 595 | } |
| 590 | 596 | ||
| 591 | #ifdef MODULE | 597 | static int hgafb_remove(struct device *device) |
| 592 | static void __exit hgafb_exit(void) | ||
| 593 | { | 598 | { |
| 599 | struct fb_info *info = dev_get_drvdata(device); | ||
| 600 | |||
| 594 | hga_txt_mode(); | 601 | hga_txt_mode(); |
| 595 | hga_clear_screen(); | 602 | hga_clear_screen(); |
| 596 | unregister_framebuffer(&fb_info); | 603 | |
| 604 | if (info) { | ||
| 605 | unregister_framebuffer(info); | ||
| 606 | framebuffer_release(info); | ||
| 607 | } | ||
| 608 | |||
| 597 | iounmap(hga_vram); | 609 | iounmap(hga_vram); |
| 598 | if (release_io_ports) release_region(0x3b0, 12); | 610 | |
| 599 | if (release_io_port) release_region(0x3bf, 1); | 611 | if (release_io_ports) |
| 612 | release_region(0x3b0, 12); | ||
| 613 | |||
| 614 | if (release_io_port) | ||
| 615 | release_region(0x3bf, 1); | ||
| 616 | |||
| 617 | return 0; | ||
| 618 | } | ||
| 619 | |||
| 620 | static struct device_driver hgafb_driver = { | ||
| 621 | .name = "hgafb", | ||
| 622 | .bus = &platform_bus_type, | ||
| 623 | .probe = hgafb_probe, | ||
| 624 | .remove = hgafb_remove, | ||
| 625 | }; | ||
| 626 | |||
| 627 | static struct platform_device hgafb_device = { | ||
| 628 | .name = "hgafb", | ||
| 629 | }; | ||
| 630 | |||
| 631 | static int __init hgafb_init(void) | ||
| 632 | { | ||
| 633 | int ret; | ||
| 634 | |||
| 635 | if (fb_get_options("hgafb", NULL)) | ||
| 636 | return -ENODEV; | ||
| 637 | |||
| 638 | ret = driver_register(&hgafb_driver); | ||
| 639 | |||
| 640 | if (!ret) { | ||
| 641 | ret = platform_device_register(&hgafb_device); | ||
| 642 | if (ret) | ||
| 643 | driver_unregister(&hgafb_driver); | ||
| 644 | } | ||
| 645 | |||
| 646 | return ret; | ||
| 647 | } | ||
| 648 | |||
| 649 | static void __exit hgafb_exit(void) | ||
| 650 | { | ||
| 651 | platform_device_unregister(&hgafb_device); | ||
| 652 | driver_unregister(&hgafb_driver); | ||
| 600 | } | 653 | } |
| 601 | #endif | ||
| 602 | 654 | ||
| 603 | /* ------------------------------------------------------------------------- | 655 | /* ------------------------------------------------------------------------- |
| 604 | * | 656 | * |
| @@ -613,7 +665,4 @@ MODULE_LICENSE("GPL"); | |||
| 613 | module_param(nologo, bool, 0); | 665 | module_param(nologo, bool, 0); |
| 614 | MODULE_PARM_DESC(nologo, "Disables startup logo if != 0 (default=0)"); | 666 | MODULE_PARM_DESC(nologo, "Disables startup logo if != 0 (default=0)"); |
| 615 | module_init(hgafb_init); | 667 | module_init(hgafb_init); |
| 616 | |||
| 617 | #ifdef MODULE | ||
| 618 | module_exit(hgafb_exit); | 668 | module_exit(hgafb_exit); |
| 619 | #endif | ||
