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