2 * extcon-arizona.c - Extcon driver Wolfson Arizona devices
4 * Copyright (C) 2012-2014 Wolfson Microelectronics plc
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.
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.
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>
32 #include <sound/soc.h>
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>
39 #define ARIZONA_MAX_MICD_RANGE 8
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
46 #define ARIZONA_TST_CAP_DEFAULT 0x3
47 #define ARIZONA_TST_CAP_CLAMP 0x1
49 #define ARIZONA_HPDET_MAX 10000
51 #define HPDET_DEBOUNCE 500
52 #define DEFAULT_MICD_TIMEOUT 2000
54 #define QUICK_HEADPHONE_MAX_OHM 3
55 #define MICROPHONE_MIN_OHM 1257
56 #define MICROPHONE_MAX_OHM 30000
58 #define MICD_DBTIME_TWO_READINGS 2
59 #define MICD_DBTIME_FOUR_READINGS 4
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 | \
66 #define MICD_LVL_0_TO_7 (ARIZONA_MICD_LVL_0 | MICD_LVL_1_TO_7)
68 #define MICD_LVL_0_TO_8 (MICD_LVL_0_TO_7 | ARIZONA_MICD_LVL_8)
70 struct arizona_extcon_info
{
72 struct arizona
*arizona
;
74 struct regulator
*micvdd
;
75 struct input_dev
*input
;
80 const struct arizona_micd_config
*micd_modes
;
83 const struct arizona_micd_range
*micd_ranges
;
91 struct delayed_work hpdet_work
;
92 struct delayed_work micd_detect_work
;
93 struct delayed_work micd_timeout_work
;
100 unsigned int hpdet_res
[3];
106 int hpdet_ip_version
;
108 struct extcon_dev
*edev
;
110 struct gpio_desc
*micd_pol_gpio
;
113 static const struct arizona_micd_config micd_default_modes
[] = {
114 { ARIZONA_ACCDET_SRC
, 1, 0 },
118 static 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
},
127 /* The number of levels in arizona_micd_levels valid for button thresholds */
128 #define ARIZONA_NUM_MICD_BUTTON_LEVELS 64
130 static 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,
138 static const unsigned int arizona_cable
[] = {
146 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info
*info
);
148 static void arizona_extcon_hp_clamp(struct arizona_extcon_info
*info
,
151 struct arizona
*arizona
= info
->arizona
;
152 unsigned int mask
= 0, val
= 0;
153 unsigned int cap_sel
= 0;
156 switch (arizona
->type
) {
163 mask
= ARIZONA_HP1L_SHRTO
| ARIZONA_HP1L_FLWR
|
166 val
= ARIZONA_HP1L_SHRTO
;
167 cap_sel
= ARIZONA_TST_CAP_CLAMP
;
169 val
= ARIZONA_HP1L_FLWR
| ARIZONA_HP1L_SHRTI
;
170 cap_sel
= ARIZONA_TST_CAP_DEFAULT
;
173 ret
= regmap_update_bits(arizona
->regmap
,
174 ARIZONA_HP_TEST_CTRL_1
,
175 ARIZONA_HP1_TST_CAP_SEL_MASK
,
178 dev_warn(arizona
->dev
,
179 "Failed to set TST_CAP_SEL: %d\n", ret
);
182 mask
= ARIZONA_RMV_SHRT_HP1L
;
184 val
= ARIZONA_RMV_SHRT_HP1L
;
188 mutex_lock(&arizona
->dapm
->card
->dapm_mutex
);
190 arizona
->hpdet_clamp
= clamp
;
192 /* Keep the HP output stages disabled while doing the clamp */
194 ret
= regmap_update_bits(arizona
->regmap
,
195 ARIZONA_OUTPUT_ENABLES_1
,
197 ARIZONA_OUT1R_ENA
, 0);
199 dev_warn(arizona
->dev
,
200 "Failed to disable headphone outputs: %d\n",
205 ret
= regmap_update_bits(arizona
->regmap
, ARIZONA_HP_CTRL_1L
,
208 dev_warn(arizona
->dev
, "Failed to do clamp: %d\n",
211 ret
= regmap_update_bits(arizona
->regmap
, ARIZONA_HP_CTRL_1R
,
214 dev_warn(arizona
->dev
, "Failed to do clamp: %d\n",
218 /* Restore the desired state while not doing the clamp */
220 ret
= regmap_update_bits(arizona
->regmap
,
221 ARIZONA_OUTPUT_ENABLES_1
,
223 ARIZONA_OUT1R_ENA
, arizona
->hp_ena
);
225 dev_warn(arizona
->dev
,
226 "Failed to restore headphone outputs: %d\n",
230 mutex_unlock(&arizona
->dapm
->card
->dapm_mutex
);
233 static void arizona_extcon_set_mode(struct arizona_extcon_info
*info
, int mode
)
235 struct arizona
*arizona
= info
->arizona
;
237 mode
%= info
->micd_num_modes
;
239 if (arizona
->pdata
.micd_pol_gpio
> 0)
240 gpio_set_value_cansleep(arizona
->pdata
.micd_pol_gpio
,
241 info
->micd_modes
[mode
].gpio
);
243 gpiod_set_value_cansleep(info
->micd_pol_gpio
,
244 info
->micd_modes
[mode
].gpio
);
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
);
253 info
->micd_mode
= mode
;
255 dev_dbg(arizona
->dev
, "Set jack polarity to %d\n", mode
);
258 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info
*info
)
260 switch (info
->micd_modes
[0].bias
) {
272 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info
*info
)
274 struct arizona
*arizona
= info
->arizona
;
275 const char *widget
= arizona_extcon_get_micbias(info
);
276 struct snd_soc_dapm_context
*dapm
= arizona
->dapm
;
279 ret
= snd_soc_dapm_force_enable_pin(dapm
, widget
);
281 dev_warn(arizona
->dev
, "Failed to enable %s: %d\n",
284 snd_soc_dapm_sync(dapm
);
286 if (!arizona
->pdata
.micd_force_micbias
) {
287 ret
= snd_soc_dapm_disable_pin(arizona
->dapm
, widget
);
289 dev_warn(arizona
->dev
, "Failed to disable %s: %d\n",
292 snd_soc_dapm_sync(dapm
);
296 static void arizona_start_mic(struct arizona_extcon_info
*info
)
298 struct arizona
*arizona
= info
->arizona
;
303 /* Microphone detection can't use idle mode */
304 pm_runtime_get(info
->dev
);
306 if (info
->detecting
) {
307 ret
= regulator_allow_bypass(info
->micvdd
, false);
309 dev_err(arizona
->dev
,
310 "Failed to regulate MICVDD: %d\n",
315 ret
= regulator_enable(info
->micvdd
);
317 dev_err(arizona
->dev
, "Failed to enable MICVDD: %d\n",
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);
327 if (info
->detecting
&& arizona
->pdata
.micd_software_compare
)
328 mode
= ARIZONA_ACCDET_MODE_ADC
;
330 mode
= ARIZONA_ACCDET_MODE_MIC
;
332 regmap_update_bits(arizona
->regmap
,
333 ARIZONA_ACCESSORY_DETECT_MODE_1
,
334 ARIZONA_ACCDET_MODE_MASK
, mode
);
336 arizona_extcon_pulse_micbias(info
);
338 regmap_update_bits_check(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
339 ARIZONA_MICD_ENA
, ARIZONA_MICD_ENA
,
342 regulator_disable(info
->micvdd
);
343 pm_runtime_put_autosuspend(info
->dev
);
347 static void arizona_stop_mic(struct arizona_extcon_info
*info
)
349 struct arizona
*arizona
= info
->arizona
;
350 const char *widget
= arizona_extcon_get_micbias(info
);
351 struct snd_soc_dapm_context
*dapm
= arizona
->dapm
;
355 regmap_update_bits_check(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
359 ret
= snd_soc_dapm_disable_pin(dapm
, widget
);
361 dev_warn(arizona
->dev
,
362 "Failed to disable %s: %d\n",
365 snd_soc_dapm_sync(dapm
);
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);
373 ret
= regulator_allow_bypass(info
->micvdd
, true);
375 dev_err(arizona
->dev
, "Failed to bypass MICVDD: %d\n",
380 regulator_disable(info
->micvdd
);
381 pm_runtime_mark_last_busy(info
->dev
);
382 pm_runtime_put_autosuspend(info
->dev
);
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 },
396 #define ARIZONA_HPDET_B_RANGE_MAX 0x3fb
401 } arizona_hpdet_c_ranges
[] = {
408 static int arizona_hpdet_read(struct arizona_extcon_info
*info
)
410 struct arizona
*arizona
= info
->arizona
;
411 unsigned int val
, range
;
414 ret
= regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_2
, &val
);
416 dev_err(arizona
->dev
, "Failed to read HPDET status: %d\n",
421 switch (info
->hpdet_ip_version
) {
423 if (!(val
& ARIZONA_HP_DONE
)) {
424 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
429 val
&= ARIZONA_HP_LVL_MASK
;
433 if (!(val
& ARIZONA_HP_DONE_B
)) {
434 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
439 ret
= regmap_read(arizona
->regmap
, ARIZONA_HP_DACVAL
, &val
);
441 dev_err(arizona
->dev
, "Failed to read HP value: %d\n",
446 regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
448 range
= (range
& ARIZONA_HP_IMPEDANCE_RANGE_MASK
)
449 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
;
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
)) {
455 dev_dbg(arizona
->dev
, "Moving to HPDET range %d\n",
457 regmap_update_bits(arizona
->regmap
,
458 ARIZONA_HEADPHONE_DETECT_1
,
459 ARIZONA_HP_IMPEDANCE_RANGE_MASK
,
461 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
);
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
;
472 dev_dbg(arizona
->dev
, "HPDET read %d in range %d\n",
475 val
= arizona_hpdet_b_ranges
[range
].factor_b
477 arizona_hpdet_b_ranges
[range
].factor_a
);
481 dev_warn(arizona
->dev
, "Unknown HPDET IP revision %d\n",
482 info
->hpdet_ip_version
);
484 if (!(val
& ARIZONA_HP_DONE_B
)) {
485 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
490 val
&= ARIZONA_HP_LVL_B_MASK
;
491 /* Convert to ohms, the value is in 0.5 ohm increments */
494 regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
496 range
= (range
& ARIZONA_HP_IMPEDANCE_RANGE_MASK
)
497 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
;
499 /* Skip up a range, or report? */
500 if (range
< ARRAY_SIZE(arizona_hpdet_c_ranges
) - 1 &&
501 (val
>= arizona_hpdet_c_ranges
[range
].max
)) {
503 dev_dbg(arizona
->dev
, "Moving to HPDET range %d-%d\n",
504 arizona_hpdet_c_ranges
[range
].min
,
505 arizona_hpdet_c_ranges
[range
].max
);
506 regmap_update_bits(arizona
->regmap
,
507 ARIZONA_HEADPHONE_DETECT_1
,
508 ARIZONA_HP_IMPEDANCE_RANGE_MASK
,
510 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
);
514 if (range
&& (val
< arizona_hpdet_c_ranges
[range
].min
)) {
515 dev_dbg(arizona
->dev
, "Reporting range boundary %d\n",
516 arizona_hpdet_c_ranges
[range
].min
);
517 val
= arizona_hpdet_c_ranges
[range
].min
;
521 dev_dbg(arizona
->dev
, "HP impedance %d ohms\n", val
);
525 static int arizona_hpdet_do_id(struct arizona_extcon_info
*info
, int *reading
,
528 struct arizona
*arizona
= info
->arizona
;
529 int id_gpio
= arizona
->pdata
.hpdet_id_gpio
;
532 * If we're using HPDET for accessory identification we need
533 * to take multiple measurements, step through them in sequence.
535 if (arizona
->pdata
.hpdet_acc_id
) {
536 info
->hpdet_res
[info
->num_hpdet_res
++] = *reading
;
538 /* Only check the mic directly if we didn't already ID it */
539 if (id_gpio
&& info
->num_hpdet_res
== 1) {
540 dev_dbg(arizona
->dev
, "Measuring mic\n");
542 regmap_update_bits(arizona
->regmap
,
543 ARIZONA_ACCESSORY_DETECT_MODE_1
,
544 ARIZONA_ACCDET_MODE_MASK
|
546 ARIZONA_ACCDET_MODE_HPR
|
547 info
->micd_modes
[0].src
);
549 gpio_set_value_cansleep(id_gpio
, 1);
551 regmap_update_bits(arizona
->regmap
,
552 ARIZONA_HEADPHONE_DETECT_1
,
553 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
557 /* OK, got both. Now, compare... */
558 dev_dbg(arizona
->dev
, "HPDET measured %d %d\n",
559 info
->hpdet_res
[0], info
->hpdet_res
[1]);
561 /* Take the headphone impedance for the main report */
562 *reading
= info
->hpdet_res
[0];
564 /* Sometimes we get false readings due to slow insert */
565 if (*reading
>= ARIZONA_HPDET_MAX
&& !info
->hpdet_retried
) {
566 dev_dbg(arizona
->dev
, "Retrying high impedance\n");
567 info
->num_hpdet_res
= 0;
568 info
->hpdet_retried
= true;
569 arizona_start_hpdet_acc_id(info
);
570 pm_runtime_put(info
->dev
);
575 * If we measure the mic as high impedance
577 if (!id_gpio
|| info
->hpdet_res
[1] > 50) {
578 dev_dbg(arizona
->dev
, "Detected mic\n");
580 info
->detecting
= true;
582 dev_dbg(arizona
->dev
, "Detected headphone\n");
585 /* Make sure everything is reset back to the real polarity */
586 regmap_update_bits(arizona
->regmap
,
587 ARIZONA_ACCESSORY_DETECT_MODE_1
,
589 info
->micd_modes
[0].src
);
595 static irqreturn_t
arizona_hpdet_irq(int irq
, void *data
)
597 struct arizona_extcon_info
*info
= data
;
598 struct arizona
*arizona
= info
->arizona
;
599 int id_gpio
= arizona
->pdata
.hpdet_id_gpio
;
600 unsigned int report
= EXTCON_HEADPHONE
;
604 mutex_lock(&info
->lock
);
606 /* If we got a spurious IRQ for some reason then ignore it */
607 if (!info
->hpdet_active
) {
608 dev_warn(arizona
->dev
, "Spurious HPDET IRQ\n");
609 mutex_unlock(&info
->lock
);
613 /* If the cable was removed while measuring ignore the result */
614 ret
= extcon_get_cable_state_(info
->edev
, EXTCON_MECHANICAL
);
616 dev_err(arizona
->dev
, "Failed to check cable state: %d\n",
620 dev_dbg(arizona
->dev
, "Ignoring HPDET for removed cable\n");
624 ret
= arizona_hpdet_read(info
);
631 /* Reset back to starting range */
632 regmap_update_bits(arizona
->regmap
,
633 ARIZONA_HEADPHONE_DETECT_1
,
634 ARIZONA_HP_IMPEDANCE_RANGE_MASK
| ARIZONA_HP_POLL
,
637 ret
= arizona_hpdet_do_id(info
, &reading
, &mic
);
643 /* Report high impedence cables as line outputs */
645 report
= EXTCON_LINE_OUT
;
647 report
= EXTCON_HEADPHONE
;
649 ret
= extcon_set_cable_state_(info
->edev
, report
, true);
651 dev_err(arizona
->dev
, "Failed to report HP/line: %d\n",
655 /* Reset back to starting range */
656 regmap_update_bits(arizona
->regmap
,
657 ARIZONA_HEADPHONE_DETECT_1
,
658 ARIZONA_HP_IMPEDANCE_RANGE_MASK
| ARIZONA_HP_POLL
,
661 arizona_extcon_hp_clamp(info
, false);
664 gpio_set_value_cansleep(id_gpio
, 0);
666 /* Revert back to MICDET mode */
667 regmap_update_bits(arizona
->regmap
,
668 ARIZONA_ACCESSORY_DETECT_MODE_1
,
669 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
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;
704 arizona_stop_mic(info
);
706 arizona_extcon_hp_clamp(info
, true);
708 ret
= regmap_update_bits(arizona
->regmap
,
709 ARIZONA_ACCESSORY_DETECT_MODE_1
,
710 ARIZONA_ACCDET_MODE_MASK
,
711 arizona
->pdata
.hpdet_channel
);
713 dev_err(arizona
->dev
, "Failed to set HPDET mode: %d\n", ret
);
717 ret
= regmap_update_bits(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
718 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
720 dev_err(arizona
->dev
, "Can't start HPDETL measurement: %d\n",
728 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
729 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
731 /* Just report headphone */
732 ret
= extcon_set_cable_state_(info
->edev
, EXTCON_HEADPHONE
, true);
734 dev_err(arizona
->dev
, "Failed to report headphone: %d\n", ret
);
737 arizona_start_mic(info
);
739 info
->hpdet_active
= false;
742 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info
*info
)
744 struct arizona
*arizona
= info
->arizona
;
749 dev_dbg(arizona
->dev
, "Starting identification via HPDET\n");
751 /* Make sure we keep the device enabled during the measurement */
752 pm_runtime_get_sync(info
->dev
);
754 info
->hpdet_active
= true;
756 arizona_extcon_hp_clamp(info
, true);
758 ret
= regmap_update_bits(arizona
->regmap
,
759 ARIZONA_ACCESSORY_DETECT_MODE_1
,
760 ARIZONA_ACCDET_SRC
| ARIZONA_ACCDET_MODE_MASK
,
761 info
->micd_modes
[0].src
|
762 arizona
->pdata
.hpdet_channel
);
764 dev_err(arizona
->dev
, "Failed to set HPDET mode: %d\n", ret
);
768 if (arizona
->pdata
.hpdet_acc_id_line
) {
769 ret
= regmap_update_bits(arizona
->regmap
,
770 ARIZONA_HEADPHONE_DETECT_1
,
771 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
773 dev_err(arizona
->dev
,
774 "Can't start HPDETL measurement: %d\n",
779 arizona_hpdet_do_id(info
, &hp_reading
, &mic
);
785 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
786 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
788 /* Just report headphone */
789 ret
= extcon_set_cable_state_(info
->edev
, EXTCON_HEADPHONE
, true);
791 dev_err(arizona
->dev
, "Failed to report headphone: %d\n", ret
);
793 info
->hpdet_active
= false;
796 static void arizona_micd_timeout_work(struct work_struct
*work
)
798 struct arizona_extcon_info
*info
= container_of(work
,
799 struct arizona_extcon_info
,
800 micd_timeout_work
.work
);
802 mutex_lock(&info
->lock
);
804 dev_dbg(info
->arizona
->dev
, "MICD timed out, reporting HP\n");
806 info
->detecting
= false;
808 arizona_identify_headphone(info
);
810 arizona_stop_mic(info
);
812 mutex_unlock(&info
->lock
);
815 static void arizona_micd_detect(struct work_struct
*work
)
817 struct arizona_extcon_info
*info
= container_of(work
,
818 struct arizona_extcon_info
,
819 micd_detect_work
.work
);
820 struct arizona
*arizona
= info
->arizona
;
821 unsigned int val
= 0, lvl
;
824 cancel_delayed_work_sync(&info
->micd_timeout_work
);
826 mutex_lock(&info
->lock
);
828 /* If the cable was removed while measuring ignore the result */
829 ret
= extcon_get_cable_state_(info
->edev
, EXTCON_MECHANICAL
);
831 dev_err(arizona
->dev
, "Failed to check cable state: %d\n",
833 mutex_unlock(&info
->lock
);
836 dev_dbg(arizona
->dev
, "Ignoring MICDET for removed cable\n");
837 mutex_unlock(&info
->lock
);
841 if (info
->detecting
&& arizona
->pdata
.micd_software_compare
) {
842 /* Must disable MICD before we read the ADCVAL */
843 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
844 ARIZONA_MICD_ENA
, 0);
845 ret
= regmap_read(arizona
->regmap
, ARIZONA_MIC_DETECT_4
, &val
);
847 dev_err(arizona
->dev
,
848 "Failed to read MICDET_ADCVAL: %d\n",
850 mutex_unlock(&info
->lock
);
854 dev_dbg(arizona
->dev
, "MICDET_ADCVAL: %x\n", val
);
856 val
&= ARIZONA_MICDET_ADCVAL_MASK
;
857 if (val
< ARRAY_SIZE(arizona_micd_levels
))
858 val
= arizona_micd_levels
[val
];
862 if (val
<= QUICK_HEADPHONE_MAX_OHM
)
863 val
= ARIZONA_MICD_STS
| ARIZONA_MICD_LVL_0
;
864 else if (val
<= MICROPHONE_MIN_OHM
)
865 val
= ARIZONA_MICD_STS
| ARIZONA_MICD_LVL_1
;
866 else if (val
<= MICROPHONE_MAX_OHM
)
867 val
= ARIZONA_MICD_STS
| ARIZONA_MICD_LVL_8
;
869 val
= ARIZONA_MICD_LVL_8
;
872 for (i
= 0; i
< 10 && !(val
& MICD_LVL_0_TO_8
); i
++) {
873 ret
= regmap_read(arizona
->regmap
, ARIZONA_MIC_DETECT_3
, &val
);
875 dev_err(arizona
->dev
,
876 "Failed to read MICDET: %d\n", ret
);
877 mutex_unlock(&info
->lock
);
881 dev_dbg(arizona
->dev
, "MICDET: %x\n", val
);
883 if (!(val
& ARIZONA_MICD_VALID
)) {
884 dev_warn(arizona
->dev
,
885 "Microphone detection state invalid\n");
886 mutex_unlock(&info
->lock
);
891 if (i
== 10 && !(val
& MICD_LVL_0_TO_8
)) {
892 dev_err(arizona
->dev
, "Failed to get valid MICDET value\n");
893 mutex_unlock(&info
->lock
);
897 /* Due to jack detect this should never happen */
898 if (!(val
& ARIZONA_MICD_STS
)) {
899 dev_warn(arizona
->dev
, "Detected open circuit\n");
901 arizona_stop_mic(info
);
902 info
->detecting
= false;
903 arizona_identify_headphone(info
);
907 /* If we got a high impedence we should have a headset, report it. */
908 if (info
->detecting
&& (val
& ARIZONA_MICD_LVL_8
)) {
910 info
->detecting
= false;
912 arizona_identify_headphone(info
);
914 ret
= extcon_set_cable_state_(info
->edev
,
915 EXTCON_MICROPHONE
, true);
917 dev_err(arizona
->dev
, "Headset report failed: %d\n",
920 /* Don't need to regulate for button detection */
921 ret
= regulator_allow_bypass(info
->micvdd
, true);
923 dev_err(arizona
->dev
, "Failed to bypass MICVDD: %d\n",
930 /* If we detected a lower impedence during initial startup
931 * then we probably have the wrong polarity, flip it. Don't
932 * do this for the lowest impedences to speed up detection of
933 * plain headphones. If both polarities report a low
934 * impedence then give up and report headphones.
936 if (info
->detecting
&& (val
& MICD_LVL_1_TO_7
)) {
937 if (info
->jack_flips
>= info
->micd_num_modes
* 10) {
938 dev_dbg(arizona
->dev
, "Detected HP/line\n");
940 info
->detecting
= false;
942 arizona_identify_headphone(info
);
944 arizona_stop_mic(info
);
947 if (info
->micd_mode
== info
->micd_num_modes
)
949 arizona_extcon_set_mode(info
, info
->micd_mode
);
958 * If we're still detecting and we detect a short then we've
959 * got a headphone. Otherwise it's a button press.
961 if (val
& MICD_LVL_0_TO_7
) {
963 dev_dbg(arizona
->dev
, "Mic button detected\n");
965 lvl
= val
& ARIZONA_MICD_LVL_MASK
;
966 lvl
>>= ARIZONA_MICD_LVL_SHIFT
;
968 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
969 input_report_key(info
->input
,
970 info
->micd_ranges
[i
].key
, 0);
973 WARN_ON(ffs(lvl
) - 1 >= info
->num_micd_ranges
);
974 if (lvl
&& ffs(lvl
) - 1 < info
->num_micd_ranges
) {
975 key
= info
->micd_ranges
[ffs(lvl
) - 1].key
;
976 input_report_key(info
->input
, key
, 1);
977 input_sync(info
->input
);
980 } else if (info
->detecting
) {
981 dev_dbg(arizona
->dev
, "Headphone detected\n");
982 info
->detecting
= false;
983 arizona_stop_mic(info
);
985 arizona_identify_headphone(info
);
987 dev_warn(arizona
->dev
, "Button with no mic: %x\n",
991 dev_dbg(arizona
->dev
, "Mic button released\n");
992 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
993 input_report_key(info
->input
,
994 info
->micd_ranges
[i
].key
, 0);
995 input_sync(info
->input
);
996 arizona_extcon_pulse_micbias(info
);
1000 if (info
->detecting
) {
1001 if (arizona
->pdata
.micd_software_compare
)
1002 regmap_update_bits(arizona
->regmap
,
1003 ARIZONA_MIC_DETECT_1
,
1007 queue_delayed_work(system_power_efficient_wq
,
1008 &info
->micd_timeout_work
,
1009 msecs_to_jiffies(info
->micd_timeout
));
1012 pm_runtime_mark_last_busy(info
->dev
);
1013 mutex_unlock(&info
->lock
);
1016 static irqreturn_t
arizona_micdet(int irq
, void *data
)
1018 struct arizona_extcon_info
*info
= data
;
1019 struct arizona
*arizona
= info
->arizona
;
1020 int debounce
= arizona
->pdata
.micd_detect_debounce
;
1022 cancel_delayed_work_sync(&info
->micd_detect_work
);
1023 cancel_delayed_work_sync(&info
->micd_timeout_work
);
1025 mutex_lock(&info
->lock
);
1026 if (!info
->detecting
)
1028 mutex_unlock(&info
->lock
);
1031 queue_delayed_work(system_power_efficient_wq
,
1032 &info
->micd_detect_work
,
1033 msecs_to_jiffies(debounce
));
1035 arizona_micd_detect(&info
->micd_detect_work
.work
);
1040 static void arizona_hpdet_work(struct work_struct
*work
)
1042 struct arizona_extcon_info
*info
= container_of(work
,
1043 struct arizona_extcon_info
,
1046 mutex_lock(&info
->lock
);
1047 arizona_start_hpdet_acc_id(info
);
1048 mutex_unlock(&info
->lock
);
1051 static irqreturn_t
arizona_jackdet(int irq
, void *data
)
1053 struct arizona_extcon_info
*info
= data
;
1054 struct arizona
*arizona
= info
->arizona
;
1055 unsigned int val
, present
, mask
;
1056 bool cancelled_hp
, cancelled_mic
;
1059 cancelled_hp
= cancel_delayed_work_sync(&info
->hpdet_work
);
1060 cancelled_mic
= cancel_delayed_work_sync(&info
->micd_timeout_work
);
1062 pm_runtime_get_sync(info
->dev
);
1064 mutex_lock(&info
->lock
);
1066 if (info
->micd_clamp
) {
1067 mask
= ARIZONA_MICD_CLAMP_STS
;
1070 mask
= ARIZONA_JD1_STS
;
1071 if (arizona
->pdata
.jd_invert
)
1074 present
= ARIZONA_JD1_STS
;
1077 ret
= regmap_read(arizona
->regmap
, ARIZONA_AOD_IRQ_RAW_STATUS
, &val
);
1079 dev_err(arizona
->dev
, "Failed to read jackdet status: %d\n",
1081 mutex_unlock(&info
->lock
);
1082 pm_runtime_put_autosuspend(info
->dev
);
1087 if (val
== info
->last_jackdet
) {
1088 dev_dbg(arizona
->dev
, "Suppressing duplicate JACKDET\n");
1090 queue_delayed_work(system_power_efficient_wq
,
1092 msecs_to_jiffies(HPDET_DEBOUNCE
));
1094 if (cancelled_mic
) {
1095 int micd_timeout
= info
->micd_timeout
;
1097 queue_delayed_work(system_power_efficient_wq
,
1098 &info
->micd_timeout_work
,
1099 msecs_to_jiffies(micd_timeout
));
1104 info
->last_jackdet
= val
;
1106 if (info
->last_jackdet
== present
) {
1107 dev_dbg(arizona
->dev
, "Detected jack\n");
1108 ret
= extcon_set_cable_state_(info
->edev
,
1109 EXTCON_MECHANICAL
, true);
1112 dev_err(arizona
->dev
, "Mechanical report failed: %d\n",
1115 if (!arizona
->pdata
.hpdet_acc_id
) {
1116 info
->detecting
= true;
1118 info
->jack_flips
= 0;
1120 arizona_start_mic(info
);
1122 queue_delayed_work(system_power_efficient_wq
,
1124 msecs_to_jiffies(HPDET_DEBOUNCE
));
1127 if (info
->micd_clamp
|| !arizona
->pdata
.jd_invert
)
1128 regmap_update_bits(arizona
->regmap
,
1129 ARIZONA_JACK_DETECT_DEBOUNCE
,
1130 ARIZONA_MICD_CLAMP_DB
|
1133 dev_dbg(arizona
->dev
, "Detected jack removal\n");
1135 arizona_stop_mic(info
);
1137 info
->num_hpdet_res
= 0;
1138 for (i
= 0; i
< ARRAY_SIZE(info
->hpdet_res
); i
++)
1139 info
->hpdet_res
[i
] = 0;
1141 info
->hpdet_done
= false;
1142 info
->hpdet_retried
= false;
1144 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
1145 input_report_key(info
->input
,
1146 info
->micd_ranges
[i
].key
, 0);
1147 input_sync(info
->input
);
1149 ret
= extcon_update_state(info
->edev
, 0xffffffff, 0);
1151 dev_err(arizona
->dev
, "Removal report failed: %d\n",
1154 regmap_update_bits(arizona
->regmap
,
1155 ARIZONA_JACK_DETECT_DEBOUNCE
,
1156 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
,
1157 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
);
1160 if (arizona
->pdata
.micd_timeout
)
1161 info
->micd_timeout
= arizona
->pdata
.micd_timeout
;
1163 info
->micd_timeout
= DEFAULT_MICD_TIMEOUT
;
1166 /* Clear trig_sts to make sure DCVDD is not forced up */
1167 regmap_write(arizona
->regmap
, ARIZONA_AOD_WKUP_AND_TRIG
,
1168 ARIZONA_MICD_CLAMP_FALL_TRIG_STS
|
1169 ARIZONA_MICD_CLAMP_RISE_TRIG_STS
|
1170 ARIZONA_JD1_FALL_TRIG_STS
|
1171 ARIZONA_JD1_RISE_TRIG_STS
);
1173 mutex_unlock(&info
->lock
);
1175 pm_runtime_mark_last_busy(info
->dev
);
1176 pm_runtime_put_autosuspend(info
->dev
);
1181 /* Map a level onto a slot in the register bank */
1182 static void arizona_micd_set_level(struct arizona
*arizona
, int index
,
1188 reg
= ARIZONA_MIC_DETECT_LEVEL_4
- (index
/ 2);
1197 /* Program the level itself */
1198 regmap_update_bits(arizona
->regmap
, reg
, mask
, level
);
1201 static int arizona_extcon_device_get_pdata(struct arizona
*arizona
)
1203 struct arizona_pdata
*pdata
= &arizona
->pdata
;
1204 unsigned int val
= ARIZONA_ACCDET_MODE_HPL
;
1206 device_property_read_u32(arizona
->dev
, "wlf,hpdet-channel", &val
);
1208 case ARIZONA_ACCDET_MODE_HPL
:
1209 case ARIZONA_ACCDET_MODE_HPR
:
1210 pdata
->hpdet_channel
= val
;
1213 dev_err(arizona
->dev
,
1214 "Wrong wlf,hpdet-channel DT value %d\n", val
);
1215 pdata
->hpdet_channel
= ARIZONA_ACCDET_MODE_HPL
;
1218 device_property_read_u32(arizona
->dev
, "wlf,micd-detect-debounce",
1219 &pdata
->micd_detect_debounce
);
1221 device_property_read_u32(arizona
->dev
, "wlf,micd-bias-start-time",
1222 &pdata
->micd_bias_start_time
);
1224 device_property_read_u32(arizona
->dev
, "wlf,micd-rate",
1227 device_property_read_u32(arizona
->dev
, "wlf,micd-dbtime",
1228 &pdata
->micd_dbtime
);
1230 device_property_read_u32(arizona
->dev
, "wlf,micd-timeout",
1231 &pdata
->micd_timeout
);
1233 pdata
->micd_force_micbias
= device_property_read_bool(arizona
->dev
,
1234 "wlf,micd-force-micbias");
1239 static int arizona_extcon_probe(struct platform_device
*pdev
)
1241 struct arizona
*arizona
= dev_get_drvdata(pdev
->dev
.parent
);
1242 struct arizona_pdata
*pdata
= &arizona
->pdata
;
1243 struct arizona_extcon_info
*info
;
1245 unsigned int clamp_mode
;
1246 int jack_irq_fall
, jack_irq_rise
;
1247 int ret
, mode
, i
, j
;
1249 if (!arizona
->dapm
|| !arizona
->dapm
->card
)
1250 return -EPROBE_DEFER
;
1252 info
= devm_kzalloc(&pdev
->dev
, sizeof(*info
), GFP_KERNEL
);
1256 if (!dev_get_platdata(arizona
->dev
))
1257 arizona_extcon_device_get_pdata(arizona
);
1259 info
->micvdd
= devm_regulator_get(&pdev
->dev
, "MICVDD");
1260 if (IS_ERR(info
->micvdd
)) {
1261 ret
= PTR_ERR(info
->micvdd
);
1262 dev_err(arizona
->dev
, "Failed to get MICVDD: %d\n", ret
);
1266 mutex_init(&info
->lock
);
1267 info
->arizona
= arizona
;
1268 info
->dev
= &pdev
->dev
;
1269 info
->last_jackdet
= ~(ARIZONA_MICD_CLAMP_STS
| ARIZONA_JD1_STS
);
1270 INIT_DELAYED_WORK(&info
->hpdet_work
, arizona_hpdet_work
);
1271 INIT_DELAYED_WORK(&info
->micd_detect_work
, arizona_micd_detect
);
1272 INIT_DELAYED_WORK(&info
->micd_timeout_work
, arizona_micd_timeout_work
);
1273 platform_set_drvdata(pdev
, info
);
1275 switch (arizona
->type
) {
1277 switch (arizona
->rev
) {
1279 info
->micd_reva
= true;
1282 info
->micd_clamp
= true;
1283 info
->hpdet_ip_version
= 1;
1289 switch (arizona
->rev
) {
1293 info
->micd_clamp
= true;
1294 info
->hpdet_ip_version
= 2;
1300 info
->micd_clamp
= true;
1301 info
->hpdet_ip_version
= 2;
1307 info
->edev
= devm_extcon_dev_allocate(&pdev
->dev
, arizona_cable
);
1308 if (IS_ERR(info
->edev
)) {
1309 dev_err(&pdev
->dev
, "failed to allocate extcon device\n");
1313 ret
= devm_extcon_dev_register(&pdev
->dev
, info
->edev
);
1315 dev_err(arizona
->dev
, "extcon_dev_register() failed: %d\n",
1320 info
->input
= devm_input_allocate_device(&pdev
->dev
);
1322 dev_err(arizona
->dev
, "Can't allocate input dev\n");
1327 info
->input
->name
= "Headset";
1328 info
->input
->phys
= "arizona/extcon";
1330 if (pdata
->num_micd_configs
) {
1331 info
->micd_modes
= pdata
->micd_configs
;
1332 info
->micd_num_modes
= pdata
->num_micd_configs
;
1334 info
->micd_modes
= micd_default_modes
;
1335 info
->micd_num_modes
= ARRAY_SIZE(micd_default_modes
);
1338 if (arizona
->pdata
.gpsw
> 0)
1339 regmap_update_bits(arizona
->regmap
, ARIZONA_GP_SWITCH_1
,
1340 ARIZONA_SW1_MODE_MASK
, arizona
->pdata
.gpsw
);
1342 if (arizona
->pdata
.micd_pol_gpio
> 0) {
1343 if (info
->micd_modes
[0].gpio
)
1344 mode
= GPIOF_OUT_INIT_HIGH
;
1346 mode
= GPIOF_OUT_INIT_LOW
;
1348 ret
= devm_gpio_request_one(&pdev
->dev
,
1349 arizona
->pdata
.micd_pol_gpio
,
1353 dev_err(arizona
->dev
, "Failed to request GPIO%d: %d\n",
1354 arizona
->pdata
.micd_pol_gpio
, ret
);
1358 if (info
->micd_modes
[0].gpio
)
1359 mode
= GPIOD_OUT_HIGH
;
1361 mode
= GPIOD_OUT_LOW
;
1363 /* We can't use devm here because we need to do the get
1364 * against the MFD device, as that is where the of_node
1365 * will reside, but if we devm against that the GPIO
1366 * will not be freed if the extcon driver is unloaded.
1368 info
->micd_pol_gpio
= gpiod_get_optional(arizona
->dev
,
1371 if (IS_ERR(info
->micd_pol_gpio
)) {
1372 ret
= PTR_ERR(info
->micd_pol_gpio
);
1373 dev_err(arizona
->dev
,
1374 "Failed to get microphone polarity GPIO: %d\n",
1380 if (arizona
->pdata
.hpdet_id_gpio
> 0) {
1381 ret
= devm_gpio_request_one(&pdev
->dev
,
1382 arizona
->pdata
.hpdet_id_gpio
,
1386 dev_err(arizona
->dev
, "Failed to request GPIO%d: %d\n",
1387 arizona
->pdata
.hpdet_id_gpio
, ret
);
1392 if (arizona
->pdata
.micd_bias_start_time
)
1393 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1394 ARIZONA_MICD_BIAS_STARTTIME_MASK
,
1395 arizona
->pdata
.micd_bias_start_time
1396 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT
);
1398 if (arizona
->pdata
.micd_rate
)
1399 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1400 ARIZONA_MICD_RATE_MASK
,
1401 arizona
->pdata
.micd_rate
1402 << ARIZONA_MICD_RATE_SHIFT
);
1404 switch (arizona
->pdata
.micd_dbtime
) {
1405 case MICD_DBTIME_FOUR_READINGS
:
1406 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1407 ARIZONA_MICD_DBTIME_MASK
,
1408 ARIZONA_MICD_DBTIME
);
1410 case MICD_DBTIME_TWO_READINGS
:
1411 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1412 ARIZONA_MICD_DBTIME_MASK
, 0);
1418 BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels
) <
1419 ARIZONA_NUM_MICD_BUTTON_LEVELS
);
1421 if (arizona
->pdata
.num_micd_ranges
) {
1422 info
->micd_ranges
= pdata
->micd_ranges
;
1423 info
->num_micd_ranges
= pdata
->num_micd_ranges
;
1425 info
->micd_ranges
= micd_default_ranges
;
1426 info
->num_micd_ranges
= ARRAY_SIZE(micd_default_ranges
);
1429 if (arizona
->pdata
.num_micd_ranges
> ARIZONA_MAX_MICD_RANGE
) {
1430 dev_err(arizona
->dev
, "Too many MICD ranges: %d\n",
1431 arizona
->pdata
.num_micd_ranges
);
1434 if (info
->num_micd_ranges
> 1) {
1435 for (i
= 1; i
< info
->num_micd_ranges
; i
++) {
1436 if (info
->micd_ranges
[i
- 1].max
>
1437 info
->micd_ranges
[i
].max
) {
1438 dev_err(arizona
->dev
,
1439 "MICD ranges must be sorted\n");
1446 /* Disable all buttons by default */
1447 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_2
,
1448 ARIZONA_MICD_LVL_SEL_MASK
, 0x81);
1450 /* Set up all the buttons the user specified */
1451 for (i
= 0; i
< info
->num_micd_ranges
; i
++) {
1452 for (j
= 0; j
< ARIZONA_NUM_MICD_BUTTON_LEVELS
; j
++)
1453 if (arizona_micd_levels
[j
] >= info
->micd_ranges
[i
].max
)
1456 if (j
== ARIZONA_NUM_MICD_BUTTON_LEVELS
) {
1457 dev_err(arizona
->dev
, "Unsupported MICD level %d\n",
1458 info
->micd_ranges
[i
].max
);
1463 dev_dbg(arizona
->dev
, "%d ohms for MICD threshold %d\n",
1464 arizona_micd_levels
[j
], i
);
1466 arizona_micd_set_level(arizona
, i
, j
);
1467 input_set_capability(info
->input
, EV_KEY
,
1468 info
->micd_ranges
[i
].key
);
1470 /* Enable reporting of that range */
1471 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_2
,
1475 /* Set all the remaining keys to a maximum */
1476 for (; i
< ARIZONA_MAX_MICD_RANGE
; i
++)
1477 arizona_micd_set_level(arizona
, i
, 0x3f);
1480 * If we have a clamp use it, activating in conjunction with
1481 * GPIO5 if that is connected for jack detect operation.
1483 if (info
->micd_clamp
) {
1484 if (arizona
->pdata
.jd_gpio5
) {
1485 /* Put the GPIO into input mode with optional pull */
1487 if (arizona
->pdata
.jd_gpio5_nopull
)
1488 val
&= ~ARIZONA_GPN_PU
;
1490 regmap_write(arizona
->regmap
, ARIZONA_GPIO5_CTRL
,
1493 if (arizona
->pdata
.jd_invert
)
1494 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDH_GP5H
;
1496 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDL_GP5H
;
1498 if (arizona
->pdata
.jd_invert
)
1499 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDH
;
1501 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDL
;
1504 regmap_update_bits(arizona
->regmap
,
1505 ARIZONA_MICD_CLAMP_CONTROL
,
1506 ARIZONA_MICD_CLAMP_MODE_MASK
, clamp_mode
);
1508 regmap_update_bits(arizona
->regmap
,
1509 ARIZONA_JACK_DETECT_DEBOUNCE
,
1510 ARIZONA_MICD_CLAMP_DB
,
1511 ARIZONA_MICD_CLAMP_DB
);
1514 arizona_extcon_set_mode(info
, 0);
1516 pm_runtime_enable(&pdev
->dev
);
1517 pm_runtime_idle(&pdev
->dev
);
1518 pm_runtime_get_sync(&pdev
->dev
);
1520 if (info
->micd_clamp
) {
1521 jack_irq_rise
= ARIZONA_IRQ_MICD_CLAMP_RISE
;
1522 jack_irq_fall
= ARIZONA_IRQ_MICD_CLAMP_FALL
;
1524 jack_irq_rise
= ARIZONA_IRQ_JD_RISE
;
1525 jack_irq_fall
= ARIZONA_IRQ_JD_FALL
;
1528 ret
= arizona_request_irq(arizona
, jack_irq_rise
,
1529 "JACKDET rise", arizona_jackdet
, info
);
1531 dev_err(&pdev
->dev
, "Failed to get JACKDET rise IRQ: %d\n",
1536 ret
= arizona_set_irq_wake(arizona
, jack_irq_rise
, 1);
1538 dev_err(&pdev
->dev
, "Failed to set JD rise IRQ wake: %d\n",
1543 ret
= arizona_request_irq(arizona
, jack_irq_fall
,
1544 "JACKDET fall", arizona_jackdet
, info
);
1546 dev_err(&pdev
->dev
, "Failed to get JD fall IRQ: %d\n", ret
);
1550 ret
= arizona_set_irq_wake(arizona
, jack_irq_fall
, 1);
1552 dev_err(&pdev
->dev
, "Failed to set JD fall IRQ wake: %d\n",
1557 ret
= arizona_request_irq(arizona
, ARIZONA_IRQ_MICDET
,
1558 "MICDET", arizona_micdet
, info
);
1560 dev_err(&pdev
->dev
, "Failed to get MICDET IRQ: %d\n", ret
);
1564 ret
= arizona_request_irq(arizona
, ARIZONA_IRQ_HPDET
,
1565 "HPDET", arizona_hpdet_irq
, info
);
1567 dev_err(&pdev
->dev
, "Failed to get HPDET IRQ: %d\n", ret
);
1571 arizona_clk32k_enable(arizona
);
1572 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_DEBOUNCE
,
1573 ARIZONA_JD1_DB
, ARIZONA_JD1_DB
);
1574 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_ANALOGUE
,
1575 ARIZONA_JD1_ENA
, ARIZONA_JD1_ENA
);
1577 ret
= regulator_allow_bypass(info
->micvdd
, true);
1579 dev_warn(arizona
->dev
, "Failed to set MICVDD to bypass: %d\n",
1582 pm_runtime_put(&pdev
->dev
);
1584 ret
= input_register_device(info
->input
);
1586 dev_err(&pdev
->dev
, "Can't register input device: %d\n", ret
);
1593 arizona_free_irq(arizona
, ARIZONA_IRQ_HPDET
, info
);
1595 arizona_free_irq(arizona
, ARIZONA_IRQ_MICDET
, info
);
1597 arizona_set_irq_wake(arizona
, jack_irq_fall
, 0);
1599 arizona_free_irq(arizona
, jack_irq_fall
, info
);
1601 arizona_set_irq_wake(arizona
, jack_irq_rise
, 0);
1603 arizona_free_irq(arizona
, jack_irq_rise
, info
);
1605 gpiod_put(info
->micd_pol_gpio
);
1607 pm_runtime_disable(&pdev
->dev
);
1611 static int arizona_extcon_remove(struct platform_device
*pdev
)
1613 struct arizona_extcon_info
*info
= platform_get_drvdata(pdev
);
1614 struct arizona
*arizona
= info
->arizona
;
1615 int jack_irq_rise
, jack_irq_fall
;
1617 gpiod_put(info
->micd_pol_gpio
);
1619 pm_runtime_disable(&pdev
->dev
);
1621 regmap_update_bits(arizona
->regmap
,
1622 ARIZONA_MICD_CLAMP_CONTROL
,
1623 ARIZONA_MICD_CLAMP_MODE_MASK
, 0);
1625 if (info
->micd_clamp
) {
1626 jack_irq_rise
= ARIZONA_IRQ_MICD_CLAMP_RISE
;
1627 jack_irq_fall
= ARIZONA_IRQ_MICD_CLAMP_FALL
;
1629 jack_irq_rise
= ARIZONA_IRQ_JD_RISE
;
1630 jack_irq_fall
= ARIZONA_IRQ_JD_FALL
;
1633 arizona_set_irq_wake(arizona
, jack_irq_rise
, 0);
1634 arizona_set_irq_wake(arizona
, jack_irq_fall
, 0);
1635 arizona_free_irq(arizona
, ARIZONA_IRQ_HPDET
, info
);
1636 arizona_free_irq(arizona
, ARIZONA_IRQ_MICDET
, info
);
1637 arizona_free_irq(arizona
, jack_irq_rise
, info
);
1638 arizona_free_irq(arizona
, jack_irq_fall
, info
);
1639 cancel_delayed_work_sync(&info
->hpdet_work
);
1640 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_ANALOGUE
,
1641 ARIZONA_JD1_ENA
, 0);
1642 arizona_clk32k_disable(arizona
);
1647 static struct platform_driver arizona_extcon_driver
= {
1649 .name
= "arizona-extcon",
1651 .probe
= arizona_extcon_probe
,
1652 .remove
= arizona_extcon_remove
,
1655 module_platform_driver(arizona_extcon_driver
);
1657 MODULE_DESCRIPTION("Arizona Extcon driver");
1658 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1659 MODULE_LICENSE("GPL");
1660 MODULE_ALIAS("platform:extcon-arizona");