Commit c1c8c4f9 authored by James Simmons's avatar James Simmons Committed by James Simmons

Pmac updates

parent 60c9598a
...@@ -87,6 +87,9 @@ ...@@ -87,6 +87,9 @@
#include <linux/adb.h> #include <linux/adb.h>
#include <linux/pmu.h> #include <linux/pmu.h>
#endif #endif
#ifdef CONFIG_BOOTX_TEXT
#include <asm/btext.h>
#endif
#ifdef CONFIG_NVRAM #ifdef CONFIG_NVRAM
#include <linux/nvram.h> #include <linux/nvram.h>
#endif #endif
...@@ -815,6 +818,13 @@ static void atyfb_set_par(const struct atyfb_par *par, ...@@ -815,6 +818,13 @@ static void atyfb_set_par(const struct atyfb_par *par,
display_info.disp_reg_address = info->ati_regbase_phys; display_info.disp_reg_address = info->ati_regbase_phys;
} }
#endif /* CONFIG_FB_COMPAT_XPMAC */ #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, static int atyfb_decode_var(const struct fb_var_screeninfo *var,
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
#ifdef CONFIG_FB_COMPAT_XPMAC #ifdef CONFIG_FB_COMPAT_XPMAC
#include <asm/vc_ioctl.h> #include <asm/vc_ioctl.h>
#endif #endif
#ifdef CONFIG_BOOTX_TEXT
#include <asm/btext.h>
#endif /* CONFIG_BOOTX_TEXT */
#include <video/fbcon.h> #include <video/fbcon.h>
#include <video/fbcon-cfb8.h> #include <video/fbcon-cfb8.h>
...@@ -154,6 +157,7 @@ static struct aty128_chip_info aty128_pci_probe_list[] __initdata = ...@@ -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 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 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 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 (PCI)", PCI_DEVICE_ID_ATI_RAGE128_LE, rage_M3},
{"Rage Mobility M3 (AGP)", PCI_DEVICE_ID_ATI_RAGE128_LF, rage_M3}, {"Rage Mobility M3 (AGP)", PCI_DEVICE_ID_ATI_RAGE128_LF, rage_M3},
{NULL, 0, rage_128} {NULL, 0, rage_128}
...@@ -216,9 +220,13 @@ static const char *aty128fb_name = "ATY Rage128"; ...@@ -216,9 +220,13 @@ static const char *aty128fb_name = "ATY Rage128";
static char fontname[40] __initdata = { 0 }; static char fontname[40] __initdata = { 0 };
static int noaccel __initdata = 0; static int noaccel __initdata = 0;
#ifdef MODULE
static char *font __initdata = NULL; static char *font __initdata = NULL;
static char *mode __initdata = NULL; static char *mode __initdata = NULL;
#ifdef CONFIG_MTRR
static int nomtrr __initdata = 0; static int nomtrr __initdata = 0;
#endif
#endif /* MODULE */
static char *mode_option __initdata = NULL; static char *mode_option __initdata = NULL;
...@@ -418,6 +426,7 @@ static struct fb_ops aty128fb_ops = { ...@@ -418,6 +426,7 @@ static struct fb_ops aty128fb_ops = {
fb_set_cmap: gen_set_cmap, fb_set_cmap: gen_set_cmap,
fb_setcolreg: aty128fb_setcolreg, fb_setcolreg: aty128fb_setcolreg,
fb_pan_display: aty128fb_pan_display, fb_pan_display: aty128fb_pan_display,
fb_blank: aty128fb_blank,
fb_rasterimg: aty128fb_rasterimg, fb_rasterimg: aty128fb_rasterimg,
}; };
...@@ -1243,6 +1252,13 @@ aty128_set_par(struct aty128fb_par *par, ...@@ -1243,6 +1252,13 @@ aty128_set_par(struct aty128fb_par *par,
display_info.disp_reg_address = info->regbase_phys; display_info.disp_reg_address = info->regbase_phys;
} }
#endif /* CONFIG_FB_COMPAT_XPMAC */ #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) ...@@ -1584,7 +1600,7 @@ aty128fb_setup(char *options)
if (!options || !*options) if (!options || !*options)
return 0; return 0;
while (this_opt = strsep(&options, ",")) { while ((this_opt = strsep(&options, ",")) != NULL) {
if (!strncmp(this_opt, "font:", 5)) { if (!strncmp(this_opt, "font:", 5)) {
char *p; char *p;
int i; int i;
...@@ -1687,6 +1703,29 @@ aty128_init(struct fb_info_aty128 *info, const char *name) ...@@ -1687,6 +1703,29 @@ aty128_init(struct fb_info_aty128 *info, const char *name)
if (default_vmode <= 0 || default_vmode > VMODE_MAX) if (default_vmode <= 0 || default_vmode > VMODE_MAX)
default_vmode = VMODE_1024_768_60; 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) if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
default_cmode = CMODE_8; default_cmode = CMODE_8;
......
...@@ -312,7 +312,7 @@ static void chips_set_bitdepth(struct fb_info_chips *p, struct display* disp, in ...@@ -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; struct fb_var_screeninfo* var = &p->var;
if (bpp == 16) { if (bpp == 16) {
if (con == info->currcon) { if (con == p->info.currcon) {
write_cr(0x13, 200); // Set line length (doublewords) write_cr(0x13, 200); // Set line length (doublewords)
write_xr(0x81, 0x14); // 15 bit (555) color mode write_xr(0x81, 0x14); // 15 bit (555) color mode
write_xr(0x82, 0x00); // Disable palettes write_xr(0x82, 0x00); // Disable palettes
...@@ -334,7 +334,7 @@ static void chips_set_bitdepth(struct fb_info_chips *p, struct display* disp, in ...@@ -334,7 +334,7 @@ static void chips_set_bitdepth(struct fb_info_chips *p, struct display* disp, in
disp->dispsw = &fbcon_dummy; disp->dispsw = &fbcon_dummy;
#endif #endif
} else if (bpp == 8) { } else if (bpp == 8) {
if (con == info->currcon) { if (con == p->info.currcon) {
write_cr(0x13, 100); // Set line length (doublewords) write_cr(0x13, 100); // Set line length (doublewords)
write_xr(0x81, 0x12); // 8 bit color mode write_xr(0x81, 0x12); // 8 bit color mode
write_xr(0x82, 0x08); // Graphics gamma enable write_xr(0x82, 0x08); // Graphics gamma enable
......
...@@ -1238,7 +1238,7 @@ static void control_cfb16_revc(struct display *p, int xx, int yy) ...@@ -1238,7 +1238,7 @@ static void control_cfb16_revc(struct display *p, int xx, int yy)
u8 *dest; u8 *dest;
int bytes = p->next_line, rows; 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) { for (rows = fontheight(p); rows--; dest += bytes) {
switch (fontwidth(p)) { switch (fontwidth(p)) {
case 16: case 16:
...@@ -1261,7 +1261,7 @@ static void control_cfb32_revc(struct display *p, int xx, int yy) ...@@ -1261,7 +1261,7 @@ static void control_cfb32_revc(struct display *p, int xx, int yy)
u8 *dest; u8 *dest;
int bytes = p->next_line, rows; 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) { for (rows = fontheight(p); rows--; dest += bytes) {
switch (fontwidth(p)) { switch (fontwidth(p)) {
case 16: case 16:
......
...@@ -1908,7 +1908,7 @@ imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1908,7 +1908,7 @@ imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
p->ramdac = TVP; p->ramdac = TVP;
break; break;
default: default:
printk(KERN_INFO "imsttfb: Device 0x%lx unknown, " printk(KERN_INFO "imsttfb: Device 0x%x unknown, "
"contact maintainer.\n", pdev->device); "contact maintainer.\n", pdev->device);
return -ENODEV; return -ENODEV;
} }
......
...@@ -49,7 +49,8 @@ enum { ...@@ -49,7 +49,8 @@ enum {
cmap_r128, /* ATI Rage128 */ cmap_r128, /* ATI Rage128 */
cmap_M3A, /* ATI Rage Mobility M3 Head A */ cmap_M3A, /* ATI Rage Mobility M3 Head A */
cmap_M3B, /* ATI Rage Mobility M3 Head B */ cmap_M3B, /* ATI Rage Mobility M3 Head B */
cmap_radeon /* ATI Radeon */ cmap_radeon, /* ATI Radeon */
cmap_gxt2000, /* IBM GXT2000 */
}; };
struct fb_info_offb { struct fb_info_offb {
...@@ -61,6 +62,7 @@ struct fb_info_offb { ...@@ -61,6 +62,7 @@ struct fb_info_offb {
volatile unsigned char *cmap_adr; volatile unsigned char *cmap_adr;
volatile unsigned char *cmap_data; volatile unsigned char *cmap_data;
int cmap_type; int cmap_type;
int blanked;
union { union {
#ifdef FBCON_HAS_CFB16 #ifdef FBCON_HAS_CFB16
u16 cfb16[16]; u16 cfb16[16];
...@@ -207,9 +209,11 @@ static int offb_set_var(struct fb_var_screeninfo *var, int con, ...@@ -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, static int offb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
struct fb_info *info) 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); 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); fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
else else
{ {
...@@ -237,7 +241,7 @@ static int offb_set_cmap(struct fb_cmap *cmap, int kspc, int con, ...@@ -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))) if ((err = fb_alloc_cmap(&fb_display[con].cmap, size, 0)))
return err; return err;
} }
if (con == info->currcon) /* current console? */ if (con == info->currcon && !info2->blanked) /* current console? */
return fb_set_cmap(cmap, kspc, info); return fb_set_cmap(cmap, kspc, info);
else else
fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1); 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) ...@@ -254,7 +258,17 @@ static int offb_blank(int blank, struct fb_info *info)
int i, j; int i, j;
if (!info2->cmap_adr) 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) if (blank)
for (i = 0; i < 256; i++) { for (i = 0; i < 256; i++) {
...@@ -288,6 +302,9 @@ static int offb_blank(int blank, struct fb_info *info) ...@@ -288,6 +302,9 @@ static int offb_blank(int blank, struct fb_info *info)
out_8(info2->cmap_adr + 0xb0, i); out_8(info2->cmap_adr + 0xb0, i);
out_le32((unsigned *)(info2->cmap_adr + 0xb4), 0); out_le32((unsigned *)(info2->cmap_adr + 0xb4), 0);
break; break;
case cmap_gxt2000:
out_le32((unsigned *)info2->cmap_adr + i, 0);
break;
} }
} }
else else
...@@ -496,6 +513,10 @@ static void __init offb_init_fb(const char *name, const char *full_name, ...@@ -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_adr = ioremap(base + 0x7ff000, 0x1000) + 0xcc0;
info->cmap_data = info->cmap_adr + 1; info->cmap_data = info->cmap_adr + 1;
info->cmap_type = cmap_m64; 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 fix->visual = info->cmap_adr ? FB_VISUAL_PSEUDOCOLOR
: FB_VISUAL_STATIC_PSEUDOCOLOR; : FB_VISUAL_STATIC_PSEUDOCOLOR;
...@@ -664,11 +685,12 @@ static void __init offb_init_fb(const char *name, const char *full_name, ...@@ -664,11 +685,12 @@ static void __init offb_init_fb(const char *name, const char *full_name,
#endif /* CONFIG_FB_COMPAT_XPMAC) */ #endif /* CONFIG_FB_COMPAT_XPMAC) */
} }
static int offbcon_switch(int con, struct fb_info *info) 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? */ /* 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); fb_get_cmap(&fb_display[info->currcon].cmap, 1, offb_getcolreg, info);
info->currcon = con; info->currcon = con;
...@@ -766,6 +788,10 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ...@@ -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), out_le32((unsigned *)(info2->cmap_adr + 0xb4),
(red << 16 | green << 8 | blue)); (red << 16 | green << 8 | blue));
break; break;
case cmap_gxt2000:
out_le32((unsigned *)info2->cmap_adr + regno,
(red << 16 | green << 8 | blue));
break;
} }
if (regno < 16) if (regno < 16)
......
...@@ -329,10 +329,10 @@ static int platinum_switch(int con, struct fb_info *fb) ...@@ -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_info_platinum *info = (struct fb_info_platinum *) fb;
struct fb_par_platinum par; struct fb_par_platinum par;
if (fb_display[info->currcon].cmap.len) if (fb_display[fb->currcon].cmap.len)
fb_get_cmap(&fb_display[info->currcon].cmap, 1, platinum_getcolreg, fb_get_cmap(&fb_display[fb->currcon].cmap, 1, platinum_getcolreg,
fb); fb);
info->currcon = con; fb->currcon = con;
platinum_var_to_par(&fb_display[con].var, &par, info); platinum_var_to_par(&fb_display[con].var, &par, info);
platinum_set_par(&par, info); platinum_set_par(&par, info);
......
...@@ -260,7 +260,7 @@ static int valkyriefb_switch(int con, struct fb_info *fb) ...@@ -260,7 +260,7 @@ static int valkyriefb_switch(int con, struct fb_info *fb)
fb); fb);
fb->currcon = con; fb->currcon = con;
#if 1 #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); valkyrie_set_par(&par, info);
do_install_cmap(con, fb); do_install_cmap(con, fb);
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment