--- linux/drivers/video/aty128fb.c.aty128fb_fix	Sat Jun  1 14:51:15 2002
+++ linux/drivers/video/aty128fb.c	Sun Jun  2 11:11:03 2002
@@ -2599,6 +2599,15 @@
         return;
     }
 
+    if (srcx < dstx) {
+	srcx += width - 1;
+	dstx += width - 1;
+    }
+    if (srcy < dsty) {
+	srcy += height - 1;
+	dsty += height - 1;
+    }
+
     wait_for_fifo(2, info);
     save_dp_datatype = aty_ld_le32(DP_DATATYPE);
     save_dp_cntl     = aty_ld_le32(DP_CNTL);
@@ -2606,7 +2615,9 @@
     wait_for_fifo(6, info);
     aty_st_le32(SRC_Y_X, (srcy << 16) | srcx);
     aty_st_le32(DP_MIX, ROP3_SRCCOPY | DP_SRC_RECT);
-    aty_st_le32(DP_CNTL, DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM);
+    aty_st_le32(DP_CNTL,
+		((srcx >= dstx) ? DST_X_LEFT_TO_RIGHT : 0) |
+		((srcy >= dsty) ? DST_Y_TOP_TO_BOTTOM : 0));
     aty_st_le32(DP_DATATYPE, save_dp_datatype | dstval | SRC_DSTCOLOR);
 
     aty_st_le32(DST_Y_X, (dsty << 16) | dstx);
@@ -2641,6 +2652,18 @@
 
 
 #ifdef FBCON_HAS_CFB8
+static void fbcon_aty8_clear(struct vc_data *conp, struct display *p,
+			     int sy, int sx, int height, int width)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb8_clear(conp, p, sy, sx, height, width);
+}
+
+
 static void fbcon_aty8_putc(struct vc_data *conp, struct display *p,
                             int c, int yy, int xx)
 {
@@ -2666,6 +2689,17 @@
 }
 
 
+static void fbcon_aty8_revc(struct display *p, int xx, int yy)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb8_revc(p, xx, yy);
+}
+
+
 static void fbcon_aty8_clear_margins(struct vc_data *conp,
                                      struct display *p, int bottom_only)
 {
@@ -2680,15 +2714,27 @@
 static struct display_switch fbcon_aty128_8 = {
     setup:		fbcon_cfb8_setup,
     bmove:		fbcon_aty128_bmove,
-    clear:		fbcon_cfb8_clear,
+    clear:		fbcon_aty8_clear,
     putc:		fbcon_aty8_putc,
     putcs:		fbcon_aty8_putcs,
-    revc:		fbcon_cfb8_revc,
+    revc:		fbcon_aty8_revc,
     clear_margins:	fbcon_aty8_clear_margins,
     fontwidthmask:	FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
 };
 #endif
 #ifdef FBCON_HAS_CFB16
+static void fbcon_aty16_clear(struct vc_data *conp, struct display *p,
+			      int sy, int sx, int height, int width)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb16_clear(conp, p, sy, sx, height, width);
+}
+
+
 static void fbcon_aty16_putc(struct vc_data *conp, struct display *p,
                             int c, int yy, int xx)
 {
@@ -2714,6 +2760,17 @@
 }
 
 
+static void fbcon_aty16_revc(struct display *p, int xx, int yy)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb16_revc(p, xx, yy);
+}
+
+
 static void fbcon_aty16_clear_margins(struct vc_data *conp,
                                      struct display *p, int bottom_only)
 {
@@ -2728,15 +2785,27 @@
 static struct display_switch fbcon_aty128_16 = {
     setup:		fbcon_cfb16_setup,
     bmove:		fbcon_aty128_bmove,
-    clear:		fbcon_cfb16_clear,
+    clear:		fbcon_aty16_clear,
     putc:		fbcon_aty16_putc,
     putcs:		fbcon_aty16_putcs,
-    revc:		fbcon_cfb16_revc,
+    revc:		fbcon_aty16_revc,
     clear_margins:	fbcon_aty16_clear_margins,
     fontwidthmask:	FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
 };
 #endif
 #ifdef FBCON_HAS_CFB24
+static void fbcon_aty24_clear(struct vc_data *conp, struct display *p,
+			      int sy, int sx, int height, int width)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb24_clear(conp, p, sy, sx, height, width);
+}
+
+
 static void fbcon_aty24_putc(struct vc_data *conp, struct display *p,
                             int c, int yy, int xx)
 {
@@ -2762,6 +2831,17 @@
 }
 
 
+static void fbcon_aty24_revc(struct display *p, int xx, int yy)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb24_revc(p, xx, yy);
+}
+
+
 static void fbcon_aty24_clear_margins(struct vc_data *conp,
                                      struct display *p, int bottom_only)
 {
@@ -2776,15 +2856,27 @@
 static struct display_switch fbcon_aty128_24 = {
     setup:		fbcon_cfb24_setup,
     bmove:		fbcon_aty128_bmove,
-    clear:		fbcon_cfb24_clear,
+    clear:		fbcon_aty24_clear,
     putc:		fbcon_aty24_putc,
     putcs:		fbcon_aty24_putcs,
-    revc:		fbcon_cfb24_revc,
+    revc:		fbcon_aty24_revc,
     clear_margins:	fbcon_aty24_clear_margins,
     fontwidthmask:	FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
 };
 #endif
 #ifdef FBCON_HAS_CFB32
+static void fbcon_aty32_clear(struct vc_data *conp, struct display *p,
+			      int sy, int sx, int height, int width)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb32_clear(conp, p, sy, sx, height, width);
+}
+
+
 static void fbcon_aty32_putc(struct vc_data *conp, struct display *p,
                             int c, int yy, int xx)
 {
@@ -2810,6 +2902,17 @@
 }
 
 
+static void fbcon_aty32_revc(struct display *p, int xx, int yy)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb32_revc(p, xx, yy);
+}
+
+
 static void fbcon_aty32_clear_margins(struct vc_data *conp,
                                      struct display *p, int bottom_only)
 {
@@ -2824,10 +2927,10 @@
 static struct display_switch fbcon_aty128_32 = {
     setup:		fbcon_cfb32_setup,
     bmove:		fbcon_aty128_bmove,
-    clear:		fbcon_cfb32_clear,
+    clear:		fbcon_aty32_clear,
     putc:		fbcon_aty32_putc,
     putcs:		fbcon_aty32_putcs,
-    revc:		fbcon_cfb32_revc,
+    revc:		fbcon_aty32_revc,
     clear_margins:	fbcon_aty32_clear_margins,
     fontwidthmask:	FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
 };

