diff -Ncr linux-c750_org/arch/arm/mach-pxa/sharpsl_power.c linux-c750_patch/arch/arm/mach-pxa/sharpsl_power.c
*** linux-c750_org/arch/arm/mach-pxa/sharpsl_power.c	2003-06-18 17:09:04.000000000 +0900
--- linux-c750_patch/arch/arm/mach-pxa/sharpsl_power.c	2003-08-01 22:50:13.000000000 +0900
***************
*** 1290,1299 ****
  
  	// daemonize();
  	strcpy(current->comm, "off_thread");
! 	sigfillset(&current->blocked);
! 
  	while(1) {
! 		interruptible_sleep_on(&wq_off);
  		DPRINTK("start off sequence ! \n");
  
  #if !defined(CONFIG_ARCH_PXA_SHEPHERD)
--- 1298,1307 ----
  
  	// daemonize();
  	strcpy(current->comm, "off_thread");
! /*	sigfillset(&current->blocked);
!  */
  	while(1) {
! 		sleep_on(&wq_off);
  		DPRINTK("start off sequence ! \n");
  
  #if !defined(CONFIG_ARCH_PXA_SHEPHERD)
***************
*** 1303,1326 ****
  		handle_scancode(SLKEY_OFF|KBDOWN , 1);
  		mdelay(10);
  		handle_scancode(SLKEY_OFF|KBUP   , 0);
! 
! #if !defined(CONFIG_ARCH_PXA_SHEPHERD)
! 		// wait off signal
! 		// if can not recieve off siganl , so force off.
! 		time_cnt = jiffies;
! 		while(1) {
! 		  if ( ( jiffies - time_cnt )  > 500 ) break;
! 		  schedule();
! 		}
! 
  		// maybe apps is dead, so we have to restart.
  		pm_do_suspend();
! 		sharpsl_restart();
! #endif
  	}
  	return 0;
  }
  
  #if defined(CONFIG_ARCH_PXA_SHEPHERD)
  static struct timer_list bat_switch_timer;
  
--- 1311,1345 ----
  		handle_scancode(SLKEY_OFF|KBDOWN , 1);
  		mdelay(10);
  		handle_scancode(SLKEY_OFF|KBUP   , 0);
! /*
!  * #if !defined(CONFIG_ARCH_PXA_SHEPHERD)
!  *		// wait off signal
!  *		// if can not recieve off siganl , so force off.
!  *		time_cnt = jiffies;
!  *		while(1) {
!  *		  if ( ( jiffies - time_cnt )  > 500 ) break;
!  *		  schedule();
!  *		}
!  */
  		// maybe apps is dead, so we have to restart.
  		pm_do_suspend();
! 
! /*		sharpsl_restart(); 
!  * #endif
!  */
  	}
  	return 0;
  }
  
+ void slc700_key_suspend(void)
+ {
+ 	apm_wakeup_src_mask = 0;
+ 	wake_up(&wq_off);
+ }
+ 
+ 
+ EXPORT_SYMBOL(slc700_key_suspend);
+ 
  #if defined(CONFIG_ARCH_PXA_SHEPHERD)
  static struct timer_list bat_switch_timer;
  
diff -Ncr linux-c750_org/drivers/char/keyboard.c linux-c750_patch/drivers/char/keyboard.c
*** linux-c750_org/drivers/char/keyboard.c	2002-12-18 19:27:58.000000000 +0900
--- linux-c750_patch/drivers/char/keyboard.c	2003-08-01 22:50:23.000000000 +0900
***************
*** 224,229 ****
--- 224,244 ----
  
  void handle_scancode(unsigned char scancode, int down)
  {
+ 	int fd;
+ 
+ 	/* SL-C700 side power 0x6d  */ 
+ 	if ( ( scancode == 0x6d ) && ( down == 0x01 ) ){ 
+ 
+ 		printk("power button");
+ 		slc700_key_suspend();
+ 
+ 	} else {
+ 		handle_scancode_main ( scancode, down );
+ 	}
+ }
+ 
+ void handle_scancode_main(unsigned char scancode, int down)
+ {
  	unsigned char keycode;
  	char up_flag = down ? 0 : 0200;
  	char raw_mode;

