hwmon: (ams) Simplify IRQ handling routine
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 17 Oct 2008 15:51:13 +0000 (17:51 +0200)
committerJean Delvare <khali@mahadeva.delvare>
Fri, 17 Oct 2008 15:51:13 +0000 (17:51 +0200)
Simplify the IRQ handling routine of ams driver.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
drivers/hwmon/ams/ams-core.c

index 9b4a0e7a564fb030d0d3945626bab2b7320d63bc..6c9ace1b76f6db6ca810c5cf2c7cb89889da7984 100644 (file)
@@ -99,39 +99,31 @@ static struct pmf_irq_client ams_shock_client = {
  */
 static void ams_worker(struct work_struct *work)
 {
-       mutex_lock(&ams_info.lock);
-
-       if (ams_info.has_device) {
-               unsigned long flags;
+       unsigned long flags;
+       u8 irqs_to_clear;
 
-               spin_lock_irqsave(&ams_info.irq_lock, flags);
+       mutex_lock(&ams_info.lock);
 
-               if (ams_info.worker_irqs & AMS_IRQ_FREEFALL) {
-                       if (verbose)
-                               printk(KERN_INFO "ams: freefall detected!\n");
+       spin_lock_irqsave(&ams_info.irq_lock, flags);
+       irqs_to_clear = ams_info.worker_irqs;
 
-                       ams_info.worker_irqs &= ~AMS_IRQ_FREEFALL;
+       if (ams_info.worker_irqs & AMS_IRQ_FREEFALL) {
+               if (verbose)
+                       printk(KERN_INFO "ams: freefall detected!\n");
 
-                       /* we must call this with interrupts enabled */
-                       spin_unlock_irqrestore(&ams_info.irq_lock, flags);
-                       ams_info.clear_irq(AMS_IRQ_FREEFALL);
-                       spin_lock_irqsave(&ams_info.irq_lock, flags);
-               }
+               ams_info.worker_irqs &= ~AMS_IRQ_FREEFALL;
+       }
 
-               if (ams_info.worker_irqs & AMS_IRQ_SHOCK) {
-                       if (verbose)
-                               printk(KERN_INFO "ams: shock detected!\n");
+       if (ams_info.worker_irqs & AMS_IRQ_SHOCK) {
+               if (verbose)
+                       printk(KERN_INFO "ams: shock detected!\n");
 
-                       ams_info.worker_irqs &= ~AMS_IRQ_SHOCK;
+               ams_info.worker_irqs &= ~AMS_IRQ_SHOCK;
+       }
 
-                       /* we must call this with interrupts enabled */
-                       spin_unlock_irqrestore(&ams_info.irq_lock, flags);
-                       ams_info.clear_irq(AMS_IRQ_SHOCK);
-                       spin_lock_irqsave(&ams_info.irq_lock, flags);
-               }
+       spin_unlock_irqrestore(&ams_info.irq_lock, flags);
 
-               spin_unlock_irqrestore(&ams_info.irq_lock, flags);
-       }
+       ams_info.clear_irq(irqs_to_clear);
 
        mutex_unlock(&ams_info.lock);
 }