From dbee356262bb1c84cfa585530e33e7003534052a Mon Sep 17 00:00:00 2001
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: Fri, 17 Oct 2008 17:51:13 +0200
Subject: [PATCH] hwmon: (ams) Simplify IRQ handling routine

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 | 42 +++++++++++++++---------------------
 1 file changed, 17 insertions(+), 25 deletions(-)

diff --git a/drivers/hwmon/ams/ams-core.c b/drivers/hwmon/ams/ams-core.c
index 9b4a0e7a564f..6c9ace1b76f6 100644
--- a/drivers/hwmon/ams/ams-core.c
+++ b/drivers/hwmon/ams/ams-core.c
@@ -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);
 }
-- 
GitLab