summaryrefslogtreecommitdiffstats
path: root/drivers/extcon
diff options
context:
space:
mode:
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>2013-11-14 17:18:23 +0100
committerChanwoo Choi <cw00.choi@samsung.com>2014-01-07 03:54:28 +0100
commit31a847e6e1ed4db5002a4af191988aa85008c407 (patch)
treeb8e21584379518dccec958077678434869a12d9e /drivers/extcon
parentextcon: arizona: Fix reset of HPDET after race with removal (diff)
downloadlinux-31a847e6e1ed4db5002a4af191988aa85008c407.tar.xz
linux-31a847e6e1ed4db5002a4af191988aa85008c407.zip
extcon: arizona: Fix race with microphone detection and removal
The microphone detection code is run as delayed work to provide additional debounce, it is possible that the jack could have been removed by the time we process the microphone detection. Turn this case into a no op. Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Diffstat (limited to 'drivers/extcon')
-rw-r--r--drivers/extcon/extcon-arizona.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c
index fefb8563db9e..f36debffe6e8 100644
--- a/drivers/extcon/extcon-arizona.c
+++ b/drivers/extcon/extcon-arizona.c
@@ -780,6 +780,19 @@ static void arizona_micd_detect(struct work_struct *work)
mutex_lock(&info->lock);
+ /* If the cable was removed while measuring ignore the result */
+ ret = extcon_get_cable_state_(&info->edev, ARIZONA_CABLE_MECHANICAL);
+ if (ret < 0) {
+ dev_err(arizona->dev, "Failed to check cable state: %d\n",
+ ret);
+ mutex_unlock(&info->lock);
+ return;
+ } else if (!ret) {
+ dev_dbg(arizona->dev, "Ignoring MICDET for removed cable\n");
+ mutex_unlock(&info->lock);
+ return;
+ }
+
for (i = 0; i < 10 && !(val & MICD_LVL_0_TO_8); i++) {
ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
if (ret != 0) {