提交 e2c0f476 编写于 作者: C Charles Keepax 提交者: Mark Brown

extcon: arizona: Check we report a valid impedance

Occasionally we can trigger an interrupt before we have completed
impedance measurement, although the valid bit will still be set. This
patch spins reading the impedance value until a valid value is seen.
Signed-off-by: NCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
上级 a3e2078d
...@@ -737,22 +737,30 @@ static irqreturn_t arizona_micdet(int irq, void *data) ...@@ -737,22 +737,30 @@ static irqreturn_t arizona_micdet(int irq, void *data)
{ {
struct arizona_extcon_info *info = data; struct arizona_extcon_info *info = data;
struct arizona *arizona = info->arizona; struct arizona *arizona = info->arizona;
unsigned int val, lvl; unsigned int val = 0, lvl;
int ret, i, key; int ret, i, key;
mutex_lock(&info->lock); mutex_lock(&info->lock);
ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val); for (i = 0; i < 10 && !(val & 0x7fc); i++) {
if (ret != 0) { ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
dev_err(arizona->dev, "Failed to read MICDET: %d\n", ret); if (ret != 0) {
mutex_unlock(&info->lock); dev_err(arizona->dev, "Failed to read MICDET: %d\n", ret);
return IRQ_NONE; mutex_unlock(&info->lock);
} return IRQ_NONE;
}
dev_dbg(arizona->dev, "MICDET: %x\n", val);
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;
}
}
if (!(val & ARIZONA_MICD_VALID)) { if (i == 10 && !(val & 0x7fc)) {
dev_warn(arizona->dev, "Microphone detection state invalid\n"); dev_err(arizona->dev, "Failed to get valid MICDET value\n");
mutex_unlock(&info->lock); mutex_unlock(&info->lock);
return IRQ_NONE; return IRQ_NONE;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册