Commit d079a1c7 authored by Jarkko Nikula's avatar Jarkko Nikula Committed by Tony Lindgren

CBUS: Do not BUG_ON in retu-headset in case of spurious release event

There is a small chance that retu_headset_detect_timer can run twice
and pressed flag being zero in second run. Do nothing in that case instead
of throwing BUG_ON.

Double run can happen under very busy system assuming following scenario

1. Hook interrupt (run in softirq context, pressed flag = 1)
2. First retu_headset_enable_timer call
3. Busy system, retu raises an interrupt but cannot run hook interrupt for
   300-350 ms
4. Second hook interrupt
5. First retu_headset_detect_timer call (pressed flag = 0)
6. Second retu_headset_enable_timer
7. Second retu_headset_detect_timer
   -> pressed flag == 0 => BUG_ON

Patch also removes two debug messages since they are not needed very much
and removal cleans up code a bit.
Signed-off-by: default avatarJarkko Nikula <jarkko.nikula@nokia.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 69cc712d
...@@ -180,7 +180,6 @@ static void retu_headset_hook_interrupt(unsigned long arg) ...@@ -180,7 +180,6 @@ static void retu_headset_hook_interrupt(unsigned long arg)
{ {
struct retu_headset *hs = (struct retu_headset *) arg; struct retu_headset *hs = (struct retu_headset *) arg;
unsigned long flags; unsigned long flags;
int was_pressed = 0;
retu_ack_irq(RETU_INT_HOOK); retu_ack_irq(RETU_INT_HOOK);
spin_lock_irqsave(&hs->lock, flags); spin_lock_irqsave(&hs->lock, flags);
...@@ -188,11 +187,8 @@ static void retu_headset_hook_interrupt(unsigned long arg) ...@@ -188,11 +187,8 @@ static void retu_headset_hook_interrupt(unsigned long arg)
/* Headset button was just pressed down. */ /* Headset button was just pressed down. */
hs->pressed = 1; hs->pressed = 1;
input_report_key(hs->idev, RETU_HEADSET_KEY, 1); input_report_key(hs->idev, RETU_HEADSET_KEY, 1);
was_pressed = 1;
} }
spin_unlock_irqrestore(&hs->lock, flags); spin_unlock_irqrestore(&hs->lock, flags);
if (was_pressed)
dev_info(&hs->pdev->dev, "button pressed\n");
retu_set_clear_reg_bits(RETU_REG_CC1, 0, (1 << 10) | (1 << 8)); retu_set_clear_reg_bits(RETU_REG_CC1, 0, (1 << 10) | (1 << 8));
mod_timer(&hs->enable_timer, jiffies + msecs_to_jiffies(50)); mod_timer(&hs->enable_timer, jiffies + msecs_to_jiffies(50));
} }
...@@ -211,11 +207,11 @@ static void retu_headset_detect_timer(unsigned long arg) ...@@ -211,11 +207,11 @@ static void retu_headset_detect_timer(unsigned long arg)
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&hs->lock, flags); spin_lock_irqsave(&hs->lock, flags);
BUG_ON(!hs->pressed); if (hs->pressed) {
input_report_key(hs->idev, RETU_HEADSET_KEY, 0);
hs->pressed = 0; hs->pressed = 0;
input_report_key(hs->idev, RETU_HEADSET_KEY, 0);
}
spin_unlock_irqrestore(&hs->lock, flags); spin_unlock_irqrestore(&hs->lock, flags);
dev_info(&hs->pdev->dev, "button released\n");
} }
static int __init retu_headset_probe(struct platform_device *pdev) static int __init retu_headset_probe(struct platform_device *pdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment