summaryrefslogtreecommitdiffstats
path: root/drivers/video/S3triofb.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-08-25 09:12:35 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-08-25 09:12:35 +0000
commitc7fc24dc4420057f103afe8fc64524ebc25c5d37 (patch)
tree3682407a599b8f9f03fc096298134cafba1c9b2f /drivers/video/S3triofb.c
parent1d793fade8b063fde3cf275bf1a5c2d381292cd9 (diff)
o Merge with Linux 2.1.116.
o New Newport console code. o New G364 console code.
Diffstat (limited to 'drivers/video/S3triofb.c')
-rw-r--r--drivers/video/S3triofb.c326
1 files changed, 163 insertions, 163 deletions
diff --git a/drivers/video/S3triofb.c b/drivers/video/S3triofb.c
index 16c0b888a..eb94dec73 100644
--- a/drivers/video/S3triofb.c
+++ b/drivers/video/S3triofb.c
@@ -24,8 +24,8 @@
*/
#include <linux/config.h>
-#include <linux/module.h>
#include <linux/kernel.h>
+#include <linux/module.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/mm.h>
@@ -36,11 +36,18 @@
#include <linux/interrupt.h>
#include <linux/fb.h>
#include <linux/init.h>
+#include <linux/selection.h>
#include <asm/io.h>
#include <asm/prom.h>
+#include <asm/pci-bridge.h>
#include <linux/pci.h>
+#ifdef CONFIG_FB_COMPAT_XPMAC
+#include <asm/vc_ioctl.h>
+#endif
+#include "fbcon.h"
#include "fbcon-cfb8.h"
+#include "s3blit.h"
#define mem_in8(addr) in_8((void *)(addr))
@@ -60,7 +67,7 @@ static struct display disp;
static struct fb_info fb_info;
static struct { u_char red, green, blue, pad; } palette[256];
static char s3trio_name[16] = "S3Trio ";
-
+static char *s3trio_base;
static struct fb_fix_screeninfo fb_fix;
static struct fb_var_screeninfo fb_var = { 0, };
@@ -70,10 +77,8 @@ static struct fb_var_screeninfo fb_var = { 0, };
* Interface used by the world
*/
-void of_video_setup(char *options, int *ints);
-
-static int s3trio_open(struct fb_info *info);
-static int s3trio_release(struct fb_info *info);
+static int s3trio_open(struct fb_info *info, int user);
+static int s3trio_release(struct fb_info *info, int user);
static int s3trio_get_fix(struct fb_fix_screeninfo *fix, int con,
struct fb_info *info);
static int s3trio_get_var(struct fb_var_screeninfo *var, int con,
@@ -89,30 +94,24 @@ static int s3trio_pan_display(struct fb_var_screeninfo *var, int con,
static int s3trio_ioctl(struct inode *inode, struct file *file, u_int cmd,
u_long arg, int con, struct fb_info *info);
-#ifdef CONFIG_FB_COMPAT_XPMAC
-extern struct vc_mode display_info;
-extern struct fb_info *console_fb_info;
-extern int (*console_setmode_ptr)(struct vc_mode *, int);
-extern int (*console_set_cmap_ptr)(struct fb_cmap *, int, int,
- struct fb_info *);
-static int s3trio_console_setmode(struct vc_mode *mode, int doit);
-#endif /* CONFIG_FB_COMPAT_XPMAC */
/*
* Interface to the low level console driver
*/
-unsigned long s3trio_fb_init(unsigned long mem_start);
+void s3triofb_init(void);
static int s3triofbcon_switch(int con, struct fb_info *info);
static int s3triofbcon_updatevar(int con, struct fb_info *info);
static void s3triofbcon_blank(int blank, struct fb_info *info);
+#if 0
static int s3triofbcon_setcmap(struct fb_cmap *cmap, int con);
+#endif
/*
* Text console acceleration
*/
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
static struct display_switch fbcon_trio8;
#endif
@@ -138,12 +137,12 @@ static int s3trio_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
u_int *transp, struct fb_info *info);
static int s3trio_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
u_int transp, struct fb_info *info);
-static void do_install_cmap(int con);
+static void do_install_cmap(int con, struct fb_info *info);
static struct fb_ops s3trio_ops = {
s3trio_open, s3trio_release, s3trio_get_fix, s3trio_get_var, s3trio_set_var,
- s3trio_get_cmap, s3trio_set_cmap, s3trio_pan_display, NULL, s3trio_ioctl
+ s3trio_get_cmap, s3trio_set_cmap, s3trio_pan_display, s3trio_ioctl
};
@@ -151,7 +150,7 @@ static struct fb_ops s3trio_ops = {
* Open/Release the frame buffer device
*/
-static int s3trio_open(struct fb_info *info)
+static int s3trio_open(struct fb_info *info, int user)
{
/*
* Nothing, only a usage count for the moment
@@ -161,7 +160,7 @@ static int s3trio_open(struct fb_info *info)
return(0);
}
-static int s3trio_release(struct fb_info *info)
+static int s3trio_release(struct fb_info *info, int user)
{
MOD_DEC_USE_COUNT;
return(0);
@@ -200,11 +199,16 @@ static int s3trio_set_var(struct fb_var_screeninfo *var, int con,
struct fb_info *info)
{
if (var->xres > fb_var.xres || var->yres > fb_var.yres ||
- var->xres_virtual > fb_var.xres_virtual ||
- var->yres_virtual > fb_var.yres_virtual ||
- var->bits_per_pixel > fb_var.bits_per_pixel ||
- var->nonstd || var->vmode != FB_VMODE_NONINTERLACED)
+ var->bits_per_pixel > fb_var.bits_per_pixel )
+ /* || var->nonstd || var->vmode != FB_VMODE_NONINTERLACED) */
return -EINVAL;
+ if (var->xres_virtual > fb_var.xres_virtual) {
+ outw(IO_OUT16VAL((var->xres_virtual /8) & 0xff, 0x13), 0x3d4);
+ outw(IO_OUT16VAL(((var->xres_virtual /8 ) & 0x300) >> 3, 0x51), 0x3d4);
+ fb_var.xres_virtual = var->xres_virtual;
+ fb_fix.line_length = var->xres_virtual;
+ }
+ fb_var.yres_virtual = var->yres_virtual;
memcpy(var, &fb_var, sizeof(fb_var));
return 0;
}
@@ -219,12 +223,25 @@ static int s3trio_set_var(struct fb_var_screeninfo *var, int con,
static int s3trio_pan_display(struct fb_var_screeninfo *var, int con,
struct fb_info *info)
{
- if (var->xoffset || var->yoffset)
+ unsigned int base;
+
+ if (var->xoffset > (var->xres_virtual - var->xres))
return -EINVAL;
- else
- return 0;
+ if (var->yoffset > (var->yres_virtual - var->yres))
+ return -EINVAL;
+
+ fb_var.xoffset = var->xoffset;
+ fb_var.yoffset = var->yoffset;
+
+ base = var->yoffset * fb_fix.line_length + var->xoffset;
+
+ outw(IO_OUT16VAL((base >> 8) & 0xff, 0x0c),0x03D4);
+ outw(IO_OUT16VAL(base & 0xff, 0x0d),0x03D4);
+ outw(IO_OUT16VAL((base >> 16) & 0xf, 0x69),0x03D4);
+ return 0;
}
+
/*
* Get the Colormap
*/
@@ -238,7 +255,7 @@ static int s3trio_get_cmap(struct fb_cmap *cmap, int kspc, int con,
else if (fb_display[con].cmap.len) /* non default colormap? */
fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
else
- fb_copy_cmap(fb_default_cmap(fb_display[con].var.bits_per_pixel),
+ fb_copy_cmap(fb_default_cmap(1 << fb_display[con].var.bits_per_pixel),
cmap, kspc ? 0 : 2);
return 0;
}
@@ -273,7 +290,17 @@ static int s3trio_ioctl(struct inode *inode, struct file *file, u_int cmd,
return -EINVAL;
}
-__initfunc(int s3trio_resetaccel(void)) {
+__initfunc(void s3triofb_init(void))
+{
+#ifdef __powerpc__
+ /* We don't want to be called like this. */
+ /* We rely on Open Firmware (offb) instead. */
+#else /* !__powerpc__ */
+ /* To be merged with cybervision */
+#endif /* !__powerpc__ */
+}
+
+__initfunc(void s3trio_resetaccel(void)) {
#define EC01_ENH_ENB 0x0005
@@ -314,18 +341,15 @@ __initfunc(int s3trio_resetaccel(void)) {
outw(0xffff, 0xaae8); /* Enable all planes */
outw(0xffff, 0xaae8); /* Enable all planes */
outw( MF_PIX_CONTROL | MFA_SRC_FOREGR_MIX, 0xbee8);
-
}
-__initfunc(int s3trio_init(void)) {
+__initfunc(int s3trio_init(struct device_node *dp)) {
u_char bus, dev;
unsigned int t32;
unsigned short cmd;
- int i;
- bus=0;
- dev=(3<<3);
+ pci_device_loc(dp,&bus,&dev);
pcibios_read_config_dword(bus, dev, PCI_VENDOR_ID, &t32);
if(t32 == (PCI_DEVICE_ID_S3_TRIO << 16) + PCI_VENDOR_ID_S3) {
pcibios_read_config_dword(bus, dev, PCI_BASE_ADDRESS_0, &t32);
@@ -351,16 +375,16 @@ __initfunc(int s3trio_init(void)) {
outw(IO_OUT16VAL(0x48, 0x38),0x03D4);
outw(IO_OUT16VAL(0xA0, 0x39),0x03D4);
outb(0x33,0x3d4);
- outw(IO_OUT16VAL( inb(0x3d5) & ~(0x2 |
- 0x10 | 0x40) , 0x33),0x3d4);
+ outw(IO_OUT16VAL((inb(0x3d5) & ~(0x2 | 0x10 | 0x40)) |
+ 0x20, 0x33), 0x3d4);
- outw(IO_OUT16VAL(0x6,0x8), 0x3c4);
+ outw(IO_OUT16VAL(0x6, 0x8), 0x3c4);
/* switch to MMIO only mode */
- outb(0x58,0x3d4);
- outw(IO_OUT16VAL(inb(0x3d5) | 3 | 0x10,0x58),0x3d4);
- outw(IO_OUT16VAL(8,0x53),0x3d4);
+ outb(0x58, 0x3d4);
+ outw(IO_OUT16VAL(inb(0x3d5) | 3 | 0x10, 0x58), 0x3d4);
+ outw(IO_OUT16VAL(8, 0x53), 0x3d4);
/* switch off I/O accesses */
@@ -368,6 +392,7 @@ __initfunc(int s3trio_init(void)) {
pcibios_write_config_word(bus, dev, PCI_COMMAND,
PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
#endif
+ return 1;
}
return 0;
@@ -379,18 +404,12 @@ __initfunc(int s3trio_init(void)) {
* We heavily rely on OF for the moment. This needs fixing.
*/
-__initfunc(unsigned long s3trio_fb_init(unsigned long mem_start))
+__initfunc(void s3triofb_init_of(struct device_node *dp))
{
- struct device_node *dp;
- int i, err, *pp, len;
- unsigned *up, address;
+ int i, *pp, len;
+ unsigned long address;
u_long *CursorBase;
- if (!prom_display_paths[0])
- return mem_start;
- if (!(dp = find_path_device(prom_display_paths[0])))
- return mem_start;
-
strncat(s3trio_name, dp->name, sizeof(s3trio_name));
s3trio_name[sizeof(s3trio_name)-1] = '\0';
strcpy(fb_fix.id, s3trio_name);
@@ -398,19 +417,19 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start))
if((pp = (int *)get_property(dp, "vendor-id", &len)) != NULL
&& *pp!=PCI_VENDOR_ID_S3) {
printk("%s: can't find S3 Trio board\n", dp->full_name);
- return mem_start;
+ return;
}
if((pp = (int *)get_property(dp, "device-id", &len)) != NULL
&& *pp!=PCI_DEVICE_ID_S3_TRIO) {
printk("%s: can't find S3 Trio board\n", dp->full_name);
- return mem_start;
+ return;
}
if ((pp = (int *)get_property(dp, "depth", &len)) != NULL
&& len == sizeof(int) && *pp != 8) {
printk("%s: can't use depth = %d\n", dp->full_name, *pp);
- return mem_start;
+ return;
}
if ((pp = (int *)get_property(dp, "width", &len)) != NULL
&& len == sizeof(int))
@@ -425,45 +444,51 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start))
fb_fix.line_length = fb_var.xres_virtual;
fb_fix.smem_len = fb_fix.line_length*fb_var.yres;
- s3trio_init();
- address=0xc6000000;
- fb_fix.smem_start = ioremap(address,64*1024*1024);
+ s3trio_init(dp);
+ address = 0xc6000000;
+ s3trio_base = ioremap(address,64*1024*1024);
+ fb_fix.smem_start = (char *)address;
fb_fix.type = FB_TYPE_PACKED_PIXELS;
fb_fix.type_aux = 0;
+ fb_fix.accel = FB_ACCEL_S3_TRIO64;
+ fb_fix.mmio_start = (char *)address+0x1000000;
+ fb_fix.mmio_len = 0x1000000;
+ fb_fix.xpanstep = 1;
+ fb_fix.ypanstep = 1;
s3trio_resetaccel();
- mem_out8(0x30,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(0x2d,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(0x2e,fb_fix.smem_start+0x1008000 + 0x03D4);
+ mem_out8(0x30, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(0x2d, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(0x2e, s3trio_base+0x1008000 + 0x03D4);
- mem_out8(0x50,fb_fix.smem_start+0x1008000 + 0x03D4);
+ mem_out8(0x50, s3trio_base+0x1008000 + 0x03D4);
/* disable HW cursor */
- mem_out8(0x39,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(0xa0,fb_fix.smem_start+0x1008000 + 0x03D5);
+ mem_out8(0x39, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(0xa0, s3trio_base+0x1008000 + 0x03D5);
- mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5);
+ mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
- mem_out8(0x4e,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5);
+ mem_out8(0x4e, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
- mem_out8(0x4f,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5);
+ mem_out8(0x4f, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
/* init HW cursor */
- CursorBase=(u_long *)(fb_fix.smem_start + 2*1024*1024 - 0x400);
- for (i=0; i < 8; i++) {
+ CursorBase = (u_long *)(s3trio_base + 2*1024*1024 - 0x400);
+ for (i = 0; i < 8; i++) {
*(CursorBase +(i*4)) = 0xffffff00;
*(CursorBase+1+(i*4)) = 0xffff0000;
*(CursorBase+2+(i*4)) = 0xffff0000;
*(CursorBase+3+(i*4)) = 0xffff0000;
}
- for (i=8; i < 64; i++) {
+ for (i = 8; i < 64; i++) {
*(CursorBase +(i*4)) = 0xffff0000;
*(CursorBase+1+(i*4)) = 0xffff0000;
*(CursorBase+2+(i*4)) = 0xffff0000;
@@ -471,34 +496,43 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start))
}
- mem_out8(0x4c,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(((2*1024 - 1)&0xf00)>>8,fb_fix.smem_start+0x1008000 + 0x03D5);
+ mem_out8(0x4c, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(((2*1024 - 1)&0xf00)>>8, s3trio_base+0x1008000 + 0x03D5);
+
+ mem_out8(0x4d, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8((2*1024 - 1) & 0xff, s3trio_base+0x1008000 + 0x03D5);
- mem_out8(0x4d,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8((2*1024 - 1) & 0xff,fb_fix.smem_start+0x1008000 + 0x03D5);
+ mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4);
+ mem_in8(s3trio_base+0x1008000 + 0x03D4);
- mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_in8(fb_fix.smem_start+0x1008000 + 0x03D4);
+ mem_out8(0x4a, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5);
+ mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5);
+ mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5);
- mem_out8(0x4a,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5);
- mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5);
- mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5);
+ mem_out8(0x4b, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5);
+ mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5);
+ mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5);
- mem_out8(0x4b,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5);
- mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5);
- mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5);
+ mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4);
+ mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
- mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4);
- mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5);
+ /* setup default color table */
+
+ for(i = 0; i < 16; i++) {
+ int j = color_table[i];
+ palette[i].red=default_red[j];
+ palette[i].green=default_grn[j];
+ palette[i].blue=default_blu[j];
+ }
s3trio_setcolreg(255, 56, 100, 160, 0, NULL /* not used */);
s3trio_setcolreg(254, 0, 0, 0, 0, NULL /* not used */);
- memset((char *)fb_fix.smem_start,0,640*480);
+ memset((char *)s3trio_base, 0, 640*480);
#if 0
- Trio_RectFill(0,0,90,90,7,1);
+ Trio_RectFill(0, 0, 90, 90, 7, 1);
#endif
fb_fix.visual = FB_VISUAL_PSEUDOCOLOR ;
@@ -512,7 +546,8 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start))
fb_var.nonstd = 0;
fb_var.activate = 0;
fb_var.height = fb_var.width = -1;
- fb_var.accel = 5;
+ fb_var.accel_flags = FB_ACCELF_TEXT;
+#warning FIXME: always obey fb_var.accel_flags
fb_var.pixclock = 1;
fb_var.left_margin = fb_var.right_margin = 0;
fb_var.upper_margin = fb_var.lower_margin = 0;
@@ -524,7 +559,7 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start))
disp.cmap.start = 0;
disp.cmap.len = 0;
disp.cmap.red = disp.cmap.green = disp.cmap.blue = disp.cmap.transp = NULL;
- disp.screen_base = fb_fix.smem_start;
+ disp.screen_base = s3trio_base;
disp.visual = fb_fix.visual;
disp.type = fb_fix.type;
disp.type_aux = fb_fix.type_aux;
@@ -533,11 +568,15 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start))
disp.line_length = fb_fix.line_length;
disp.can_soft_blank = 1;
disp.inverse = 0;
-#ifdef CONFIG_FBCON_CFB8
- disp.dispsw = &fbcon_trio8;
+#ifdef FBCON_HAS_CFB8
+ if (fb_var.accel_flags & FB_ACCELF_TEXT)
+ disp.dispsw = &fbcon_trio8;
+ else
+ disp.dispsw = &fbcon_cfb8;
#else
disp.dispsw = NULL;
#endif
+ disp.scrollmode = fb_var.accel_flags & FB_ACCELF_TEXT ? 0 : SCROLL_YREDRAW;
strcpy(fb_info.modename, "Trio64 ");
strncat(fb_info.modename, dp->full_name, sizeof(fb_info.modename));
@@ -570,19 +609,14 @@ __initfunc(unsigned long s3trio_fb_init(unsigned long mem_start))
display_info.cmap_adr_address = address + 0x1008000 + 0x3c8;
display_info.cmap_data_address = address + 0x1008000 + 0x3c9;
console_fb_info = &fb_info;
- console_setmode_ptr = s3trio_console_setmode;
- console_set_cmap_ptr = s3trio_set_cmap;
}
#endif /* CONFIG_FB_COMPAT_XPMAC) */
- err = register_framebuffer(&fb_info);
- if (err < 0)
- return mem_start;
+ if (register_framebuffer(&fb_info) < 0)
+ return;
printk("fb%d: S3 Trio frame buffer device on %s\n",
GET_FB_IDX(fb_info.node), dp->full_name);
-
- return mem_start;
}
@@ -595,7 +629,7 @@ static int s3triofbcon_switch(int con, struct fb_info *info)
currcon = con;
/* Install new colormap */
- do_install_cmap(con);
+ do_install_cmap(con,info);
return 0;
}
@@ -615,17 +649,23 @@ static int s3triofbcon_updatevar(int con, struct fb_info *info)
static void s3triofbcon_blank(int blank, struct fb_info *info)
{
- /* Nothing */
+ unsigned char x;
+
+ mem_out8(0x1, s3trio_base+0x1008000 + 0x03c4);
+ x = mem_in8(s3trio_base+0x1008000 + 0x03c5);
+ mem_out8((x & (~0x20)) | (blank << 5), s3trio_base+0x1008000 + 0x03c5);
}
/*
* Set the colormap
*/
+#if 0
static int s3triofbcon_setcmap(struct fb_cmap *cmap, int con)
{
return(s3trio_set_cmap(cmap, 1, con, &fb_info));
}
+#endif
/*
@@ -660,16 +700,16 @@ static int s3trio_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
palette[regno].green = green;
palette[regno].blue = blue;
- mem_out8(regno,fb_fix.smem_start+0x1008000 + 0x3c8);
- mem_out8((red & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9);
- mem_out8((green & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9);
- mem_out8((blue & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9);
+ mem_out8(regno,s3trio_base+0x1008000 + 0x3c8);
+ mem_out8((red & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9);
+ mem_out8((green & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9);
+ mem_out8((blue & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9);
return 0;
}
-static void do_install_cmap(int con)
+static void do_install_cmap(int con, struct fb_info *info)
{
if (con != currcon)
return;
@@ -681,48 +721,7 @@ static void do_install_cmap(int con)
&fb_display[con].var, 1, s3trio_setcolreg, &fb_info);
}
-#ifdef CONFIG_FB_COMPAT_XPMAC
-
- /*
- * Backward compatibility mode for Xpmac
- */
-
-static int s3trio_console_setmode(struct vc_mode *mode, int doit)
-{
- int err;
- struct fb_var_screeninfo var;
- struct s3trio_par par;
-
- if (mode->mode <= 0 || mode->mode > VMODE_MAX )
- return -EINVAL;
- par.video_mode = mode->mode;
-
- switch (mode->depth) {
- case 24:
- case 32:
- par.color_mode = CMODE_32;
- break;
- case 16:
- par.color_mode = CMODE_16;
- break;
- case 8:
- case 0: /* (default) */
- par.color_mode = CMODE_8;
- break;
- default:
- return -EINVAL;
- }
- encode_var(&var, &par);
- if ((err = decode_var(&var, &par)))
- return err;
- if (doit)
- s3trio_set_var(&var, currcon, 0);
- return 0;
-}
-
-#endif /* CONFIG_FB_COMPAT_XPMAC */
-
-void s3trio_video_setup(char *options, int *ints) {
+void s3triofb_setup(char *options, int *ints) {
return;
@@ -734,7 +733,7 @@ static void Trio_WaitQueue(u_short fifo) {
do
{
- status = mem_in16(fb_fix.smem_start + 0x1000000 + 0x9AE8);
+ status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8);
} while (!(status & fifo));
}
@@ -745,7 +744,7 @@ static void Trio_WaitBlit(void) {
do
{
- status = mem_in16(fb_fix.smem_start + 0x1000000 + 0x9AE8);
+ status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8);
} while (status & 0x200);
}
@@ -813,18 +812,18 @@ static void Trio_RectFill(u_short x, u_short y, u_short width, u_short height,
static void Trio_MoveCursor(u_short x, u_short y) {
- mem_out8(0x39, fb_fix.smem_start + 0x1008000 + 0x3d4);
- mem_out8(0xa0, fb_fix.smem_start + 0x1008000 + 0x3d5);
+ mem_out8(0x39, s3trio_base + 0x1008000 + 0x3d4);
+ mem_out8(0xa0, s3trio_base + 0x1008000 + 0x3d5);
- mem_out8(0x46, fb_fix.smem_start + 0x1008000 + 0x3d4);
- mem_out8((x & 0x0700) >> 8, fb_fix.smem_start + 0x1008000 + 0x3d5);
- mem_out8(0x47, fb_fix.smem_start + 0x1008000 + 0x3d4);
- mem_out8(x & 0x00ff, fb_fix.smem_start + 0x1008000 + 0x3d5);
+ mem_out8(0x46, s3trio_base + 0x1008000 + 0x3d4);
+ mem_out8((x & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5);
+ mem_out8(0x47, s3trio_base + 0x1008000 + 0x3d4);
+ mem_out8(x & 0x00ff, s3trio_base + 0x1008000 + 0x3d5);
- mem_out8(0x48, fb_fix.smem_start + 0x1008000 + 0x3d4);
- mem_out8((y & 0x0700) >> 8, fb_fix.smem_start + 0x1008000 + 0x3d5);
- mem_out8(0x49, fb_fix.smem_start + 0x1008000 + 0x3d4);
- mem_out8(y & 0x00ff, fb_fix.smem_start + 0x1008000 + 0x3d5);
+ mem_out8(0x48, s3trio_base + 0x1008000 + 0x3d4);
+ mem_out8((y & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5);
+ mem_out8(0x49, s3trio_base + 0x1008000 + 0x3d4);
+ mem_out8(y & 0x00ff, s3trio_base + 0x1008000 + 0x3d5);
}
@@ -833,7 +832,7 @@ static void Trio_MoveCursor(u_short x, u_short y) {
* Text console acceleration
*/
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
static void fbcon_trio8_bmove(struct display *p, int sy, int sx, int dy,
int dx, int height, int width)
{
@@ -866,7 +865,7 @@ static void fbcon_trio8_putc(struct vc_data *conp, struct display *p, int c,
}
static void fbcon_trio8_putcs(struct vc_data *conp, struct display *p,
- const char *s, int count, int yy, int xx)
+ const unsigned short *s, int count, int yy, int xx)
{
Trio_WaitBlit();
fbcon_cfb8_putcs(conp, p, s, count, yy, xx);
@@ -880,6 +879,7 @@ static void fbcon_trio8_revc(struct display *p, int xx, int yy)
static struct display_switch fbcon_trio8 = {
fbcon_cfb8_setup, fbcon_trio8_bmove, fbcon_trio8_clear, fbcon_trio8_putc,
- fbcon_trio8_putcs, fbcon_trio8_revc
+ fbcon_trio8_putcs, fbcon_trio8_revc, NULL, NULL, fbcon_cfb8_clear_margins,
+ FONTWIDTH(8)
};
#endif