diff options
| -rw-r--r-- | drivers/video/cirrusfb.c | 59 |
1 files changed, 18 insertions, 41 deletions
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c index c14b2435d23e..e729fb279645 100644 --- a/drivers/video/cirrusfb.c +++ b/drivers/video/cirrusfb.c | |||
| @@ -628,27 +628,18 @@ static long cirrusfb_get_mclk(long freq, int bpp, long *div) | |||
| 628 | static int cirrusfb_check_var(struct fb_var_screeninfo *var, | 628 | static int cirrusfb_check_var(struct fb_var_screeninfo *var, |
| 629 | struct fb_info *info) | 629 | struct fb_info *info) |
| 630 | { | 630 | { |
| 631 | int nom, den; /* translyting from pixels->bytes */ | 631 | int yres; |
| 632 | int yres, i; | 632 | /* memory size in pixels */ |
| 633 | static struct { int xres, yres; } modes[] = | 633 | unsigned pixels = info->screen_size * 8 / var->bits_per_pixel; |
| 634 | { { 1600, 1280 }, | ||
| 635 | { 1280, 1024 }, | ||
| 636 | { 1024, 768 }, | ||
| 637 | { 800, 600 }, | ||
| 638 | { 640, 480 }, | ||
| 639 | { -1, -1 } }; | ||
| 640 | 634 | ||
| 641 | switch (var->bits_per_pixel) { | 635 | switch (var->bits_per_pixel) { |
| 642 | case 1: | 636 | case 1: |
| 643 | nom = 4; | 637 | pixels /= 4; |
| 644 | den = 8; | ||
| 645 | break; /* 8 pixel per byte, only 1/4th of mem usable */ | 638 | break; /* 8 pixel per byte, only 1/4th of mem usable */ |
| 646 | case 8: | 639 | case 8: |
| 647 | case 16: | 640 | case 16: |
| 648 | case 24: | 641 | case 24: |
| 649 | case 32: | 642 | case 32: |
| 650 | nom = var->bits_per_pixel / 8; | ||
| 651 | den = 1; | ||
| 652 | break; /* 1 pixel == 1 byte */ | 643 | break; /* 1 pixel == 1 byte */ |
| 653 | default: | 644 | default: |
| 654 | printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected..." | 645 | printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected..." |
| @@ -658,43 +649,29 @@ static int cirrusfb_check_var(struct fb_var_screeninfo *var, | |||
| 658 | return -EINVAL; | 649 | return -EINVAL; |
| 659 | } | 650 | } |
| 660 | 651 | ||
| 661 | if (var->xres * nom / den * var->yres > info->screen_size) { | 652 | if (var->xres_virtual < var->xres) |
| 662 | printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected..." | 653 | var->xres_virtual = var->xres; |
| 663 | "resolution too high to fit into video memory!\n", | ||
| 664 | var->xres, var->yres, var->bits_per_pixel); | ||
| 665 | DPRINTK("EXIT - EINVAL error\n"); | ||
| 666 | return -EINVAL; | ||
| 667 | } | ||
| 668 | |||
| 669 | /* use highest possible virtual resolution */ | 654 | /* use highest possible virtual resolution */ |
| 670 | if (var->xres_virtual == -1 && | 655 | if (var->yres_virtual == -1) { |
| 671 | var->yres_virtual == -1) { | 656 | var->yres_virtual = pixels / var->xres_virtual; |
| 672 | printk(KERN_INFO | ||
| 673 | "cirrusfb: using maximum available virtual resolution\n"); | ||
| 674 | for (i = 0; modes[i].xres != -1; i++) { | ||
| 675 | int size = modes[i].xres * nom / den * modes[i].yres; | ||
| 676 | if (size < info->screen_size / 2) | ||
| 677 | break; | ||
| 678 | } | ||
| 679 | if (modes[i].xres == -1) { | ||
| 680 | printk(KERN_ERR "cirrusfb: could not find a virtual " | ||
| 681 | "resolution that fits into video memory!!\n"); | ||
| 682 | DPRINTK("EXIT - EINVAL error\n"); | ||
| 683 | return -EINVAL; | ||
| 684 | } | ||
| 685 | var->xres_virtual = modes[i].xres; | ||
| 686 | var->yres_virtual = modes[i].yres; | ||
| 687 | 657 | ||
| 688 | printk(KERN_INFO "cirrusfb: virtual resolution set to " | 658 | printk(KERN_INFO "cirrusfb: virtual resolution set to " |
| 689 | "maximum of %dx%d\n", var->xres_virtual, | 659 | "maximum of %dx%d\n", var->xres_virtual, |
| 690 | var->yres_virtual); | 660 | var->yres_virtual); |
| 691 | } | 661 | } |
| 692 | |||
| 693 | if (var->xres_virtual < var->xres) | ||
| 694 | var->xres_virtual = var->xres; | ||
| 695 | if (var->yres_virtual < var->yres) | 662 | if (var->yres_virtual < var->yres) |
| 696 | var->yres_virtual = var->yres; | 663 | var->yres_virtual = var->yres; |
| 697 | 664 | ||
| 665 | if (var->xres_virtual * var->yres_virtual > pixels) { | ||
| 666 | printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected... " | ||
| 667 | "virtual resolution too high to fit into video memory!\n", | ||
| 668 | var->xres_virtual, var->yres_virtual, | ||
| 669 | var->bits_per_pixel); | ||
| 670 | DPRINTK("EXIT - EINVAL error\n"); | ||
| 671 | return -EINVAL; | ||
| 672 | } | ||
| 673 | |||
| 674 | |||
| 698 | if (var->xoffset < 0) | 675 | if (var->xoffset < 0) |
| 699 | var->xoffset = 0; | 676 | var->xoffset = 0; |
| 700 | if (var->yoffset < 0) | 677 | if (var->yoffset < 0) |
