Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / video / pm2fb.c
index 5dcedde..4e96393 100644 (file)
@@ -73,8 +73,8 @@ static char *mode __devinitdata = NULL;
  * these flags allow the user to specify that requests for +ve sync
  * should be silently turned in -ve sync.
  */
-static int lowhsync __devinitdata = 0;
-static int lowvsync __devinitdata = 0;
+static int lowhsync;
+static int lowvsync;
 
 /*
  * The hardware state of the graphics card that isn't part of the
@@ -91,6 +91,7 @@ struct pm2fb_par
        u32             mem_config;     /* MemConfig reg at probe */
        u32             mem_control;    /* MemControl reg at probe */
        u32             boot_address;   /* BootAddress reg at probe */
+       u32             palette[16];
 };
 
 /*
@@ -138,27 +139,27 @@ static struct fb_var_screeninfo pm2fb_var __devinitdata = {
  * Utility functions
  */
 
-inline static u32 RD32(unsigned char __iomem *base, s32 off)
+static inline u32 RD32(unsigned char __iomem *base, s32 off)
 {
        return fb_readl(base + off);
 }
 
-inline static void WR32(unsigned char __iomem *base, s32 off, u32 v)
+static inline void WR32(unsigned char __iomem *base, s32 off, u32 v)
 {
        fb_writel(v, base + off);
 }
 
-inline static u32 pm2_RD(struct pm2fb_par* p, s32 off)
+static inline u32 pm2_RD(struct pm2fb_par* p, s32 off)
 {
        return RD32(p->v_regs, off);
 }
 
-inline static void pm2_WR(struct pm2fb_par* p, s32 off, u32 v)
+static inline void pm2_WR(struct pm2fb_par* p, s32 off, u32 v)
 {
        WR32(p->v_regs, off, v);
 }
 
-inline static u32 pm2_RDAC_RD(struct pm2fb_par* p, s32 idx)
+static inline u32 pm2_RDAC_RD(struct pm2fb_par* p, s32 idx)
 {
        int index = PM2R_RD_INDEXED_DATA;
        switch (p->type) {
@@ -174,7 +175,7 @@ inline static u32 pm2_RDAC_RD(struct pm2fb_par* p, s32 idx)
        return pm2_RD(p, index);
 }
 
-inline static void pm2_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v)
+static inline void pm2_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v)
 {
        int index = PM2R_RD_INDEXED_DATA;
        switch (p->type) {
@@ -190,7 +191,7 @@ inline static void pm2_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v)
        pm2_WR(p, index, v);
 }
 
-inline static void pm2v_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v)
+static inline void pm2v_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v)
 {
        pm2_WR(p, PM2VR_RD_INDEX_LOW, idx & 0xff);
        mb();
@@ -200,7 +201,7 @@ inline static void pm2v_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v)
 #ifdef CONFIG_FB_PM2_FIFO_DISCONNECT
 #define WAIT_FIFO(p,a)
 #else
-inline static void WAIT_FIFO(struct pm2fb_par* p, u32 a)
+static inline void WAIT_FIFO(struct pm2fb_par* p, u32 a)
 {
        while( pm2_RD(p, PM2R_IN_FIFO_SPACE) < a );
        mb();
@@ -674,7 +675,7 @@ static int pm2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
  */
 static int pm2fb_set_par(struct fb_info *info)
 {
-       struct pm2fb_par *par = (struct pm2fb_par *) info->par;
+       struct pm2fb_par *par = info->par;
        u32 pixclock;
        u32 width, height, depth;
        u32 hsstart, hsend, hbend, htotal;
@@ -854,7 +855,7 @@ static int pm2fb_setcolreg(unsigned regno, unsigned red, unsigned green,
                           unsigned blue, unsigned transp,
                           struct fb_info *info)
 {
-       struct pm2fb_par *par = (struct pm2fb_par *) info->par;
+       struct pm2fb_par *par = info->par;
 
        if (regno >= info->cmap.len)  /* no. of hw registers */
                return 1;
@@ -929,7 +930,7 @@ static int pm2fb_setcolreg(unsigned regno, unsigned red, unsigned green,
                case 16:
                case 24:
                case 32:        
-                       ((u32*)(info->pseudo_palette))[regno] = v;
+                       par->palette[regno] = v;
                        break;
                }
                return 0;
@@ -955,7 +956,7 @@ static int pm2fb_setcolreg(unsigned regno, unsigned red, unsigned green,
 static int pm2fb_pan_display(struct fb_var_screeninfo *var,
                             struct fb_info *info)
 {
-       struct pm2fb_par *p = (struct pm2fb_par *) info->par;
+       struct pm2fb_par *p = info->par;
        u32 base;
        u32 depth;
        u32 xres;
@@ -987,7 +988,7 @@ static int pm2fb_pan_display(struct fb_var_screeninfo *var,
  */
 static int pm2fb_blank(int blank_mode, struct fb_info *info)
 {
-       struct pm2fb_par *par = (struct pm2fb_par *) info->par;
+       struct pm2fb_par *par = info->par;
        u32 video = par->video;
 
        DPRINTK("blank_mode %d\n", blank_mode);
@@ -1034,7 +1035,6 @@ static struct fb_ops pm2fb_ops = {
        .fb_fillrect    = cfb_fillrect,
        .fb_copyarea    = cfb_copyarea,
        .fb_imageblit   = cfb_imageblit,
-       .fb_cursor      = soft_cursor,
 };
 
 /*
@@ -1055,8 +1055,7 @@ static int __devinit pm2fb_probe(struct pci_dev *pdev,
 {
        struct pm2fb_par *default_par;
        struct fb_info *info;
-       int size, err;
-       int err_retval = -ENXIO;
+       int err, err_retval = -ENXIO;
 
        err = pci_enable_device(pdev);
        if ( err ) {
@@ -1064,11 +1063,10 @@ static int __devinit pm2fb_probe(struct pci_dev *pdev,
                return err;
        }
 
-       size = sizeof(struct pm2fb_par) + 256 * sizeof(u32);
-       info = framebuffer_alloc(size, &pdev->dev);
+       info = framebuffer_alloc(sizeof(struct pm2fb_par), &pdev->dev);
        if ( !info )
                return -ENOMEM;
-       default_par = (struct pm2fb_par *) info->par;
+       default_par = info->par;
 
        switch (pdev->device) {
        case  PCI_DEVICE_ID_TI_TVP4020:
@@ -1121,6 +1119,22 @@ static int __devinit pm2fb_probe(struct pci_dev *pdev,
                default_par->mem_control, default_par->boot_address,
                default_par->mem_config);
 
+       if(default_par->mem_control == 0 &&
+               default_par->boot_address == 0x31 &&
+               default_par->mem_config == 0x259fffff &&
+               pdev->subsystem_vendor == 0x1048 &&
+               pdev->subsystem_device == 0x0a31) {
+               DPRINTK("subsystem_vendor: %04x, subsystem_device: %04x\n",
+                       pdev->subsystem_vendor, pdev->subsystem_device);
+               DPRINTK("We have not been initialized by VGA BIOS "
+                       "and are running on an Elsa Winner 2000 Office\n");
+               DPRINTK("Initializing card timings manually...\n");
+               default_par->mem_control=0;
+               default_par->boot_address=0x20;
+               default_par->mem_config=0xe6002021;
+               default_par->memclock=100000;
+       }
+
        /* Now work out how big lfb is going to be. */
        switch(default_par->mem_config & PM2F_MEM_CONFIG_RAM_MASK) {
        case PM2F_MEM_BANKS_1:
@@ -1156,7 +1170,7 @@ static int __devinit pm2fb_probe(struct pci_dev *pdev,
 
        info->fbops             = &pm2fb_ops;
        info->fix               = pm2fb_fix;    
-       info->pseudo_palette    = (void *)(default_par + 1); 
+       info->pseudo_palette    = default_par->palette;
        info->flags             = FBINFO_DEFAULT |
                                   FBINFO_HWACCEL_YPAN;