summaryrefslogtreecommitdiff
path: root/drivers/video/hgafb.c
diff options
context:
space:
mode:
authorBrent Cook <busterb@gmail.com>2010-12-31 05:56:50 +0000
committerPaul Mundt <lethal@linux-sh.org>2011-01-06 15:48:13 +0900
commit529ed806d4540d23ca2f68b28c3715d1566fc3ac (patch)
treeb8287b72e0a832496eb49fc77e17add713273c55 /drivers/video/hgafb.c
parente045da7d835a28950543f5f10f0cb1905ca9bbaf (diff)
downloadlwn-529ed806d4540d23ca2f68b28c3715d1566fc3ac.tar.gz
lwn-529ed806d4540d23ca2f68b28c3715d1566fc3ac.zip
video: Fix the HGA framebuffer driver
Resurrected some old hardware and fixed up the hgafb driver to work again. Only tested with fbcon, since most fbdev-based software appears to only support 12bpp and up. It does not appear that this driver has worked for at least the entire 2.6.x series, perhaps since 2002. Hercules graphics hardware uses packed pixels horizontally, but rows are not linear. In other words, the pixels are not packed vertically. This means that custom imageblit, fillrect and copyarea need to be written specific to the hardware. * Removed the experimental acceleration option, since it is required for the hardware to work. * Fixed imageblit to work with fb_image's wider than 8 pixels. * Updated configuration text (HGA hardware is from 1984) Signed-off-by: Brent Cook <busterb@gmail.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'drivers/video/hgafb.c')
-rw-r--r--drivers/video/hgafb.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/drivers/video/hgafb.c b/drivers/video/hgafb.c
index af8f0f2cc782..4052718eefaa 100644
--- a/drivers/video/hgafb.c
+++ b/drivers/video/hgafb.c
@@ -454,7 +454,6 @@ static int hgafb_blank(int blank_mode, struct fb_info *info)
/*
* Accel functions
*/
-#ifdef CONFIG_FB_HGA_ACCEL
static void hgafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
{
u_int rows, y;
@@ -466,7 +465,7 @@ static void hgafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
dest = rowaddr(info, y) + (rect->dx >> 3);
switch (rect->rop) {
case ROP_COPY:
- //fb_memset(dest, rect->color, (rect->width >> 3));
+ memset_io(dest, rect->color, (rect->width >> 3));
break;
case ROP_XOR:
fb_writeb(~(fb_readb(dest)), dest);
@@ -488,7 +487,7 @@ static void hgafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
for (rows = area->height; rows--; ) {
src = rowaddr(info, y1) + (area->sx >> 3);
dest = rowaddr(info, y2) + (area->dx >> 3);
- //fb_memmove(dest, src, (area->width >> 3));
+ memmove(dest, src, (area->width >> 3));
y1++;
y2++;
}
@@ -499,7 +498,7 @@ static void hgafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
for (rows = area->height; rows--;) {
src = rowaddr(info, y1) + (area->sx >> 3);
dest = rowaddr(info, y2) + (area->dx >> 3);
- //fb_memmove(dest, src, (area->width >> 3));
+ memmove(dest, src, (area->width >> 3));
y1--;
y2--;
}
@@ -511,20 +510,17 @@ static void hgafb_imageblit(struct fb_info *info, const struct fb_image *image)
u8 __iomem *dest;
u8 *cdat = (u8 *) image->data;
u_int rows, y = image->dy;
+ u_int x;
u8 d;
for (rows = image->height; rows--; y++) {
- d = *cdat++;
- dest = rowaddr(info, y) + (image->dx >> 3);
- fb_writeb(d, dest);
+ for (x = 0; x < image->width; x+= 8) {
+ d = *cdat++;
+ dest = rowaddr(info, y) + ((image->dx + x)>> 3);
+ fb_writeb(d, dest);
+ }
}
}
-#else /* !CONFIG_FB_HGA_ACCEL */
-#define hgafb_fillrect cfb_fillrect
-#define hgafb_copyarea cfb_copyarea
-#define hgafb_imageblit cfb_imageblit
-#endif /* CONFIG_FB_HGA_ACCEL */
-
static struct fb_ops hgafb_ops = {
.owner = THIS_MODULE,