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

Pmac updates

parent 60c9598a
......@@ -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,
......
......@@ -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;
......
......@@ -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
......
......@@ -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:
......
......@@ -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;
}
......
......@@ -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)
......
......@@ -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);
......
......@@ -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
......
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