Index: ppc-2.6/drivers/hwmon/ams/ams-core.c
===================================================================
--- ppc-2.6.orig/drivers/hwmon/ams/ams-core.c	2006-07-13 15:40:33.000000000 -0300
+++ ppc-2.6/drivers/hwmon/ams/ams-core.c	2006-07-13 15:42:14.000000000 -0300
@@ -71,14 +71,13 @@
 static void ams_handle_irq(void *data)
 {
 	enum ams_irq irq = *((enum ams_irq *)data);
-	unsigned long flags;
 
-	spin_lock_irqsave(&ams.irq_lock, flags);
+	spin_lock(&ams.irq_lock);
 
 	ams.worker_irqs |= irq;
 	schedule_work(&ams.worker);
 
-	spin_unlock_irqrestore(&ams.irq_lock, flags);
+	spin_unlock(&ams.irq_lock);
 }
 
 static enum ams_irq ams_freefall_irq_data = AMS_IRQ_FREEFALL;
@@ -112,7 +111,10 @@
 				printk(KERN_INFO "ams: freefall detected!\n");
 
 			ams.worker_irqs &= ~AMS_IRQ_FREEFALL;
+			/* we must call this with interrupts enabled */
+			spin_unlock_irqrestore(&ams.irq_lock, flags);
 			ams.clear_irq(AMS_IRQ_FREEFALL);
+			spin_lock_irqsave(&ams.irq_lock, flags);
 		}
 
 		if (ams.worker_irqs & AMS_IRQ_SHOCK) {
@@ -120,7 +122,10 @@
 				printk(KERN_INFO "ams: shock detected!\n");
 
 			ams.worker_irqs &= ~AMS_IRQ_SHOCK;
+			spin_unlock_irqrestore(&ams.irq_lock, flags);
+			/* we must call this with interrupts enabled */
 			ams.clear_irq(AMS_IRQ_SHOCK);
+			spin_lock_irqsave(&ams.irq_lock, flags);
 		}
 
 		spin_unlock_irqrestore(&ams.irq_lock, flags); 

