]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/video/nvidia/nv_setup.c
nvidiafb: fix sparse warning
[linux-2.6-omap-h63xx.git] / drivers / video / nvidia / nv_setup.c
index 1f06a9f1bd0f52d893e4233111174281a23f130e..336ddb0d10b8bc58aaa564650ed16cea1a33ac46 100644 (file)
@@ -262,7 +262,7 @@ static void nv10GetConfig(struct nvidia_par *par)
 #endif
 
        dev = pci_find_slot(0, 1);
-       if ((par->Chipset && 0xffff) == 0x01a0) {
+       if ((par->Chipset & 0xffff) == 0x01a0) {
                int amt = 0;
 
                pci_read_config_dword(dev, 0x7c, &amt);
@@ -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);
@@ -353,6 +359,7 @@ void NVCommonSetup(struct fb_info *info)
        case 0x0186:
        case 0x0187:
        case 0x018D:
+       case 0x0228:
        case 0x0286:
        case 0x028C:
        case 0x0316:
@@ -376,12 +383,18 @@ void NVCommonSetup(struct fb_info *info)
        case 0x034C:
        case 0x0160:
        case 0x0166:
+       case 0x0169:
+       case 0x016B:
+       case 0x016C:
+       case 0x016D:
        case 0x00C8:
        case 0x00CC:
        case 0x0144:
        case 0x0146:
        case 0x0147:
        case 0x0148:
+       case 0x0098:
+       case 0x0099:
                mobile = 1;
                break;
        default:
@@ -406,9 +419,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 +507,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);
                }
 
@@ -631,12 +644,28 @@ void NVCommonSetup(struct fb_info *info)
                par->fpHeight = NV_RD32(par->PRAMDAC, 0x0800) + 1;
                par->fpSyncs = NV_RD32(par->PRAMDAC, 0x0848) & 0x30000033;
 
-               printk("Panel size is %i x %i\n", par->fpWidth, par->fpHeight);
+               printk("nvidiafb: Panel size is %i x %i\n", par->fpWidth, par->fpHeight);
        }
 
        if (monA)
                info->monspecs = *monA;
 
+       if (!par->FlatPanel || !par->twoHeads)
+               par->FPDither = 0;
+
+       par->LVDS = 0;
+       if (par->FlatPanel && par->twoHeads) {
+               NV_WR32(par->PRAMDAC0, 0x08B0, 0x00010004);
+               if (NV_RD32(par->PRAMDAC0, 0x08b4) & 1)
+                       par->LVDS = 1;
+               printk("nvidiafb: Panel is %s\n", par->LVDS ? "LVDS" : "TMDS");
+       }
+
        kfree(edidA);
        kfree(edidB);
+done:
+       kfree(var);
+       kfree(monitorA);
+       kfree(monitorB);
+       return err;
 }