From 74471ece5e491edc21668567595cad37d1ec28a8 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 5 Feb 2013 21:00:15 +0000 Subject: [PATCH] --- yaml --- r: 355075 b: refs/heads/master c: 0e27bd3137778ac9e856fec99b1752bf054a987c h: refs/heads/master i: 355073: 85f3a27d778ac90e96d658f73796100434929e77 355071: e26e593b2bf37e74c9fa8070a8e3d9980869c31d v: v3 --- [refs] | 2 +- trunk/drivers/extcon/extcon-arizona.c | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 59803a7ac03f..57d868697c09 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e339af1c4567b1e63209329e2665781e598709f2 +refs/heads/master: 0e27bd3137778ac9e856fec99b1752bf054a987c diff --git a/trunk/drivers/extcon/extcon-arizona.c b/trunk/drivers/extcon/extcon-arizona.c index c17a41ff60ea..2ad0e4a35a23 100644 --- a/trunk/drivers/extcon/extcon-arizona.c +++ b/trunk/drivers/extcon/extcon-arizona.c @@ -53,6 +53,8 @@ struct arizona_extcon_info { bool micd_reva; bool micd_clamp; + struct delayed_work hpdet_work; + bool hpdet_active; int num_hpdet_res; @@ -640,7 +642,7 @@ static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info) dev_dbg(arizona->dev, "Starting identification via HPDET\n"); /* Make sure we keep the device enabled during the measurement */ - pm_runtime_get(info->dev); + pm_runtime_get_sync(info->dev); info->hpdet_active = true; @@ -813,6 +815,17 @@ static irqreturn_t arizona_micdet(int irq, void *data) return IRQ_HANDLED; } +static void arizona_hpdet_work(struct work_struct *work) +{ + struct arizona_extcon_info *info = container_of(work, + struct arizona_extcon_info, + hpdet_work.work); + + mutex_lock(&info->lock); + arizona_start_hpdet_acc_id(info); + mutex_unlock(&info->lock); +} + static irqreturn_t arizona_jackdet(int irq, void *data) { struct arizona_extcon_info *info = data; @@ -822,6 +835,8 @@ static irqreturn_t arizona_jackdet(int irq, void *data) pm_runtime_get_sync(info->dev); + cancel_delayed_work_sync(&info->hpdet_work); + mutex_lock(&info->lock); if (arizona->pdata.jd_gpio5) { @@ -857,7 +872,8 @@ static irqreturn_t arizona_jackdet(int irq, void *data) arizona_start_mic(info); } else { - arizona_start_hpdet_acc_id(info); + schedule_delayed_work(&info->hpdet_work, + msecs_to_jiffies(250)); } regmap_update_bits(arizona->regmap, @@ -927,6 +943,7 @@ static int arizona_extcon_probe(struct platform_device *pdev) mutex_init(&info->lock); info->arizona = arizona; info->dev = &pdev->dev; + INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work); platform_set_drvdata(pdev, info); switch (arizona->type) { @@ -1173,6 +1190,7 @@ static int arizona_extcon_remove(struct platform_device *pdev) arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info); arizona_free_irq(arizona, jack_irq_rise, info); arizona_free_irq(arizona, jack_irq_fall, info); + cancel_delayed_work_sync(&info->hpdet_work); regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE, ARIZONA_JD1_ENA, 0); arizona_clk32k_disable(arizona);