]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/video/nvidia/nv_setup.c
[NETFILTER]: fix ebtable targets return
[linux-2.6-omap-h63xx.git] / drivers / video / nvidia / nv_setup.c
index a18a9aebf05fb2f7ea9c428ee7171068b9bfd5c5..82579d3a99706470bcf05e26902c4d5e6f2961ea 100644 (file)
@@ -166,11 +166,13 @@ u8 NVReadDacData(struct nvidia_par *par)
 static int NVIsConnected(struct nvidia_par *par, int output)
 {
        volatile u32 __iomem *PRAMDAC = par->PRAMDAC0;
-       u32 reg52C, reg608;
+       u32 reg52C, reg608, dac0_reg608 = 0;
        int present;
 
-       if (output)
-               PRAMDAC += 0x800;
+       if (output) {
+           dac0_reg608 = NV_RD32(PRAMDAC, 0x0608);
+           PRAMDAC += 0x800;
+       }
 
        reg52C = NV_RD32(PRAMDAC, 0x052C);
        reg608 = NV_RD32(PRAMDAC, 0x0608);
@@ -194,8 +196,8 @@ static int NVIsConnected(struct nvidia_par *par, int output)
        else
                printk("nvidiafb: CRTC%i analog not found\n", output);
 
-       NV_WR32(par->PRAMDAC0, 0x0608, NV_RD32(par->PRAMDAC0, 0x0608) &
-               0x0000EFFF);
+       if (output)
+           NV_WR32(par->PRAMDAC0, 0x0608, dac0_reg608);
 
        NV_WR32(PRAMDAC, 0x052C, reg52C);
        NV_WR32(PRAMDAC, 0x0608, reg608);
@@ -261,8 +263,8 @@ static void nv10GetConfig(struct nvidia_par *par)
        }
 #endif
 
-       dev = pci_find_slot(0, 1);
-       if ((par->Chipset && 0xffff) == 0x01a0) {
+       dev = pci_get_bus_and_slot(0, 1);
+       if ((par->Chipset & 0xffff) == 0x01a0) {
                int amt = 0;
 
                pci_read_config_dword(dev, 0x7c, &amt);
@@ -276,6 +278,7 @@ static void nv10GetConfig(struct nvidia_par *par)
                par->RamAmountKBytes =
                    (NV_RD32(par->PFB, 0x020C) & 0xFFF00000) >> 10;
        }
+       pci_dev_put(dev);
 
        par->CrystalFreqKHz = (NV_RD32(par->PEXTDEV, 0x0000) & (1 << 6)) ?
            14318 : 13500;
@@ -359,6 +362,7 @@ int NVCommonSetup(struct fb_info *info)
        case 0x0186:
        case 0x0187:
        case 0x018D:
+       case 0x0228:
        case 0x0286:
        case 0x028C:
        case 0x0316:
@@ -382,6 +386,10 @@ int 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:
@@ -639,12 +647,23 @@ int 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: