Skip to content
Snippets Groups Projects
Commit c541c59f authored by Vladimir Karpovich's avatar Vladimir Karpovich Committed by Vineeta Srivastava
Browse files

asoc: fsa8500: Add extra delay to LINT detection


The moisture can cause false headset detection.In this case
the LINT detection will trigger several detect/undetect events.
Add 200ms debounce timeout to let it settle.

Change-Id: Ia2b4837cdf5194ca5c6de83c3a401c736542a183
Signed-off-by: default avatarVladimir Karpovich <vkarpovich@motorola.com>
parent 5ea32a4d
No related branches found
No related tags found
No related merge requests found
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
SND_JACK_BTN_6 | SND_JACK_BTN_7) SND_JACK_BTN_6 | SND_JACK_BTN_7)
#define SND_JACK_BTN_SHIFT 20 #define SND_JACK_BTN_SHIFT 20
#define FSA8500_LINT_DEBOUNCE 200
static struct snd_soc_jack hs_jack; static struct snd_soc_jack hs_jack;
static struct snd_soc_jack button_jack; static struct snd_soc_jack button_jack;
...@@ -632,6 +633,7 @@ static irqreturn_t fsa8500_irq_handler(int irq, void *data) ...@@ -632,6 +633,7 @@ static irqreturn_t fsa8500_irq_handler(int irq, void *data)
static void fsa8500_det_thread(struct work_struct *work) static void fsa8500_det_thread(struct work_struct *work)
{ {
u8 tmp_status[5];
struct fsa8500_data *irq_data = struct fsa8500_data *irq_data =
i2c_get_clientdata(fsa8500_client); i2c_get_clientdata(fsa8500_client);
...@@ -639,11 +641,28 @@ static void fsa8500_det_thread(struct work_struct *work) ...@@ -639,11 +641,28 @@ static void fsa8500_det_thread(struct work_struct *work)
mutex_lock(&irq_data->lock); mutex_lock(&irq_data->lock);
wake_lock(&irq_data->wake_lock); wake_lock(&irq_data->wake_lock);
if (fsa8500_update_device_status(irq_data)) if (fsa8500_update_device_status(irq_data)) {
queue_delayed_work(irq_data->wq, &irq_data->work_det, queue_delayed_work(irq_data->wq, &irq_data->work_det,
msecs_to_jiffies(2000)); msecs_to_jiffies(2000));
fsa8500_report_hs(irq_data); goto skip_report;
} else if ((irq_data->irq_status[0] & 0x2) &&
(irq_data->irq_status[0] & 0x7)) {
/* LINT detected, delay for 200ms*/
memcpy(tmp_status, irq_data->irq_status, sizeof(tmp_status));
msleep(FSA8500_LINT_DEBOUNCE);
fsa8500_update_device_status(irq_data);
if (irq_data->irq_status[0] & 0x18) {
/* Disconnect event in 200ms, retry in 2sec */
queue_delayed_work(irq_data->wq, &irq_data->work_det,
msecs_to_jiffies(2000));
goto skip_report;
} else
memcpy(irq_data->irq_status,
tmp_status, sizeof(tmp_status));
}
fsa8500_report_hs(irq_data);
skip_report:
wake_unlock(&irq_data->wake_lock); wake_unlock(&irq_data->wake_lock);
mutex_unlock(&irq_data->lock); mutex_unlock(&irq_data->lock);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment