Commit 5694f9ce authored by Ondrej Zary's avatar Ondrej Zary Committed by Paul Mundt

s3fb: add support for 86C365 Trio3D

Add support for S3 Trio3D (86C365) cards to s3fb driver. Tested with one 4MB card.
Signed-off-by: default avatarOndrej Zary <linux@rainbow-software.org>
Acked-by: default avatarOndrej Zajicek <santiago@crfreenet.org>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 99d054d8
...@@ -64,6 +64,8 @@ static const struct svga_fb_format s3fb_formats[] = { ...@@ -64,6 +64,8 @@ static const struct svga_fb_format s3fb_formats[] = {
static const struct svga_pll s3_pll = {3, 129, 3, 33, 0, 3, static const struct svga_pll s3_pll = {3, 129, 3, 33, 0, 3,
35000, 240000, 14318}; 35000, 240000, 14318};
static const struct svga_pll s3_trio3d_pll = {3, 129, 3, 31, 0, 4,
230000, 460000, 14318};
static const int s3_memsizes[] = {4096, 0, 3072, 8192, 2048, 6144, 1024, 512}; static const int s3_memsizes[] = {4096, 0, 3072, 8192, 2048, 6144, 1024, 512};
...@@ -72,7 +74,8 @@ static const char * const s3_names[] = {"S3 Unknown", "S3 Trio32", "S3 Trio64", ...@@ -72,7 +74,8 @@ static const char * const s3_names[] = {"S3 Unknown", "S3 Trio32", "S3 Trio64",
"S3 Plato/PX", "S3 Aurora64VP", "S3 Virge", "S3 Plato/PX", "S3 Aurora64VP", "S3 Virge",
"S3 Virge/VX", "S3 Virge/DX", "S3 Virge/GX", "S3 Virge/VX", "S3 Virge/DX", "S3 Virge/GX",
"S3 Virge/GX2", "S3 Virge/GX2P", "S3 Virge/GX2P", "S3 Virge/GX2", "S3 Virge/GX2P", "S3 Virge/GX2P",
"S3 Trio3D/1X", "S3 Trio3D/2X", "S3 Trio3D/2X"}; "S3 Trio3D/1X", "S3 Trio3D/2X", "S3 Trio3D/2X",
"S3 Trio3D"};
#define CHIP_UNKNOWN 0x00 #define CHIP_UNKNOWN 0x00
#define CHIP_732_TRIO32 0x01 #define CHIP_732_TRIO32 0x01
...@@ -93,6 +96,7 @@ static const char * const s3_names[] = {"S3 Unknown", "S3 Trio32", "S3 Trio64", ...@@ -93,6 +96,7 @@ static const char * const s3_names[] = {"S3 Unknown", "S3 Trio32", "S3 Trio64",
#define CHIP_360_TRIO3D_1X 0x10 #define CHIP_360_TRIO3D_1X 0x10
#define CHIP_362_TRIO3D_2X 0x11 #define CHIP_362_TRIO3D_2X 0x11
#define CHIP_368_TRIO3D_2X 0x12 #define CHIP_368_TRIO3D_2X 0x12
#define CHIP_365_TRIO3D 0x13
#define CHIP_XXX_TRIO 0x80 #define CHIP_XXX_TRIO 0x80
#define CHIP_XXX_TRIO64V2_DXGX 0x81 #define CHIP_XXX_TRIO64V2_DXGX 0x81
...@@ -341,7 +345,8 @@ static void s3_set_pixclock(struct fb_info *info, u32 pixclock) ...@@ -341,7 +345,8 @@ static void s3_set_pixclock(struct fb_info *info, u32 pixclock)
u8 regval; u8 regval;
int rv; int rv;
rv = svga_compute_pll(&s3_pll, 1000000000 / pixclock, &m, &n, &r, info->node); rv = svga_compute_pll((par->chip == CHIP_365_TRIO3D) ? &s3_trio3d_pll : &s3_pll,
1000000000 / pixclock, &m, &n, &r, info->node);
if (rv < 0) { if (rv < 0) {
printk(KERN_ERR "fb%d: cannot set requested pixclock, keeping old value\n", info->node); printk(KERN_ERR "fb%d: cannot set requested pixclock, keeping old value\n", info->node);
return; return;
...@@ -598,7 +603,8 @@ static int s3fb_set_par(struct fb_info *info) ...@@ -598,7 +603,8 @@ static int s3fb_set_par(struct fb_info *info)
if (par->chip == CHIP_360_TRIO3D_1X || if (par->chip == CHIP_360_TRIO3D_1X ||
par->chip == CHIP_362_TRIO3D_2X || par->chip == CHIP_362_TRIO3D_2X ||
par->chip == CHIP_368_TRIO3D_2X) { par->chip == CHIP_368_TRIO3D_2X ||
par->chip == CHIP_365_TRIO3D) {
dbytes = info->var.xres * ((bpp+7)/8); dbytes = info->var.xres * ((bpp+7)/8);
vga_wcrt(par->state.vgabase, 0x91, (dbytes + 7) / 8); vga_wcrt(par->state.vgabase, 0x91, (dbytes + 7) / 8);
vga_wcrt(par->state.vgabase, 0x90, (((dbytes + 7) / 8) >> 8) | 0x80); vga_wcrt(par->state.vgabase, 0x90, (((dbytes + 7) / 8) >> 8) | 0x80);
...@@ -1012,13 +1018,15 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i ...@@ -1012,13 +1018,15 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i
regval = vga_rcrt(par->state.vgabase, 0x36); regval = vga_rcrt(par->state.vgabase, 0x36);
if (par->chip == CHIP_360_TRIO3D_1X || if (par->chip == CHIP_360_TRIO3D_1X ||
par->chip == CHIP_362_TRIO3D_2X || par->chip == CHIP_362_TRIO3D_2X ||
par->chip == CHIP_368_TRIO3D_2X) { par->chip == CHIP_368_TRIO3D_2X ||
par->chip == CHIP_365_TRIO3D) {
switch ((regval & 0xE0) >> 5) { switch ((regval & 0xE0) >> 5) {
case 0: /* 8MB -- only 4MB usable for display */ case 0: /* 8MB -- only 4MB usable for display */
case 1: /* 4MB with 32-bit bus */ case 1: /* 4MB with 32-bit bus */
case 2: /* 4MB */ case 2: /* 4MB */
info->screen_size = 4 << 20; info->screen_size = 4 << 20;
break; break;
case 4: /* 2MB on 365 Trio3D */
case 6: /* 2MB */ case 6: /* 2MB */
info->screen_size = 2 << 20; info->screen_size = 2 << 20;
break; break;
...@@ -1226,6 +1234,7 @@ static struct pci_device_id s3_devices[] __devinitdata = { ...@@ -1226,6 +1234,7 @@ static struct pci_device_id s3_devices[] __devinitdata = {
{PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A11), .driver_data = CHIP_357_VIRGE_GX2P}, {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A11), .driver_data = CHIP_357_VIRGE_GX2P},
{PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A12), .driver_data = CHIP_359_VIRGE_GX2P}, {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A12), .driver_data = CHIP_359_VIRGE_GX2P},
{PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A13), .driver_data = CHIP_36X_TRIO3D_1X_2X}, {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A13), .driver_data = CHIP_36X_TRIO3D_1X_2X},
{PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8904), .driver_data = CHIP_365_TRIO3D},
{0, 0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0, 0}
}; };
......
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