|
@@ -51,6 +51,9 @@
|
|
|
#define HPDET_DEBOUNCE 500
|
|
|
#define DEFAULT_MICD_TIMEOUT 2000
|
|
|
|
|
|
+#define ARIZONA_HPDET_WAIT_COUNT 15
|
|
|
+#define ARIZONA_HPDET_WAIT_DELAY_MS 20
|
|
|
+
|
|
|
#define QUICK_HEADPHONE_MAX_OHM 3
|
|
|
#define MICROPHONE_MIN_OHM 1257
|
|
|
#define MICROPHONE_MAX_OHM 30000
|
|
@@ -1049,6 +1052,40 @@ static void arizona_hpdet_work(struct work_struct *work)
|
|
|
mutex_unlock(&info->lock);
|
|
|
}
|
|
|
|
|
|
+static int arizona_hpdet_wait(struct arizona_extcon_info *info)
|
|
|
+{
|
|
|
+ struct arizona *arizona = info->arizona;
|
|
|
+ unsigned int val;
|
|
|
+ int i, ret;
|
|
|
+
|
|
|
+ for (i = 0; i < ARIZONA_HPDET_WAIT_COUNT; i++) {
|
|
|
+ ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2,
|
|
|
+ &val);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(arizona->dev,
|
|
|
+ "Failed to read HPDET state: %d\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (info->hpdet_ip_version) {
|
|
|
+ case 0:
|
|
|
+ if (val & ARIZONA_HP_DONE)
|
|
|
+ return 0;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ if (val & ARIZONA_HP_DONE_B)
|
|
|
+ return 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ msleep(ARIZONA_HPDET_WAIT_DELAY_MS);
|
|
|
+ }
|
|
|
+
|
|
|
+ dev_warn(arizona->dev, "HPDET did not appear to complete\n");
|
|
|
+
|
|
|
+ return -ETIMEDOUT;
|
|
|
+}
|
|
|
+
|
|
|
static irqreturn_t arizona_jackdet(int irq, void *data)
|
|
|
{
|
|
|
struct arizona_extcon_info *info = data;
|
|
@@ -1155,6 +1192,15 @@ static irqreturn_t arizona_jackdet(int irq, void *data)
|
|
|
"Removal report failed: %d\n", ret);
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * If the jack was removed during a headphone detection we
|
|
|
+ * need to wait for the headphone detection to finish, as
|
|
|
+ * it can not be aborted. We don't want to be able to start
|
|
|
+ * a new headphone detection from a fresh insert until this
|
|
|
+ * one is finished.
|
|
|
+ */
|
|
|
+ arizona_hpdet_wait(info);
|
|
|
+
|
|
|
regmap_update_bits(arizona->regmap,
|
|
|
ARIZONA_JACK_DETECT_DEBOUNCE,
|
|
|
ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB,
|