aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/extcon/extcon-arizona.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2013-02-05 16:00:15 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-02-11 11:06:22 -0500
commit0e27bd3137778ac9e856fec99b1752bf054a987c (patch)
tree22370d1d7cf24b52bd48cc6e9dd8a83a27c43091 /drivers/extcon/extcon-arizona.c
parente339af1c4567b1e63209329e2665781e598709f2 (diff)
extcon: arizona: Add some debounce time before starting HPDET identification
The HPDET identification method does not have the same natural debounce built into it that the standard MICDET method does so add some extra on top of what the jack detection does in hardware to make sure we get a robust result. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/extcon/extcon-arizona.c')
-rw-r--r--drivers/extcon/extcon-arizona.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c
index c17a41ff60ea..2ad0e4a35a23 100644
--- a/drivers/extcon/extcon-arizona.c
+++ b/drivers/extcon/extcon-arizona.c
@@ -53,6 +53,8 @@ struct arizona_extcon_info {
53 bool micd_reva; 53 bool micd_reva;
54 bool micd_clamp; 54 bool micd_clamp;
55 55
56 struct delayed_work hpdet_work;
57
56 bool hpdet_active; 58 bool hpdet_active;
57 59
58 int num_hpdet_res; 60 int num_hpdet_res;
@@ -640,7 +642,7 @@ static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
640 dev_dbg(arizona->dev, "Starting identification via HPDET\n"); 642 dev_dbg(arizona->dev, "Starting identification via HPDET\n");
641 643
642 /* Make sure we keep the device enabled during the measurement */ 644 /* Make sure we keep the device enabled during the measurement */
643 pm_runtime_get(info->dev); 645 pm_runtime_get_sync(info->dev);
644 646
645 info->hpdet_active = true; 647 info->hpdet_active = true;
646 648
@@ -813,6 +815,17 @@ handled:
813 return IRQ_HANDLED; 815 return IRQ_HANDLED;
814} 816}
815 817
818static void arizona_hpdet_work(struct work_struct *work)
819{
820 struct arizona_extcon_info *info = container_of(work,
821 struct arizona_extcon_info,
822 hpdet_work.work);
823
824 mutex_lock(&info->lock);
825 arizona_start_hpdet_acc_id(info);
826 mutex_unlock(&info->lock);
827}
828
816static irqreturn_t arizona_jackdet(int irq, void *data) 829static irqreturn_t arizona_jackdet(int irq, void *data)
817{ 830{
818 struct arizona_extcon_info *info = data; 831 struct arizona_extcon_info *info = data;
@@ -822,6 +835,8 @@ static irqreturn_t arizona_jackdet(int irq, void *data)
822 835
823 pm_runtime_get_sync(info->dev); 836 pm_runtime_get_sync(info->dev);
824 837
838 cancel_delayed_work_sync(&info->hpdet_work);
839
825 mutex_lock(&info->lock); 840 mutex_lock(&info->lock);
826 841
827 if (arizona->pdata.jd_gpio5) { 842 if (arizona->pdata.jd_gpio5) {
@@ -857,7 +872,8 @@ static irqreturn_t arizona_jackdet(int irq, void *data)
857 872
858 arizona_start_mic(info); 873 arizona_start_mic(info);
859 } else { 874 } else {
860 arizona_start_hpdet_acc_id(info); 875 schedule_delayed_work(&info->hpdet_work,
876 msecs_to_jiffies(250));
861 } 877 }
862 878
863 regmap_update_bits(arizona->regmap, 879 regmap_update_bits(arizona->regmap,
@@ -927,6 +943,7 @@ static int arizona_extcon_probe(struct platform_device *pdev)
927 mutex_init(&info->lock); 943 mutex_init(&info->lock);
928 info->arizona = arizona; 944 info->arizona = arizona;
929 info->dev = &pdev->dev; 945 info->dev = &pdev->dev;
946 INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
930 platform_set_drvdata(pdev, info); 947 platform_set_drvdata(pdev, info);
931 948
932 switch (arizona->type) { 949 switch (arizona->type) {
@@ -1173,6 +1190,7 @@ static int arizona_extcon_remove(struct platform_device *pdev)
1173 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info); 1190 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1174 arizona_free_irq(arizona, jack_irq_rise, info); 1191 arizona_free_irq(arizona, jack_irq_rise, info);
1175 arizona_free_irq(arizona, jack_irq_fall, info); 1192 arizona_free_irq(arizona, jack_irq_fall, info);
1193 cancel_delayed_work_sync(&info->hpdet_work);
1176 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE, 1194 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1177 ARIZONA_JD1_ENA, 0); 1195 ARIZONA_JD1_ENA, 0);
1178 arizona_clk32k_disable(arizona); 1196 arizona_clk32k_disable(arizona);