xref: /linux/sound/soc/codecs/arizona-jack.c (revision 9c39c6ffe0c2945c7cf814814c096bc23b63f53d)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * extcon-arizona.c - Extcon driver Wolfson Arizona devices
4  *
5  *  Copyright (C) 2012-2014 Wolfson Microelectronics plc
6  */
7 
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/i2c.h>
11 #include <linux/slab.h>
12 #include <linux/interrupt.h>
13 #include <linux/err.h>
14 #include <linux/gpio/consumer.h>
15 #include <linux/gpio.h>
16 #include <linux/input.h>
17 #include <linux/platform_device.h>
18 #include <linux/pm_runtime.h>
19 #include <linux/property.h>
20 #include <linux/regulator/consumer.h>
21 #include <linux/extcon-provider.h>
22 
23 #include <sound/soc.h>
24 
25 #include <linux/mfd/arizona/core.h>
26 #include <linux/mfd/arizona/pdata.h>
27 #include <linux/mfd/arizona/registers.h>
28 #include <dt-bindings/mfd/arizona.h>
29 
30 #define ARIZONA_MAX_MICD_RANGE 8
31 
32 #define ARIZONA_MICD_CLAMP_MODE_JDL      0x4
33 #define ARIZONA_MICD_CLAMP_MODE_JDH      0x5
34 #define ARIZONA_MICD_CLAMP_MODE_JDL_GP5H 0x9
35 #define ARIZONA_MICD_CLAMP_MODE_JDH_GP5H 0xb
36 
37 #define ARIZONA_TST_CAP_DEFAULT 0x3
38 #define ARIZONA_TST_CAP_CLAMP   0x1
39 
40 #define ARIZONA_HPDET_MAX 10000
41 
42 #define HPDET_DEBOUNCE 500
43 #define DEFAULT_MICD_TIMEOUT 2000
44 
45 #define ARIZONA_HPDET_WAIT_COUNT 15
46 #define ARIZONA_HPDET_WAIT_DELAY_MS 20
47 
48 #define QUICK_HEADPHONE_MAX_OHM 3
49 #define MICROPHONE_MIN_OHM      1257
50 #define MICROPHONE_MAX_OHM      30000
51 
52 #define MICD_DBTIME_TWO_READINGS 2
53 #define MICD_DBTIME_FOUR_READINGS 4
54 
55 #define MICD_LVL_1_TO_7 (ARIZONA_MICD_LVL_1 | ARIZONA_MICD_LVL_2 | \
56 			 ARIZONA_MICD_LVL_3 | ARIZONA_MICD_LVL_4 | \
57 			 ARIZONA_MICD_LVL_5 | ARIZONA_MICD_LVL_6 | \
58 			 ARIZONA_MICD_LVL_7)
59 
60 #define MICD_LVL_0_TO_7 (ARIZONA_MICD_LVL_0 | MICD_LVL_1_TO_7)
61 
62 #define MICD_LVL_0_TO_8 (MICD_LVL_0_TO_7 | ARIZONA_MICD_LVL_8)
63 
64 struct arizona_extcon_info {
65 	struct device *dev;
66 	struct arizona *arizona;
67 	struct mutex lock;
68 	struct regulator *micvdd;
69 	struct input_dev *input;
70 
71 	u16 last_jackdet;
72 
73 	int micd_mode;
74 	const struct arizona_micd_config *micd_modes;
75 	int micd_num_modes;
76 
77 	const struct arizona_micd_range *micd_ranges;
78 	int num_micd_ranges;
79 
80 	bool micd_reva;
81 	bool micd_clamp;
82 
83 	struct delayed_work hpdet_work;
84 	struct delayed_work micd_detect_work;
85 	struct delayed_work micd_timeout_work;
86 
87 	bool hpdet_active;
88 	bool hpdet_done;
89 	bool hpdet_retried;
90 
91 	int num_hpdet_res;
92 	unsigned int hpdet_res[3];
93 
94 	bool mic;
95 	bool detecting;
96 	int jack_flips;
97 
98 	int hpdet_ip_version;
99 
100 	struct extcon_dev *edev;
101 
102 	struct gpio_desc *micd_pol_gpio;
103 };
104 
105 static const struct arizona_micd_config micd_default_modes[] = {
106 	{ ARIZONA_ACCDET_SRC, 1, 0 },
107 	{ 0,                  2, 1 },
108 };
109 
110 static const struct arizona_micd_range micd_default_ranges[] = {
111 	{ .max =  11, .key = BTN_0 },
112 	{ .max =  28, .key = BTN_1 },
113 	{ .max =  54, .key = BTN_2 },
114 	{ .max = 100, .key = BTN_3 },
115 	{ .max = 186, .key = BTN_4 },
116 	{ .max = 430, .key = BTN_5 },
117 };
118 
119 /* The number of levels in arizona_micd_levels valid for button thresholds */
120 #define ARIZONA_NUM_MICD_BUTTON_LEVELS 64
121 
122 static const int arizona_micd_levels[] = {
123 	3, 6, 8, 11, 13, 16, 18, 21, 23, 26, 28, 31, 34, 36, 39, 41, 44, 46,
124 	49, 52, 54, 57, 60, 62, 65, 67, 70, 73, 75, 78, 81, 83, 89, 94, 100,
125 	105, 111, 116, 122, 127, 139, 150, 161, 173, 186, 196, 209, 220, 245,
126 	270, 295, 321, 348, 375, 402, 430, 489, 550, 614, 681, 752, 903, 1071,
127 	1257, 30000,
128 };
129 
130 static const unsigned int arizona_cable[] = {
131 	EXTCON_MECHANICAL,
132 	EXTCON_JACK_MICROPHONE,
133 	EXTCON_JACK_HEADPHONE,
134 	EXTCON_JACK_LINE_OUT,
135 	EXTCON_NONE,
136 };
137 
138 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info);
139 
140 static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info,
141 				    bool clamp)
142 {
143 	struct arizona *arizona = info->arizona;
144 	unsigned int mask = 0, val = 0;
145 	unsigned int cap_sel = 0;
146 	int ret;
147 
148 	switch (arizona->type) {
149 	case WM8998:
150 	case WM1814:
151 		mask = 0;
152 		break;
153 	case WM5110:
154 	case WM8280:
155 		mask = ARIZONA_HP1L_SHRTO | ARIZONA_HP1L_FLWR |
156 		       ARIZONA_HP1L_SHRTI;
157 		if (clamp) {
158 			val = ARIZONA_HP1L_SHRTO;
159 			cap_sel = ARIZONA_TST_CAP_CLAMP;
160 		} else {
161 			val = ARIZONA_HP1L_FLWR | ARIZONA_HP1L_SHRTI;
162 			cap_sel = ARIZONA_TST_CAP_DEFAULT;
163 		}
164 
165 		ret = regmap_update_bits(arizona->regmap,
166 					 ARIZONA_HP_TEST_CTRL_1,
167 					 ARIZONA_HP1_TST_CAP_SEL_MASK,
168 					 cap_sel);
169 		if (ret != 0)
170 			dev_warn(arizona->dev,
171 				 "Failed to set TST_CAP_SEL: %d\n", ret);
172 		break;
173 	default:
174 		mask = ARIZONA_RMV_SHRT_HP1L;
175 		if (clamp)
176 			val = ARIZONA_RMV_SHRT_HP1L;
177 		break;
178 	}
179 
180 	snd_soc_dapm_mutex_lock(arizona->dapm);
181 
182 	arizona->hpdet_clamp = clamp;
183 
184 	/* Keep the HP output stages disabled while doing the clamp */
185 	if (clamp) {
186 		ret = regmap_update_bits(arizona->regmap,
187 					 ARIZONA_OUTPUT_ENABLES_1,
188 					 ARIZONA_OUT1L_ENA |
189 					 ARIZONA_OUT1R_ENA, 0);
190 		if (ret != 0)
191 			dev_warn(arizona->dev,
192 				"Failed to disable headphone outputs: %d\n",
193 				 ret);
194 	}
195 
196 	if (mask) {
197 		ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L,
198 					 mask, val);
199 		if (ret != 0)
200 			dev_warn(arizona->dev, "Failed to do clamp: %d\n",
201 				 ret);
202 
203 		ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R,
204 					 mask, val);
205 		if (ret != 0)
206 			dev_warn(arizona->dev, "Failed to do clamp: %d\n",
207 				 ret);
208 	}
209 
210 	/* Restore the desired state while not doing the clamp */
211 	if (!clamp) {
212 		ret = regmap_update_bits(arizona->regmap,
213 					 ARIZONA_OUTPUT_ENABLES_1,
214 					 ARIZONA_OUT1L_ENA |
215 					 ARIZONA_OUT1R_ENA, arizona->hp_ena);
216 		if (ret != 0)
217 			dev_warn(arizona->dev,
218 				 "Failed to restore headphone outputs: %d\n",
219 				 ret);
220 	}
221 
222 	snd_soc_dapm_mutex_unlock(arizona->dapm);
223 }
224 
225 static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode)
226 {
227 	struct arizona *arizona = info->arizona;
228 
229 	mode %= info->micd_num_modes;
230 
231 	gpiod_set_value_cansleep(info->micd_pol_gpio,
232 				 info->micd_modes[mode].gpio);
233 
234 	regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
235 			   ARIZONA_MICD_BIAS_SRC_MASK,
236 			   info->micd_modes[mode].bias <<
237 			   ARIZONA_MICD_BIAS_SRC_SHIFT);
238 	regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
239 			   ARIZONA_ACCDET_SRC, info->micd_modes[mode].src);
240 
241 	info->micd_mode = mode;
242 
243 	dev_dbg(arizona->dev, "Set jack polarity to %d\n", mode);
244 }
245 
246 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info *info)
247 {
248 	switch (info->micd_modes[0].bias) {
249 	case 1:
250 		return "MICBIAS1";
251 	case 2:
252 		return "MICBIAS2";
253 	case 3:
254 		return "MICBIAS3";
255 	default:
256 		return "MICVDD";
257 	}
258 }
259 
260 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info)
261 {
262 	struct arizona *arizona = info->arizona;
263 	const char *widget = arizona_extcon_get_micbias(info);
264 	struct snd_soc_dapm_context *dapm = arizona->dapm;
265 	struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
266 	int ret;
267 
268 	ret = snd_soc_component_force_enable_pin(component, widget);
269 	if (ret != 0)
270 		dev_warn(arizona->dev, "Failed to enable %s: %d\n",
271 			 widget, ret);
272 
273 	snd_soc_dapm_sync(dapm);
274 
275 	if (!arizona->pdata.micd_force_micbias) {
276 		ret = snd_soc_component_disable_pin(component, widget);
277 		if (ret != 0)
278 			dev_warn(arizona->dev, "Failed to disable %s: %d\n",
279 				 widget, ret);
280 
281 		snd_soc_dapm_sync(dapm);
282 	}
283 }
284 
285 static void arizona_start_mic(struct arizona_extcon_info *info)
286 {
287 	struct arizona *arizona = info->arizona;
288 	bool change;
289 	int ret;
290 	unsigned int mode;
291 
292 	/* Microphone detection can't use idle mode */
293 	pm_runtime_get_sync(info->dev);
294 
295 	if (info->detecting) {
296 		ret = regulator_allow_bypass(info->micvdd, false);
297 		if (ret != 0) {
298 			dev_err(arizona->dev,
299 				"Failed to regulate MICVDD: %d\n",
300 				ret);
301 		}
302 	}
303 
304 	ret = regulator_enable(info->micvdd);
305 	if (ret != 0) {
306 		dev_err(arizona->dev, "Failed to enable MICVDD: %d\n",
307 			ret);
308 	}
309 
310 	if (info->micd_reva) {
311 		const struct reg_sequence reva[] = {
312 			{ 0x80,  0x3 },
313 			{ 0x294, 0x0 },
314 			{ 0x80,  0x0 },
315 		};
316 
317 		regmap_multi_reg_write(arizona->regmap, reva, ARRAY_SIZE(reva));
318 	}
319 
320 	if (info->detecting && arizona->pdata.micd_software_compare)
321 		mode = ARIZONA_ACCDET_MODE_ADC;
322 	else
323 		mode = ARIZONA_ACCDET_MODE_MIC;
324 
325 	regmap_update_bits(arizona->regmap,
326 			   ARIZONA_ACCESSORY_DETECT_MODE_1,
327 			   ARIZONA_ACCDET_MODE_MASK, mode);
328 
329 	arizona_extcon_pulse_micbias(info);
330 
331 	ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
332 				       ARIZONA_MICD_ENA, ARIZONA_MICD_ENA,
333 				       &change);
334 	if (ret < 0) {
335 		dev_err(arizona->dev, "Failed to enable micd: %d\n", ret);
336 	} else if (!change) {
337 		regulator_disable(info->micvdd);
338 		pm_runtime_put_autosuspend(info->dev);
339 	}
340 }
341 
342 static void arizona_stop_mic(struct arizona_extcon_info *info)
343 {
344 	struct arizona *arizona = info->arizona;
345 	const char *widget = arizona_extcon_get_micbias(info);
346 	struct snd_soc_dapm_context *dapm = arizona->dapm;
347 	struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
348 	bool change = false;
349 	int ret;
350 
351 	ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
352 				       ARIZONA_MICD_ENA, 0,
353 				       &change);
354 	if (ret < 0)
355 		dev_err(arizona->dev, "Failed to disable micd: %d\n", ret);
356 
357 	ret = snd_soc_component_disable_pin(component, widget);
358 	if (ret != 0)
359 		dev_warn(arizona->dev,
360 			 "Failed to disable %s: %d\n",
361 			 widget, ret);
362 
363 	snd_soc_dapm_sync(dapm);
364 
365 	if (info->micd_reva) {
366 		const struct reg_sequence reva[] = {
367 			{ 0x80,  0x3 },
368 			{ 0x294, 0x2 },
369 			{ 0x80,  0x0 },
370 		};
371 
372 		regmap_multi_reg_write(arizona->regmap, reva, ARRAY_SIZE(reva));
373 	}
374 
375 	ret = regulator_allow_bypass(info->micvdd, true);
376 	if (ret != 0) {
377 		dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
378 			ret);
379 	}
380 
381 	if (change) {
382 		regulator_disable(info->micvdd);
383 		pm_runtime_mark_last_busy(info->dev);
384 		pm_runtime_put_autosuspend(info->dev);
385 	}
386 }
387 
388 static struct {
389 	unsigned int threshold;
390 	unsigned int factor_a;
391 	unsigned int factor_b;
392 } arizona_hpdet_b_ranges[] = {
393 	{ 100,  5528,   362464 },
394 	{ 169, 11084,  6186851 },
395 	{ 169, 11065, 65460395 },
396 };
397 
398 #define ARIZONA_HPDET_B_RANGE_MAX 0x3fb
399 
400 static struct {
401 	int min;
402 	int max;
403 } arizona_hpdet_c_ranges[] = {
404 	{ 0,       30 },
405 	{ 8,      100 },
406 	{ 100,   1000 },
407 	{ 1000, 10000 },
408 };
409 
410 static int arizona_hpdet_read(struct arizona_extcon_info *info)
411 {
412 	struct arizona *arizona = info->arizona;
413 	unsigned int val, range;
414 	int ret;
415 
416 	ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2, &val);
417 	if (ret != 0) {
418 		dev_err(arizona->dev, "Failed to read HPDET status: %d\n",
419 			ret);
420 		return ret;
421 	}
422 
423 	switch (info->hpdet_ip_version) {
424 	case 0:
425 		if (!(val & ARIZONA_HP_DONE)) {
426 			dev_err(arizona->dev, "HPDET did not complete: %x\n",
427 				val);
428 			return -EAGAIN;
429 		}
430 
431 		val &= ARIZONA_HP_LVL_MASK;
432 		break;
433 
434 	case 1:
435 		if (!(val & ARIZONA_HP_DONE_B)) {
436 			dev_err(arizona->dev, "HPDET did not complete: %x\n",
437 				val);
438 			return -EAGAIN;
439 		}
440 
441 		ret = regmap_read(arizona->regmap, ARIZONA_HP_DACVAL, &val);
442 		if (ret != 0) {
443 			dev_err(arizona->dev, "Failed to read HP value: %d\n",
444 				ret);
445 			return -EAGAIN;
446 		}
447 
448 		regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
449 			    &range);
450 		range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
451 			   >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
452 
453 		if (range < ARRAY_SIZE(arizona_hpdet_b_ranges) - 1 &&
454 		    (val < arizona_hpdet_b_ranges[range].threshold ||
455 		     val >= ARIZONA_HPDET_B_RANGE_MAX)) {
456 			range++;
457 			dev_dbg(arizona->dev, "Moving to HPDET range %d\n",
458 				range);
459 			regmap_update_bits(arizona->regmap,
460 					   ARIZONA_HEADPHONE_DETECT_1,
461 					   ARIZONA_HP_IMPEDANCE_RANGE_MASK,
462 					   range <<
463 					   ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
464 			return -EAGAIN;
465 		}
466 
467 		/* If we go out of range report top of range */
468 		if (val < arizona_hpdet_b_ranges[range].threshold ||
469 		    val >= ARIZONA_HPDET_B_RANGE_MAX) {
470 			dev_dbg(arizona->dev, "Measurement out of range\n");
471 			return ARIZONA_HPDET_MAX;
472 		}
473 
474 		dev_dbg(arizona->dev, "HPDET read %d in range %d\n",
475 			val, range);
476 
477 		val = arizona_hpdet_b_ranges[range].factor_b
478 			/ ((val * 100) -
479 			   arizona_hpdet_b_ranges[range].factor_a);
480 		break;
481 
482 	case 2:
483 		if (!(val & ARIZONA_HP_DONE_B)) {
484 			dev_err(arizona->dev, "HPDET did not complete: %x\n",
485 				val);
486 			return -EAGAIN;
487 		}
488 
489 		val &= ARIZONA_HP_LVL_B_MASK;
490 		/* Convert to ohms, the value is in 0.5 ohm increments */
491 		val /= 2;
492 
493 		regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
494 			    &range);
495 		range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
496 			   >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
497 
498 		/* Skip up a range, or report? */
499 		if (range < ARRAY_SIZE(arizona_hpdet_c_ranges) - 1 &&
500 		    (val >= arizona_hpdet_c_ranges[range].max)) {
501 			range++;
502 			dev_dbg(arizona->dev, "Moving to HPDET range %d-%d\n",
503 				arizona_hpdet_c_ranges[range].min,
504 				arizona_hpdet_c_ranges[range].max);
505 			regmap_update_bits(arizona->regmap,
506 					   ARIZONA_HEADPHONE_DETECT_1,
507 					   ARIZONA_HP_IMPEDANCE_RANGE_MASK,
508 					   range <<
509 					   ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
510 			return -EAGAIN;
511 		}
512 
513 		if (range && (val < arizona_hpdet_c_ranges[range].min)) {
514 			dev_dbg(arizona->dev, "Reporting range boundary %d\n",
515 				arizona_hpdet_c_ranges[range].min);
516 			val = arizona_hpdet_c_ranges[range].min;
517 		}
518 		break;
519 
520 	default:
521 		dev_warn(arizona->dev, "Unknown HPDET IP revision %d\n",
522 			 info->hpdet_ip_version);
523 		return -EINVAL;
524 	}
525 
526 	dev_dbg(arizona->dev, "HP impedance %d ohms\n", val);
527 	return val;
528 }
529 
530 static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading,
531 			       bool *mic)
532 {
533 	struct arizona *arizona = info->arizona;
534 	int id_gpio = arizona->pdata.hpdet_id_gpio;
535 
536 	if (!arizona->pdata.hpdet_acc_id)
537 		return 0;
538 
539 	/*
540 	 * If we're using HPDET for accessory identification we need
541 	 * to take multiple measurements, step through them in sequence.
542 	 */
543 	info->hpdet_res[info->num_hpdet_res++] = *reading;
544 
545 	/* Only check the mic directly if we didn't already ID it */
546 	if (id_gpio && info->num_hpdet_res == 1) {
547 		dev_dbg(arizona->dev, "Measuring mic\n");
548 
549 		regmap_update_bits(arizona->regmap,
550 				   ARIZONA_ACCESSORY_DETECT_MODE_1,
551 				   ARIZONA_ACCDET_MODE_MASK |
552 				   ARIZONA_ACCDET_SRC,
553 				   ARIZONA_ACCDET_MODE_HPR |
554 				   info->micd_modes[0].src);
555 
556 		gpio_set_value_cansleep(id_gpio, 1);
557 
558 		regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
559 				   ARIZONA_HP_POLL, ARIZONA_HP_POLL);
560 		return -EAGAIN;
561 	}
562 
563 	/* OK, got both.  Now, compare... */
564 	dev_dbg(arizona->dev, "HPDET measured %d %d\n",
565 		info->hpdet_res[0], info->hpdet_res[1]);
566 
567 	/* Take the headphone impedance for the main report */
568 	*reading = info->hpdet_res[0];
569 
570 	/* Sometimes we get false readings due to slow insert */
571 	if (*reading >= ARIZONA_HPDET_MAX && !info->hpdet_retried) {
572 		dev_dbg(arizona->dev, "Retrying high impedance\n");
573 		info->num_hpdet_res = 0;
574 		info->hpdet_retried = true;
575 		arizona_start_hpdet_acc_id(info);
576 		pm_runtime_put(info->dev);
577 		return -EAGAIN;
578 	}
579 
580 	/*
581 	 * If we measure the mic as high impedance
582 	 */
583 	if (!id_gpio || info->hpdet_res[1] > 50) {
584 		dev_dbg(arizona->dev, "Detected mic\n");
585 		*mic = true;
586 		info->detecting = true;
587 	} else {
588 		dev_dbg(arizona->dev, "Detected headphone\n");
589 	}
590 
591 	/* Make sure everything is reset back to the real polarity */
592 	regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
593 			   ARIZONA_ACCDET_SRC, info->micd_modes[0].src);
594 
595 	return 0;
596 }
597 
598 static irqreturn_t arizona_hpdet_irq(int irq, void *data)
599 {
600 	struct arizona_extcon_info *info = data;
601 	struct arizona *arizona = info->arizona;
602 	int id_gpio = arizona->pdata.hpdet_id_gpio;
603 	unsigned int report = EXTCON_JACK_HEADPHONE;
604 	int ret, reading, state;
605 	bool mic = false;
606 
607 	mutex_lock(&info->lock);
608 
609 	/* If we got a spurious IRQ for some reason then ignore it */
610 	if (!info->hpdet_active) {
611 		dev_warn(arizona->dev, "Spurious HPDET IRQ\n");
612 		mutex_unlock(&info->lock);
613 		return IRQ_NONE;
614 	}
615 
616 	/* If the cable was removed while measuring ignore the result */
617 	state = extcon_get_state(info->edev, EXTCON_MECHANICAL);
618 	if (state < 0) {
619 		dev_err(arizona->dev, "Failed to check cable state: %d\n", state);
620 		goto out;
621 	} else if (!state) {
622 		dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
623 		goto done;
624 	}
625 
626 	ret = arizona_hpdet_read(info);
627 	if (ret == -EAGAIN)
628 		goto out;
629 	else if (ret < 0)
630 		goto done;
631 	reading = ret;
632 
633 	/* Reset back to starting range */
634 	regmap_update_bits(arizona->regmap,
635 			   ARIZONA_HEADPHONE_DETECT_1,
636 			   ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL,
637 			   0);
638 
639 	ret = arizona_hpdet_do_id(info, &reading, &mic);
640 	if (ret == -EAGAIN)
641 		goto out;
642 	else if (ret < 0)
643 		goto done;
644 
645 	/* Report high impedence cables as line outputs */
646 	if (reading >= 5000)
647 		report = EXTCON_JACK_LINE_OUT;
648 	else
649 		report = EXTCON_JACK_HEADPHONE;
650 
651 	ret = extcon_set_state_sync(info->edev, report, true);
652 	if (ret != 0)
653 		dev_err(arizona->dev, "Failed to report HP/line: %d\n",
654 			ret);
655 
656 done:
657 	/* Reset back to starting range */
658 	regmap_update_bits(arizona->regmap,
659 			   ARIZONA_HEADPHONE_DETECT_1,
660 			   ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL,
661 			   0);
662 
663 	arizona_extcon_hp_clamp(info, false);
664 
665 	if (id_gpio)
666 		gpio_set_value_cansleep(id_gpio, 0);
667 
668 	/* If we have a mic then reenable MICDET */
669 	if (state && (mic || info->mic))
670 		arizona_start_mic(info);
671 
672 	if (info->hpdet_active) {
673 		pm_runtime_put_autosuspend(info->dev);
674 		info->hpdet_active = false;
675 	}
676 
677 	/* Do not set hp_det done when the cable has been unplugged */
678 	if (state)
679 		info->hpdet_done = true;
680 
681 out:
682 	mutex_unlock(&info->lock);
683 
684 	return IRQ_HANDLED;
685 }
686 
687 static void arizona_identify_headphone(struct arizona_extcon_info *info)
688 {
689 	struct arizona *arizona = info->arizona;
690 	int ret;
691 
692 	if (info->hpdet_done)
693 		return;
694 
695 	dev_dbg(arizona->dev, "Starting HPDET\n");
696 
697 	/* Make sure we keep the device enabled during the measurement */
698 	pm_runtime_get_sync(info->dev);
699 
700 	info->hpdet_active = true;
701 
702 	arizona_stop_mic(info);
703 
704 	arizona_extcon_hp_clamp(info, true);
705 
706 	ret = regmap_update_bits(arizona->regmap,
707 				 ARIZONA_ACCESSORY_DETECT_MODE_1,
708 				 ARIZONA_ACCDET_MODE_MASK,
709 				 arizona->pdata.hpdet_channel);
710 	if (ret != 0) {
711 		dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
712 		goto err;
713 	}
714 
715 	ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
716 				 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
717 	if (ret != 0) {
718 		dev_err(arizona->dev, "Can't start HPDETL measurement: %d\n",
719 			ret);
720 		goto err;
721 	}
722 
723 	return;
724 
725 err:
726 	arizona_extcon_hp_clamp(info, false);
727 	pm_runtime_put_autosuspend(info->dev);
728 
729 	/* Just report headphone */
730 	ret = extcon_set_state_sync(info->edev, EXTCON_JACK_HEADPHONE, true);
731 	if (ret != 0)
732 		dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
733 
734 	if (info->mic)
735 		arizona_start_mic(info);
736 
737 	info->hpdet_active = false;
738 }
739 
740 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
741 {
742 	struct arizona *arizona = info->arizona;
743 	int hp_reading = 32;
744 	bool mic;
745 	int ret;
746 
747 	dev_dbg(arizona->dev, "Starting identification via HPDET\n");
748 
749 	/* Make sure we keep the device enabled during the measurement */
750 	pm_runtime_get_sync(info->dev);
751 
752 	info->hpdet_active = true;
753 
754 	arizona_extcon_hp_clamp(info, true);
755 
756 	ret = regmap_update_bits(arizona->regmap,
757 				 ARIZONA_ACCESSORY_DETECT_MODE_1,
758 				 ARIZONA_ACCDET_SRC | ARIZONA_ACCDET_MODE_MASK,
759 				 info->micd_modes[0].src |
760 				 arizona->pdata.hpdet_channel);
761 	if (ret != 0) {
762 		dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
763 		goto err;
764 	}
765 
766 	if (arizona->pdata.hpdet_acc_id_line) {
767 		ret = regmap_update_bits(arizona->regmap,
768 					 ARIZONA_HEADPHONE_DETECT_1,
769 					 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
770 		if (ret != 0) {
771 			dev_err(arizona->dev,
772 				"Can't start HPDETL measurement: %d\n",
773 				ret);
774 			goto err;
775 		}
776 	} else {
777 		arizona_hpdet_do_id(info, &hp_reading, &mic);
778 	}
779 
780 	return;
781 
782 err:
783 	/* Just report headphone */
784 	ret = extcon_set_state_sync(info->edev, EXTCON_JACK_HEADPHONE, true);
785 	if (ret != 0)
786 		dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
787 
788 	info->hpdet_active = false;
789 }
790 
791 static void arizona_micd_timeout_work(struct work_struct *work)
792 {
793 	struct arizona_extcon_info *info = container_of(work,
794 						struct arizona_extcon_info,
795 						micd_timeout_work.work);
796 
797 	mutex_lock(&info->lock);
798 
799 	dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
800 
801 	info->detecting = false;
802 
803 	arizona_identify_headphone(info);
804 
805 	mutex_unlock(&info->lock);
806 }
807 
808 static int arizona_micd_adc_read(struct arizona_extcon_info *info)
809 {
810 	struct arizona *arizona = info->arizona;
811 	unsigned int val;
812 	int ret;
813 
814 	/* Must disable MICD before we read the ADCVAL */
815 	regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
816 			   ARIZONA_MICD_ENA, 0);
817 
818 	ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_4, &val);
819 	if (ret != 0) {
820 		dev_err(arizona->dev,
821 			"Failed to read MICDET_ADCVAL: %d\n", ret);
822 		return ret;
823 	}
824 
825 	dev_dbg(arizona->dev, "MICDET_ADCVAL: %x\n", val);
826 
827 	val &= ARIZONA_MICDET_ADCVAL_MASK;
828 	if (val < ARRAY_SIZE(arizona_micd_levels))
829 		val = arizona_micd_levels[val];
830 	else
831 		val = INT_MAX;
832 
833 	if (val <= QUICK_HEADPHONE_MAX_OHM)
834 		val = ARIZONA_MICD_STS | ARIZONA_MICD_LVL_0;
835 	else if (val <= MICROPHONE_MIN_OHM)
836 		val = ARIZONA_MICD_STS | ARIZONA_MICD_LVL_1;
837 	else if (val <= MICROPHONE_MAX_OHM)
838 		val = ARIZONA_MICD_STS | ARIZONA_MICD_LVL_8;
839 	else
840 		val = ARIZONA_MICD_LVL_8;
841 
842 	return val;
843 }
844 
845 static int arizona_micd_read(struct arizona_extcon_info *info)
846 {
847 	struct arizona *arizona = info->arizona;
848 	unsigned int val = 0;
849 	int ret, i;
850 
851 	for (i = 0; i < 10 && !(val & MICD_LVL_0_TO_8); i++) {
852 		ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
853 		if (ret != 0) {
854 			dev_err(arizona->dev,
855 				"Failed to read MICDET: %d\n", ret);
856 			return ret;
857 		}
858 
859 		dev_dbg(arizona->dev, "MICDET: %x\n", val);
860 
861 		if (!(val & ARIZONA_MICD_VALID)) {
862 			dev_warn(arizona->dev,
863 				 "Microphone detection state invalid\n");
864 			return -EINVAL;
865 		}
866 	}
867 
868 	if (i == 10 && !(val & MICD_LVL_0_TO_8)) {
869 		dev_err(arizona->dev, "Failed to get valid MICDET value\n");
870 		return -EINVAL;
871 	}
872 
873 	return val;
874 }
875 
876 static int arizona_micdet_reading(void *priv)
877 {
878 	struct arizona_extcon_info *info = priv;
879 	struct arizona *arizona = info->arizona;
880 	int ret, val;
881 
882 	if (info->detecting && arizona->pdata.micd_software_compare)
883 		ret = arizona_micd_adc_read(info);
884 	else
885 		ret = arizona_micd_read(info);
886 	if (ret < 0)
887 		return ret;
888 
889 	val = ret;
890 
891 	/* Due to jack detect this should never happen */
892 	if (!(val & ARIZONA_MICD_STS)) {
893 		dev_warn(arizona->dev, "Detected open circuit\n");
894 		info->mic = false;
895 		info->detecting = false;
896 		arizona_identify_headphone(info);
897 		return 0;
898 	}
899 
900 	/* If we got a high impedence we should have a headset, report it. */
901 	if (val & ARIZONA_MICD_LVL_8) {
902 		info->mic = true;
903 		info->detecting = false;
904 
905 		arizona_identify_headphone(info);
906 
907 		ret = extcon_set_state_sync(info->edev,
908 					      EXTCON_JACK_MICROPHONE, true);
909 		if (ret != 0)
910 			dev_err(arizona->dev, "Headset report failed: %d\n",
911 				ret);
912 
913 		/* Don't need to regulate for button detection */
914 		ret = regulator_allow_bypass(info->micvdd, true);
915 		if (ret != 0) {
916 			dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
917 				ret);
918 		}
919 
920 		return 0;
921 	}
922 
923 	/* If we detected a lower impedence during initial startup
924 	 * then we probably have the wrong polarity, flip it.  Don't
925 	 * do this for the lowest impedences to speed up detection of
926 	 * plain headphones.  If both polarities report a low
927 	 * impedence then give up and report headphones.
928 	 */
929 	if (val & MICD_LVL_1_TO_7) {
930 		if (info->jack_flips >= info->micd_num_modes * 10) {
931 			dev_dbg(arizona->dev, "Detected HP/line\n");
932 
933 			info->detecting = false;
934 
935 			arizona_identify_headphone(info);
936 		} else {
937 			info->micd_mode++;
938 			if (info->micd_mode == info->micd_num_modes)
939 				info->micd_mode = 0;
940 			arizona_extcon_set_mode(info, info->micd_mode);
941 
942 			info->jack_flips++;
943 
944 			if (arizona->pdata.micd_software_compare)
945 				regmap_update_bits(arizona->regmap,
946 						   ARIZONA_MIC_DETECT_1,
947 						   ARIZONA_MICD_ENA,
948 						   ARIZONA_MICD_ENA);
949 
950 			queue_delayed_work(system_power_efficient_wq,
951 					   &info->micd_timeout_work,
952 					   msecs_to_jiffies(arizona->pdata.micd_timeout));
953 		}
954 
955 		return 0;
956 	}
957 
958 	/*
959 	 * If we're still detecting and we detect a short then we've
960 	 * got a headphone.
961 	 */
962 	dev_dbg(arizona->dev, "Headphone detected\n");
963 	info->detecting = false;
964 
965 	arizona_identify_headphone(info);
966 
967 	return 0;
968 }
969 
970 static int arizona_button_reading(void *priv)
971 {
972 	struct arizona_extcon_info *info = priv;
973 	struct arizona *arizona = info->arizona;
974 	int val, key, lvl, i;
975 
976 	val = arizona_micd_read(info);
977 	if (val < 0)
978 		return val;
979 
980 	/*
981 	 * If we're still detecting and we detect a short then we've
982 	 * got a headphone.  Otherwise it's a button press.
983 	 */
984 	if (val & MICD_LVL_0_TO_7) {
985 		if (info->mic) {
986 			dev_dbg(arizona->dev, "Mic button detected\n");
987 
988 			lvl = val & ARIZONA_MICD_LVL_MASK;
989 			lvl >>= ARIZONA_MICD_LVL_SHIFT;
990 
991 			for (i = 0; i < info->num_micd_ranges; i++)
992 				input_report_key(info->input,
993 						 info->micd_ranges[i].key, 0);
994 
995 			if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) {
996 				key = info->micd_ranges[ffs(lvl) - 1].key;
997 				input_report_key(info->input, key, 1);
998 				input_sync(info->input);
999 			} else {
1000 				dev_err(arizona->dev, "Button out of range\n");
1001 			}
1002 		} else {
1003 			dev_warn(arizona->dev, "Button with no mic: %x\n",
1004 				 val);
1005 		}
1006 	} else {
1007 		dev_dbg(arizona->dev, "Mic button released\n");
1008 		for (i = 0; i < info->num_micd_ranges; i++)
1009 			input_report_key(info->input,
1010 					 info->micd_ranges[i].key, 0);
1011 		input_sync(info->input);
1012 		arizona_extcon_pulse_micbias(info);
1013 	}
1014 
1015 	return 0;
1016 }
1017 
1018 static void arizona_micd_detect(struct work_struct *work)
1019 {
1020 	struct arizona_extcon_info *info = container_of(work,
1021 						struct arizona_extcon_info,
1022 						micd_detect_work.work);
1023 	struct arizona *arizona = info->arizona;
1024 	int ret;
1025 
1026 	cancel_delayed_work_sync(&info->micd_timeout_work);
1027 
1028 	mutex_lock(&info->lock);
1029 
1030 	/* If the cable was removed while measuring ignore the result */
1031 	ret = extcon_get_state(info->edev, EXTCON_MECHANICAL);
1032 	if (ret < 0) {
1033 		dev_err(arizona->dev, "Failed to check cable state: %d\n",
1034 				ret);
1035 		mutex_unlock(&info->lock);
1036 		return;
1037 	} else if (!ret) {
1038 		dev_dbg(arizona->dev, "Ignoring MICDET for removed cable\n");
1039 		mutex_unlock(&info->lock);
1040 		return;
1041 	}
1042 
1043 	if (info->detecting)
1044 		arizona_micdet_reading(info);
1045 	else
1046 		arizona_button_reading(info);
1047 
1048 	pm_runtime_mark_last_busy(info->dev);
1049 	mutex_unlock(&info->lock);
1050 }
1051 
1052 static irqreturn_t arizona_micdet(int irq, void *data)
1053 {
1054 	struct arizona_extcon_info *info = data;
1055 	struct arizona *arizona = info->arizona;
1056 	int debounce = arizona->pdata.micd_detect_debounce;
1057 
1058 	cancel_delayed_work_sync(&info->micd_detect_work);
1059 	cancel_delayed_work_sync(&info->micd_timeout_work);
1060 
1061 	mutex_lock(&info->lock);
1062 	if (!info->detecting)
1063 		debounce = 0;
1064 	mutex_unlock(&info->lock);
1065 
1066 	if (debounce)
1067 		queue_delayed_work(system_power_efficient_wq,
1068 				   &info->micd_detect_work,
1069 				   msecs_to_jiffies(debounce));
1070 	else
1071 		arizona_micd_detect(&info->micd_detect_work.work);
1072 
1073 	return IRQ_HANDLED;
1074 }
1075 
1076 static void arizona_hpdet_work(struct work_struct *work)
1077 {
1078 	struct arizona_extcon_info *info = container_of(work,
1079 						struct arizona_extcon_info,
1080 						hpdet_work.work);
1081 
1082 	mutex_lock(&info->lock);
1083 	arizona_start_hpdet_acc_id(info);
1084 	mutex_unlock(&info->lock);
1085 }
1086 
1087 static int arizona_hpdet_wait(struct arizona_extcon_info *info)
1088 {
1089 	struct arizona *arizona = info->arizona;
1090 	unsigned int val;
1091 	int i, ret;
1092 
1093 	for (i = 0; i < ARIZONA_HPDET_WAIT_COUNT; i++) {
1094 		ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2,
1095 				&val);
1096 		if (ret) {
1097 			dev_err(arizona->dev,
1098 				"Failed to read HPDET state: %d\n", ret);
1099 			return ret;
1100 		}
1101 
1102 		switch (info->hpdet_ip_version) {
1103 		case 0:
1104 			if (val & ARIZONA_HP_DONE)
1105 				return 0;
1106 			break;
1107 		default:
1108 			if (val & ARIZONA_HP_DONE_B)
1109 				return 0;
1110 			break;
1111 		}
1112 
1113 		msleep(ARIZONA_HPDET_WAIT_DELAY_MS);
1114 	}
1115 
1116 	dev_warn(arizona->dev, "HPDET did not appear to complete\n");
1117 
1118 	return -ETIMEDOUT;
1119 }
1120 
1121 static irqreturn_t arizona_jackdet(int irq, void *data)
1122 {
1123 	struct arizona_extcon_info *info = data;
1124 	struct arizona *arizona = info->arizona;
1125 	unsigned int val, present, mask;
1126 	bool cancelled_hp, cancelled_mic;
1127 	int ret, i;
1128 
1129 	cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
1130 	cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);
1131 
1132 	pm_runtime_get_sync(info->dev);
1133 
1134 	mutex_lock(&info->lock);
1135 
1136 	if (info->micd_clamp) {
1137 		mask = ARIZONA_MICD_CLAMP_STS;
1138 		present = 0;
1139 	} else {
1140 		mask = ARIZONA_JD1_STS;
1141 		if (arizona->pdata.jd_invert)
1142 			present = 0;
1143 		else
1144 			present = ARIZONA_JD1_STS;
1145 	}
1146 
1147 	ret = regmap_read(arizona->regmap, ARIZONA_AOD_IRQ_RAW_STATUS, &val);
1148 	if (ret != 0) {
1149 		dev_err(arizona->dev, "Failed to read jackdet status: %d\n",
1150 			ret);
1151 		mutex_unlock(&info->lock);
1152 		pm_runtime_put_autosuspend(info->dev);
1153 		return IRQ_NONE;
1154 	}
1155 
1156 	val &= mask;
1157 	if (val == info->last_jackdet) {
1158 		dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
1159 		if (cancelled_hp)
1160 			queue_delayed_work(system_power_efficient_wq,
1161 					   &info->hpdet_work,
1162 					   msecs_to_jiffies(HPDET_DEBOUNCE));
1163 
1164 		if (cancelled_mic) {
1165 			int micd_timeout = arizona->pdata.micd_timeout;
1166 
1167 			queue_delayed_work(system_power_efficient_wq,
1168 					   &info->micd_timeout_work,
1169 					   msecs_to_jiffies(micd_timeout));
1170 		}
1171 
1172 		goto out;
1173 	}
1174 	info->last_jackdet = val;
1175 
1176 	if (info->last_jackdet == present) {
1177 		dev_dbg(arizona->dev, "Detected jack\n");
1178 		ret = extcon_set_state_sync(info->edev,
1179 					      EXTCON_MECHANICAL, true);
1180 
1181 		if (ret != 0)
1182 			dev_err(arizona->dev, "Mechanical report failed: %d\n",
1183 				ret);
1184 
1185 		info->detecting = true;
1186 		info->mic = false;
1187 		info->jack_flips = 0;
1188 
1189 		if (!arizona->pdata.hpdet_acc_id) {
1190 			arizona_start_mic(info);
1191 		} else {
1192 			queue_delayed_work(system_power_efficient_wq,
1193 					   &info->hpdet_work,
1194 					   msecs_to_jiffies(HPDET_DEBOUNCE));
1195 		}
1196 
1197 		if (info->micd_clamp || !arizona->pdata.jd_invert)
1198 			regmap_update_bits(arizona->regmap,
1199 					   ARIZONA_JACK_DETECT_DEBOUNCE,
1200 					   ARIZONA_MICD_CLAMP_DB |
1201 					   ARIZONA_JD1_DB, 0);
1202 	} else {
1203 		dev_dbg(arizona->dev, "Detected jack removal\n");
1204 
1205 		arizona_stop_mic(info);
1206 
1207 		info->num_hpdet_res = 0;
1208 		for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
1209 			info->hpdet_res[i] = 0;
1210 		info->mic = false;
1211 		info->hpdet_done = false;
1212 		info->hpdet_retried = false;
1213 
1214 		for (i = 0; i < info->num_micd_ranges; i++)
1215 			input_report_key(info->input,
1216 					 info->micd_ranges[i].key, 0);
1217 		input_sync(info->input);
1218 
1219 		for (i = 0; i < ARRAY_SIZE(arizona_cable) - 1; i++) {
1220 			ret = extcon_set_state_sync(info->edev,
1221 					arizona_cable[i], false);
1222 			if (ret != 0)
1223 				dev_err(arizona->dev,
1224 					"Removal report failed: %d\n", ret);
1225 		}
1226 
1227 		/*
1228 		 * If the jack was removed during a headphone detection we
1229 		 * need to wait for the headphone detection to finish, as
1230 		 * it can not be aborted. We don't want to be able to start
1231 		 * a new headphone detection from a fresh insert until this
1232 		 * one is finished.
1233 		 */
1234 		arizona_hpdet_wait(info);
1235 
1236 		regmap_update_bits(arizona->regmap,
1237 				   ARIZONA_JACK_DETECT_DEBOUNCE,
1238 				   ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB,
1239 				   ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB);
1240 	}
1241 
1242 out:
1243 	/* Clear trig_sts to make sure DCVDD is not forced up */
1244 	regmap_write(arizona->regmap, ARIZONA_AOD_WKUP_AND_TRIG,
1245 		     ARIZONA_MICD_CLAMP_FALL_TRIG_STS |
1246 		     ARIZONA_MICD_CLAMP_RISE_TRIG_STS |
1247 		     ARIZONA_JD1_FALL_TRIG_STS |
1248 		     ARIZONA_JD1_RISE_TRIG_STS);
1249 
1250 	mutex_unlock(&info->lock);
1251 
1252 	pm_runtime_mark_last_busy(info->dev);
1253 	pm_runtime_put_autosuspend(info->dev);
1254 
1255 	return IRQ_HANDLED;
1256 }
1257 
1258 /* Map a level onto a slot in the register bank */
1259 static void arizona_micd_set_level(struct arizona *arizona, int index,
1260 				   unsigned int level)
1261 {
1262 	int reg;
1263 	unsigned int mask;
1264 
1265 	reg = ARIZONA_MIC_DETECT_LEVEL_4 - (index / 2);
1266 
1267 	if (!(index % 2)) {
1268 		mask = 0x3f00;
1269 		level <<= 8;
1270 	} else {
1271 		mask = 0x3f;
1272 	}
1273 
1274 	/* Program the level itself */
1275 	regmap_update_bits(arizona->regmap, reg, mask, level);
1276 }
1277 
1278 static int arizona_extcon_get_micd_configs(struct device *dev,
1279 					   struct arizona *arizona)
1280 {
1281 	const char * const prop = "wlf,micd-configs";
1282 	const int entries_per_config = 3;
1283 	struct arizona_micd_config *micd_configs;
1284 	int nconfs, ret;
1285 	int i, j;
1286 	u32 *vals;
1287 
1288 	nconfs = device_property_count_u32(arizona->dev, prop);
1289 	if (nconfs <= 0)
1290 		return 0;
1291 
1292 	vals = kcalloc(nconfs, sizeof(u32), GFP_KERNEL);
1293 	if (!vals)
1294 		return -ENOMEM;
1295 
1296 	ret = device_property_read_u32_array(arizona->dev, prop, vals, nconfs);
1297 	if (ret < 0)
1298 		goto out;
1299 
1300 	nconfs /= entries_per_config;
1301 	micd_configs = devm_kcalloc(dev, nconfs, sizeof(*micd_configs),
1302 				    GFP_KERNEL);
1303 	if (!micd_configs) {
1304 		ret = -ENOMEM;
1305 		goto out;
1306 	}
1307 
1308 	for (i = 0, j = 0; i < nconfs; ++i) {
1309 		micd_configs[i].src = vals[j++] ? ARIZONA_ACCDET_SRC : 0;
1310 		micd_configs[i].bias = vals[j++];
1311 		micd_configs[i].gpio = vals[j++];
1312 	}
1313 
1314 	arizona->pdata.micd_configs = micd_configs;
1315 	arizona->pdata.num_micd_configs = nconfs;
1316 
1317 out:
1318 	kfree(vals);
1319 	return ret;
1320 }
1321 
1322 static int arizona_extcon_device_get_pdata(struct device *dev,
1323 					   struct arizona *arizona)
1324 {
1325 	struct arizona_pdata *pdata = &arizona->pdata;
1326 	unsigned int val = ARIZONA_ACCDET_MODE_HPL;
1327 	int ret;
1328 
1329 	device_property_read_u32(arizona->dev, "wlf,hpdet-channel", &val);
1330 	switch (val) {
1331 	case ARIZONA_ACCDET_MODE_HPL:
1332 	case ARIZONA_ACCDET_MODE_HPR:
1333 		pdata->hpdet_channel = val;
1334 		break;
1335 	default:
1336 		dev_err(arizona->dev,
1337 			"Wrong wlf,hpdet-channel DT value %d\n", val);
1338 		pdata->hpdet_channel = ARIZONA_ACCDET_MODE_HPL;
1339 	}
1340 
1341 	device_property_read_u32(arizona->dev, "wlf,micd-detect-debounce",
1342 				 &pdata->micd_detect_debounce);
1343 
1344 	device_property_read_u32(arizona->dev, "wlf,micd-bias-start-time",
1345 				 &pdata->micd_bias_start_time);
1346 
1347 	device_property_read_u32(arizona->dev, "wlf,micd-rate",
1348 				 &pdata->micd_rate);
1349 
1350 	device_property_read_u32(arizona->dev, "wlf,micd-dbtime",
1351 				 &pdata->micd_dbtime);
1352 
1353 	device_property_read_u32(arizona->dev, "wlf,micd-timeout-ms",
1354 				 &pdata->micd_timeout);
1355 
1356 	pdata->micd_force_micbias = device_property_read_bool(arizona->dev,
1357 						"wlf,micd-force-micbias");
1358 
1359 	pdata->micd_software_compare = device_property_read_bool(arizona->dev,
1360 						"wlf,micd-software-compare");
1361 
1362 	pdata->jd_invert = device_property_read_bool(arizona->dev,
1363 						     "wlf,jd-invert");
1364 
1365 	device_property_read_u32(arizona->dev, "wlf,gpsw", &pdata->gpsw);
1366 
1367 	pdata->jd_gpio5 = device_property_read_bool(arizona->dev,
1368 						    "wlf,use-jd2");
1369 	pdata->jd_gpio5_nopull = device_property_read_bool(arizona->dev,
1370 						"wlf,use-jd2-nopull");
1371 
1372 	ret = arizona_extcon_get_micd_configs(dev, arizona);
1373 	if (ret < 0)
1374 		dev_err(arizona->dev, "Failed to read micd configs: %d\n", ret);
1375 
1376 	return 0;
1377 }
1378 
1379 static int arizona_extcon_probe(struct platform_device *pdev)
1380 {
1381 	struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1382 	struct arizona_pdata *pdata = &arizona->pdata;
1383 	struct arizona_extcon_info *info;
1384 	unsigned int val;
1385 	unsigned int clamp_mode;
1386 	int jack_irq_fall, jack_irq_rise;
1387 	int ret, mode, i, j;
1388 
1389 	if (!arizona->dapm || !arizona->dapm->card)
1390 		return -EPROBE_DEFER;
1391 
1392 	info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
1393 	if (!info)
1394 		return -ENOMEM;
1395 
1396 	if (!dev_get_platdata(arizona->dev))
1397 		arizona_extcon_device_get_pdata(&pdev->dev, arizona);
1398 
1399 	info->micvdd = devm_regulator_get(&pdev->dev, "MICVDD");
1400 	if (IS_ERR(info->micvdd)) {
1401 		ret = PTR_ERR(info->micvdd);
1402 		dev_err(arizona->dev, "Failed to get MICVDD: %d\n", ret);
1403 		return ret;
1404 	}
1405 
1406 	mutex_init(&info->lock);
1407 	info->arizona = arizona;
1408 	info->dev = &pdev->dev;
1409 	info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS);
1410 	INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
1411 	INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect);
1412 	INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
1413 	platform_set_drvdata(pdev, info);
1414 
1415 	switch (arizona->type) {
1416 	case WM5102:
1417 		switch (arizona->rev) {
1418 		case 0:
1419 			info->micd_reva = true;
1420 			break;
1421 		default:
1422 			info->micd_clamp = true;
1423 			info->hpdet_ip_version = 1;
1424 			break;
1425 		}
1426 		break;
1427 	case WM5110:
1428 	case WM8280:
1429 		switch (arizona->rev) {
1430 		case 0 ... 2:
1431 			break;
1432 		default:
1433 			info->micd_clamp = true;
1434 			info->hpdet_ip_version = 2;
1435 			break;
1436 		}
1437 		break;
1438 	case WM8998:
1439 	case WM1814:
1440 		info->micd_clamp = true;
1441 		info->hpdet_ip_version = 2;
1442 		break;
1443 	default:
1444 		break;
1445 	}
1446 
1447 	info->edev = devm_extcon_dev_allocate(&pdev->dev, arizona_cable);
1448 	if (IS_ERR(info->edev)) {
1449 		dev_err(&pdev->dev, "failed to allocate extcon device\n");
1450 		return -ENOMEM;
1451 	}
1452 
1453 	ret = devm_extcon_dev_register(&pdev->dev, info->edev);
1454 	if (ret < 0) {
1455 		dev_err(arizona->dev, "extcon_dev_register() failed: %d\n",
1456 			ret);
1457 		return ret;
1458 	}
1459 
1460 	info->input = devm_input_allocate_device(&pdev->dev);
1461 	if (!info->input) {
1462 		dev_err(arizona->dev, "Can't allocate input dev\n");
1463 		ret = -ENOMEM;
1464 		return ret;
1465 	}
1466 
1467 	info->input->name = "Headset";
1468 	info->input->phys = "arizona/extcon";
1469 
1470 	if (!pdata->micd_timeout)
1471 		pdata->micd_timeout = DEFAULT_MICD_TIMEOUT;
1472 
1473 	if (pdata->num_micd_configs) {
1474 		info->micd_modes = pdata->micd_configs;
1475 		info->micd_num_modes = pdata->num_micd_configs;
1476 	} else {
1477 		info->micd_modes = micd_default_modes;
1478 		info->micd_num_modes = ARRAY_SIZE(micd_default_modes);
1479 	}
1480 
1481 	if (arizona->pdata.gpsw > 0)
1482 		regmap_update_bits(arizona->regmap, ARIZONA_GP_SWITCH_1,
1483 				ARIZONA_SW1_MODE_MASK, arizona->pdata.gpsw);
1484 
1485 	if (pdata->micd_pol_gpio > 0) {
1486 		if (info->micd_modes[0].gpio)
1487 			mode = GPIOF_OUT_INIT_HIGH;
1488 		else
1489 			mode = GPIOF_OUT_INIT_LOW;
1490 
1491 		ret = devm_gpio_request_one(&pdev->dev, pdata->micd_pol_gpio,
1492 					    mode, "MICD polarity");
1493 		if (ret != 0) {
1494 			dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1495 				pdata->micd_pol_gpio, ret);
1496 			return ret;
1497 		}
1498 
1499 		info->micd_pol_gpio = gpio_to_desc(pdata->micd_pol_gpio);
1500 	} else {
1501 		if (info->micd_modes[0].gpio)
1502 			mode = GPIOD_OUT_HIGH;
1503 		else
1504 			mode = GPIOD_OUT_LOW;
1505 
1506 		/* We can't use devm here because we need to do the get
1507 		 * against the MFD device, as that is where the of_node
1508 		 * will reside, but if we devm against that the GPIO
1509 		 * will not be freed if the extcon driver is unloaded.
1510 		 */
1511 		info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
1512 							 "wlf,micd-pol",
1513 							 mode);
1514 		if (IS_ERR(info->micd_pol_gpio)) {
1515 			ret = PTR_ERR(info->micd_pol_gpio);
1516 			dev_err(arizona->dev,
1517 				"Failed to get microphone polarity GPIO: %d\n",
1518 				ret);
1519 			return ret;
1520 		}
1521 	}
1522 
1523 	if (arizona->pdata.hpdet_id_gpio > 0) {
1524 		ret = devm_gpio_request_one(&pdev->dev,
1525 					    arizona->pdata.hpdet_id_gpio,
1526 					    GPIOF_OUT_INIT_LOW,
1527 					    "HPDET");
1528 		if (ret != 0) {
1529 			dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1530 				arizona->pdata.hpdet_id_gpio, ret);
1531 			goto err_gpio;
1532 		}
1533 	}
1534 
1535 	if (arizona->pdata.micd_bias_start_time)
1536 		regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1537 				   ARIZONA_MICD_BIAS_STARTTIME_MASK,
1538 				   arizona->pdata.micd_bias_start_time
1539 				   << ARIZONA_MICD_BIAS_STARTTIME_SHIFT);
1540 
1541 	if (arizona->pdata.micd_rate)
1542 		regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1543 				   ARIZONA_MICD_RATE_MASK,
1544 				   arizona->pdata.micd_rate
1545 				   << ARIZONA_MICD_RATE_SHIFT);
1546 
1547 	switch (arizona->pdata.micd_dbtime) {
1548 	case MICD_DBTIME_FOUR_READINGS:
1549 		regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1550 				   ARIZONA_MICD_DBTIME_MASK,
1551 				   ARIZONA_MICD_DBTIME);
1552 		break;
1553 	case MICD_DBTIME_TWO_READINGS:
1554 		regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1555 				   ARIZONA_MICD_DBTIME_MASK, 0);
1556 		break;
1557 	default:
1558 		break;
1559 	}
1560 
1561 	BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels) <
1562 		     ARIZONA_NUM_MICD_BUTTON_LEVELS);
1563 
1564 	if (arizona->pdata.num_micd_ranges) {
1565 		info->micd_ranges = pdata->micd_ranges;
1566 		info->num_micd_ranges = pdata->num_micd_ranges;
1567 	} else {
1568 		info->micd_ranges = micd_default_ranges;
1569 		info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges);
1570 	}
1571 
1572 	if (arizona->pdata.num_micd_ranges > ARIZONA_MAX_MICD_RANGE) {
1573 		dev_err(arizona->dev, "Too many MICD ranges: %d\n",
1574 			arizona->pdata.num_micd_ranges);
1575 	}
1576 
1577 	if (info->num_micd_ranges > 1) {
1578 		for (i = 1; i < info->num_micd_ranges; i++) {
1579 			if (info->micd_ranges[i - 1].max >
1580 			    info->micd_ranges[i].max) {
1581 				dev_err(arizona->dev,
1582 					"MICD ranges must be sorted\n");
1583 				ret = -EINVAL;
1584 				goto err_gpio;
1585 			}
1586 		}
1587 	}
1588 
1589 	/* Disable all buttons by default */
1590 	regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1591 			   ARIZONA_MICD_LVL_SEL_MASK, 0x81);
1592 
1593 	/* Set up all the buttons the user specified */
1594 	for (i = 0; i < info->num_micd_ranges; i++) {
1595 		for (j = 0; j < ARIZONA_NUM_MICD_BUTTON_LEVELS; j++)
1596 			if (arizona_micd_levels[j] >= info->micd_ranges[i].max)
1597 				break;
1598 
1599 		if (j == ARIZONA_NUM_MICD_BUTTON_LEVELS) {
1600 			dev_err(arizona->dev, "Unsupported MICD level %d\n",
1601 				info->micd_ranges[i].max);
1602 			ret = -EINVAL;
1603 			goto err_gpio;
1604 		}
1605 
1606 		dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n",
1607 			arizona_micd_levels[j], i);
1608 
1609 		arizona_micd_set_level(arizona, i, j);
1610 		input_set_capability(info->input, EV_KEY,
1611 				     info->micd_ranges[i].key);
1612 
1613 		/* Enable reporting of that range */
1614 		regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1615 				   1 << i, 1 << i);
1616 	}
1617 
1618 	/* Set all the remaining keys to a maximum */
1619 	for (; i < ARIZONA_MAX_MICD_RANGE; i++)
1620 		arizona_micd_set_level(arizona, i, 0x3f);
1621 
1622 	/*
1623 	 * If we have a clamp use it, activating in conjunction with
1624 	 * GPIO5 if that is connected for jack detect operation.
1625 	 */
1626 	if (info->micd_clamp) {
1627 		if (arizona->pdata.jd_gpio5) {
1628 			/* Put the GPIO into input mode with optional pull */
1629 			val = 0xc101;
1630 			if (arizona->pdata.jd_gpio5_nopull)
1631 				val &= ~ARIZONA_GPN_PU;
1632 
1633 			regmap_write(arizona->regmap, ARIZONA_GPIO5_CTRL,
1634 				     val);
1635 
1636 			if (arizona->pdata.jd_invert)
1637 				clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDH_GP5H;
1638 			else
1639 				clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDL_GP5H;
1640 		} else {
1641 			if (arizona->pdata.jd_invert)
1642 				clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDH;
1643 			else
1644 				clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDL;
1645 		}
1646 
1647 		regmap_update_bits(arizona->regmap,
1648 				   ARIZONA_MICD_CLAMP_CONTROL,
1649 				   ARIZONA_MICD_CLAMP_MODE_MASK, clamp_mode);
1650 
1651 		regmap_update_bits(arizona->regmap,
1652 				   ARIZONA_JACK_DETECT_DEBOUNCE,
1653 				   ARIZONA_MICD_CLAMP_DB,
1654 				   ARIZONA_MICD_CLAMP_DB);
1655 	}
1656 
1657 	arizona_extcon_set_mode(info, 0);
1658 
1659 	pm_runtime_enable(&pdev->dev);
1660 	pm_runtime_idle(&pdev->dev);
1661 	pm_runtime_get_sync(&pdev->dev);
1662 
1663 	if (info->micd_clamp) {
1664 		jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1665 		jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1666 	} else {
1667 		jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1668 		jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1669 	}
1670 
1671 	ret = arizona_request_irq(arizona, jack_irq_rise,
1672 				  "JACKDET rise", arizona_jackdet, info);
1673 	if (ret != 0) {
1674 		dev_err(&pdev->dev, "Failed to get JACKDET rise IRQ: %d\n",
1675 			ret);
1676 		goto err_pm;
1677 	}
1678 
1679 	ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1);
1680 	if (ret != 0) {
1681 		dev_err(&pdev->dev, "Failed to set JD rise IRQ wake: %d\n",
1682 			ret);
1683 		goto err_rise;
1684 	}
1685 
1686 	ret = arizona_request_irq(arizona, jack_irq_fall,
1687 				  "JACKDET fall", arizona_jackdet, info);
1688 	if (ret != 0) {
1689 		dev_err(&pdev->dev, "Failed to get JD fall IRQ: %d\n", ret);
1690 		goto err_rise_wake;
1691 	}
1692 
1693 	ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1);
1694 	if (ret != 0) {
1695 		dev_err(&pdev->dev, "Failed to set JD fall IRQ wake: %d\n",
1696 			ret);
1697 		goto err_fall;
1698 	}
1699 
1700 	ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET,
1701 				  "MICDET", arizona_micdet, info);
1702 	if (ret != 0) {
1703 		dev_err(&pdev->dev, "Failed to get MICDET IRQ: %d\n", ret);
1704 		goto err_fall_wake;
1705 	}
1706 
1707 	ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET,
1708 				  "HPDET", arizona_hpdet_irq, info);
1709 	if (ret != 0) {
1710 		dev_err(&pdev->dev, "Failed to get HPDET IRQ: %d\n", ret);
1711 		goto err_micdet;
1712 	}
1713 
1714 	arizona_clk32k_enable(arizona);
1715 	regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_DEBOUNCE,
1716 			   ARIZONA_JD1_DB, ARIZONA_JD1_DB);
1717 	regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1718 			   ARIZONA_JD1_ENA, ARIZONA_JD1_ENA);
1719 
1720 	ret = regulator_allow_bypass(info->micvdd, true);
1721 	if (ret != 0)
1722 		dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n",
1723 			 ret);
1724 
1725 	ret = input_register_device(info->input);
1726 	if (ret) {
1727 		dev_err(&pdev->dev, "Can't register input device: %d\n", ret);
1728 		goto err_hpdet;
1729 	}
1730 
1731 	pm_runtime_put(&pdev->dev);
1732 
1733 	return 0;
1734 
1735 err_hpdet:
1736 	arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1737 err_micdet:
1738 	arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1739 err_fall_wake:
1740 	arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1741 err_fall:
1742 	arizona_free_irq(arizona, jack_irq_fall, info);
1743 err_rise_wake:
1744 	arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1745 err_rise:
1746 	arizona_free_irq(arizona, jack_irq_rise, info);
1747 err_pm:
1748 	pm_runtime_put(&pdev->dev);
1749 	pm_runtime_disable(&pdev->dev);
1750 err_gpio:
1751 	gpiod_put(info->micd_pol_gpio);
1752 	return ret;
1753 }
1754 
1755 static int arizona_extcon_remove(struct platform_device *pdev)
1756 {
1757 	struct arizona_extcon_info *info = platform_get_drvdata(pdev);
1758 	struct arizona *arizona = info->arizona;
1759 	int jack_irq_rise, jack_irq_fall;
1760 	bool change;
1761 	int ret;
1762 
1763 	if (info->micd_clamp) {
1764 		jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1765 		jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1766 	} else {
1767 		jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1768 		jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1769 	}
1770 
1771 	arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1772 	arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1773 	arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1774 	arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1775 	arizona_free_irq(arizona, jack_irq_rise, info);
1776 	arizona_free_irq(arizona, jack_irq_fall, info);
1777 	cancel_delayed_work_sync(&info->hpdet_work);
1778 	cancel_delayed_work_sync(&info->micd_detect_work);
1779 	cancel_delayed_work_sync(&info->micd_timeout_work);
1780 
1781 	ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
1782 				       ARIZONA_MICD_ENA, 0,
1783 				       &change);
1784 	if (ret < 0) {
1785 		dev_err(&pdev->dev, "Failed to disable micd on remove: %d\n",
1786 			ret);
1787 	} else if (change) {
1788 		regulator_disable(info->micvdd);
1789 		pm_runtime_put(info->dev);
1790 	}
1791 
1792 	regmap_update_bits(arizona->regmap,
1793 			   ARIZONA_MICD_CLAMP_CONTROL,
1794 			   ARIZONA_MICD_CLAMP_MODE_MASK, 0);
1795 	regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1796 			   ARIZONA_JD1_ENA, 0);
1797 	arizona_clk32k_disable(arizona);
1798 
1799 	gpiod_put(info->micd_pol_gpio);
1800 
1801 	pm_runtime_disable(&pdev->dev);
1802 
1803 	return 0;
1804 }
1805 
1806 static struct platform_driver arizona_extcon_driver = {
1807 	.driver		= {
1808 		.name	= "arizona-extcon",
1809 	},
1810 	.probe		= arizona_extcon_probe,
1811 	.remove		= arizona_extcon_remove,
1812 };
1813 
1814 module_platform_driver(arizona_extcon_driver);
1815 
1816 MODULE_DESCRIPTION("Arizona Extcon driver");
1817 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1818 MODULE_LICENSE("GPL");
1819 MODULE_ALIAS("platform:extcon-arizona");
1820