]> git.hungrycats.org Git - linux/commitdiff
Pmac updates
authorJames Simmons <jsimmons@heisenberg.transvirtual.com>
Thu, 2 May 2002 02:48:04 +0000 (19:48 -0700)
committerJames Simmons <fbdev.adm@hostme.bitkeeper.com>
Thu, 2 May 2002 02:48:04 +0000 (19:48 -0700)
drivers/video/aty/atyfb_base.c
drivers/video/aty128fb.c
drivers/video/chipsfb.c
drivers/video/controlfb.c
drivers/video/imsttfb.c
drivers/video/offb.c
drivers/video/platinumfb.c
drivers/video/valkyriefb.c

index 91ddf86c76e9e77e9e63eb7660e4d8c4ae64fa50..1d897a5385abb372d403484be92805709b961009 100644 (file)
@@ -87,6 +87,9 @@
 #include <linux/adb.h>
 #include <linux/pmu.h>
 #endif
+#ifdef CONFIG_BOOTX_TEXT
+#include <asm/btext.h>
+#endif
 #ifdef CONFIG_NVRAM
 #include <linux/nvram.h>
 #endif
@@ -815,6 +818,13 @@ static void atyfb_set_par(const struct atyfb_par *par,
        display_info.disp_reg_address = info->ati_regbase_phys;
     }
 #endif /* CONFIG_FB_COMPAT_XPMAC */
