Skip to content

Commit

Permalink
s3fb: driver fixes
Browse files Browse the repository at this point in the history
This fixes broken fbcon on Virge VX in 24 bpp mode, and contains several
other small updates.

Signed-off-by: Ondrej Zajicek <[email protected]>
Signed-off-by: Antonino Daplas <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Ondrej Zajicek authored and Linus Torvalds committed May 8, 2007
1 parent 4941cb7 commit 249bdbb
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 15 deletions.
12 changes: 8 additions & 4 deletions Documentation/fb/s3fb.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@ Supported Features
* suspend/resume support
* DPMS support

Text mode is supported even in higher resolutions, but there is limitation
to lower pixclocks (maximum between 50-60 MHz, depending on specific hardware).
This limitation is not enforced by driver. Text mode supports 8bit wide fonts
only (hardware limitation) and 16bit tall fonts (driver limitation).
Text mode is supported even in higher resolutions, but there is limitation to
lower pixclocks (maximum usually between 50-60 MHz, depending on specific
hardware, i get best results from plain S3 Trio32 card - about 75 MHz). This
limitation is not enforced by driver. Text mode supports 8bit wide fonts only
(hardware limitation) and 16bit tall fonts (driver limitation). Text mode
support is broken on S3 Trio64 V2/DX.

There are two 4 bpp modes. First mode (selected if nonstd == 0) is mode with
packed pixels, high nibble first. Second mode (selected if nonstd == 1) is mode
Expand Down Expand Up @@ -73,6 +75,8 @@ Known bugs
==========

* cursor disable in text mode doesn't work
* text mode broken on S3 Trio64 V2/DX


--
Ondrej Zajicek <[email protected]>
21 changes: 10 additions & 11 deletions drivers/video/s3fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ static const struct svga_fb_format s3fb_formats[] = {


static const struct svga_pll s3_pll = {3, 129, 3, 33, 0, 3,
60000, 240000, 14318};
35000, 240000, 14318};

static const int s3_memsizes[] = {4096, 0, 3072, 8192, 2048, 6144, 1024, 512};

Expand Down Expand Up @@ -331,8 +331,13 @@ static void s3_set_pixclock(struct fb_info *info, u32 pixclock)
{
u16 m, n, r;
u8 regval;
int rv;

svga_compute_pll(&s3_pll, 1000000000 / pixclock, &m, &n, &r, info->node);
rv = svga_compute_pll(&s3_pll, 1000000000 / pixclock, &m, &n, &r, info->node);
if (rv < 0) {
printk(KERN_ERR "fb%d: cannot set requested pixclock, keeping old value\n", info->node);
return;
}

/* Set VGA misc register */
regval = vga_r(NULL, VGA_MIS_R);
Expand Down Expand Up @@ -710,7 +715,7 @@ static int s3fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
break;
case 16:
if (regno >= 16)
return -EINVAL;
return 0;

if (fb->var.green.length == 5)
((u32*)fb->pseudo_palette)[regno] = ((red & 0xF800) >> 1) |
Expand All @@ -723,9 +728,9 @@ static int s3fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
case 24:
case 32:
if (regno >= 16)
return -EINVAL;
return 0;

((u32*)fb->pseudo_palette)[regno] = ((transp & 0xFF00) << 16) | ((red & 0xFF00) << 8) |
((u32*)fb->pseudo_palette)[regno] = ((red & 0xFF00) << 8) |
(green & 0xFF00) | ((blue & 0xFF00) >> 8);
break;
default:
Expand Down Expand Up @@ -778,12 +783,6 @@ static int s3fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)

unsigned int offset;

/* Validate the offsets */
if ((var->xoffset + var->xres) > var->xres_virtual)
return -EINVAL;
if ((var->yoffset + var->yres) > var->yres_virtual)
return -EINVAL;

/* Calculate the offset */
if (var->bits_per_pixel == 0) {
offset = (var->yoffset / 16) * (var->xres_virtual / 2) + (var->xoffset / 2);
Expand Down

0 comments on commit 249bdbb

Please sign in to comment.