* [PATCH 3/3] cirrusfb: code improvements
@ 2007-08-18 6:23 Krzysztof Helt
0 siblings, 0 replies; only message in thread
From: Krzysztof Helt @ 2007-08-18 6:23 UTC (permalink / raw)
To: linux-fbdev-devel
[-- Attachment #1: Type: text/plain, Size: 12324 bytes --]
From: Krzysztof Helt <krzysztof.h1@wp.pl>
This patch does some "short-range" code improvements like
merging identical switch clauses, replacing conditional
branches with calculation of values, merging only once-used
functions into place they are called from.
Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
---
This set of patches requires previously sent cirrusfb cleanup up.
--- linux-2.6.23.old/drivers/video/cirrusfb.c 2007-08-18 08:
05:00.000000000 +0200
+++ linux-2.6.23/drivers/video/cirrusfb.c 2007-08-18 08:08:
17.000000000 +0200
@@ -647,31 +647,17 @@ static int cirrusfb_check_var(struct fb_
{ -1, -1 } };
switch (var->bits_per_pixel) {
- case 0 ... 1:
- var->bits_per_pixel = 1;
+ case 1:
nom = 4;
den = 8;
break; /* 8 pixel per byte, only 1/4th of mem
usable */
- case 2 ... 8:
- var->bits_per_pixel = 8;
- nom = 1;
+ case 8:
+ case 16:
+ case 24:
+ case 32:
+ nom = var->bits_per_pixel / 8;
den = 1;
break; /* 1 pixel == 1 byte */
- case 9 ... 16:
- var->bits_per_pixel = 16;
- nom = 2;
- den = 1;
- break; /* 2 bytes per pixel */
- case 17 ... 24:
- var->bits_per_pixel = 24;
- nom = 3;
- den = 1;
- break; /* 3 bytes per pixel */
- case 25 ... 32:
- var->bits_per_pixel = 32;
- nom = 4;
- den = 1;
- break; /* 4 bytes per pixel */
default:
printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected..."
"color depth not supported.\n",
@@ -732,19 +718,15 @@ static int cirrusfb_check_var(struct fb_
case 1:
var->red.offset = 0;
var->red.length = 1;
- var->green.offset = 0;
- var->green.length = 1;
- var->blue.offset = 0;
- var->blue.length = 1;
+ var->green = var->red;
+ var->blue = var->red;
break;
case 8:
var->red.offset = 0;
var->red.length = 6;
- var->green.offset = 0;
- var->green.length = 6;
- var->blue.offset = 0;
- var->blue.length = 6;
+ var->green = var->red;
+ var->blue = var->red;
break;
case 16:
@@ -763,20 +745,6 @@ static int cirrusfb_check_var(struct fb_
break;
case 24:
- if (isPReP) {
- var->red.offset = 8;
- var->green.offset = 16;
- var->blue.offset = 24;
- } else {
- var->red.offset = 16;
- var->green.offset = 8;
- var->blue.offset = 0;
- }
- var->red.length = 8;
- var->green.length = 8;
- var->blue.length = 8;
- break;
-
case 32:
if (isPReP) {
var->red.offset = 8;
@@ -828,7 +796,7 @@ static int cirrusfb_decode_var(const str
{
long freq;
long maxclock;
- int maxclockidx = 0;
+ int maxclockidx = var->bits_per_pixel >> 3;
struct cirrusfb_info *cinfo = info->par;
int xres, hfront, hsync, hback;
int yres, vfront, vsync, vback;
@@ -837,31 +805,18 @@ static int cirrusfb_decode_var(const str
case 1:
regs->line_length = var->xres_virtual / 8;
regs->visual = FB_VISUAL_MONO10;
- maxclockidx = 0;
break;
case 8:
regs->line_length = var->xres_virtual;
regs->visual = FB_VISUAL_PSEUDOCOLOR;
- maxclockidx = 1;
break;
case 16:
- regs->line_length = var->xres_virtual * 2;
- regs->visual = FB_VISUAL_DIRECTCOLOR;
- maxclockidx = 2;
- break;
-
case 24:
- regs->line_length = var->xres_virtual * 3;
- regs->visual = FB_VISUAL_DIRECTCOLOR;
- maxclockidx = 3;
- break;
-
case 32:
- regs->line_length = var->xres_virtual * 4;
+ regs->line_length = var->xres_virtual * maxclockidx;
regs->visual = FB_VISUAL_DIRECTCOLOR;
- maxclockidx = 4;
break;
default:
@@ -874,7 +829,7 @@ static int cirrusfb_decode_var(const str
regs->type = FB_TYPE_PACKED_PIXELS;
/* convert from ps to kHz */
- freq = 1000000000 / var->pixclock;
+ freq = PICOS2KHZ(var->pixclock);
DPRINTK("desired pixclock: %ld kHz\n", freq);
@@ -1213,7 +1168,8 @@ static int cirrusfb_set_par_foo(struct f
break;
case BT_PICCOLO:
- DPRINTK("(for Piccolo)\n");
+ case BT_SPECTRUM:
+ DPRINTK("(for Piccolo/Spectrum)\n");
/* ### ueberall 0x22? */
/* ##vorher 1c MCLK select */
vga_wseq(regbase, CL_SEQR1F, 0x22);
@@ -1229,15 +1185,6 @@ static int cirrusfb_set_par_foo(struct f
vga_wseq(regbase, CL_SEQRF, 0xd0);
break;
- case BT_SPECTRUM:
- DPRINTK("(for Spectrum)\n");
- /* ### ueberall 0x22? */
- /* ##vorher 1c MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- /* evtl d0? avoid FIFO underruns..? */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- break;
-
case BT_PICASSO4:
case BT_ALPINE:
case BT_GD5480:
@@ -1306,19 +1253,7 @@ static int cirrusfb_set_par_foo(struct f
break;
case BT_PICCOLO:
- /* ### vorher 1c MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- /* Fast Page-Mode writes */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- break;
-
case BT_PICASSO:
- /* ### vorher 1c MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- /* Fast Page-Mode writes */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- break;
-
case BT_SPECTRUM:
/* ### vorher 1c MCLK select */
vga_wseq(regbase, CL_SEQR1F, 0x22);
@@ -1385,6 +1320,7 @@ static int cirrusfb_set_par_foo(struct f
break;
case BT_PICCOLO:
+ case BT_SPECTRUM:
vga_wseq(regbase, CL_SEQR7, 0x87);
/* Fast Page-Mode writes */
vga_wseq(regbase, CL_SEQRF, 0xb0);
@@ -1400,14 +1336,6 @@ static int cirrusfb_set_par_foo(struct f
vga_wseq(regbase, CL_SEQR1F, 0x22);
break;
- case BT_SPECTRUM:
- vga_wseq(regbase, CL_SEQR7, 0x87);
- /* Fast Page-Mode writes */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- /* MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- break;
-
case BT_PICASSO4:
vga_wseq(regbase, CL_SEQR7, 0x27);
/* vga_wseq(regbase, CL_SEQR1F, 0x1c); */
@@ -1473,6 +1401,7 @@ static int cirrusfb_set_par_foo(struct f
break;
case BT_PICCOLO:
+ case BT_SPECTRUM:
vga_wseq(regbase, CL_SEQR7, 0x85);
/* Fast Page-Mode writes */
vga_wseq(regbase, CL_SEQRF, 0xb0);
@@ -1488,14 +1417,6 @@ static int cirrusfb_set_par_foo(struct f
vga_wseq(regbase, CL_SEQR1F, 0x22);
break;
- case BT_SPECTRUM:
- vga_wseq(regbase, CL_SEQR7, 0x85);
- /* Fast Page-Mode writes */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- /* MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- break;
-
case BT_PICASSO4:
vga_wseq(regbase, CL_SEQR7, 0x25);
/* vga_wseq(regbase, CL_SEQR1F, 0x1c); */
@@ -1662,18 +1583,7 @@ static int cirrusfb_setcolreg(unsigned r
(green << info->var.green.offset) |
(blue << info->var.blue.offset);
- switch (info->var.bits_per_pixel) {
- case 8:
- cinfo->pseudo_palette[regno] = v;
- break;
- case 16:
- cinfo->pseudo_palette[regno] = v;
- break;
- case 24:
- case 32:
- cinfo->pseudo_palette[regno] = v;
- break;
- }
+ cinfo->pseudo_palette[regno] = v;
return 0;
}
@@ -1743,12 +1653,8 @@ static int cirrusfb_pan_display(struct f
vga_wcrt(cinfo->regbase, CL_CRT1B, tmp2);
/* construct bit 19 of screen start address */
- if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19) {
- tmp2 = 0;
- if (base & 0x80000)
- tmp2 = 0x80;
- vga_wcrt(cinfo->regbase, CL_CRT1D, tmp2);
- }
+ if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19)
+ vga_wcrt(cinfo->regbase, CL_CRT1D, (base >> 12) & 0x80);
/* write pixel panning value to AR33; this does not quite
work in 8bpp
*
@@ -2139,38 +2045,15 @@ static void switch_monitor(struct cirrus
/* Linux 2.6-style accelerated functions */
/******************************************/
-static void cirrusfb_prim_fillrect(struct fb_info *info,
- const struct fb_fillrect *region)
-{
- struct cirrusfb_info *cinfo = info->par;
- int m; /* bytes per pixel */
- u32 color = (info->fix.visual == FB_VISUAL_TRUECOLOR) ?
- cinfo->pseudo_palette[region->color] : region->color;
-
- if (info->var.bits_per_pixel == 1) {
- cirrusfb_RectFill(cinfo->regbase,
- info->var.bits_per_pixel,
- region->dx / 8, region->dy,
- region->width / 8, region->height,
- color,
- cinfo->currentmode.line_length);
- } else {
- m = (info->var.bits_per_pixel + 7) / 8;
- cirrusfb_RectFill(cinfo->regbase,
- info->var.bits_per_pixel,
- region->dx * m, region->dy,
- region->width * m, region->height,
- color,
- cinfo->currentmode.line_length);
- }
- return;
-}
-
static void cirrusfb_fillrect(struct fb_info *info,
const struct fb_fillrect *region)
{
struct fb_fillrect modded;
int vxres, vyres;
+ struct cirrusfb_info *cinfo = info->par;
+ int m = info->var.bits_per_pixel;
+ u32 color = (info->fix.visual == FB_VISUAL_TRUECOLOR) ?
+ cinfo->pseudo_palette[region->color] : region->color;
if (info->state != FBINFO_STATE_RUNNING)
return;
@@ -2193,30 +2076,12 @@ static void cirrusfb_fillrect(struct fb_
if (modded.dy + modded.height > vyres)
modded.height = vyres - modded.dy;
- cirrusfb_prim_fillrect(info, &modded);
-}
-
-static void cirrusfb_prim_copyarea(struct fb_info *info,
- const struct fb_copyarea *area)
-{
- struct cirrusfb_info *cinfo = info->par;
- int m; /* bytes per pixel */
-
- if (info->var.bits_per_pixel == 1) {
- cirrusfb_BitBLT(cinfo->regbase, info->var.
bits_per_pixel,
- area->sx / 8, area->sy,
- area->dx / 8, area->dy,
- area->width / 8, area->height,
- cinfo->currentmode.line_length);
- } else {
- m = (info->var.bits_per_pixel + 7) / 8;
- cirrusfb_BitBLT(cinfo->regbase, info->var.
bits_per_pixel,
- area->sx * m, area->sy,
- area->dx * m, area->dy,
- area->width * m, area->height,
- cinfo->currentmode.line_length);
- }
- return;
+ cirrusfb_RectFill(cinfo->regbase,
+ info->var.bits_per_pixel,
+ (region->dx * m) / 8, region->dy,
+ (region->width * m) / 8, region->height,
+ color,
+ cinfo->currentmode.line_length);
}
static void cirrusfb_copyarea(struct fb_info *info,
@@ -2224,13 +2089,8 @@ static void cirrusfb_copyarea(struct fb_
{
struct fb_copyarea modded;
u32 vxres, vyres;
-
- modded.sx = area->sx;
- modded.sy = area->sy;
- modded.dx = area->dx;
- modded.dy = area->dy;
- modded.width = area->width;
- modded.height = area->height;
+ struct cirrusfb_info *cinfo = info->par;
+ int m = info->var.bits_per_pixel;
if (info->state != FBINFO_STATE_RUNNING)
return;
@@ -2241,6 +2101,7 @@ static void cirrusfb_copyarea(struct fb_
vxres = info->var.xres_virtual;
vyres = info->var.yres_virtual;
+ memcpy(&modded, area, sizeof(struct fb_copyarea));
if (!modded.width || !modded.height ||
modded.sx >= vxres || modded.sy >= vyres ||
@@ -2256,7 +2117,12 @@ static void cirrusfb_copyarea(struct fb_
if (modded.dy + modded.height > vyres)
modded.height = vyres - modded.dy;
- cirrusfb_prim_copyarea(info, &modded);
+ cirrusfb_BitBLT(cinfo->regbase, info->var.bits_per_pixel,
+ (area->sx * m) / 8, area->sy,
+ (area->dx * m) / 8, area->dy,
+ (area->width * m) / 8, area->height,
+ cinfo->currentmode.line_length);
+
}
static void cirrusfb_imageblit(struct fb_info *info,
@@ -2366,7 +2232,6 @@ static void cirrusfb_pci_unmap(struct fb
if (release_io_ports)
release_region(0x3C0, 32);
pci_release_regions(pdev);
- framebuffer_release(info);
}
#endif /* CONFIG_PCI */
@@ -2383,7 +2248,6 @@ static void __devexit cirrusfb_zorro_unm
if (zorro_resource_start(cinfo->zdev) > 0x01000000)
iounmap(info->screen_base);
}
- framebuffer_release(cinfo->info);
}
#endif /* CONFIG_ZORRO */
@@ -2481,6 +2345,7 @@ err_dealloc_cmap:
fb_dealloc_cmap(&info->cmap);
err_unmap_cirrusfb:
cinfo->unmap(info);
+ framebuffer_release(info);
return err;
}
@@ -2495,6 +2360,7 @@ static void __devexit cirrusfb_cleanup(s
fb_dealloc_cmap(&info->cmap);
printk("Framebuffer unregistered\n");
cinfo->unmap(info);
+ framebuffer_release(info);
DPRINTK("EXIT\n");
}
----------------------------------------------------
Producenci filmu SEZON NA MISIA przedstawiają
surfujące pingwiny w nowej, animowanej komedii
NA FALI - w kinach od 10 sierpnia!
http://klik.wp.pl/?adr=http%3A%2F%2Fadv.reklama.wp.pl%2Fas%2Fnafali_zwiastun.html&sid=1256
[-- Attachment #2: cirrusfb-impro.diff --]
[-- Type: application/octet-stream, Size: 11536 bytes --]
From: Krzysztof Helt <krzysztof.h1@wp.pl>
This patch does some "short-range" code improvements like
merging identical switch clauses, replacing conditional
branches with calculation of values, merging only once-used
functions into place they are called from.
Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
---
--- linux-2.6.23.old/drivers/video/cirrusfb.c 2007-08-18 08:05:00.000000000 +0200
+++ linux-2.6.23/drivers/video/cirrusfb.c 2007-08-18 08:08:17.000000000 +0200
@@ -647,31 +647,17 @@ static int cirrusfb_check_var(struct fb_
{ -1, -1 } };
switch (var->bits_per_pixel) {
- case 0 ... 1:
- var->bits_per_pixel = 1;
+ case 1:
nom = 4;
den = 8;
break; /* 8 pixel per byte, only 1/4th of mem usable */
- case 2 ... 8:
- var->bits_per_pixel = 8;
- nom = 1;
+ case 8:
+ case 16:
+ case 24:
+ case 32:
+ nom = var->bits_per_pixel / 8;
den = 1;
break; /* 1 pixel == 1 byte */
- case 9 ... 16:
- var->bits_per_pixel = 16;
- nom = 2;
- den = 1;
- break; /* 2 bytes per pixel */
- case 17 ... 24:
- var->bits_per_pixel = 24;
- nom = 3;
- den = 1;
- break; /* 3 bytes per pixel */
- case 25 ... 32:
- var->bits_per_pixel = 32;
- nom = 4;
- den = 1;
- break; /* 4 bytes per pixel */
default:
printk(KERN_ERR "cirrusfb: mode %dx%dx%d rejected..."
"color depth not supported.\n",
@@ -732,19 +718,15 @@ static int cirrusfb_check_var(struct fb_
case 1:
var->red.offset = 0;
var->red.length = 1;
- var->green.offset = 0;
- var->green.length = 1;
- var->blue.offset = 0;
- var->blue.length = 1;
+ var->green = var->red;
+ var->blue = var->red;
break;
case 8:
var->red.offset = 0;
var->red.length = 6;
- var->green.offset = 0;
- var->green.length = 6;
- var->blue.offset = 0;
- var->blue.length = 6;
+ var->green = var->red;
+ var->blue = var->red;
break;
case 16:
@@ -763,20 +745,6 @@ static int cirrusfb_check_var(struct fb_
break;
case 24:
- if (isPReP) {
- var->red.offset = 8;
- var->green.offset = 16;
- var->blue.offset = 24;
- } else {
- var->red.offset = 16;
- var->green.offset = 8;
- var->blue.offset = 0;
- }
- var->red.length = 8;
- var->green.length = 8;
- var->blue.length = 8;
- break;
-
case 32:
if (isPReP) {
var->red.offset = 8;
@@ -828,7 +796,7 @@ static int cirrusfb_decode_var(const str
{
long freq;
long maxclock;
- int maxclockidx = 0;
+ int maxclockidx = var->bits_per_pixel >> 3;
struct cirrusfb_info *cinfo = info->par;
int xres, hfront, hsync, hback;
int yres, vfront, vsync, vback;
@@ -837,31 +805,18 @@ static int cirrusfb_decode_var(const str
case 1:
regs->line_length = var->xres_virtual / 8;
regs->visual = FB_VISUAL_MONO10;
- maxclockidx = 0;
break;
case 8:
regs->line_length = var->xres_virtual;
regs->visual = FB_VISUAL_PSEUDOCOLOR;
- maxclockidx = 1;
break;
case 16:
- regs->line_length = var->xres_virtual * 2;
- regs->visual = FB_VISUAL_DIRECTCOLOR;
- maxclockidx = 2;
- break;
-
case 24:
- regs->line_length = var->xres_virtual * 3;
- regs->visual = FB_VISUAL_DIRECTCOLOR;
- maxclockidx = 3;
- break;
-
case 32:
- regs->line_length = var->xres_virtual * 4;
+ regs->line_length = var->xres_virtual * maxclockidx;
regs->visual = FB_VISUAL_DIRECTCOLOR;
- maxclockidx = 4;
break;
default:
@@ -874,7 +829,7 @@ static int cirrusfb_decode_var(const str
regs->type = FB_TYPE_PACKED_PIXELS;
/* convert from ps to kHz */
- freq = 1000000000 / var->pixclock;
+ freq = PICOS2KHZ(var->pixclock);
DPRINTK("desired pixclock: %ld kHz\n", freq);
@@ -1213,7 +1168,8 @@ static int cirrusfb_set_par_foo(struct f
break;
case BT_PICCOLO:
- DPRINTK("(for Piccolo)\n");
+ case BT_SPECTRUM:
+ DPRINTK("(for Piccolo/Spectrum)\n");
/* ### ueberall 0x22? */
/* ##vorher 1c MCLK select */
vga_wseq(regbase, CL_SEQR1F, 0x22);
@@ -1229,15 +1185,6 @@ static int cirrusfb_set_par_foo(struct f
vga_wseq(regbase, CL_SEQRF, 0xd0);
break;
- case BT_SPECTRUM:
- DPRINTK("(for Spectrum)\n");
- /* ### ueberall 0x22? */
- /* ##vorher 1c MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- /* evtl d0? avoid FIFO underruns..? */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- break;
-
case BT_PICASSO4:
case BT_ALPINE:
case BT_GD5480:
@@ -1306,19 +1253,7 @@ static int cirrusfb_set_par_foo(struct f
break;
case BT_PICCOLO:
- /* ### vorher 1c MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- /* Fast Page-Mode writes */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- break;
-
case BT_PICASSO:
- /* ### vorher 1c MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- /* Fast Page-Mode writes */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- break;
-
case BT_SPECTRUM:
/* ### vorher 1c MCLK select */
vga_wseq(regbase, CL_SEQR1F, 0x22);
@@ -1385,6 +1320,7 @@ static int cirrusfb_set_par_foo(struct f
break;
case BT_PICCOLO:
+ case BT_SPECTRUM:
vga_wseq(regbase, CL_SEQR7, 0x87);
/* Fast Page-Mode writes */
vga_wseq(regbase, CL_SEQRF, 0xb0);
@@ -1400,14 +1336,6 @@ static int cirrusfb_set_par_foo(struct f
vga_wseq(regbase, CL_SEQR1F, 0x22);
break;
- case BT_SPECTRUM:
- vga_wseq(regbase, CL_SEQR7, 0x87);
- /* Fast Page-Mode writes */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- /* MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- break;
-
case BT_PICASSO4:
vga_wseq(regbase, CL_SEQR7, 0x27);
/* vga_wseq(regbase, CL_SEQR1F, 0x1c); */
@@ -1473,6 +1401,7 @@ static int cirrusfb_set_par_foo(struct f
break;
case BT_PICCOLO:
+ case BT_SPECTRUM:
vga_wseq(regbase, CL_SEQR7, 0x85);
/* Fast Page-Mode writes */
vga_wseq(regbase, CL_SEQRF, 0xb0);
@@ -1488,14 +1417,6 @@ static int cirrusfb_set_par_foo(struct f
vga_wseq(regbase, CL_SEQR1F, 0x22);
break;
- case BT_SPECTRUM:
- vga_wseq(regbase, CL_SEQR7, 0x85);
- /* Fast Page-Mode writes */
- vga_wseq(regbase, CL_SEQRF, 0xb0);
- /* MCLK select */
- vga_wseq(regbase, CL_SEQR1F, 0x22);
- break;
-
case BT_PICASSO4:
vga_wseq(regbase, CL_SEQR7, 0x25);
/* vga_wseq(regbase, CL_SEQR1F, 0x1c); */
@@ -1662,18 +1583,7 @@ static int cirrusfb_setcolreg(unsigned r
(green << info->var.green.offset) |
(blue << info->var.blue.offset);
- switch (info->var.bits_per_pixel) {
- case 8:
- cinfo->pseudo_palette[regno] = v;
- break;
- case 16:
- cinfo->pseudo_palette[regno] = v;
- break;
- case 24:
- case 32:
- cinfo->pseudo_palette[regno] = v;
- break;
- }
+ cinfo->pseudo_palette[regno] = v;
return 0;
}
@@ -1743,12 +1653,8 @@ static int cirrusfb_pan_display(struct f
vga_wcrt(cinfo->regbase, CL_CRT1B, tmp2);
/* construct bit 19 of screen start address */
- if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19) {
- tmp2 = 0;
- if (base & 0x80000)
- tmp2 = 0x80;
- vga_wcrt(cinfo->regbase, CL_CRT1D, tmp2);
- }
+ if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19)
+ vga_wcrt(cinfo->regbase, CL_CRT1D, (base >> 12) & 0x80);
/* write pixel panning value to AR33; this does not quite work in 8bpp
*
@@ -2139,38 +2045,15 @@ static void switch_monitor(struct cirrus
/* Linux 2.6-style accelerated functions */
/******************************************/
-static void cirrusfb_prim_fillrect(struct fb_info *info,
- const struct fb_fillrect *region)
-{
- struct cirrusfb_info *cinfo = info->par;
- int m; /* bytes per pixel */
- u32 color = (info->fix.visual == FB_VISUAL_TRUECOLOR) ?
- cinfo->pseudo_palette[region->color] : region->color;
-
- if (info->var.bits_per_pixel == 1) {
- cirrusfb_RectFill(cinfo->regbase,
- info->var.bits_per_pixel,
- region->dx / 8, region->dy,
- region->width / 8, region->height,
- color,
- cinfo->currentmode.line_length);
- } else {
- m = (info->var.bits_per_pixel + 7) / 8;
- cirrusfb_RectFill(cinfo->regbase,
- info->var.bits_per_pixel,
- region->dx * m, region->dy,
- region->width * m, region->height,
- color,
- cinfo->currentmode.line_length);
- }
- return;
-}
-
static void cirrusfb_fillrect(struct fb_info *info,
const struct fb_fillrect *region)
{
struct fb_fillrect modded;
int vxres, vyres;
+ struct cirrusfb_info *cinfo = info->par;
+ int m = info->var.bits_per_pixel;
+ u32 color = (info->fix.visual == FB_VISUAL_TRUECOLOR) ?
+ cinfo->pseudo_palette[region->color] : region->color;
if (info->state != FBINFO_STATE_RUNNING)
return;
@@ -2193,30 +2076,12 @@ static void cirrusfb_fillrect(struct fb_
if (modded.dy + modded.height > vyres)
modded.height = vyres - modded.dy;
- cirrusfb_prim_fillrect(info, &modded);
-}
-
-static void cirrusfb_prim_copyarea(struct fb_info *info,
- const struct fb_copyarea *area)
-{
- struct cirrusfb_info *cinfo = info->par;
- int m; /* bytes per pixel */
-
- if (info->var.bits_per_pixel == 1) {
- cirrusfb_BitBLT(cinfo->regbase, info->var.bits_per_pixel,
- area->sx / 8, area->sy,
- area->dx / 8, area->dy,
- area->width / 8, area->height,
- cinfo->currentmode.line_length);
- } else {
- m = (info->var.bits_per_pixel + 7) / 8;
- cirrusfb_BitBLT(cinfo->regbase, info->var.bits_per_pixel,
- area->sx * m, area->sy,
- area->dx * m, area->dy,
- area->width * m, area->height,
- cinfo->currentmode.line_length);
- }
- return;
+ cirrusfb_RectFill(cinfo->regbase,
+ info->var.bits_per_pixel,
+ (region->dx * m) / 8, region->dy,
+ (region->width * m) / 8, region->height,
+ color,
+ cinfo->currentmode.line_length);
}
static void cirrusfb_copyarea(struct fb_info *info,
@@ -2224,13 +2089,8 @@ static void cirrusfb_copyarea(struct fb_
{
struct fb_copyarea modded;
u32 vxres, vyres;
-
- modded.sx = area->sx;
- modded.sy = area->sy;
- modded.dx = area->dx;
- modded.dy = area->dy;
- modded.width = area->width;
- modded.height = area->height;
+ struct cirrusfb_info *cinfo = info->par;
+ int m = info->var.bits_per_pixel;
if (info->state != FBINFO_STATE_RUNNING)
return;
@@ -2241,6 +2101,7 @@ static void cirrusfb_copyarea(struct fb_
vxres = info->var.xres_virtual;
vyres = info->var.yres_virtual;
+ memcpy(&modded, area, sizeof(struct fb_copyarea));
if (!modded.width || !modded.height ||
modded.sx >= vxres || modded.sy >= vyres ||
@@ -2256,7 +2117,12 @@ static void cirrusfb_copyarea(struct fb_
if (modded.dy + modded.height > vyres)
modded.height = vyres - modded.dy;
- cirrusfb_prim_copyarea(info, &modded);
+ cirrusfb_BitBLT(cinfo->regbase, info->var.bits_per_pixel,
+ (area->sx * m) / 8, area->sy,
+ (area->dx * m) / 8, area->dy,
+ (area->width * m) / 8, area->height,
+ cinfo->currentmode.line_length);
+
}
static void cirrusfb_imageblit(struct fb_info *info,
@@ -2366,7 +2232,6 @@ static void cirrusfb_pci_unmap(struct fb
if (release_io_ports)
release_region(0x3C0, 32);
pci_release_regions(pdev);
- framebuffer_release(info);
}
#endif /* CONFIG_PCI */
@@ -2383,7 +2248,6 @@ static void __devexit cirrusfb_zorro_unm
if (zorro_resource_start(cinfo->zdev) > 0x01000000)
iounmap(info->screen_base);
}
- framebuffer_release(cinfo->info);
}
#endif /* CONFIG_ZORRO */
@@ -2481,6 +2345,7 @@ err_dealloc_cmap:
fb_dealloc_cmap(&info->cmap);
err_unmap_cirrusfb:
cinfo->unmap(info);
+ framebuffer_release(info);
return err;
}
@@ -2495,6 +2360,7 @@ static void __devexit cirrusfb_cleanup(s
fb_dealloc_cmap(&info->cmap);
printk("Framebuffer unregistered\n");
cinfo->unmap(info);
+ framebuffer_release(info);
DPRINTK("EXIT\n");
}
[-- Attachment #3: Type: text/plain, Size: 315 bytes --]
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
[-- Attachment #4: Type: text/plain, Size: 182 bytes --]
_______________________________________________
Linux-fbdev-devel mailing list
Linux-fbdev-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-fbdev-devel
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-08-18 6:23 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-18 6:23 [PATCH 3/3] cirrusfb: code improvements Krzysztof Helt
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.