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