Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 363192
b: refs/heads/master
c: cd59e79
h: refs/heads/master
v: v3
  • Loading branch information
Mark Brown committed Apr 2, 2013
1 parent 5ebaa4b commit 237c44f
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 6 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: 41a57850b5e5c450da351465efcc41383def7f8a
refs/heads/master: cd59e79656f4e7137909166248a935d422b1245a
35 changes: 30 additions & 5 deletions trunk/drivers/extcon/extcon-arizona.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ struct arizona_extcon_info {
bool micd_clamp;

struct delayed_work hpdet_work;
struct delayed_work micd_detect_work;
struct delayed_work micd_timeout_work;

bool hpdet_active;
Expand Down Expand Up @@ -750,9 +751,11 @@ static void arizona_micd_timeout_work(struct work_struct *work)
mutex_unlock(&info->lock);
}

static irqreturn_t arizona_micdet(int irq, void *data)
static void arizona_micd_detect(struct work_struct *work)
{
struct arizona_extcon_info *info = data;
struct arizona_extcon_info *info = container_of(work,
struct arizona_extcon_info,
micd_detect_work.work);
struct arizona *arizona = info->arizona;
unsigned int val = 0, lvl;
int ret, i, key;
Expand All @@ -766,22 +769,22 @@ static irqreturn_t arizona_micdet(int irq, void *data)
if (ret != 0) {
dev_err(arizona->dev, "Failed to read MICDET: %d\n", ret);
mutex_unlock(&info->lock);
return IRQ_NONE;
return;
}

dev_dbg(arizona->dev, "MICDET: %x\n", val);

if (!(val & ARIZONA_MICD_VALID)) {
dev_warn(arizona->dev, "Microphone detection state invalid\n");
mutex_unlock(&info->lock);
return IRQ_NONE;
return;
}
}

if (i == 10 && !(val & 0x7fc)) {
dev_err(arizona->dev, "Failed to get valid MICDET value\n");
mutex_unlock(&info->lock);
return IRQ_NONE;
return;
}

/* Due to jack detect this should never happen */
Expand Down Expand Up @@ -890,6 +893,27 @@ static irqreturn_t arizona_micdet(int irq, void *data)

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

static irqreturn_t arizona_micdet(int irq, void *data)
{
struct arizona_extcon_info *info = data;
struct arizona *arizona = info->arizona;
int debounce = arizona->pdata.micd_detect_debounce;

cancel_delayed_work_sync(&info->micd_detect_work);
cancel_delayed_work_sync(&info->micd_timeout_work);

mutex_lock(&info->lock);
if (!info->detecting)
debounce = 0;
mutex_unlock(&info->lock);

if (debounce)
schedule_delayed_work(&info->micd_detect_work,
msecs_to_jiffies(debounce));
else
arizona_micd_detect(&info->micd_detect_work.work);

return IRQ_HANDLED;
}
Expand Down Expand Up @@ -1072,6 +1096,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_detect_work, arizona_micd_detect);
INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
platform_set_drvdata(pdev, info);

Expand Down
3 changes: 3 additions & 0 deletions trunk/include/linux/mfd/arizona/pdata.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,9 @@ struct arizona_pdata {
/** GPIO used for mic isolation with HPDET */
int hpdet_id_gpio;

/** Extra debounce timeout used during initial mic detection (ms) */
int micd_detect_debounce;

/** GPIO for mic detection polarity */
int micd_pol_gpio;

Expand Down

0 comments on commit 237c44f

Please sign in to comment.