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;
83 struct delayed_work hpdet_work;
84 struct delayed_work micd_detect_work;
85 struct delayed_work micd_timeout_work;
92 unsigned int hpdet_res[3];
100 struct extcon_dev *edev;
102 struct gpio_desc *micd_pol_gpio;
105 static const struct arizona_micd_config micd_default_modes[] = {
106 { ARIZONA_ACCDET_SRC, 1, 0 },
110 static const struct arizona_micd_range micd_default_ranges[] = {
111 { .max = 11, .key = BTN_0 },
112 { .max = 28, .key = BTN_1 },
113 { .max = 54, .key = BTN_2 },
114 { .max = 100, .key = BTN_3 },
115 { .max = 186, .key = BTN_4 },
116 { .max = 430, .key = BTN_5 },
119 /* The number of levels in arizona_micd_levels valid for button thresholds */
120 #define ARIZONA_NUM_MICD_BUTTON_LEVELS 64
122 static const int arizona_micd_levels[] = {
123 3, 6, 8, 11, 13, 16, 18, 21, 23, 26, 28, 31, 34, 36, 39, 41, 44, 46,
124 49, 52, 54, 57, 60, 62, 65, 67, 70, 73, 75, 78, 81, 83, 89, 94, 100,
125 105, 111, 116, 122, 127, 139, 150, 161, 173, 186, 196, 209, 220, 245,
126 270, 295, 321, 348, 375, 402, 430, 489, 550, 614, 681, 752, 903, 1071,
130 static const unsigned int arizona_cable[] = {
132 EXTCON_JACK_MICROPHONE,
133 EXTCON_JACK_HEADPHONE,
134 EXTCON_JACK_LINE_OUT,
138 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info);
140 static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info,
143 struct arizona *arizona = info->arizona;
144 unsigned int mask = 0, val = 0;
145 unsigned int cap_sel = 0;
148 switch (arizona->type) {
155 mask = ARIZONA_HP1L_SHRTO | ARIZONA_HP1L_FLWR |
158 val = ARIZONA_HP1L_SHRTO;
159 cap_sel = ARIZONA_TST_CAP_CLAMP;
161 val = ARIZONA_HP1L_FLWR | ARIZONA_HP1L_SHRTI;
162 cap_sel = ARIZONA_TST_CAP_DEFAULT;
165 ret = regmap_update_bits(arizona->regmap,
166 ARIZONA_HP_TEST_CTRL_1,
167 ARIZONA_HP1_TST_CAP_SEL_MASK,
170 dev_warn(arizona->dev,
171 "Failed to set TST_CAP_SEL: %d\n", ret);
174 mask = ARIZONA_RMV_SHRT_HP1L;
176 val = ARIZONA_RMV_SHRT_HP1L;
180 snd_soc_dapm_mutex_lock(arizona->dapm);
182 arizona->hpdet_clamp = clamp;
184 /* Keep the HP output stages disabled while doing the clamp */
186 ret = regmap_update_bits(arizona->regmap,
187 ARIZONA_OUTPUT_ENABLES_1,
189 ARIZONA_OUT1R_ENA, 0);
191 dev_warn(arizona->dev,
192 "Failed to disable headphone outputs: %d\n",
197 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L,
200 dev_warn(arizona->dev, "Failed to do clamp: %d\n",
203 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R,
206 dev_warn(arizona->dev, "Failed to do clamp: %d\n",
210 /* Restore the desired state while not doing the clamp */
212 ret = regmap_update_bits(arizona->regmap,
213 ARIZONA_OUTPUT_ENABLES_1,
215 ARIZONA_OUT1R_ENA, arizona->hp_ena);
217 dev_warn(arizona->dev,
218 "Failed to restore headphone outputs: %d\n",
222 snd_soc_dapm_mutex_unlock(arizona->dapm);
225 static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode)
227 struct arizona *arizona = info->arizona;
229 mode %= info->micd_num_modes;
231 gpiod_set_value_cansleep(info->micd_pol_gpio,
232 info->micd_modes[mode].gpio);
234 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
235 ARIZONA_MICD_BIAS_SRC_MASK,
236 info->micd_modes[mode].bias <<
237 ARIZONA_MICD_BIAS_SRC_SHIFT);
238 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
239 ARIZONA_ACCDET_SRC, info->micd_modes[mode].src);
241 info->micd_mode = mode;
243 dev_dbg(arizona->dev, "Set jack polarity to %d\n", mode);
246 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info *info)
248 switch (info->micd_modes[0].bias) {
260 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info)
262 struct arizona *arizona = info->arizona;
263 const char *widget = arizona_extcon_get_micbias(info);
264 struct snd_soc_dapm_context *dapm = arizona->dapm;
265 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
268 ret = snd_soc_component_force_enable_pin(component, widget);
270 dev_warn(arizona->dev, "Failed to enable %s: %d\n",
273 snd_soc_dapm_sync(dapm);
275 if (!arizona->pdata.micd_force_micbias) {
276 ret = snd_soc_component_disable_pin(component, widget);
278 dev_warn(arizona->dev, "Failed to disable %s: %d\n",
281 snd_soc_dapm_sync(dapm);
285 static void arizona_start_mic(struct arizona_extcon_info *info)
287 struct arizona *arizona = info->arizona;
292 /* Microphone detection can't use idle mode */
293 pm_runtime_get(info->dev);
295 if (info->detecting) {
296 ret = regulator_allow_bypass(info->micvdd, false);
298 dev_err(arizona->dev,
299 "Failed to regulate MICVDD: %d\n",
304 ret = regulator_enable(info->micvdd);
306 dev_err(arizona->dev, "Failed to enable MICVDD: %d\n",
310 if (info->micd_reva) {
311 const struct reg_sequence reva[] = {
317 regmap_multi_reg_write(arizona->regmap, reva, ARRAY_SIZE(reva));
320 if (info->detecting && arizona->pdata.micd_software_compare)
321 mode = ARIZONA_ACCDET_MODE_ADC;
323 mode = ARIZONA_ACCDET_MODE_MIC;
325 regmap_update_bits(arizona->regmap,
326 ARIZONA_ACCESSORY_DETECT_MODE_1,
327 ARIZONA_ACCDET_MODE_MASK, mode);
329 arizona_extcon_pulse_micbias(info);
331 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
332 ARIZONA_MICD_ENA, ARIZONA_MICD_ENA,
335 dev_err(arizona->dev, "Failed to enable micd: %d\n", ret);
336 } else if (!change) {
337 regulator_disable(info->micvdd);
338 pm_runtime_put_autosuspend(info->dev);
342 static void arizona_stop_mic(struct arizona_extcon_info *info)
344 struct arizona *arizona = info->arizona;
345 const char *widget = arizona_extcon_get_micbias(info);
346 struct snd_soc_dapm_context *dapm = arizona->dapm;
347 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
351 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
355 dev_err(arizona->dev, "Failed to disable micd: %d\n", ret);
357 ret = snd_soc_component_disable_pin(component, widget);
359 dev_warn(arizona->dev,
360 "Failed to disable %s: %d\n",
363 snd_soc_dapm_sync(dapm);
365 if (info->micd_reva) {
366 const struct reg_sequence reva[] = {
372 regmap_multi_reg_write(arizona->regmap, reva, ARRAY_SIZE(reva));
375 ret = regulator_allow_bypass(info->micvdd, true);
377 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
382 regulator_disable(info->micvdd);
383 pm_runtime_mark_last_busy(info->dev);
384 pm_runtime_put_autosuspend(info->dev);
389 unsigned int threshold;
390 unsigned int factor_a;
391 unsigned int factor_b;
392 } arizona_hpdet_b_ranges[] = {
393 { 100, 5528, 362464 },
394 { 169, 11084, 6186851 },
395 { 169, 11065, 65460395 },
398 #define ARIZONA_HPDET_B_RANGE_MAX 0x3fb
403 } arizona_hpdet_c_ranges[] = {
410 static int arizona_hpdet_read(struct arizona_extcon_info *info)
412 struct arizona *arizona = info->arizona;
413 unsigned int val, range;
416 ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2, &val);
418 dev_err(arizona->dev, "Failed to read HPDET status: %d\n",
423 switch (info->hpdet_ip_version) {
425 if (!(val & ARIZONA_HP_DONE)) {
426 dev_err(arizona->dev, "HPDET did not complete: %x\n",
431 val &= ARIZONA_HP_LVL_MASK;
435 if (!(val & ARIZONA_HP_DONE_B)) {
436 dev_err(arizona->dev, "HPDET did not complete: %x\n",
441 ret = regmap_read(arizona->regmap, ARIZONA_HP_DACVAL, &val);
443 dev_err(arizona->dev, "Failed to read HP value: %d\n",
448 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
450 range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
451 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
453 if (range < ARRAY_SIZE(arizona_hpdet_b_ranges) - 1 &&
454 (val < arizona_hpdet_b_ranges[range].threshold ||
455 val >= ARIZONA_HPDET_B_RANGE_MAX)) {
457 dev_dbg(arizona->dev, "Moving to HPDET range %d\n",
459 regmap_update_bits(arizona->regmap,
460 ARIZONA_HEADPHONE_DETECT_1,
461 ARIZONA_HP_IMPEDANCE_RANGE_MASK,
463 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
467 /* If we go out of range report top of range */
468 if (val < arizona_hpdet_b_ranges[range].threshold ||
469 val >= ARIZONA_HPDET_B_RANGE_MAX) {
470 dev_dbg(arizona->dev, "Measurement out of range\n");
471 return ARIZONA_HPDET_MAX;
474 dev_dbg(arizona->dev, "HPDET read %d in range %d\n",
477 val = arizona_hpdet_b_ranges[range].factor_b
479 arizona_hpdet_b_ranges[range].factor_a);
483 if (!(val & ARIZONA_HP_DONE_B)) {
484 dev_err(arizona->dev, "HPDET did not complete: %x\n",
489 val &= ARIZONA_HP_LVL_B_MASK;
490 /* Convert to ohms, the value is in 0.5 ohm increments */
493 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
495 range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
496 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
498 /* Skip up a range, or report? */
499 if (range < ARRAY_SIZE(arizona_hpdet_c_ranges) - 1 &&
500 (val >= arizona_hpdet_c_ranges[range].max)) {
502 dev_dbg(arizona->dev, "Moving to HPDET range %d-%d\n",
503 arizona_hpdet_c_ranges[range].min,
504 arizona_hpdet_c_ranges[range].max);
505 regmap_update_bits(arizona->regmap,
506 ARIZONA_HEADPHONE_DETECT_1,
507 ARIZONA_HP_IMPEDANCE_RANGE_MASK,
509 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
513 if (range && (val < arizona_hpdet_c_ranges[range].min)) {
514 dev_dbg(arizona->dev, "Reporting range boundary %d\n",
515 arizona_hpdet_c_ranges[range].min);
516 val = arizona_hpdet_c_ranges[range].min;
521 dev_warn(arizona->dev, "Unknown HPDET IP revision %d\n",
522 info->hpdet_ip_version);
526 dev_dbg(arizona->dev, "HP impedance %d ohms\n", val);
530 static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading,
533 struct arizona *arizona = info->arizona;
534 int id_gpio = arizona->pdata.hpdet_id_gpio;
537 * If we're using HPDET for accessory identification we need
538 * to take multiple measurements, step through them in sequence.
540 if (arizona->pdata.hpdet_acc_id) {
541 info->hpdet_res[info->num_hpdet_res++] = *reading;
543 /* Only check the mic directly if we didn't already ID it */
544 if (id_gpio && info->num_hpdet_res == 1) {
545 dev_dbg(arizona->dev, "Measuring mic\n");
547 regmap_update_bits(arizona->regmap,
548 ARIZONA_ACCESSORY_DETECT_MODE_1,
549 ARIZONA_ACCDET_MODE_MASK |
551 ARIZONA_ACCDET_MODE_HPR |
552 info->micd_modes[0].src);
554 gpio_set_value_cansleep(id_gpio, 1);
556 regmap_update_bits(arizona->regmap,
557 ARIZONA_HEADPHONE_DETECT_1,
558 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
562 /* OK, got both. Now, compare... */
563 dev_dbg(arizona->dev, "HPDET measured %d %d\n",
564 info->hpdet_res[0], info->hpdet_res[1]);
566 /* Take the headphone impedance for the main report */
567 *reading = info->hpdet_res[0];
569 /* Sometimes we get false readings due to slow insert */
570 if (*reading >= ARIZONA_HPDET_MAX && !info->hpdet_retried) {
571 dev_dbg(arizona->dev, "Retrying high impedance\n");
572 info->num_hpdet_res = 0;
573 info->hpdet_retried = true;
574 arizona_start_hpdet_acc_id(info);
575 pm_runtime_put(info->dev);
580 * If we measure the mic as high impedance
582 if (!id_gpio || info->hpdet_res[1] > 50) {
583 dev_dbg(arizona->dev, "Detected mic\n");
585 info->detecting = true;
587 dev_dbg(arizona->dev, "Detected headphone\n");
590 /* Make sure everything is reset back to the real polarity */
591 regmap_update_bits(arizona->regmap,
592 ARIZONA_ACCESSORY_DETECT_MODE_1,
594 info->micd_modes[0].src);
600 static irqreturn_t arizona_hpdet_irq(int irq, void *data)
602 struct arizona_extcon_info *info = data;
603 struct arizona *arizona = info->arizona;
604 int id_gpio = arizona->pdata.hpdet_id_gpio;
605 unsigned int report = EXTCON_JACK_HEADPHONE;
609 mutex_lock(&info->lock);
611 /* If we got a spurious IRQ for some reason then ignore it */
612 if (!info->hpdet_active) {
613 dev_warn(arizona->dev, "Spurious HPDET IRQ\n");
614 mutex_unlock(&info->lock);
618 /* If the cable was removed while measuring ignore the result */
619 ret = extcon_get_state(info->edev, EXTCON_MECHANICAL);
621 dev_err(arizona->dev, "Failed to check cable state: %d\n",
625 dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
629 ret = arizona_hpdet_read(info);
636 /* Reset back to starting range */
637 regmap_update_bits(arizona->regmap,
638 ARIZONA_HEADPHONE_DETECT_1,
639 ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL,
642 ret = arizona_hpdet_do_id(info, &reading, &mic);
648 /* Report high impedence cables as line outputs */
650 report = EXTCON_JACK_LINE_OUT;
652 report = EXTCON_JACK_HEADPHONE;
654 ret = extcon_set_state_sync(info->edev, report, true);
656 dev_err(arizona->dev, "Failed to report HP/line: %d\n",
660 /* Reset back to starting range */
661 regmap_update_bits(arizona->regmap,
662 ARIZONA_HEADPHONE_DETECT_1,
663 ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL,
666 arizona_extcon_hp_clamp(info, false);
669 gpio_set_value_cansleep(id_gpio, 0);
671 /* If we have a mic then reenable MICDET */
672 if (mic || info->mic)
673 arizona_start_mic(info);
675 if (info->hpdet_active) {
676 pm_runtime_put_autosuspend(info->dev);
677 info->hpdet_active = false;
680 info->hpdet_done = true;
683 mutex_unlock(&info->lock);
688 static void arizona_identify_headphone(struct arizona_extcon_info *info)
690 struct arizona *arizona = info->arizona;
693 if (info->hpdet_done)
696 dev_dbg(arizona->dev, "Starting HPDET\n");
698 /* Make sure we keep the device enabled during the measurement */
699 pm_runtime_get(info->dev);
701 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 arizona_extcon_hp_clamp(info, false);
728 pm_runtime_put_autosuspend(info->dev);
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 /* Just report headphone */
785 ret = extcon_set_state_sync(info->edev, EXTCON_JACK_HEADPHONE, true);
787 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
789 info->hpdet_active = false;
792 static void arizona_micd_timeout_work(struct work_struct *work)
794 struct arizona_extcon_info *info = container_of(work,
795 struct arizona_extcon_info,
796 micd_timeout_work.work);
798 mutex_lock(&info->lock);
800 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
802 info->detecting = false;
804 arizona_identify_headphone(info);
806 mutex_unlock(&info->lock);
809 static void arizona_micd_detect(struct work_struct *work)
811 struct arizona_extcon_info *info = container_of(work,
812 struct arizona_extcon_info,
813 micd_detect_work.work);
814 struct arizona *arizona = info->arizona;
815 unsigned int val = 0, lvl;
818 cancel_delayed_work_sync(&info->micd_timeout_work);
820 mutex_lock(&info->lock);
822 /* If the cable was removed while measuring ignore the result */
823 ret = extcon_get_state(info->edev, EXTCON_MECHANICAL);
825 dev_err(arizona->dev, "Failed to check cable state: %d\n",
827 mutex_unlock(&info->lock);
830 dev_dbg(arizona->dev, "Ignoring MICDET for removed cable\n");
831 mutex_unlock(&info->lock);
835 if (info->detecting && arizona->pdata.micd_software_compare) {
836 /* Must disable MICD before we read the ADCVAL */
837 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
838 ARIZONA_MICD_ENA, 0);
839 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_4, &val);
841 dev_err(arizona->dev,
842 "Failed to read MICDET_ADCVAL: %d\n",
844 mutex_unlock(&info->lock);
848 dev_dbg(arizona->dev, "MICDET_ADCVAL: %x\n", val);
850 val &= ARIZONA_MICDET_ADCVAL_MASK;
851 if (val < ARRAY_SIZE(arizona_micd_levels))
852 val = arizona_micd_levels[val];
856 if (val <= QUICK_HEADPHONE_MAX_OHM)
857 val = ARIZONA_MICD_STS | ARIZONA_MICD_LVL_0;
858 else if (val <= MICROPHONE_MIN_OHM)
859 val = ARIZONA_MICD_STS | ARIZONA_MICD_LVL_1;
860 else if (val <= MICROPHONE_MAX_OHM)
861 val = ARIZONA_MICD_STS | ARIZONA_MICD_LVL_8;
863 val = ARIZONA_MICD_LVL_8;
866 for (i = 0; i < 10 && !(val & MICD_LVL_0_TO_8); i++) {
867 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
869 dev_err(arizona->dev,
870 "Failed to read MICDET: %d\n", ret);
871 mutex_unlock(&info->lock);
875 dev_dbg(arizona->dev, "MICDET: %x\n", val);
877 if (!(val & ARIZONA_MICD_VALID)) {
878 dev_warn(arizona->dev,
879 "Microphone detection state invalid\n");
880 mutex_unlock(&info->lock);
885 if (i == 10 && !(val & MICD_LVL_0_TO_8)) {
886 dev_err(arizona->dev, "Failed to get valid MICDET value\n");
887 mutex_unlock(&info->lock);
891 /* Due to jack detect this should never happen */
892 if (!(val & ARIZONA_MICD_STS)) {
893 dev_warn(arizona->dev, "Detected open circuit\n");
895 info->detecting = false;
896 arizona_identify_headphone(info);
900 /* If we got a high impedence we should have a headset, report it. */
901 if (info->detecting && (val & ARIZONA_MICD_LVL_8)) {
903 info->detecting = false;
905 arizona_identify_headphone(info);
907 ret = extcon_set_state_sync(info->edev,
908 EXTCON_JACK_MICROPHONE, true);
910 dev_err(arizona->dev, "Headset report failed: %d\n",
913 /* Don't need to regulate for button detection */
914 ret = regulator_allow_bypass(info->micvdd, true);
916 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
923 /* If we detected a lower impedence during initial startup
924 * then we probably have the wrong polarity, flip it. Don't
925 * do this for the lowest impedences to speed up detection of
926 * plain headphones. If both polarities report a low
927 * impedence then give up and report headphones.
929 if (info->detecting && (val & MICD_LVL_1_TO_7)) {
930 if (info->jack_flips >= info->micd_num_modes * 10) {
931 dev_dbg(arizona->dev, "Detected HP/line\n");
933 info->detecting = false;
935 arizona_identify_headphone(info);
938 if (info->micd_mode == info->micd_num_modes)
940 arizona_extcon_set_mode(info, info->micd_mode);
949 * If we're still detecting and we detect a short then we've
950 * got a headphone. Otherwise it's a button press.
952 if (val & MICD_LVL_0_TO_7) {
954 dev_dbg(arizona->dev, "Mic button detected\n");
956 lvl = val & ARIZONA_MICD_LVL_MASK;
957 lvl >>= ARIZONA_MICD_LVL_SHIFT;
959 for (i = 0; i < info->num_micd_ranges; i++)
960 input_report_key(info->input,
961 info->micd_ranges[i].key, 0);
963 if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) {
964 key = info->micd_ranges[ffs(lvl) - 1].key;
965 input_report_key(info->input, key, 1);
966 input_sync(info->input);
968 dev_err(arizona->dev, "Button out of range\n");
970 } else if (info->detecting) {
971 dev_dbg(arizona->dev, "Headphone detected\n");
972 info->detecting = false;
974 arizona_identify_headphone(info);
976 dev_warn(arizona->dev, "Button with no mic: %x\n",
980 dev_dbg(arizona->dev, "Mic button released\n");
981 for (i = 0; i < info->num_micd_ranges; i++)
982 input_report_key(info->input,
983 info->micd_ranges[i].key, 0);
984 input_sync(info->input);
985 arizona_extcon_pulse_micbias(info);
989 if (info->detecting) {
990 if (arizona->pdata.micd_software_compare)
991 regmap_update_bits(arizona->regmap,
992 ARIZONA_MIC_DETECT_1,
996 queue_delayed_work(system_power_efficient_wq,
997 &info->micd_timeout_work,
998 msecs_to_jiffies(arizona->pdata.micd_timeout));
1001 pm_runtime_mark_last_busy(info->dev);
1002 mutex_unlock(&info->lock);
1005 static irqreturn_t arizona_micdet(int irq, void *data)
1007 struct arizona_extcon_info *info = data;
1008 struct arizona *arizona = info->arizona;
1009 int debounce = arizona->pdata.micd_detect_debounce;
1011 cancel_delayed_work_sync(&info->micd_detect_work);
1012 cancel_delayed_work_sync(&info->micd_timeout_work);
1014 mutex_lock(&info->lock);
1015 if (!info->detecting)
1017 mutex_unlock(&info->lock);
1020 queue_delayed_work(system_power_efficient_wq,
1021 &info->micd_detect_work,
1022 msecs_to_jiffies(debounce));
1024 arizona_micd_detect(&info->micd_detect_work.work);
1029 static void arizona_hpdet_work(struct work_struct *work)
1031 struct arizona_extcon_info *info = container_of(work,
1032 struct arizona_extcon_info,
1035 mutex_lock(&info->lock);
1036 arizona_start_hpdet_acc_id(info);
1037 mutex_unlock(&info->lock);
1040 static int arizona_hpdet_wait(struct arizona_extcon_info *info)
1042 struct arizona *arizona = info->arizona;
1046 for (i = 0; i < ARIZONA_HPDET_WAIT_COUNT; i++) {
1047 ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2,
1050 dev_err(arizona->dev,
1051 "Failed to read HPDET state: %d\n", ret);
1055 switch (info->hpdet_ip_version) {
1057 if (val & ARIZONA_HP_DONE)
1061 if (val & ARIZONA_HP_DONE_B)
1066 msleep(ARIZONA_HPDET_WAIT_DELAY_MS);
1069 dev_warn(arizona->dev, "HPDET did not appear to complete\n");
1074 static irqreturn_t arizona_jackdet(int irq, void *data)
1076 struct arizona_extcon_info *info = data;
1077 struct arizona *arizona = info->arizona;
1078 unsigned int val, present, mask;
1079 bool cancelled_hp, cancelled_mic;
1082 cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
1083 cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);
1085 pm_runtime_get_sync(info->dev);
1087 mutex_lock(&info->lock);
1089 if (info->micd_clamp) {
1090 mask = ARIZONA_MICD_CLAMP_STS;
1093 mask = ARIZONA_JD1_STS;
1094 if (arizona->pdata.jd_invert)
1097 present = ARIZONA_JD1_STS;
1100 ret = regmap_read(arizona->regmap, ARIZONA_AOD_IRQ_RAW_STATUS, &val);
1102 dev_err(arizona->dev, "Failed to read jackdet status: %d\n",
1104 mutex_unlock(&info->lock);
1105 pm_runtime_put_autosuspend(info->dev);
1110 if (val == info->last_jackdet) {
1111 dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
1113 queue_delayed_work(system_power_efficient_wq,
1115 msecs_to_jiffies(HPDET_DEBOUNCE));
1117 if (cancelled_mic) {
1118 int micd_timeout = arizona->pdata.micd_timeout;
1120 queue_delayed_work(system_power_efficient_wq,
1121 &info->micd_timeout_work,
1122 msecs_to_jiffies(micd_timeout));
1127 info->last_jackdet = val;
1129 if (info->last_jackdet == present) {
1130 dev_dbg(arizona->dev, "Detected jack\n");
1131 ret = extcon_set_state_sync(info->edev,
1132 EXTCON_MECHANICAL, true);
1135 dev_err(arizona->dev, "Mechanical report failed: %d\n",
1138 info->detecting = true;
1140 info->jack_flips = 0;
1142 if (!arizona->pdata.hpdet_acc_id) {
1143 arizona_start_mic(info);
1145 queue_delayed_work(system_power_efficient_wq,
1147 msecs_to_jiffies(HPDET_DEBOUNCE));
1150 if (info->micd_clamp || !arizona->pdata.jd_invert)
1151 regmap_update_bits(arizona->regmap,
1152 ARIZONA_JACK_DETECT_DEBOUNCE,
1153 ARIZONA_MICD_CLAMP_DB |
1156 dev_dbg(arizona->dev, "Detected jack removal\n");
1158 arizona_stop_mic(info);
1160 info->num_hpdet_res = 0;
1161 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
1162 info->hpdet_res[i] = 0;
1164 info->hpdet_done = false;
1165 info->hpdet_retried = false;
1167 for (i = 0; i < info->num_micd_ranges; i++)
1168 input_report_key(info->input,
1169 info->micd_ranges[i].key, 0);
1170 input_sync(info->input);
1172 for (i = 0; i < ARRAY_SIZE(arizona_cable) - 1; i++) {
1173 ret = extcon_set_state_sync(info->edev,
1174 arizona_cable[i], false);
1176 dev_err(arizona->dev,
1177 "Removal report failed: %d\n", ret);
1181 * If the jack was removed during a headphone detection we
1182 * need to wait for the headphone detection to finish, as
1183 * it can not be aborted. We don't want to be able to start
1184 * a new headphone detection from a fresh insert until this
1187 arizona_hpdet_wait(info);
1189 regmap_update_bits(arizona->regmap,
1190 ARIZONA_JACK_DETECT_DEBOUNCE,
1191 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB,
1192 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB);
1196 /* Clear trig_sts to make sure DCVDD is not forced up */
1197 regmap_write(arizona->regmap, ARIZONA_AOD_WKUP_AND_TRIG,
1198 ARIZONA_MICD_CLAMP_FALL_TRIG_STS |
1199 ARIZONA_MICD_CLAMP_RISE_TRIG_STS |
1200 ARIZONA_JD1_FALL_TRIG_STS |
1201 ARIZONA_JD1_RISE_TRIG_STS);
1203 mutex_unlock(&info->lock);
1205 pm_runtime_mark_last_busy(info->dev);
1206 pm_runtime_put_autosuspend(info->dev);
1211 /* Map a level onto a slot in the register bank */
1212 static void arizona_micd_set_level(struct arizona *arizona, int index,
1218 reg = ARIZONA_MIC_DETECT_LEVEL_4 - (index / 2);
1227 /* Program the level itself */
1228 regmap_update_bits(arizona->regmap, reg, mask, level);
1231 static int arizona_extcon_get_micd_configs(struct device *dev,
1232 struct arizona *arizona)
1234 const char * const prop = "wlf,micd-configs";
1235 const int entries_per_config = 3;
1236 struct arizona_micd_config *micd_configs;
1241 nconfs = device_property_count_u32(arizona->dev, prop);
1245 vals = kcalloc(nconfs, sizeof(u32), GFP_KERNEL);
1249 ret = device_property_read_u32_array(arizona->dev, prop, vals, nconfs);
1253 nconfs /= entries_per_config;
1254 micd_configs = devm_kcalloc(dev, nconfs, sizeof(*micd_configs),
1256 if (!micd_configs) {
1261 for (i = 0, j = 0; i < nconfs; ++i) {
1262 micd_configs[i].src = vals[j++] ? ARIZONA_ACCDET_SRC : 0;
1263 micd_configs[i].bias = vals[j++];
1264 micd_configs[i].gpio = vals[j++];
1267 arizona->pdata.micd_configs = micd_configs;
1268 arizona->pdata.num_micd_configs = nconfs;
1275 static int arizona_extcon_device_get_pdata(struct device *dev,
1276 struct arizona *arizona)
1278 struct arizona_pdata *pdata = &arizona->pdata;
1279 unsigned int val = ARIZONA_ACCDET_MODE_HPL;
1282 device_property_read_u32(arizona->dev, "wlf,hpdet-channel", &val);
1284 case ARIZONA_ACCDET_MODE_HPL:
1285 case ARIZONA_ACCDET_MODE_HPR:
1286 pdata->hpdet_channel = val;
1289 dev_err(arizona->dev,
1290 "Wrong wlf,hpdet-channel DT value %d\n", val);
1291 pdata->hpdet_channel = ARIZONA_ACCDET_MODE_HPL;
1294 device_property_read_u32(arizona->dev, "wlf,micd-detect-debounce",
1295 &pdata->micd_detect_debounce);
1297 device_property_read_u32(arizona->dev, "wlf,micd-bias-start-time",
1298 &pdata->micd_bias_start_time);
1300 device_property_read_u32(arizona->dev, "wlf,micd-rate",
1303 device_property_read_u32(arizona->dev, "wlf,micd-dbtime",
1304 &pdata->micd_dbtime);
1306 device_property_read_u32(arizona->dev, "wlf,micd-timeout-ms",
1307 &pdata->micd_timeout);
1309 pdata->micd_force_micbias = device_property_read_bool(arizona->dev,
1310 "wlf,micd-force-micbias");
1312 pdata->micd_software_compare = device_property_read_bool(arizona->dev,
1313 "wlf,micd-software-compare");
1315 pdata->jd_invert = device_property_read_bool(arizona->dev,
1318 device_property_read_u32(arizona->dev, "wlf,gpsw", &pdata->gpsw);
1320 pdata->jd_gpio5 = device_property_read_bool(arizona->dev,
1322 pdata->jd_gpio5_nopull = device_property_read_bool(arizona->dev,
1323 "wlf,use-jd2-nopull");
1325 ret = arizona_extcon_get_micd_configs(dev, arizona);
1327 dev_err(arizona->dev, "Failed to read micd configs: %d\n", ret);
1332 static int arizona_extcon_probe(struct platform_device *pdev)
1334 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1335 struct arizona_pdata *pdata = &arizona->pdata;
1336 struct arizona_extcon_info *info;
1338 unsigned int clamp_mode;
1339 int jack_irq_fall, jack_irq_rise;
1340 int ret, mode, i, j;
1342 if (!arizona->dapm || !arizona->dapm->card)
1343 return -EPROBE_DEFER;
1345 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
1349 if (!dev_get_platdata(arizona->dev))
1350 arizona_extcon_device_get_pdata(&pdev->dev, arizona);
1352 info->micvdd = devm_regulator_get(&pdev->dev, "MICVDD");
1353 if (IS_ERR(info->micvdd)) {
1354 ret = PTR_ERR(info->micvdd);
1355 dev_err(arizona->dev, "Failed to get MICVDD: %d\n", ret);
1359 mutex_init(&info->lock);
1360 info->arizona = arizona;
1361 info->dev = &pdev->dev;
1362 info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS);
1363 INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
1364 INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect);
1365 INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
1366 platform_set_drvdata(pdev, info);
1368 switch (arizona->type) {
1370 switch (arizona->rev) {
1372 info->micd_reva = true;
1375 info->micd_clamp = true;
1376 info->hpdet_ip_version = 1;
1382 switch (arizona->rev) {
1386 info->micd_clamp = true;
1387 info->hpdet_ip_version = 2;
1393 info->micd_clamp = true;
1394 info->hpdet_ip_version = 2;
1400 info->edev = devm_extcon_dev_allocate(&pdev->dev, arizona_cable);
1401 if (IS_ERR(info->edev)) {
1402 dev_err(&pdev->dev, "failed to allocate extcon device\n");
1406 ret = devm_extcon_dev_register(&pdev->dev, info->edev);
1408 dev_err(arizona->dev, "extcon_dev_register() failed: %d\n",
1413 info->input = devm_input_allocate_device(&pdev->dev);
1415 dev_err(arizona->dev, "Can't allocate input dev\n");
1420 info->input->name = "Headset";
1421 info->input->phys = "arizona/extcon";
1423 if (!pdata->micd_timeout)
1424 pdata->micd_timeout = DEFAULT_MICD_TIMEOUT;
1426 if (pdata->num_micd_configs) {
1427 info->micd_modes = pdata->micd_configs;
1428 info->micd_num_modes = pdata->num_micd_configs;
1430 info->micd_modes = micd_default_modes;
1431 info->micd_num_modes = ARRAY_SIZE(micd_default_modes);
1434 if (arizona->pdata.gpsw > 0)
1435 regmap_update_bits(arizona->regmap, ARIZONA_GP_SWITCH_1,
1436 ARIZONA_SW1_MODE_MASK, arizona->pdata.gpsw);
1438 if (pdata->micd_pol_gpio > 0) {
1439 if (info->micd_modes[0].gpio)
1440 mode = GPIOF_OUT_INIT_HIGH;
1442 mode = GPIOF_OUT_INIT_LOW;
1444 ret = devm_gpio_request_one(&pdev->dev, pdata->micd_pol_gpio,
1445 mode, "MICD polarity");
1447 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1448 pdata->micd_pol_gpio, ret);
1452 info->micd_pol_gpio = gpio_to_desc(pdata->micd_pol_gpio);
1454 if (info->micd_modes[0].gpio)
1455 mode = GPIOD_OUT_HIGH;
1457 mode = GPIOD_OUT_LOW;
1459 /* We can't use devm here because we need to do the get
1460 * against the MFD device, as that is where the of_node
1461 * will reside, but if we devm against that the GPIO
1462 * will not be freed if the extcon driver is unloaded.
1464 info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
1467 if (IS_ERR(info->micd_pol_gpio)) {
1468 ret = PTR_ERR(info->micd_pol_gpio);
1469 dev_err(arizona->dev,
1470 "Failed to get microphone polarity GPIO: %d\n",
1476 if (arizona->pdata.hpdet_id_gpio > 0) {
1477 ret = devm_gpio_request_one(&pdev->dev,
1478 arizona->pdata.hpdet_id_gpio,
1482 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1483 arizona->pdata.hpdet_id_gpio, ret);
1488 if (arizona->pdata.micd_bias_start_time)
1489 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1490 ARIZONA_MICD_BIAS_STARTTIME_MASK,
1491 arizona->pdata.micd_bias_start_time
1492 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT);
1494 if (arizona->pdata.micd_rate)
1495 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1496 ARIZONA_MICD_RATE_MASK,
1497 arizona->pdata.micd_rate
1498 << ARIZONA_MICD_RATE_SHIFT);
1500 switch (arizona->pdata.micd_dbtime) {
1501 case MICD_DBTIME_FOUR_READINGS:
1502 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1503 ARIZONA_MICD_DBTIME_MASK,
1504 ARIZONA_MICD_DBTIME);
1506 case MICD_DBTIME_TWO_READINGS:
1507 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1508 ARIZONA_MICD_DBTIME_MASK, 0);
1514 BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels) <
1515 ARIZONA_NUM_MICD_BUTTON_LEVELS);
1517 if (arizona->pdata.num_micd_ranges) {
1518 info->micd_ranges = pdata->micd_ranges;
1519 info->num_micd_ranges = pdata->num_micd_ranges;
1521 info->micd_ranges = micd_default_ranges;
1522 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges);
1525 if (arizona->pdata.num_micd_ranges > ARIZONA_MAX_MICD_RANGE) {
1526 dev_err(arizona->dev, "Too many MICD ranges: %d\n",
1527 arizona->pdata.num_micd_ranges);
1530 if (info->num_micd_ranges > 1) {
1531 for (i = 1; i < info->num_micd_ranges; i++) {
1532 if (info->micd_ranges[i - 1].max >
1533 info->micd_ranges[i].max) {
1534 dev_err(arizona->dev,
1535 "MICD ranges must be sorted\n");
1542 /* Disable all buttons by default */
1543 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1544 ARIZONA_MICD_LVL_SEL_MASK, 0x81);
1546 /* Set up all the buttons the user specified */
1547 for (i = 0; i < info->num_micd_ranges; i++) {
1548 for (j = 0; j < ARIZONA_NUM_MICD_BUTTON_LEVELS; j++)
1549 if (arizona_micd_levels[j] >= info->micd_ranges[i].max)
1552 if (j == ARIZONA_NUM_MICD_BUTTON_LEVELS) {
1553 dev_err(arizona->dev, "Unsupported MICD level %d\n",
1554 info->micd_ranges[i].max);
1559 dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n",
1560 arizona_micd_levels[j], i);
1562 arizona_micd_set_level(arizona, i, j);
1563 input_set_capability(info->input, EV_KEY,
1564 info->micd_ranges[i].key);
1566 /* Enable reporting of that range */
1567 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1571 /* Set all the remaining keys to a maximum */
1572 for (; i < ARIZONA_MAX_MICD_RANGE; i++)
1573 arizona_micd_set_level(arizona, i, 0x3f);
1576 * If we have a clamp use it, activating in conjunction with
1577 * GPIO5 if that is connected for jack detect operation.
1579 if (info->micd_clamp) {
1580 if (arizona->pdata.jd_gpio5) {
1581 /* Put the GPIO into input mode with optional pull */
1583 if (arizona->pdata.jd_gpio5_nopull)
1584 val &= ~ARIZONA_GPN_PU;
1586 regmap_write(arizona->regmap, ARIZONA_GPIO5_CTRL,
1589 if (arizona->pdata.jd_invert)
1590 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDH_GP5H;
1592 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDL_GP5H;
1594 if (arizona->pdata.jd_invert)
1595 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDH;
1597 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDL;
1600 regmap_update_bits(arizona->regmap,
1601 ARIZONA_MICD_CLAMP_CONTROL,
1602 ARIZONA_MICD_CLAMP_MODE_MASK, clamp_mode);
1604 regmap_update_bits(arizona->regmap,
1605 ARIZONA_JACK_DETECT_DEBOUNCE,
1606 ARIZONA_MICD_CLAMP_DB,
1607 ARIZONA_MICD_CLAMP_DB);
1610 arizona_extcon_set_mode(info, 0);
1612 pm_runtime_enable(&pdev->dev);
1613 pm_runtime_idle(&pdev->dev);
1614 pm_runtime_get_sync(&pdev->dev);
1616 if (info->micd_clamp) {
1617 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1618 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1620 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1621 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1624 ret = arizona_request_irq(arizona, jack_irq_rise,
1625 "JACKDET rise", arizona_jackdet, info);
1627 dev_err(&pdev->dev, "Failed to get JACKDET rise IRQ: %d\n",
1632 ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1);
1634 dev_err(&pdev->dev, "Failed to set JD rise IRQ wake: %d\n",
1639 ret = arizona_request_irq(arizona, jack_irq_fall,
1640 "JACKDET fall", arizona_jackdet, info);
1642 dev_err(&pdev->dev, "Failed to get JD fall IRQ: %d\n", ret);
1646 ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1);
1648 dev_err(&pdev->dev, "Failed to set JD fall IRQ wake: %d\n",
1653 ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET,
1654 "MICDET", arizona_micdet, info);
1656 dev_err(&pdev->dev, "Failed to get MICDET IRQ: %d\n", ret);
1660 ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET,
1661 "HPDET", arizona_hpdet_irq, info);
1663 dev_err(&pdev->dev, "Failed to get HPDET IRQ: %d\n", ret);
1667 arizona_clk32k_enable(arizona);
1668 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_DEBOUNCE,
1669 ARIZONA_JD1_DB, ARIZONA_JD1_DB);
1670 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1671 ARIZONA_JD1_ENA, ARIZONA_JD1_ENA);
1673 ret = regulator_allow_bypass(info->micvdd, true);
1675 dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n",
1678 pm_runtime_put(&pdev->dev);
1680 ret = input_register_device(info->input);
1682 dev_err(&pdev->dev, "Can't register input device: %d\n", ret);
1689 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1691 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1693 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1695 arizona_free_irq(arizona, jack_irq_fall, info);
1697 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1699 arizona_free_irq(arizona, jack_irq_rise, info);
1701 gpiod_put(info->micd_pol_gpio);
1703 pm_runtime_disable(&pdev->dev);
1707 static int arizona_extcon_remove(struct platform_device *pdev)
1709 struct arizona_extcon_info *info = platform_get_drvdata(pdev);
1710 struct arizona *arizona = info->arizona;
1711 int jack_irq_rise, jack_irq_fall;
1715 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
1716 ARIZONA_MICD_ENA, 0,
1719 dev_err(&pdev->dev, "Failed to disable micd on remove: %d\n",
1721 } else if (change) {
1722 regulator_disable(info->micvdd);
1723 pm_runtime_put(info->dev);
1726 gpiod_put(info->micd_pol_gpio);
1728 pm_runtime_disable(&pdev->dev);
1730 regmap_update_bits(arizona->regmap,
1731 ARIZONA_MICD_CLAMP_CONTROL,
1732 ARIZONA_MICD_CLAMP_MODE_MASK, 0);
1734 if (info->micd_clamp) {
1735 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1736 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1738 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1739 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1742 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1743 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1744 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1745 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1746 arizona_free_irq(arizona, jack_irq_rise, info);
1747 arizona_free_irq(arizona, jack_irq_fall, info);
1748 cancel_delayed_work_sync(&info->hpdet_work);
1749 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1750 ARIZONA_JD1_ENA, 0);
1751 arizona_clk32k_disable(arizona);
1756 static struct platform_driver arizona_extcon_driver = {
1758 .name = "arizona-extcon",
1760 .probe = arizona_extcon_probe,
1761 .remove = arizona_extcon_remove,
1764 module_platform_driver(arizona_extcon_driver);
1766 MODULE_DESCRIPTION("Arizona Extcon driver");
1767 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1768 MODULE_LICENSE("GPL");
1769 MODULE_ALIAS("platform:extcon-arizona");