staging: xgifb: move pseudo_palette into xgifb_video_info
[pandora-kernel.git] / drivers / staging / xgifb / XGI_main_26.c
index 355a178..45427d7 100644 (file)
@@ -402,7 +402,6 @@ static int XGIfb_GetXG21DefaultLVDSModeIdx(void)
                                && (XGIbios_mode[XGIfb_mode_idx].yres
                                                == XGI21_LCDCapList[0].LVDSVDE)
                                && (XGIbios_mode[XGIfb_mode_idx].bpp == 8)) {
-                       XGIfb_mode_no = XGIbios_mode[XGIfb_mode_idx].mode_no;
                        found_mode = 1;
                        break;
                }
@@ -414,14 +413,15 @@ static int XGIfb_GetXG21DefaultLVDSModeIdx(void)
        return XGIfb_mode_idx;
 }
 
-static void XGIfb_search_mode(const char *name)
+static void XGIfb_search_mode(struct xgifb_video_info *xgifb_info,
+                             const char *name)
 {
        int i = 0, j = 0, l;
 
        while (XGIbios_mode[i].mode_no != 0) {
                l = min(strlen(name), strlen(XGIbios_mode[i].name));
                if (!strncmp(name, XGIbios_mode[i].name, l)) {
-                       xgifb_mode_idx = i;
+                       xgifb_info->mode_idx = i;
                        j = 1;
                        break;
                }
@@ -431,7 +431,8 @@ static void XGIfb_search_mode(const char *name)
                printk(KERN_INFO "XGIfb: Invalid mode '%s'\n", name);
 }
 
-static void XGIfb_search_vesamode(unsigned int vesamode)
+static void XGIfb_search_vesamode(struct xgifb_video_info *xgifb_info,
+                                 unsigned int vesamode)
 {
        int i = 0, j = 0;
 
@@ -443,7 +444,7 @@ static void XGIfb_search_vesamode(unsigned int vesamode)
        while (XGIbios_mode[i].mode_no != 0) {
                if ((XGIbios_mode[i].vesa_mode_no_1 == vesamode) ||
                    (XGIbios_mode[i].vesa_mode_no_2 == vesamode)) {
-                       xgifb_mode_idx = i;
+                       xgifb_info->mode_idx = i;
                        j = 1;
                        break;
                }
@@ -748,21 +749,22 @@ static u8 XGIfb_search_refresh_rate(struct xgifb_video_info *xgifb_info,
        u16 xres, yres;
        int i = 0;
 
-       xres = XGIbios_mode[xgifb_mode_idx].xres;
-       yres = XGIbios_mode[xgifb_mode_idx].yres;
+       xres = XGIbios_mode[xgifb_info->mode_idx].xres;
+       yres = XGIbios_mode[xgifb_info->mode_idx].yres;
 
-       XGIfb_rate_idx = 0;
+       xgifb_info->rate_idx = 0;
        while ((XGIfb_vrate[i].idx != 0) && (XGIfb_vrate[i].xres <= xres)) {
                if ((XGIfb_vrate[i].xres == xres) &&
                    (XGIfb_vrate[i].yres == yres)) {
                        if (XGIfb_vrate[i].refresh == rate) {
-                               XGIfb_rate_idx = XGIfb_vrate[i].idx;
+                               xgifb_info->rate_idx = XGIfb_vrate[i].idx;
                                break;
                        } else if (XGIfb_vrate[i].refresh > rate) {
                                if ((XGIfb_vrate[i].refresh - rate) <= 3) {
                                        DPRINTK("XGIfb: Adjusting rate from %d up to %d\n",
                                                rate, XGIfb_vrate[i].refresh);
-                                       XGIfb_rate_idx = XGIfb_vrate[i].idx;
+                                       xgifb_info->rate_idx =
+                                               XGIfb_vrate[i].idx;
                                        xgifb_info->refresh_rate =
                                                XGIfb_vrate[i].refresh;
                                } else if (((rate - XGIfb_vrate[i - 1].refresh)
@@ -770,7 +772,8 @@ static u8 XGIfb_search_refresh_rate(struct xgifb_video_info *xgifb_info,
                                                != 1)) {
                                        DPRINTK("XGIfb: Adjusting rate from %d down to %d\n",
                                                rate, XGIfb_vrate[i-1].refresh);
-                                       XGIfb_rate_idx = XGIfb_vrate[i - 1].idx;
+                                       xgifb_info->rate_idx =
+                                               XGIfb_vrate[i - 1].idx;
                                        xgifb_info->refresh_rate =
                                                XGIfb_vrate[i - 1].refresh;
                                }
@@ -778,14 +781,14 @@ static u8 XGIfb_search_refresh_rate(struct xgifb_video_info *xgifb_info,
                        } else if ((rate - XGIfb_vrate[i].refresh) <= 2) {
                                DPRINTK("XGIfb: Adjusting rate from %d down to %d\n",
                                        rate, XGIfb_vrate[i].refresh);
-                               XGIfb_rate_idx = XGIfb_vrate[i].idx;
+                               xgifb_info->rate_idx = XGIfb_vrate[i].idx;
                                break;
                        }
                }
                i++;
        }
-       if (XGIfb_rate_idx > 0) {
-               return XGIfb_rate_idx;
+       if (xgifb_info->rate_idx > 0) {
+               return xgifb_info->rate_idx;
        } else {
                printk(KERN_INFO "XGIfb: Unsupported rate %d for %dx%d\n",
                       rate, xres, yres);
@@ -890,7 +893,8 @@ static void XGIfb_pre_setmode(struct xgifb_video_info *xgifb_info)
 
        xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR30, cr30);
        xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR31, cr31);
-       xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR33, (XGIfb_rate_idx & 0x0F));
+       xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR33,
+                                               (xgifb_info->rate_idx & 0x0F));
 }
 
 static void XGIfb_post_setmode(struct xgifb_video_info *xgifb_info)
@@ -1175,48 +1179,49 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
               var->bits_per_pixel,
               xgifb_info->refresh_rate);
 
-       old_mode = xgifb_mode_idx;
-       xgifb_mode_idx = 0;
+       old_mode = xgifb_info->mode_idx;
+       xgifb_info->mode_idx = 0;
 
-       while ((XGIbios_mode[xgifb_mode_idx].mode_no != 0)
-                       && (XGIbios_mode[xgifb_mode_idx].xres <= var->xres)) {
-               if ((XGIbios_mode[xgifb_mode_idx].xres == var->xres)
-                               && (XGIbios_mode[xgifb_mode_idx].yres
-                                               == var->yres)
-                               && (XGIbios_mode[xgifb_mode_idx].bpp
+       while ((XGIbios_mode[xgifb_info->mode_idx].mode_no != 0) &&
+              (XGIbios_mode[xgifb_info->mode_idx].xres <= var->xres)) {
+               if ((XGIbios_mode[xgifb_info->mode_idx].xres == var->xres) &&
+                   (XGIbios_mode[xgifb_info->mode_idx].yres == var->yres) &&
+                   (XGIbios_mode[xgifb_info->mode_idx].bpp
                                                == var->bits_per_pixel)) {
-                       XGIfb_mode_no = XGIbios_mode[xgifb_mode_idx].mode_no;
                        found_mode = 1;
                        break;
                }
-               xgifb_mode_idx++;
+               xgifb_info->mode_idx++;
        }
 
        if (found_mode)
-               xgifb_mode_idx = XGIfb_validate_mode(xgifb_info,
-                                                    xgifb_mode_idx);
+               xgifb_info->mode_idx = XGIfb_validate_mode(xgifb_info,
+                                                       xgifb_info->mode_idx);
        else
-               xgifb_mode_idx = -1;
+               xgifb_info->mode_idx = -1;
 
-       if (xgifb_mode_idx < 0) {
+       if (xgifb_info->mode_idx < 0) {
                printk(KERN_ERR "XGIfb: Mode %dx%dx%d not supported\n",
                       var->xres, var->yres, var->bits_per_pixel);
-               xgifb_mode_idx = old_mode;
+               xgifb_info->mode_idx = old_mode;
                return -EINVAL;
        }
 
        if (XGIfb_search_refresh_rate(xgifb_info,
                                      xgifb_info->refresh_rate) == 0) {
-               XGIfb_rate_idx = XGIbios_mode[xgifb_mode_idx].rate_idx;
+               xgifb_info->rate_idx =
+                       XGIbios_mode[xgifb_info->mode_idx].rate_idx;
                xgifb_info->refresh_rate = 60;
        }
 
        if (isactive) {
 
                XGIfb_pre_setmode(xgifb_info);
-               if (XGISetModeNew(hw_info, XGIfb_mode_no) == 0) {
+               if (XGISetModeNew(hw_info,
+                                 XGIbios_mode[xgifb_info->mode_idx].mode_no)
+                                       == 0) {
                        printk(KERN_ERR "XGIfb: Setting mode[0x%x] failed\n",
-                              XGIfb_mode_no);
+                              XGIbios_mode[xgifb_info->mode_idx].mode_no);
                        return -EINVAL;
                }
                info->fix.line_length = ((info->var.xres_virtual
@@ -1232,16 +1237,18 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
                XGIfb_post_setmode(xgifb_info);
 
                DPRINTK("XGIfb: Set new mode: %dx%dx%d-%d\n",
-                               XGIbios_mode[xgifb_mode_idx].xres,
-                               XGIbios_mode[xgifb_mode_idx].yres,
-                               XGIbios_mode[xgifb_mode_idx].bpp,
+                               XGIbios_mode[xgifb_info->mode_idx].xres,
+                               XGIbios_mode[xgifb_info->mode_idx].yres,
+                               XGIbios_mode[xgifb_info->mode_idx].bpp,
                                xgifb_info->refresh_rate);
 
-               xgifb_info->video_bpp = XGIbios_mode[xgifb_mode_idx].bpp;
+               xgifb_info->video_bpp = XGIbios_mode[xgifb_info->mode_idx].bpp;
                xgifb_info->video_vwidth = info->var.xres_virtual;
-               xgifb_info->video_width = XGIbios_mode[xgifb_mode_idx].xres;
+               xgifb_info->video_width =
+                       XGIbios_mode[xgifb_info->mode_idx].xres;
                xgifb_info->video_vheight = info->var.yres_virtual;
-               xgifb_info->video_height = XGIbios_mode[xgifb_mode_idx].yres;
+               xgifb_info->video_height =
+                       XGIbios_mode[xgifb_info->mode_idx].yres;
                xgifb_info->org_x = xgifb_info->org_y = 0;
                xgifb_info->video_linelength = info->var.xres_virtual
                                * (xgifb_info->video_bpp >> 3);
@@ -2251,25 +2258,28 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
 
        }
 
+       xgifb_info->mode_idx = -1;
+
        if (mode)
-               XGIfb_search_mode(mode);
+               XGIfb_search_mode(xgifb_info, mode);
        else if (vesa != -1)
-               XGIfb_search_vesamode(vesa);
+               XGIfb_search_vesamode(xgifb_info, vesa);
 
-       if (xgifb_mode_idx >= 0)
-               xgifb_mode_idx = XGIfb_validate_mode(xgifb_info,
-                                                    xgifb_mode_idx);
+       if (xgifb_info->mode_idx >= 0)
+               xgifb_info->mode_idx =
+                       XGIfb_validate_mode(xgifb_info, xgifb_info->mode_idx);
 
-       if (xgifb_mode_idx < 0) {
+       if (xgifb_info->mode_idx < 0) {
                if ((xgifb_info->disp_state & DISPTYPE_DISP2) ==
                        DISPTYPE_LCD &&
                    xgifb_info->chip == XG21)
-                       xgifb_mode_idx = XGIfb_GetXG21DefaultLVDSModeIdx();
+                       xgifb_info->mode_idx =
+                               XGIfb_GetXG21DefaultLVDSModeIdx();
                else
-                       xgifb_mode_idx = DEFAULT_MODE;
+                       xgifb_info->mode_idx = DEFAULT_MODE;
        }
 
-       if (xgifb_mode_idx < 0) {
+       if (xgifb_info->mode_idx < 0) {
                dev_err(&pdev->dev, "no supported video mode found\n");
                goto error_1;
        }
@@ -2279,33 +2289,32 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
 
                for (m = 0; m < ARRAY_SIZE(XGI21_LCDCapList); m++)
                        if ((XGI21_LCDCapList[m].LVDSHDE ==
-                               XGIbios_mode[xgifb_mode_idx].xres) &&
+                               XGIbios_mode[xgifb_info->mode_idx].xres) &&
                            (XGI21_LCDCapList[m].LVDSVDE ==
-                               XGIbios_mode[xgifb_mode_idx].yres)) {
+                               XGIbios_mode[xgifb_info->mode_idx].yres)) {
                                xgifb_reg_set(XGI_Pr.P3d4, 0x36, m);
                                break;
                        }
        }
 
-       XGIfb_mode_no = XGIbios_mode[xgifb_mode_idx].mode_no;
-
        /* yilin set default refresh rate */
        xgifb_info->refresh_rate = refresh_rate;
        if (xgifb_info->refresh_rate == 0)
                xgifb_info->refresh_rate = 60;
        if (XGIfb_search_refresh_rate(xgifb_info,
                        xgifb_info->refresh_rate) == 0) {
-               XGIfb_rate_idx = XGIbios_mode[xgifb_mode_idx].rate_idx;
+               xgifb_info->rate_idx =
+                       XGIbios_mode[xgifb_info->mode_idx].rate_idx;
                xgifb_info->refresh_rate = 60;
        }
 
-       xgifb_info->video_bpp = XGIbios_mode[xgifb_mode_idx].bpp;
+       xgifb_info->video_bpp = XGIbios_mode[xgifb_info->mode_idx].bpp;
        xgifb_info->video_vwidth =
                xgifb_info->video_width =
-                       XGIbios_mode[xgifb_mode_idx].xres;
+                       XGIbios_mode[xgifb_info->mode_idx].xres;
        xgifb_info->video_vheight =
                xgifb_info->video_height =
-                       XGIbios_mode[xgifb_mode_idx].yres;
+                       XGIbios_mode[xgifb_info->mode_idx].yres;
        xgifb_info->org_x = xgifb_info->org_y = 0;
        xgifb_info->video_linelength =
                xgifb_info->video_width *
@@ -2351,10 +2360,12 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
 
        default_var.pixclock = (u32) (1000000000 /
                        XGIfb_mode_rate_to_dclock(&XGI_Pr, hw_info,
-                                       XGIfb_mode_no, XGIfb_rate_idx));
+                               XGIbios_mode[xgifb_info->mode_idx].mode_no,
+                               xgifb_info->rate_idx));
 
        if (XGIfb_mode_rate_to_ddata(&XGI_Pr, hw_info,
-               XGIfb_mode_no, XGIfb_rate_idx,
+               XGIbios_mode[xgifb_info->mode_idx].mode_no,
+               xgifb_info->rate_idx,
                &default_var.left_margin, &default_var.right_margin,
                &default_var.upper_margin, &default_var.lower_margin,
                &default_var.hsync_len, &default_var.vsync_len,
@@ -2379,7 +2390,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
        fb_info->screen_base = xgifb_info->video_vbase;
        fb_info->fbops = &XGIfb_ops;
        XGIfb_get_fix(&fb_info->fix, -1, fb_info);
-       fb_info->pseudo_palette = pseudo_palette;
+       fb_info->pseudo_palette = xgifb_info->pseudo_palette;
 
        fb_alloc_cmap(&fb_info->cmap, 256 , 0);