Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 363190
b: refs/heads/master
c: 939c567
h: refs/heads/master
v: v3
  • Loading branch information
Mark Brown committed Apr 2, 2013
1 parent bd74285 commit ec55e5e
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9c2ba270eaa227c999af451e1c2c9bf0d24aa8e5
refs/heads/master: 939c5671d11d86ae783f416b703c705647ac563b
38 changes: 35 additions & 3 deletions trunk/drivers/extcon/extcon-arizona.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
#define ARIZONA_HPDET_MAX 10000

#define HPDET_DEBOUNCE 500
#define MICD_TIMEOUT 2000

struct arizona_extcon_info {
struct device *dev;
Expand All @@ -63,6 +64,7 @@ struct arizona_extcon_info {
bool micd_clamp;

struct delayed_work hpdet_work;
struct delayed_work micd_timeout_work;

bool hpdet_active;
bool hpdet_done;
Expand Down Expand Up @@ -730,13 +732,33 @@ static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
info->hpdet_active = false;
}

static void arizona_micd_timeout_work(struct work_struct *work)
{
struct arizona_extcon_info *info = container_of(work,
struct arizona_extcon_info,
micd_timeout_work.work);

mutex_lock(&info->lock);

dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
arizona_identify_headphone(info);

info->detecting = false;

arizona_stop_mic(info);

mutex_unlock(&info->lock);
}

static irqreturn_t arizona_micdet(int irq, void *data)
{
struct arizona_extcon_info *info = data;
struct arizona *arizona = info->arizona;
unsigned int val = 0, lvl;
int ret, i, key;

cancel_delayed_work_sync(&info->micd_timeout_work);

mutex_lock(&info->lock);

for (i = 0; i < 10 && !(val & 0x7fc); i++) {
Expand Down Expand Up @@ -858,6 +880,10 @@ static irqreturn_t arizona_micdet(int irq, void *data)
}

handled:
if (info->detecting)
schedule_delayed_work(&info->micd_timeout_work,
msecs_to_jiffies(MICD_TIMEOUT));

pm_runtime_mark_last_busy(info->dev);
mutex_unlock(&info->lock);

Expand All @@ -880,10 +906,11 @@ static irqreturn_t arizona_jackdet(int irq, void *data)
struct arizona_extcon_info *info = data;
struct arizona *arizona = info->arizona;
unsigned int val, present, mask;
bool cancelled;
bool cancelled_hp, cancelled_mic;
int ret, i;

cancelled = cancel_delayed_work_sync(&info->hpdet_work);
cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);

pm_runtime_get_sync(info->dev);

Expand All @@ -909,10 +936,14 @@ static irqreturn_t arizona_jackdet(int irq, void *data)
val &= mask;
if (val == info->last_jackdet) {
dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
if (cancelled)
if (cancelled_hp)
schedule_delayed_work(&info->hpdet_work,
msecs_to_jiffies(HPDET_DEBOUNCE));

if (cancelled_mic)
schedule_delayed_work(&info->micd_timeout_work,
msecs_to_jiffies(MICD_TIMEOUT));

goto out;
}
info->last_jackdet = val;
Expand Down Expand Up @@ -1037,6 +1068,7 @@ static int arizona_extcon_probe(struct platform_device *pdev)
info->dev = &pdev->dev;
info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS);
INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
platform_set_drvdata(pdev, info);

switch (arizona->type) {
Expand Down

0 comments on commit ec55e5e

Please sign in to comment.