+#ifdef CONFIG_BOOTX_TEXT
+       btext_update_display(info->frame_buffer_phys,
+                       (((par->crtc.h_tot_disp>>16) & 0xff)+1)*8,
+                       ((par->crtc.v_tot_disp>>16) & 0x7ff)+1,
+                       par->crtc.bpp,
+                       par->crtc.vxres*par->crtc.bpp/8);
+#endif /* CONFIG_BOOTX_TEXT */
 }
 
 static int atyfb_decode_var(const struct fb_var_screeninfo *var,
index e0c8276bf78e4e2c0d4f3852dcb3407020d11234..a4c741f5f9aae5f3e4a7f61e8f3f40d4166b157f 100644 (file)
@@ -70,6 +70,9 @@
 #ifdef CONFIG_FB_COMPAT_XPMAC
 #include <asm/vc_ioctl.h>
 #endif
+#ifdef CONFIG_BOOTX_TEXT
+#include <asm/btext.h>
+#endif /* CONFIG_BOOTX_TEXT */
 
 #include <video/fbcon.h>
 #include <video/fbcon-cfb8.h>
@@ -154,6 +157,7 @@ static struct aty128_chip_info aty128_pci_probe_list[] __initdata =
     {"Rage128 RL (AGP)", PCI_DEVICE_ID_ATI_RAGE128_RL, rage_128},
     {"Rage128 Pro PF (AGP)", PCI_DEVICE_ID_ATI_RAGE128_PF, rage_128_pro},
     {"Rage128 Pro PR (PCI)", PCI_DEVICE_ID_ATI_RAGE128_PR, rage_128_pro},
+    {"Rage128 Pro TR (AGP)", PCI_DEVICE_ID_ATI_RAGE128_U3, rage_128_pro},      
     {"Rage Mobility M3 (PCI)", PCI_DEVICE_ID_ATI_RAGE128_LE, rage_M3},
     {"Rage Mobility M3 (AGP)", PCI_DEVICE_ID_ATI_RAGE128_LF, rage_M3},
     {NULL, 0, rage_128}
@@ -216,9 +220,13 @@ static const char *aty128fb_name = "ATY Rage128";
 static char fontname[40] __initdata = { 0 };
 
 static int  noaccel __initdata = 0;
+#ifdef MODULE
 static char *font __initdata = NULL;
 static char *mode __initdata = NULL;
+#ifdef CONFIG_MTRR
 static int  nomtrr __initdata = 0;
+#endif
+#endif /* MODULE */
 
 static char *mode_option __initdata = NULL;
 
@@ -418,6 +426,7 @@ static struct fb_ops aty128fb_ops = {
        fb_set_cmap:    gen_set_cmap,
        fb_setcolreg:   aty128fb_setcolreg,
        fb_pan_display: aty128fb_pan_display,
+       fb_blank:       aty128fb_blank,
        fb_rasterimg:   aty128fb_rasterimg,
 };
 
@@ -1243,6 +1252,13 @@ aty128_set_par(struct aty128fb_par *par,
        display_info.disp_reg_address = info->regbase_phys;
     }
 #endif /* CONFIG_FB_COMPAT_XPMAC */
+#if defined(CONFIG_BOOTX_TEXT)
+       btext_update_display(info->frame_buffer_phys,
+                       (((par->crtc.h_total>>16) & 0xff)+1)*8,
+                       ((par->crtc.v_total>>16) & 0x7ff)+1,
+                       par->crtc.bpp,
+                       par->crtc.vxres*par->crtc.bpp/8);
+#endif /* CONFIG_BOOTX_TEXT */
 }
 
     /*
@@ -1584,7 +1600,7 @@ aty128fb_setup(char *options)
     if (!options || !*options)
        return 0;
 
-    while (this_opt = strsep(&options, ",")) {
+    while ((this_opt = strsep(&options, ",")) != NULL) {
        if (!strncmp(this_opt, "font:", 5)) {
            char *p;
            int i;
@@ -1687,6 +1703,29 @@ aty128_init(struct fb_info_aty128 *info, const char *name)
             if (default_vmode <= 0 || default_vmode > VMODE_MAX)
                 default_vmode = VMODE_1024_768_60;
 
+           /* iMacs need that resolution
+            * PowerMac2,1 first r128 iMacs
+            * PowerMac2,2 summer 2000 iMacs
+            * PowerMac4,1 january 2001 iMacs "flower power"
+            */
+           if (machine_is_compatible("PowerMac2,1") ||
+               machine_is_compatible("PowerMac2,2") ||
+               machine_is_compatible("PowerMac4,1"))
+               default_vmode = VMODE_1024_768_75;
+
+           /* iBook SE */
+           if (machine_is_compatible("PowerBook2,2"))
+               default_vmode = VMODE_800_600_60;
+
+           /* PowerBook Firewire (Pismo), iBook Dual USB */
+           if (machine_is_compatible("PowerBook3,1") ||
+               machine_is_compatible("PowerBook4,1"))
+               default_vmode = VMODE_1024_768_60;
+
+           /* PowerBook Titanium */
+           if (machine_is_compatible("PowerBook3,2"))
+               default_vmode = VMODE_1152_768_60;
+       
             if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
                 default_cmode = CMODE_8;
 
index 21b9184ec298ed2db24de6ed733dd6bb64c09850..8643e3c068850cf4896a08f635a97fc09ec3a1de 100644 (file)
@@ -312,7 +312,7 @@ static void chips_set_bitdepth(struct fb_info_chips *p, struct display* disp, in
        struct fb_var_screeninfo* var = &p->var;
        
        if (bpp == 16) {
-               if (con == info->currcon) {
+               if (con == p->info.currcon) {
                        write_cr(0x13, 200);            // Set line length (doublewords)
                        write_xr(0x81, 0x14);           // 15 bit (555) color mode
                        write_xr(0x82, 0x00);           // Disable palettes
@@ -334,7 +334,7 @@ static void chips_set_bitdepth(struct fb_info_chips *p, struct display* disp, in
                disp->dispsw = &fbcon_dummy;
 #endif
        } else if (bpp == 8) {
-               if (con == info->currcon) {
+               if (con == p->info.currcon) {
                        write_cr(0x13, 100);            // Set line length (doublewords)
                        write_xr(0x81, 0x12);           // 8 bit color mode
                        write_xr(0x82, 0x08);           // Graphics gamma enable
index d711c12b38ef72317b2914e7ffe5efe8ab7b8757..7da6fe86075dfff0ea3bd66f47db737091d9507d 100644 (file)
@@ -1238,7 +1238,7 @@ static void control_cfb16_revc(struct display *p, int xx, int yy)
     u8 *dest;
     int bytes = p->next_line, rows;
 
-    dest = p->info.screen_base + yy * fontheight(p) * bytes + xx * fontwidth(p)*2;
+    dest = p->fb_info->screen_base + yy * fontheight(p) * bytes + xx * fontwidth(p)*2;
     for (rows = fontheight(p); rows--; dest += bytes) {
        switch (fontwidth(p)) {
        case 16:
@@ -1261,7 +1261,7 @@ static void control_cfb32_revc(struct display *p, int xx, int yy)
     u8 *dest;
     int bytes = p->next_line, rows;
 
-    dest = p->info.screen_base + yy * fontheight(p) * bytes + xx * fontwidth(p) * 4;
+    dest = p->fb_info->screen_base + yy * fontheight(p) * bytes + xx * fontwidth(p) * 4;
     for (rows = fontheight(p); rows--; dest += bytes) {
        switch (fontwidth(p)) {
        case 16:
index c9c6f361bb2e7f51cc50b061604ab39a7002ecdf..b817517d0d21ac6ac949a6916846319e6404b7a8 100644 (file)
@@ -1908,7 +1908,7 @@ imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        p->ramdac = TVP;
                        break;
                default:
-                       printk(KERN_INFO "imsttfb: Device 0x%lx unknown, "
+                       printk(KERN_INFO "imsttfb: Device 0x%x unknown, "
                                         "contact maintainer.\n", pdev->device);
                        return -ENODEV;
        }
index ad7a79db092ca66867a7dd4c2ac2a0a223c7c58b..7a89d7c39db3a772bab142ada66cebf254ef73a8 100644 (file)
@@ -49,7 +49,8 @@ enum {
        cmap_r128,      /* ATI Rage128 */
        cmap_M3A,       /* ATI Rage Mobility M3 Head A */
        cmap_M3B,       /* ATI Rage Mobility M3 Head B */
-       cmap_radeon     /* ATI Radeon */
+       cmap_radeon,    /* ATI Radeon */
+       cmap_gxt2000,   /* IBM GXT2000 */
 };
 
 struct fb_info_offb {
@@ -61,6 +62,7 @@ struct fb_info_offb {
     volatile unsigned char *cmap_adr;
     volatile unsigned char *cmap_data;
     int cmap_type;
+    int blanked;
     union {
 #ifdef FBCON_HAS_CFB16
        u16 cfb16[16];
@@ -207,9 +209,11 @@ static int offb_set_var(struct fb_var_screeninfo *var, int con,
 static int offb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
                         struct fb_info *info)
 {
-    if (con == info->currcon) /* current console? */
+    struct fb_info_offb *info2 = (struct fb_info_offb *)info;
+
+    if (con == info->currcon && !info2->blanked) /* current console? */                
        return fb_get_cmap(cmap, kspc, offb_getcolreg, info);
-    else if (fb_display[con].cmap.len) /* non default colormap? */
+    if (fb_display[con].cmap.len) /* non default colormap? */
        fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
     else
     {
@@ -237,7 +241,7 @@ static int offb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
        if ((err = fb_alloc_cmap(&fb_display[con].cmap, size, 0)))
            return err;
     }
-    if (con == info->currcon)                  /* current console? */
+    if (con == info->currcon && !info2->blanked)       /* current console? */
        return fb_set_cmap(cmap, kspc, info);
     else
        fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
@@ -254,7 +258,17 @@ static int offb_blank(int blank, struct fb_info *info)
     int i, j;
 
     if (!info2->cmap_adr)
-       return;
+       return 0;
+
+    if (!info2->blanked) {
+       if (!blank)
+          return 0;
+       if (fb_display[info->currcon].cmap.len)
+          fb_get_cmap(&fb_display[info->currcon].cmap, 1, offb_getcolreg,info);
+    }
+
+    info2->blanked = blank;
+       
 
     if (blank)
        for (i = 0; i < 256; i++) {
@@ -288,6 +302,9 @@ static int offb_blank(int blank, struct fb_info *info)
                out_8(info2->cmap_adr + 0xb0, i);
                out_le32((unsigned *)(info2->cmap_adr + 0xb4), 0);
                break;
+           case cmap_gxt2000:
+               out_le32((unsigned *)info2->cmap_adr + i, 0);
+               break;
            }
        }
     else
@@ -496,6 +513,10 @@ static void __init offb_init_fb(const char *name, const char *full_name,
                info->cmap_adr = ioremap(base + 0x7ff000, 0x1000) + 0xcc0;
                info->cmap_data = info->cmap_adr + 1;
                info->cmap_type = cmap_m64;
+       } else if (device_is_compatible(dp, "pci1014,b7")) {
+               unsigned long regbase = dp->addrs[0].address;
+               info->cmap_adr = ioremap(regbase + 0x6000, 0x1000);
+               info->cmap_type = cmap_gxt2000;
        }
         fix->visual = info->cmap_adr ? FB_VISUAL_PSEUDOCOLOR
                                     : FB_VISUAL_STATIC_PSEUDOCOLOR;
@@ -664,11 +685,12 @@ static void __init offb_init_fb(const char *name, const char *full_name,
 #endif /* CONFIG_FB_COMPAT_XPMAC) */
 }
 
-
 static int offbcon_switch(int con, struct fb_info *info)
 {
+    struct fb_info_offb *info2 = (struct fb_info_offb *)info;  
+
     /* Do we have to save the colormap? */
-    if (fb_display[info->currcon].cmap.len)
+    if (fb_display[info->currcon].cmap.len && !info2->blanked)
        fb_get_cmap(&fb_display[info->currcon].cmap, 1, offb_getcolreg, info);
 
     info->currcon = con;
@@ -766,6 +788,10 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
        out_le32((unsigned *)(info2->cmap_adr + 0xb4),
                (red << 16 | green << 8 | blue));
        break;
+    case cmap_gxt2000:
+       out_le32((unsigned *)info2->cmap_adr + regno,
+               (red << 16 | green << 8 | blue));
+       break;
     }
 
     if (regno < 16)
index d8865d02a8f34b23d6d86a7bba49700a2e182025..e4c405b753d08fa6040c9741d19f0c2c7da807ed 100644 (file)
@@ -329,10 +329,10 @@ static int platinum_switch(int con, struct fb_info *fb)
        struct fb_info_platinum *info = (struct fb_info_platinum *) fb;
        struct fb_par_platinum par;
 
-       if (fb_display[info->currcon].cmap.len)
-               fb_get_cmap(&fb_display[info->currcon].cmap, 1, platinum_getcolreg,
+       if (fb_display[fb->currcon].cmap.len)
+               fb_get_cmap(&fb_display[fb->currcon].cmap, 1, platinum_getcolreg,
                            fb);
-       info->currcon = con;
+       fb->currcon = con;
 
        platinum_var_to_par(&fb_display[con].var, &par, info);
        platinum_set_par(&par, info);
index 0733c64f6600c7884cc22247c3419b05bd255a09..d407b04e2c18694e38584ac02e50aa4da5fa2d9d 100644 (file)
@@ -260,7 +260,7 @@ static int valkyriefb_switch(int con, struct fb_info *fb)
                            fb);
        fb->currcon = con;
 #if 1
-       valkyrie_var_to_par(&fb_display[currcon].var, &par, fb);
+       valkyrie_var_to_par(&fb_display[fb->currcon].var, &par, fb);
        valkyrie_set_par(&par, info);
        do_install_cmap(con, fb);
 #else