1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * extcon-arizona.c - Extcon driver Wolfson Arizona devices
5 * Copyright (C) 2012-2014 Wolfson Microelectronics plc
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>
23 #include <sound/soc.h>
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>
30 #define ARIZONA_MAX_MICD_RANGE 8
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
37 #define ARIZONA_TST_CAP_DEFAULT 0x3
38 #define ARIZONA_TST_CAP_CLAMP 0x1
40 #define ARIZONA_HPDET_MAX 10000
42 #define HPDET_DEBOUNCE 500
43 #define DEFAULT_MICD_TIMEOUT 2000
45 #define ARIZONA_HPDET_WAIT_COUNT 15
46 #define ARIZONA_HPDET_WAIT_DELAY_MS 20
48 #define QUICK_HEADPHONE_MAX_OHM 3
49 #define MICROPHONE_MIN_OHM 1257
50 #define MICROPHONE_MAX_OHM 30000
52 #define MICD_DBTIME_TWO_READINGS 2
53 #define MICD_DBTIME_FOUR_READINGS 4
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 | \
60 #define MICD_LVL_0_TO_7 (ARIZONA_MICD_LVL_0 | MICD_LVL_1_TO_7)
62 #define MICD_LVL_0_TO_8 (MICD_LVL_0_TO_7 | ARIZONA_MICD_LVL_8)
64 struct arizona_extcon_info {
66 struct arizona *arizona;
68 struct regulator *micvdd;
69 struct input_dev *input;
74 const struct arizona_micd_config *micd_modes;
77 const struct arizona_micd_range *micd_ranges;
85 struct delayed_work hpdet_work;
86 struct delayed_work micd_detect_work;
87 struct delayed_work micd_timeout_work;
94 unsigned int hpdet_res[3];
100 int hpdet_ip_version;
102 struct extcon_dev *edev;
104 struct gpio_desc *micd_pol_gpio;
107 static const struct arizona_micd_config micd_default_modes[] = {
108 { ARIZONA_ACCDET_SRC, 1, 0 },
112 static 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 },
121 /* The number of levels in arizona_micd_levels valid for button thresholds */
122 #define ARIZONA_NUM_MICD_BUTTON_LEVELS 64
124 static 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,
132 static const unsigned int arizona_cable[] = {
134 EXTCON_JACK_MICROPHONE,
135 EXTCON_JACK_HEADPHONE,
136 EXTCON_JACK_LINE_OUT,
140 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info);
142 static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info,
145 struct arizona *arizona = info->arizona;
146 unsigned int mask = 0, val = 0;
147 unsigned int cap_sel = 0;
150 switch (arizona->type) {
157 mask = ARIZONA_HP1L_SHRTO | ARIZONA_HP1L_FLWR |
160 val = ARIZONA_HP1L_SHRTO;
161 cap_sel = ARIZONA_TST_CAP_CLAMP;
163 val = ARIZONA_HP1L_FLWR | ARIZONA_HP1L_SHRTI;
164 cap_sel = ARIZONA_TST_CAP_DEFAULT;
167 ret = regmap_update_bits(arizona->regmap,
168 ARIZONA_HP_TEST_CTRL_1,
169 ARIZONA_HP1_TST_CAP_SEL_MASK,
172 dev_warn(arizona->dev,
173 "Failed to set TST_CAP_SEL: %d\n", ret);
176 mask = ARIZONA_RMV_SHRT_HP1L;
178 val = ARIZONA_RMV_SHRT_HP1L;
182 snd_soc_dapm_mutex_lock(arizona->dapm);
184 arizona->hpdet_clamp = clamp;
186 /* Keep the HP output stages disabled while doing the clamp */
188 ret = regmap_update_bits(arizona->regmap,
189 ARIZONA_OUTPUT_ENABLES_1,
191 ARIZONA_OUT1R_ENA, 0);
193 dev_warn(arizona->dev,
194 "Failed to disable headphone outputs: %d\n",
199 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L,
202 dev_warn(arizona->dev, "Failed to do clamp: %d\n",
205 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R,
208 dev_warn(arizona->dev, "Failed to do clamp: %d\n",
212 /* Restore the desired state while not doing the clamp */
214 ret = regmap_update_bits(arizona->regmap,
215 ARIZONA_OUTPUT_ENABLES_1,
217 ARIZONA_OUT1R_ENA, arizona->hp_ena);
219 dev_warn(arizona->dev,
220 "Failed to restore headphone outputs: %d\n",
224 snd_soc_dapm_mutex_unlock(arizona->dapm);
227 static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode)
229 struct arizona *arizona = info->arizona;
231 mode %= info->micd_num_modes;
233 gpiod_set_value_cansleep(info->micd_pol_gpio,
234 info->micd_modes[mode].gpio);
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);
243 info->micd_mode = mode;
245 dev_dbg(arizona->dev, "Set jack polarity to %d\n", mode);
248 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info *info)
250 switch (info->micd_modes[0].bias) {
262 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info)
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);
270 ret = snd_soc_component_force_enable_pin(component, widget);
272 dev_warn(arizona->dev, "Failed to enable %s: %d\n",
275 snd_soc_dapm_sync(dapm);
277 if (!arizona->pdata.micd_force_micbias) {
278 ret = snd_soc_component_disable_pin(component, widget);
280 dev_warn(arizona->dev, "Failed to disable %s: %d\n",
283 snd_soc_dapm_sync(dapm);
287 static void arizona_start_mic(struct arizona_extcon_info *info)
289 struct arizona *arizona = info->arizona;
294 /* Microphone detection can't use idle mode */
295 pm_runtime_get(info->dev);
297 if (info->detecting) {
298 ret = regulator_allow_bypass(info->micvdd, false);
300 dev_err(arizona->dev,
301 "Failed to regulate MICVDD: %d\n",
306 ret = regulator_enable(info->micvdd);
308 dev_err(arizona->dev, "Failed to enable MICVDD: %d\n",
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);
318 if (info->detecting && arizona->pdata.micd_software_compare)
319 mode = ARIZONA_ACCDET_MODE_ADC;
321 mode = ARIZONA_ACCDET_MODE_MIC;
323 regmap_update_bits(arizona->regmap,
324 ARIZONA_ACCESSORY_DETECT_MODE_1,
325 ARIZONA_ACCDET_MODE_MASK, mode);
327 arizona_extcon_pulse_micbias(info);
329 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
330 ARIZONA_MICD_ENA, ARIZONA_MICD_ENA,
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);
340 static void arizona_stop_mic(struct arizona_extcon_info *info)
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);
349 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
353 dev_err(arizona->dev, "Failed to disable micd: %d\n", ret);
355 ret = snd_soc_component_disable_pin(component, widget);
357 dev_warn(arizona->dev,
358 "Failed to disable %s: %d\n",
361 snd_soc_dapm_sync(dapm);
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);
369 ret = regulator_allow_bypass(info->micvdd, true);
371 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
376 regulator_disable(info->micvdd);
377 pm_runtime_mark_last_busy(info->dev);
378 pm_runtime_put_autosuspend(info->dev);
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 },
392 #define ARIZONA_HPDET_B_RANGE_MAX 0x3fb
397 } arizona_hpdet_c_ranges[] = {
404 static int arizona_hpdet_read(struct arizona_extcon_info *info)
406 struct arizona *arizona = info->arizona;
407 unsigned int val, range;
410 ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2, &val);
412 dev_err(arizona->dev, "Failed to read HPDET status: %d\n",
417 switch (info->hpdet_ip_version) {
419 if (!(val & ARIZONA_HP_DONE)) {
420 dev_err(arizona->dev, "HPDET did not complete: %x\n",
425 val &= ARIZONA_HP_LVL_MASK;
429 if (!(val & ARIZONA_HP_DONE_B)) {
430 dev_err(arizona->dev, "HPDET did not complete: %x\n",
435 ret = regmap_read(arizona->regmap, ARIZONA_HP_DACVAL, &val);
437 dev_err(arizona->dev, "Failed to read HP value: %d\n",
442 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
444 range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
445 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
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)) {
451 dev_dbg(arizona->dev, "Moving to HPDET range %d\n",
453 regmap_update_bits(arizona->regmap,
454 ARIZONA_HEADPHONE_DETECT_1,
455 ARIZONA_HP_IMPEDANCE_RANGE_MASK,
457 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
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;
468 dev_dbg(arizona->dev, "HPDET read %d in range %d\n",
471 val = arizona_hpdet_b_ranges[range].factor_b
473 arizona_hpdet_b_ranges[range].factor_a);
477 if (!(val & ARIZONA_HP_DONE_B)) {
478 dev_err(arizona->dev, "HPDET did not complete: %x\n",
483 val &= ARIZONA_HP_LVL_B_MASK;
484 /* Convert to ohms, the value is in 0.5 ohm increments */
487 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
489 range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
490 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
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)) {
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,
503 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
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;
515 dev_warn(arizona->dev, "Unknown HPDET IP revision %d\n",
516 info->hpdet_ip_version);
520 dev_dbg(arizona->dev, "HP impedance %d ohms\n", val);
524 static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading,
527 struct arizona *arizona = info->arizona;
528 int id_gpio = arizona->pdata.hpdet_id_gpio;
531 * If we're using HPDET for accessory identification we need
532 * to take multiple measurements, step through them in sequence.
534 if (arizona->pdata.hpdet_acc_id) {
535 info->hpdet_res[info->num_hpdet_res++] = *reading;
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");
541 regmap_update_bits(arizona->regmap,
542 ARIZONA_ACCESSORY_DETECT_MODE_1,
543 ARIZONA_ACCDET_MODE_MASK |
545 ARIZONA_ACCDET_MODE_HPR |
546 info->micd_modes[0].src);
548 gpio_set_value_cansleep(id_gpio, 1);
550 regmap_update_bits(arizona->regmap,
551 ARIZONA_HEADPHONE_DETECT_1,
552 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
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]);
560 /* Take the headphone impedance for the main report */
561 *reading = info->hpdet_res[0];
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);
574 * If we measure the mic as high impedance
576 if (!id_gpio || info->hpdet_res[1] > 50) {
577 dev_dbg(arizona->dev, "Detected mic\n");
579 info->detecting = true;
581 dev_dbg(arizona->dev, "Detected headphone\n");
584 /* Make sure everything is reset back to the real polarity */
585 regmap_update_bits(arizona->regmap,
586 ARIZONA_ACCESSORY_DETECT_MODE_1,
588 info->micd_modes[0].src);
594 static irqreturn_t arizona_hpdet_irq(int irq, void *data)
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;
603 mutex_lock(&info->lock);
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);
612 /* If the cable was removed while measuring ignore the result */
613 ret = extcon_get_state(info->edev, EXTCON_MECHANICAL);
615 dev_err(arizona->dev, "Failed to check cable state: %d\n",
619 dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
623 ret = arizona_hpdet_read(info);
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,
636 ret = arizona_hpdet_do_id(info, &reading, &mic);
642 /* Report high impedence cables as line outputs */
644 report = EXTCON_JACK_LINE_OUT;
646 report = EXTCON_JACK_HEADPHONE;
648 ret = extcon_set_state_sync(info->edev, report, true);
650 dev_err(arizona->dev, "Failed to report HP/line: %d\n",
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,
660 arizona_extcon_hp_clamp(info, false);
663 gpio_set_value_cansleep(id_gpio, 0);
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);
670 /* If we have a mic then reenable MICDET */
671 if (mic || info->mic)
672 arizona_start_mic(info);
674 if (info->hpdet_active) {
675 pm_runtime_put_autosuspend(info->dev);
676 info->hpdet_active = false;
679 info->hpdet_done = true;
682 mutex_unlock(&info->lock);
687 static void arizona_identify_headphone(struct arizona_extcon_info *info)
689 struct arizona *arizona = info->arizona;
692 if (info->hpdet_done)
695 dev_dbg(arizona->dev, "Starting HPDET\n");
697 /* Make sure we keep the device enabled during the measurement */
698 pm_runtime_get(info->dev);
700 info->hpdet_active = true;
703 arizona_stop_mic(info);
705 arizona_extcon_hp_clamp(info, true);
707 ret = regmap_update_bits(arizona->regmap,
708 ARIZONA_ACCESSORY_DETECT_MODE_1,
709 ARIZONA_ACCDET_MODE_MASK,
710 arizona->pdata.hpdet_channel);
712 dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
716 ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
717 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
719 dev_err(arizona->dev, "Can't start HPDETL measurement: %d\n",
727 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
728 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
730 /* Just report headphone */
731 ret = extcon_set_state_sync(info->edev, EXTCON_JACK_HEADPHONE, true);
733 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
736 arizona_start_mic(info);
738 info->hpdet_active = false;
741 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
743 struct arizona *arizona = info->arizona;
748 dev_dbg(arizona->dev, "Starting identification via HPDET\n");
750 /* Make sure we keep the device enabled during the measurement */
751 pm_runtime_get_sync(info->dev);
753 info->hpdet_active = true;
755 arizona_extcon_hp_clamp(info, true);
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);
763 dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
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);
772 dev_err(arizona->dev,
773 "Can't start HPDETL measurement: %d\n",
778 arizona_hpdet_do_id(info, &hp_reading, &mic);
784 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
785 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
787 /* Just report headphone */
788 ret = extcon_set_state_sync(info->edev, EXTCON_JACK_HEADPHONE, true);
790 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
792 info->hpdet_active = false;
795 static void arizona_micd_timeout_work(struct work_struct *work)
797 struct arizona_extcon_info *info = container_of(work,
798 struct arizona_extcon_info,
799 micd_timeout_work.work);
801 mutex_lock(&info->lock);
803 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
805 info->detecting = false;
807 arizona_identify_headphone(info);
809 arizona_stop_mic(info);
811 mutex_unlock(&info->lock);
814 static void arizona_micd_detect(struct work_struct *work)
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;
823 cancel_delayed_work_sync(&info->micd_timeout_work);
825 mutex_lock(&info->lock);
827 /* If the cable was removed while measuring ignore the result */
828 ret = extcon_get_state(info->edev, EXTCON_MECHANICAL);
830 dev_err(arizona->dev, "Failed to check cable state: %d\n",
832 mutex_unlock(&info->lock);
835 dev_dbg(arizona->dev, "Ignoring MICDET for removed cable\n");
836 mutex_unlock(&info->lock);
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);
846 dev_err(arizona->dev,
847 "Failed to read MICDET_ADCVAL: %d\n",
849 mutex_unlock(&info->lock);
853 dev_dbg(arizona->dev, "MICDET_ADCVAL: %x\n", val);
855 val &= ARIZONA_MICDET_ADCVAL_MASK;
856 if (val < ARRAY_SIZE(arizona_micd_levels))
857 val = arizona_micd_levels[val];
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;
868 val = ARIZONA_MICD_LVL_8;
871 for (i = 0; i < 10 && !(val & MICD_LVL_0_TO_8); i++) {
872 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
874 dev_err(arizona->dev,
875 "Failed to read MICDET: %d\n", ret);
876 mutex_unlock(&info->lock);
880 dev_dbg(arizona->dev, "MICDET: %x\n", val);
882 if (!(val & ARIZONA_MICD_VALID)) {
883 dev_warn(arizona->dev,
884 "Microphone detection state invalid\n");
885 mutex_unlock(&info->lock);
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);
896 /* Due to jack detect this should never happen */
897 if (!(val & ARIZONA_MICD_STS)) {
898 dev_warn(arizona->dev, "Detected open circuit\n");
900 arizona_stop_mic(info);
901 info->detecting = false;
902 arizona_identify_headphone(info);
906 /* If we got a high impedence we should have a headset, report it. */
907 if (info->detecting && (val & ARIZONA_MICD_LVL_8)) {
909 info->detecting = false;
911 arizona_identify_headphone(info);
913 ret = extcon_set_state_sync(info->edev,
914 EXTCON_JACK_MICROPHONE, true);
916 dev_err(arizona->dev, "Headset report failed: %d\n",
919 /* Don't need to regulate for button detection */
920 ret = regulator_allow_bypass(info->micvdd, true);
922 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
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.
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");
939 info->detecting = false;
941 arizona_identify_headphone(info);
943 arizona_stop_mic(info);
946 if (info->micd_mode == info->micd_num_modes)
948 arizona_extcon_set_mode(info, info->micd_mode);
957 * If we're still detecting and we detect a short then we've
958 * got a headphone. Otherwise it's a button press.
960 if (val & MICD_LVL_0_TO_7) {
962 dev_dbg(arizona->dev, "Mic button detected\n");
964 lvl = val & ARIZONA_MICD_LVL_MASK;
965 lvl >>= ARIZONA_MICD_LVL_SHIFT;
967 for (i = 0; i < info->num_micd_ranges; i++)
968 input_report_key(info->input,
969 info->micd_ranges[i].key, 0);
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);
979 } else if (info->detecting) {
980 dev_dbg(arizona->dev, "Headphone detected\n");
981 info->detecting = false;
982 arizona_stop_mic(info);
984 arizona_identify_headphone(info);
986 dev_warn(arizona->dev, "Button with no mic: %x\n",
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);
999 if (info->detecting) {
1000 if (arizona->pdata.micd_software_compare)
1001 regmap_update_bits(arizona->regmap,
1002 ARIZONA_MIC_DETECT_1,
1006 queue_delayed_work(system_power_efficient_wq,
1007 &info->micd_timeout_work,
1008 msecs_to_jiffies(info->micd_timeout));
1011 pm_runtime_mark_last_busy(info->dev);
1012 mutex_unlock(&info->lock);
1015 static irqreturn_t arizona_micdet(int irq, void *data)
1017 struct arizona_extcon_info *info = data;
1018 struct arizona *arizona = info->arizona;
1019 int debounce = arizona->pdata.micd_detect_debounce;
1021 cancel_delayed_work_sync(&info->micd_detect_work);
1022 cancel_delayed_work_sync(&info->micd_timeout_work);
1024 mutex_lock(&info->lock);
1025 if (!info->detecting)
1027 mutex_unlock(&info->lock);
1030 queue_delayed_work(system_power_efficient_wq,
1031 &info->micd_detect_work,
1032 msecs_to_jiffies(debounce));
1034 arizona_micd_detect(&info->micd_detect_work.work);
1039 static void arizona_hpdet_work(struct work_struct *work)
1041 struct arizona_extcon_info *info = container_of(work,
1042 struct arizona_extcon_info,
1045 mutex_lock(&info->lock);
1046 arizona_start_hpdet_acc_id(info);
1047 mutex_unlock(&info->lock);
1050 static int arizona_hpdet_wait(struct arizona_extcon_info *info)
1052 struct arizona *arizona = info->arizona;
1056 for (i = 0; i < ARIZONA_HPDET_WAIT_COUNT; i++) {
1057 ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2,
1060 dev_err(arizona->dev,
1061 "Failed to read HPDET state: %d\n", ret);
1065 switch (info->hpdet_ip_version) {
1067 if (val & ARIZONA_HP_DONE)
1071 if (val & ARIZONA_HP_DONE_B)
1076 msleep(ARIZONA_HPDET_WAIT_DELAY_MS);
1079 dev_warn(arizona->dev, "HPDET did not appear to complete\n");
1084 static irqreturn_t arizona_jackdet(int irq, void *data)
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;
1092 cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
1093 cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);
1095 pm_runtime_get_sync(info->dev);
1097 mutex_lock(&info->lock);
1099 if (info->micd_clamp) {
1100 mask = ARIZONA_MICD_CLAMP_STS;
1103 mask = ARIZONA_JD1_STS;
1104 if (arizona->pdata.jd_invert)
1107 present = ARIZONA_JD1_STS;
1110 ret = regmap_read(arizona->regmap, ARIZONA_AOD_IRQ_RAW_STATUS, &val);
1112 dev_err(arizona->dev, "Failed to read jackdet status: %d\n",
1114 mutex_unlock(&info->lock);
1115 pm_runtime_put_autosuspend(info->dev);
1120 if (val == info->last_jackdet) {
1121 dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
1123 queue_delayed_work(system_power_efficient_wq,
1125 msecs_to_jiffies(HPDET_DEBOUNCE));
1127 if (cancelled_mic) {
1128 int micd_timeout = info->micd_timeout;
1130 queue_delayed_work(system_power_efficient_wq,
1131 &info->micd_timeout_work,
1132 msecs_to_jiffies(micd_timeout));
1137 info->last_jackdet = val;
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);
1145 dev_err(arizona->dev, "Mechanical report failed: %d\n",
1148 if (!arizona->pdata.hpdet_acc_id) {
1149 info->detecting = true;
1151 info->jack_flips = 0;
1153 arizona_start_mic(info);
1155 queue_delayed_work(system_power_efficient_wq,
1157 msecs_to_jiffies(HPDET_DEBOUNCE));
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 |
1166 dev_dbg(arizona->dev, "Detected jack removal\n");
1168 arizona_stop_mic(info);
1170 info->num_hpdet_res = 0;
1171 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
1172 info->hpdet_res[i] = 0;
1174 info->hpdet_done = false;
1175 info->hpdet_retried = false;
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);
1182 for (i = 0; i < ARRAY_SIZE(arizona_cable) - 1; i++) {
1183 ret = extcon_set_state_sync(info->edev,
1184 arizona_cable[i], false);
1186 dev_err(arizona->dev,
1187 "Removal report failed: %d\n", ret);
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
1197 arizona_hpdet_wait(info);
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);
1205 if (arizona->pdata.micd_timeout)
1206 info->micd_timeout = arizona->pdata.micd_timeout;
1208 info->micd_timeout = DEFAULT_MICD_TIMEOUT;
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);
1218 mutex_unlock(&info->lock);
1220 pm_runtime_mark_last_busy(info->dev);
1221 pm_runtime_put_autosuspend(info->dev);
1226 /* Map a level onto a slot in the register bank */
1227 static void arizona_micd_set_level(struct arizona *arizona, int index,
1233 reg = ARIZONA_MIC_DETECT_LEVEL_4 - (index / 2);
1242 /* Program the level itself */
1243 regmap_update_bits(arizona->regmap, reg, mask, level);
1246 static int arizona_extcon_get_micd_configs(struct device *dev,
1247 struct arizona *arizona)
1249 const char * const prop = "wlf,micd-configs";
1250 const int entries_per_config = 3;
1251 struct arizona_micd_config *micd_configs;
1256 nconfs = device_property_count_u32(arizona->dev, prop);
1260 vals = kcalloc(nconfs, sizeof(u32), GFP_KERNEL);
1264 ret = device_property_read_u32_array(arizona->dev, prop, vals, nconfs);
1268 nconfs /= entries_per_config;
1269 micd_configs = devm_kcalloc(dev, nconfs, sizeof(*micd_configs),
1271 if (!micd_configs) {
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++];
1282 arizona->pdata.micd_configs = micd_configs;
1283 arizona->pdata.num_micd_configs = nconfs;
1290 static int arizona_extcon_device_get_pdata(struct device *dev,
1291 struct arizona *arizona)
1293 struct arizona_pdata *pdata = &arizona->pdata;
1294 unsigned int val = ARIZONA_ACCDET_MODE_HPL;
1297 device_property_read_u32(arizona->dev, "wlf,hpdet-channel", &val);
1299 case ARIZONA_ACCDET_MODE_HPL:
1300 case ARIZONA_ACCDET_MODE_HPR:
1301 pdata->hpdet_channel = val;
1304 dev_err(arizona->dev,
1305 "Wrong wlf,hpdet-channel DT value %d\n", val);
1306 pdata->hpdet_channel = ARIZONA_ACCDET_MODE_HPL;
1309 device_property_read_u32(arizona->dev, "wlf,micd-detect-debounce",
1310 &pdata->micd_detect_debounce);
1312 device_property_read_u32(arizona->dev, "wlf,micd-bias-start-time",
1313 &pdata->micd_bias_start_time);
1315 device_property_read_u32(arizona->dev, "wlf,micd-rate",
1318 device_property_read_u32(arizona->dev, "wlf,micd-dbtime",
1319 &pdata->micd_dbtime);
1321 device_property_read_u32(arizona->dev, "wlf,micd-timeout-ms",
1322 &pdata->micd_timeout);
1324 pdata->micd_force_micbias = device_property_read_bool(arizona->dev,
1325 "wlf,micd-force-micbias");
1327 pdata->micd_software_compare = device_property_read_bool(arizona->dev,
1328 "wlf,micd-software-compare");
1330 pdata->jd_invert = device_property_read_bool(arizona->dev,
1333 device_property_read_u32(arizona->dev, "wlf,gpsw", &pdata->gpsw);
1335 pdata->jd_gpio5 = device_property_read_bool(arizona->dev,
1337 pdata->jd_gpio5_nopull = device_property_read_bool(arizona->dev,
1338 "wlf,use-jd2-nopull");
1340 ret = arizona_extcon_get_micd_configs(dev, arizona);
1342 dev_err(arizona->dev, "Failed to read micd configs: %d\n", ret);
1347 static int arizona_extcon_probe(struct platform_device *pdev)
1349 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1350 struct arizona_pdata *pdata = &arizona->pdata;
1351 struct arizona_extcon_info *info;
1353 unsigned int clamp_mode;
1354 int jack_irq_fall, jack_irq_rise;
1355 int ret, mode, i, j;
1357 if (!arizona->dapm || !arizona->dapm->card)
1358 return -EPROBE_DEFER;
1360 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
1364 if (!dev_get_platdata(arizona->dev))
1365 arizona_extcon_device_get_pdata(&pdev->dev, arizona);
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);
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);
1383 switch (arizona->type) {
1385 switch (arizona->rev) {
1387 info->micd_reva = true;
1390 info->micd_clamp = true;
1391 info->hpdet_ip_version = 1;
1397 switch (arizona->rev) {
1401 info->micd_clamp = true;
1402 info->hpdet_ip_version = 2;
1408 info->micd_clamp = true;
1409 info->hpdet_ip_version = 2;
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");
1421 ret = devm_extcon_dev_register(&pdev->dev, info->edev);
1423 dev_err(arizona->dev, "extcon_dev_register() failed: %d\n",
1428 info->input = devm_input_allocate_device(&pdev->dev);
1430 dev_err(arizona->dev, "Can't allocate input dev\n");
1435 info->input->name = "Headset";
1436 info->input->phys = "arizona/extcon";
1438 if (pdata->num_micd_configs) {
1439 info->micd_modes = pdata->micd_configs;
1440 info->micd_num_modes = pdata->num_micd_configs;
1442 info->micd_modes = micd_default_modes;
1443 info->micd_num_modes = ARRAY_SIZE(micd_default_modes);
1446 if (arizona->pdata.gpsw > 0)
1447 regmap_update_bits(arizona->regmap, ARIZONA_GP_SWITCH_1,
1448 ARIZONA_SW1_MODE_MASK, arizona->pdata.gpsw);
1450 if (pdata->micd_pol_gpio > 0) {
1451 if (info->micd_modes[0].gpio)
1452 mode = GPIOF_OUT_INIT_HIGH;
1454 mode = GPIOF_OUT_INIT_LOW;
1456 ret = devm_gpio_request_one(&pdev->dev, pdata->micd_pol_gpio,
1457 mode, "MICD polarity");
1459 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1460 pdata->micd_pol_gpio, ret);
1464 info->micd_pol_gpio = gpio_to_desc(pdata->micd_pol_gpio);
1466 if (info->micd_modes[0].gpio)
1467 mode = GPIOD_OUT_HIGH;
1469 mode = GPIOD_OUT_LOW;
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.
1476 info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
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",
1488 if (arizona->pdata.hpdet_id_gpio > 0) {
1489 ret = devm_gpio_request_one(&pdev->dev,
1490 arizona->pdata.hpdet_id_gpio,
1494 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1495 arizona->pdata.hpdet_id_gpio, ret);
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);
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);
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);
1518 case MICD_DBTIME_TWO_READINGS:
1519 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1520 ARIZONA_MICD_DBTIME_MASK, 0);
1526 BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels) <
1527 ARIZONA_NUM_MICD_BUTTON_LEVELS);
1529 if (arizona->pdata.num_micd_ranges) {
1530 info->micd_ranges = pdata->micd_ranges;
1531 info->num_micd_ranges = pdata->num_micd_ranges;
1533 info->micd_ranges = micd_default_ranges;
1534 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges);
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);
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");
1554 /* Disable all buttons by default */
1555 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1556 ARIZONA_MICD_LVL_SEL_MASK, 0x81);
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)
1564 if (j == ARIZONA_NUM_MICD_BUTTON_LEVELS) {
1565 dev_err(arizona->dev, "Unsupported MICD level %d\n",
1566 info->micd_ranges[i].max);
1571 dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n",
1572 arizona_micd_levels[j], i);
1574 arizona_micd_set_level(arizona, i, j);
1575 input_set_capability(info->input, EV_KEY,
1576 info->micd_ranges[i].key);
1578 /* Enable reporting of that range */
1579 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
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);
1588 * If we have a clamp use it, activating in conjunction with
1589 * GPIO5 if that is connected for jack detect operation.
1591 if (info->micd_clamp) {
1592 if (arizona->pdata.jd_gpio5) {
1593 /* Put the GPIO into input mode with optional pull */
1595 if (arizona->pdata.jd_gpio5_nopull)
1596 val &= ~ARIZONA_GPN_PU;
1598 regmap_write(arizona->regmap, ARIZONA_GPIO5_CTRL,
1601 if (arizona->pdata.jd_invert)
1602 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDH_GP5H;
1604 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDL_GP5H;
1606 if (arizona->pdata.jd_invert)
1607 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDH;
1609 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDL;
1612 regmap_update_bits(arizona->regmap,
1613 ARIZONA_MICD_CLAMP_CONTROL,
1614 ARIZONA_MICD_CLAMP_MODE_MASK, clamp_mode);
1616 regmap_update_bits(arizona->regmap,
1617 ARIZONA_JACK_DETECT_DEBOUNCE,
1618 ARIZONA_MICD_CLAMP_DB,
1619 ARIZONA_MICD_CLAMP_DB);
1622 arizona_extcon_set_mode(info, 0);
1624 pm_runtime_enable(&pdev->dev);
1625 pm_runtime_idle(&pdev->dev);
1626 pm_runtime_get_sync(&pdev->dev);
1628 if (info->micd_clamp) {
1629 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1630 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1632 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1633 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1636 ret = arizona_request_irq(arizona, jack_irq_rise,
1637 "JACKDET rise", arizona_jackdet, info);
1639 dev_err(&pdev->dev, "Failed to get JACKDET rise IRQ: %d\n",
1644 ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1);
1646 dev_err(&pdev->dev, "Failed to set JD rise IRQ wake: %d\n",
1651 ret = arizona_request_irq(arizona, jack_irq_fall,
1652 "JACKDET fall", arizona_jackdet, info);
1654 dev_err(&pdev->dev, "Failed to get JD fall IRQ: %d\n", ret);
1658 ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1);
1660 dev_err(&pdev->dev, "Failed to set JD fall IRQ wake: %d\n",
1665 ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET,
1666 "MICDET", arizona_micdet, info);
1668 dev_err(&pdev->dev, "Failed to get MICDET IRQ: %d\n", ret);
1672 ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET,
1673 "HPDET", arizona_hpdet_irq, info);
1675 dev_err(&pdev->dev, "Failed to get HPDET IRQ: %d\n", ret);
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);
1685 ret = regulator_allow_bypass(info->micvdd, true);
1687 dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n",
1690 pm_runtime_put(&pdev->dev);
1692 ret = input_register_device(info->input);
1694 dev_err(&pdev->dev, "Can't register input device: %d\n", ret);
1701 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1703 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1705 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1707 arizona_free_irq(arizona, jack_irq_fall, info);
1709 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1711 arizona_free_irq(arizona, jack_irq_rise, info);
1713 gpiod_put(info->micd_pol_gpio);
1715 pm_runtime_disable(&pdev->dev);
1719 static int arizona_extcon_remove(struct platform_device *pdev)
1721 struct arizona_extcon_info *info = platform_get_drvdata(pdev);
1722 struct arizona *arizona = info->arizona;
1723 int jack_irq_rise, jack_irq_fall;
1727 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
1728 ARIZONA_MICD_ENA, 0,
1731 dev_err(&pdev->dev, "Failed to disable micd on remove: %d\n",
1733 } else if (change) {
1734 regulator_disable(info->micvdd);
1735 pm_runtime_put(info->dev);
1738 gpiod_put(info->micd_pol_gpio);
1740 pm_runtime_disable(&pdev->dev);
1742 regmap_update_bits(arizona->regmap,
1743 ARIZONA_MICD_CLAMP_CONTROL,
1744 ARIZONA_MICD_CLAMP_MODE_MASK, 0);
1746 if (info->micd_clamp) {
1747 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1748 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1750 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1751 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
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);
1768 static struct platform_driver arizona_extcon_driver = {
1770 .name = "arizona-extcon",
1772 .probe = arizona_extcon_probe,
1773 .remove = arizona_extcon_remove,
1776 module_platform_driver(arizona_extcon_driver);
1778 MODULE_DESCRIPTION("Arizona Extcon driver");
1780 MODULE_LICENSE("GPL");
1781 MODULE_ALIAS("platform:extcon-arizona");