]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/video/nvidia/nv_setup.c
Merge branch 'upstream-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/linvil...
[linux-2.6-omap-h63xx.git] / drivers / video / nvidia / nv_setup.c
index 1f06a9f1bd0f52d893e4233111174281a23f130e..a18a9aebf05fb2f7ea9c428ee7171068b9bfd5c5 100644 (file)
@@ -285,28 +285,34 @@ static void nv10GetConfig(struct nvidia_par *par)
                        par->CrystalFreqKHz = 27000;
        }
 
-       par->CursorStart = (par->RamAmountKBytes - 96) * 1024;
        par->CURSOR = NULL;     /* can't set this here */
        par->MinVClockFreqKHz = 12000;
        par->MaxVClockFreqKHz = par->twoStagePLL ? 400000 : 350000;
 }
 
-void NVCommonSetup(struct fb_info *info)
+int NVCommonSetup(struct fb_info *info)
 {
        struct nvidia_par *par = info->par;
-       struct fb_var_screeninfo var;
+       struct fb_var_screeninfo *var;
        u16 implementation = par->Chipset & 0x0ff0;
        u8 *edidA = NULL, *edidB = NULL;
-       struct fb_monspecs monitorA, monitorB;
+       struct fb_monspecs *monitorA, *monitorB;
        struct fb_monspecs *monA = NULL, *monB = NULL;
        int mobile = 0;
        int tvA = 0;
        int tvB = 0;
        int FlatPanel = -1;     /* really means the CRTC is slaved */
        int Television = 0;
+       int err = 0;
 
-       memset(&monitorA, 0, sizeof(struct fb_monspecs));
-       memset(&monitorB, 0, sizeof(struct fb_monspecs));
+       var = kzalloc(sizeof(struct fb_var_screeninfo), GFP_KERNEL);
+       monitorA = kzalloc(sizeof(struct fb_monspecs), GFP_KERNEL);
+       monitorB = kzalloc(sizeof(struct fb_monspecs), GFP_KERNEL);
+
+       if (!var || !monitorA || !monitorB) {
+               err = -ENOMEM;
+               goto done;
+       }
 
        par->PRAMIN = par->REGS + (0x00710000 / 4);
        par->PCRTC0 = par->REGS + (0x00600000 / 4);
@@ -382,6 +388,8 @@ void NVCommonSetup(struct fb_info *info)
        case 0x0146:
        case 0x0147:
        case 0x0148:
+       case 0x0098:
+       case 0x0099:
                mobile = 1;
                break;
        default:
@@ -406,9 +414,9 @@ void NVCommonSetup(struct fb_info *info)
                par->CRTCnumber = 0;
                if (nvidia_probe_i2c_connector(info, 1, &edidA))
                        nvidia_probe_of_connector(info, 1, &edidA);
-               if (edidA && !fb_parse_edid(edidA, &var)) {
+               if (edidA && !fb_parse_edid(edidA, var)) {
                        printk("nvidiafb: EDID found from BUS1\n");
-                       monA = &monitorA;
+                       monA = monitorA;
                        fb_edid_to_monspecs(edidA, monA);
                        FlatPanel = (monA->input & FB_DISP_DDI) ? 1 : 0;
 
@@ -494,17 +502,17 @@ void NVCommonSetup(struct fb_info *info)
 
                if (nvidia_probe_i2c_connector(info, 1, &edidA))
                        nvidia_probe_of_connector(info, 1, &edidA);
-               if (edidA && !fb_parse_edid(edidA, &var)) {
+               if (edidA && !fb_parse_edid(edidA, var)) {
                        printk("nvidiafb: EDID found from BUS1\n");
-                       monA = &monitorA;
+                       monA = monitorA;
                        fb_edid_to_monspecs(edidA, monA);
                }
 
                if (nvidia_probe_i2c_connector(info, 2, &edidB))
                        nvidia_probe_of_connector(info, 2, &edidB);
-               if (edidB && !fb_parse_edid(edidB, &var)) {
+               if (edidB && !fb_parse_edid(edidB, var)) {
                        printk("nvidiafb: EDID found from BUS2\n");
-                       monB = &monitorB;
+                       monB = monitorB;
                        fb_edid_to_monspecs(edidB, monB);
                }
 
@@ -639,4 +647,9 @@ void NVCommonSetup(struct fb_info *info)
 
        kfree(edidA);
        kfree(edidB);
+done:
+       kfree(var);
+       kfree(monitorA);
+       kfree(monitorB);
+       return err;
 }