Merge commit 'v3.1-rc2' into HEAD
authorFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
Wed, 17 Aug 2011 16:14:01 +0000 (16:14 +0000)
committerFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
Wed, 17 Aug 2011 16:14:01 +0000 (16:14 +0000)
1  2 
drivers/video/via/viafbdev.c

@@@ -38,6 -38,8 +38,6 @@@ static char *viafb_mode1
  static int viafb_bpp = 32;
  static int viafb_bpp1 = 32;
  
 -static unsigned int viafb_second_xres = 640;
 -static unsigned int viafb_second_yres = 480;
  static unsigned int viafb_second_offset;
  static int viafb_second_size;
  
@@@ -149,8 -151,7 +149,8 @@@ static void viafb_update_fix(struct fb_
  
        info->fix.visual =
                bpp == 8 ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
 -      info->fix.line_length = (info->var.xres_virtual * bpp / 8 + 7) & ~7;
 +      info->fix.line_length = ALIGN(info->var.xres_virtual * bpp / 8,
 +              VIA_PITCH_SIZE);
  }
  
  static void viafb_setup_fixinfo(struct fb_fix_screeninfo *fix,
@@@ -199,6 -200,7 +199,6 @@@ static int viafb_check_var(struct fb_va
        struct fb_info *info)
  {
        int depth, refresh;
 -      struct VideoModeTable *vmode_entry;
        struct viafb_par *ppar = info->par;
        u32 line;
  
        if (var->vmode & FB_VMODE_INTERLACED || var->vmode & FB_VMODE_DOUBLE)
                return -EINVAL;
  
 -      vmode_entry = viafb_get_mode(var->xres, var->yres);
 -      if (!vmode_entry) {
 +      /* the refresh rate is not important here, as we only want to know
 +       * whether the resolution exists
 +       */
 +      if (!viafb_get_best_mode(var->xres, var->yres, 60)) {
                DEBUG_MSG(KERN_INFO
                          "viafb: Mode %dx%dx%d not supported!!\n",
                          var->xres, var->yres, var->bits_per_pixel);
                depth = 24;
  
        viafb_fill_var_color_info(var, depth);
 -      line = (var->xres_virtual * var->bits_per_pixel / 8 + 7) & ~7;
 -      if (line * var->yres_virtual > ppar->memsize)
 +      if (var->xres_virtual < var->xres)
 +              var->xres_virtual = var->xres;
 +
 +      line = ALIGN(var->xres_virtual * var->bits_per_pixel / 8,
 +              VIA_PITCH_SIZE);
 +      if (line > VIA_PITCH_MAX || line * var->yres_virtual > ppar->memsize)
                return -EINVAL;
  
        /* Based on var passed in to calculate the refresh,
                get_var_refresh(var));
  
        /* Adjust var according to our driver's own table */
 -      viafb_fill_var_timing_info(var, refresh, vmode_entry);
 +      viafb_fill_var_timing_info(var,
 +              viafb_get_best_mode(var->xres, var->yres, refresh));
        if (var->accel_flags & FB_ACCELF_TEXT &&
                !ppar->shared->vdev->engine_mmio)
                var->accel_flags = 0;
  static int viafb_set_par(struct fb_info *info)
  {
        struct viafb_par *viapar = info->par;
 -      struct VideoModeTable *vmode_entry, *vmode_entry1 = NULL;
        int refresh;
        DEBUG_MSG(KERN_INFO "viafb_set_par!\n");
  
        viafb_update_device_setting(viafbinfo->var.xres, viafbinfo->var.yres,
                viafbinfo->var.bits_per_pixel, 0);
  
 -      vmode_entry = viafb_get_mode(viafbinfo->var.xres, viafbinfo->var.yres);
        if (viafb_dual_fb) {
 -              vmode_entry1 = viafb_get_mode(viafbinfo1->var.xres,
 -                      viafbinfo1->var.yres);
                viafb_update_device_setting(viafbinfo1->var.xres,
                        viafbinfo1->var.yres, viafbinfo1->var.bits_per_pixel,
                        1);
                DEBUG_MSG(KERN_INFO
                "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n",
                          viafb_second_xres, viafb_second_yres, viafb_bpp1);
 -              vmode_entry1 = viafb_get_mode(viafb_second_xres,
 -                      viafb_second_yres);
  
                viafb_update_device_setting(viafb_second_xres,
                        viafb_second_yres, viafb_bpp1, 1);
  
        refresh = viafb_get_refresh(info->var.xres, info->var.yres,
                get_var_refresh(&info->var));
 -      if (vmode_entry) {
 +      if (viafb_get_best_mode(viafbinfo->var.xres, viafbinfo->var.yres,
 +              refresh)) {
                if (viafb_dual_fb && viapar->iga_path == IGA2) {
                        viafb_bpp1 = info->var.bits_per_pixel;
                        viafb_refresh1 = refresh;
                        info->flags &= ~FBINFO_HWACCEL_DISABLED;
                else
                        info->flags |= FBINFO_HWACCEL_DISABLED;
 -              viafb_setmode(vmode_entry, info->var.bits_per_pixel,
 -                      vmode_entry1, viafb_bpp1);
 +              viafb_setmode(info->var.bits_per_pixel, viafb_bpp1);
                viafb_pan_display(&info->var, info);
        }
  
@@@ -347,9 -348,8 +347,9 @@@ static int viafb_pan_display(struct fb_
        struct fb_info *info)
  {
        struct viafb_par *viapar = info->par;
 -      u32 vram_addr = (var->yoffset * var->xres_virtual + var->xoffset)
 -              * (var->bits_per_pixel / 8) + viapar->vram_addr;
 +      u32 vram_addr = viapar->vram_addr
 +              + var->yoffset * info->fix.line_length
 +              + var->xoffset * info->var.bits_per_pixel / 8;
  
        DEBUG_MSG(KERN_DEBUG "viafb_pan_display, address = %d\n", vram_addr);
        if (!viafb_dual_fb) {
@@@ -1729,6 -1729,7 +1729,6 @@@ static struct viafb_pm_hooks viafb_fb_p
  int __devinit via_fb_pci_probe(struct viafb_dev *vdev)
  {
        u32 default_xres, default_yres;
 -      struct VideoModeTable *vmode_entry;
        struct fb_var_screeninfo default_var;
        int rc;
        u32 viafb_par_length;
        }
  
        parse_mode(viafb_mode, &default_xres, &default_yres);
 -      vmode_entry = viafb_get_mode(default_xres, default_yres);
        if (viafb_SAMM_ON == 1)
                parse_mode(viafb_mode1, &viafb_second_xres,
                        &viafb_second_yres);
        default_var.xres_virtual = default_xres;
        default_var.yres_virtual = default_yres;
        default_var.bits_per_pixel = viafb_bpp;
 -      viafb_fill_var_timing_info(&default_var, viafb_get_refresh(
 -              default_var.xres, default_var.yres, viafb_refresh),
 -              viafb_get_mode(default_var.xres, default_var.yres));
 +      viafb_fill_var_timing_info(&default_var, viafb_get_best_mode(
 +              default_var.xres, default_var.yres, viafb_refresh));
        viafb_setup_fixinfo(&viafbinfo->fix, viaparinfo);
        viafbinfo->var = default_var;
  
                default_var.xres_virtual = viafb_second_xres;
                default_var.yres_virtual = viafb_second_yres;
                default_var.bits_per_pixel = viafb_bpp1;
 -              viafb_fill_var_timing_info(&default_var, viafb_get_refresh(
 -                      default_var.xres, default_var.yres, viafb_refresh1),
 -                      viafb_get_mode(default_var.xres, default_var.yres));
 +              viafb_fill_var_timing_info(&default_var, viafb_get_best_mode(
 +                      default_var.xres, default_var.yres, viafb_refresh1));
  
                viafb_setup_fixinfo(&viafbinfo1->fix, viaparinfo1);
                viafb_check_var(&default_var, viafbinfo1);
@@@ -2012,7 -2016,7 +2012,7 @@@ static int __init viafb_setup(void
  int __init viafb_init(void)
  {
        u32 dummy_x, dummy_y;
-       int r;
+       int r = 0;
  
        if (machine_is_olpc())
                /* Apply XO-1.5-specific configuration. */
                return r;
  #endif
        if (parse_mode(viafb_mode, &dummy_x, &dummy_y)
 -              || !viafb_get_mode(dummy_x, dummy_y)
 +              || !viafb_get_best_mode(dummy_x, dummy_y, viafb_refresh)
                || parse_mode(viafb_mode1, &dummy_x, &dummy_y)
 -              || !viafb_get_mode(dummy_x, dummy_y)
 +              || !viafb_get_best_mode(dummy_x, dummy_y, viafb_refresh1)
                || viafb_bpp < 0 || viafb_bpp > 32
                || viafb_bpp1 < 0 || viafb_bpp1 > 32
                || parse_active_dev())
                return -EINVAL;
  
        printk(KERN_INFO
-        "VIA Graphics Intergration Chipset framebuffer %d.%d initializing\n",
+        "VIA Graphics Integration Chipset framebuffer %d.%d initializing\n",
               VERSION_MAJOR, VERSION_MINOR);
-       return 0;
+       return r;
  }
  
  void __exit viafb_exit(void)