[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Kernel2.4.20 & PowerbookG3-Lombard awakening hiccup



Can you try that patch and let me know if it helps ?

Ben.

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux 2.4 for PowerPC
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.770   -> 1.771  
#	drivers/video/aty/atyfb_base.c	1.15    -> 1.16   
#	drivers/video/aty/mach64_cursor.c	1.2     -> 1.3    
#	drivers/video/aty/atyfb.h	1.2     -> 1.3    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/01/23	benh@zion.wanadoo.fr	1.771
# Make atyfb sleep more robust
# --------------------------------------------
#
diff -Nru a/drivers/video/aty/atyfb.h b/drivers/video/aty/atyfb.h
--- a/drivers/video/aty/atyfb.h	Thu Jan 23 23:48:17 2003
+++ b/drivers/video/aty/atyfb.h	Thu Jan 23 23:48:17 2003
@@ -124,6 +124,7 @@
 #endif
     } fbcon_cmap;
     u8 blitter_may_be_busy;
+    int asleep;
 #ifdef __sparc__
     u8 mmaped;
     int open;
diff -Nru a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
--- a/drivers/video/aty/atyfb_base.c	Thu Jan 23 23:48:17 2003
+++ b/drivers/video/aty/atyfb_base.c	Thu Jan 23 23:48:17 2003
@@ -748,6 +748,8 @@
 
     info->current_par = *par;
 
+    if (info->asleep)
+    	return;
     if (info->blitter_may_be_busy)
 	wait_for_idle(info);
     tmp = aty_ld_8(CRTC_GEN_CNTL + 3, info);
@@ -1192,6 +1194,10 @@
 	return -EINVAL;
     par->crtc.xoffset = xoffset;
     par->crtc.yoffset = yoffset;
+
+    if (info->asleep)
+       	return 0;
+
     set_off_pitch(par, info);
     return 0;
 }
@@ -1660,6 +1666,7 @@
 			}
 			break;
 		case PBOOK_SLEEP_NOW:
+			acquire_console_sem();
 			if (currcon >= 0)
 				fb_display[currcon].dispsw = &fbcon_dummy;
 			if (info->blitter_may_be_busy)
@@ -1675,11 +1682,14 @@
 
 			/* Blank display and LCD */
 			atyfbcon_blank(VESA_POWERDOWN+1, (struct fb_info *)info);
+			info->asleep = 1;
 
 			/* Set chip to "suspend" mode */
 			result = aty_power_mgmt(1, info);
+			release_console_sem();
 			break;
 		case PBOOK_WAKE:
+			acquire_console_sem();
 			/* Wakeup chip */
 			result = aty_power_mgmt(0, info);
 
@@ -1690,6 +1700,7 @@
 				vfree(info->save_framebuffer);
 				info->save_framebuffer = 0;
 			}
+			info->asleep = 0;
 			/* Restore display */
 			if (currcon >= 0) {
 				atyfb_set_dispsw(&fb_display[currcon],
@@ -1697,6 +1708,11 @@
 					info->current_par.accel_flags & FB_ACCELF_TEXT);
 			}
 			atyfbcon_blank(0, (struct fb_info *)info);
+			/* XXX We may want to re-call atyfb_set_par and make
+			 * sure panning & cursor & palette are correct as we
+			 * skipped any change to these during suspend.
+			 */
+			release_console_sem();
 			break;
 		}
 	}
@@ -2720,6 +2736,9 @@
     struct fb_info_aty *info = (struct fb_info_aty *)fb;
     u8 gen_cntl;
 
+    if (info->asleep)
+       	return;
+
 #ifdef CONFIG_PMAC_BACKLIGHT
     if ((_machine == _MACH_Pmac) && blank)
     	set_backlight_enable(0);
@@ -2792,23 +2811,25 @@
     info->palette[regno].red = red;
     info->palette[regno].green = green;
     info->palette[regno].blue = blue;
-    i = aty_ld_8(DAC_CNTL, info) & 0xfc;
-    if (M64_HAS(EXTRA_BRIGHT))
-	i |= 0x2;	/*DAC_CNTL|0x2 turns off the extra brightness for gt*/
-    aty_st_8(DAC_CNTL, i, info);
-    aty_st_8(DAC_MASK, 0xff, info);
-    scale = (M64_HAS(INTEGRATED) && info->current_par.crtc.bpp == 16) ? 3 : 0;
+    if (!info->asleep) {
+        i = aty_ld_8(DAC_CNTL, info) & 0xfc;
+        if (M64_HAS(EXTRA_BRIGHT))
+	    i |= 0x2;	/*DAC_CNTL|0x2 turns off the extra brightness for gt*/
+        aty_st_8(DAC_CNTL, i, info);
+        aty_st_8(DAC_MASK, 0xff, info);
+        scale = (M64_HAS(INTEGRATED) && info->current_par.crtc.bpp == 16) ? 3 : 0;
 #ifdef CONFIG_ATARI
-    out_8(&info->aty_cmap_regs->windex, regno << scale);
-    out_8(&info->aty_cmap_regs->lut, red);
-    out_8(&info->aty_cmap_regs->lut, green);
-    out_8(&info->aty_cmap_regs->lut, blue);
+        out_8(&info->aty_cmap_regs->windex, regno << scale);
+        out_8(&info->aty_cmap_regs->lut, red);
+        out_8(&info->aty_cmap_regs->lut, green);
+        out_8(&info->aty_cmap_regs->lut, blue);
 #else
-    writeb(regno << scale, &info->aty_cmap_regs->windex);
-    writeb(red, &info->aty_cmap_regs->lut);
-    writeb(green, &info->aty_cmap_regs->lut);
-    writeb(blue, &info->aty_cmap_regs->lut);
+        writeb(regno << scale, &info->aty_cmap_regs->windex);
+        writeb(red, &info->aty_cmap_regs->lut);
+        writeb(green, &info->aty_cmap_regs->lut);
+        writeb(blue, &info->aty_cmap_regs->lut);
 #endif
+    }
     if (regno < 16)
 	switch (info->current_par.crtc.bpp) {
 #ifdef FBCON_HAS_CFB16
@@ -2859,6 +2880,9 @@
     struct vc_data *conp = p->conp;
     u32 yres, yoffset, sy, height;
 
+    if (info->asleep)
+    	return 0;
+    	
     yres = ((par->crtc.v_tot_disp >> 16) & 0x7ff) + 1;
     yoffset = fb_display[con].var.yoffset;
 
diff -Nru a/drivers/video/aty/mach64_cursor.c b/drivers/video/aty/mach64_cursor.c
--- a/drivers/video/aty/mach64_cursor.c	Thu Jan 23 23:48:17 2003
+++ b/drivers/video/aty/mach64_cursor.c	Thu Jan 23 23:48:17 2003
@@ -54,7 +54,7 @@
 	const u8 *blue = cursor_color_map;
 	int i;
 
-	if (!c)
+	if (!c || fb->asleep)
 		return;
 
 #ifdef __sparc__
@@ -81,7 +81,7 @@
 	u8 *ram, m, b;
 	int x, y;
 
-	if (!c)
+	if (!c || fb->asleep)
 		return;
 
 #ifdef __sparc__
@@ -118,7 +118,7 @@
 	u16 xoff, yoff;
 	int x, y;
 
-	if (!c)
+	if (!c || fb->asleep)
 		return;
 
 #ifdef __sparc__
@@ -297,8 +297,10 @@
 	    c->mask[i][height-1] = (j >= 8) ? 0xff : (0xff << (8 - j));
 	}
 
-	aty_set_cursor_color(fb);
-	aty_set_cursor_shape(fb);
+	if (!fb->asleep) {
+		aty_set_cursor_color(fb);
+		aty_set_cursor_shape(fb);
+	}
     }
     return 1;
 }

Reply to: