2 * extcon-arizona.c - Extcon driver Wolfson Arizona devices
4 * Copyright (C) 2012 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.h>
24 #include <linux/input.h>
25 #include <linux/platform_device.h>
26 #include <linux/pm_runtime.h>
27 #include <linux/regulator/consumer.h>
28 #include <linux/extcon.h>
30 #include <sound/soc.h>
32 #include <linux/mfd/arizona/core.h>
33 #include <linux/mfd/arizona/pdata.h>
34 #include <linux/mfd/arizona/registers.h>
36 #define ARIZONA_MAX_MICD_RANGE 8
38 #define ARIZONA_ACCDET_MODE_MIC 0
39 #define ARIZONA_ACCDET_MODE_HPL 1
40 #define ARIZONA_ACCDET_MODE_HPR 2
42 #define ARIZONA_HPDET_MAX 10000
44 #define HPDET_DEBOUNCE 500
45 #define DEFAULT_MICD_TIMEOUT 2000
47 #define MICD_LVL_1_TO_7 (ARIZONA_MICD_LVL_1 | ARIZONA_MICD_LVL_2 | \
48 ARIZONA_MICD_LVL_3 | ARIZONA_MICD_LVL_4 | \
49 ARIZONA_MICD_LVL_5 | ARIZONA_MICD_LVL_6 | \
52 #define MICD_LVL_0_TO_7 (ARIZONA_MICD_LVL_0 | MICD_LVL_1_TO_7)
54 #define MICD_LVL_0_TO_8 (MICD_LVL_0_TO_7 | ARIZONA_MICD_LVL_8)
56 struct arizona_extcon_info
{
58 struct arizona
*arizona
;
60 struct regulator
*micvdd
;
61 struct input_dev
*input
;
66 const struct arizona_micd_config
*micd_modes
;
69 const struct arizona_micd_range
*micd_ranges
;
77 struct delayed_work hpdet_work
;
78 struct delayed_work micd_detect_work
;
79 struct delayed_work micd_timeout_work
;
86 unsigned int hpdet_res
[3];
94 struct extcon_dev edev
;
97 static const struct arizona_micd_config micd_default_modes
[] = {
98 { ARIZONA_ACCDET_SRC
, 1, 0 },
102 static const struct arizona_micd_range micd_default_ranges
[] = {
103 { .max
= 11, .key
= BTN_0
},
104 { .max
= 28, .key
= BTN_1
},
105 { .max
= 54, .key
= BTN_2
},
106 { .max
= 100, .key
= BTN_3
},
107 { .max
= 186, .key
= BTN_4
},
108 { .max
= 430, .key
= BTN_5
},
111 static const int arizona_micd_levels
[] = {
112 3, 6, 8, 11, 13, 16, 18, 21, 23, 26, 28, 31, 34, 36, 39, 41, 44, 46,
113 49, 52, 54, 57, 60, 62, 65, 67, 70, 73, 75, 78, 81, 83, 89, 94, 100,
114 105, 111, 116, 122, 127, 139, 150, 161, 173, 186, 196, 209, 220, 245,
115 270, 295, 321, 348, 375, 402, 430, 489, 550, 614, 681, 752, 903, 1071,
119 #define ARIZONA_CABLE_MECHANICAL 0
120 #define ARIZONA_CABLE_MICROPHONE 1
121 #define ARIZONA_CABLE_HEADPHONE 2
122 #define ARIZONA_CABLE_LINEOUT 3
124 static const char *arizona_cable
[] = {
132 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info
*info
);
134 static void arizona_extcon_do_magic(struct arizona_extcon_info
*info
,
137 struct arizona
*arizona
= info
->arizona
;
140 mutex_lock(&arizona
->dapm
->card
->dapm_mutex
);
142 arizona
->hpdet_magic
= magic
;
144 /* Keep the HP output stages disabled while doing the magic */
146 ret
= regmap_update_bits(arizona
->regmap
,
147 ARIZONA_OUTPUT_ENABLES_1
,
149 ARIZONA_OUT1R_ENA
, 0);
151 dev_warn(arizona
->dev
,
152 "Failed to disable headphone outputs: %d\n",
156 ret
= regmap_update_bits(arizona
->regmap
, 0x225, 0x4000,
159 dev_warn(arizona
->dev
, "Failed to do magic: %d\n",
162 ret
= regmap_update_bits(arizona
->regmap
, 0x226, 0x4000,
165 dev_warn(arizona
->dev
, "Failed to do magic: %d\n",
168 /* Restore the desired state while not doing the magic */
170 ret
= regmap_update_bits(arizona
->regmap
,
171 ARIZONA_OUTPUT_ENABLES_1
,
173 ARIZONA_OUT1R_ENA
, arizona
->hp_ena
);
175 dev_warn(arizona
->dev
,
176 "Failed to restore headphone outputs: %d\n",
180 mutex_unlock(&arizona
->dapm
->card
->dapm_mutex
);
183 static void arizona_extcon_set_mode(struct arizona_extcon_info
*info
, int mode
)
185 struct arizona
*arizona
= info
->arizona
;
187 mode
%= info
->micd_num_modes
;
189 if (arizona
->pdata
.micd_pol_gpio
> 0)
190 gpio_set_value_cansleep(arizona
->pdata
.micd_pol_gpio
,
191 info
->micd_modes
[mode
].gpio
);
192 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
193 ARIZONA_MICD_BIAS_SRC_MASK
,
194 info
->micd_modes
[mode
].bias
<<
195 ARIZONA_MICD_BIAS_SRC_SHIFT
);
196 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
197 ARIZONA_ACCDET_SRC
, info
->micd_modes
[mode
].src
);
199 info
->micd_mode
= mode
;
201 dev_dbg(arizona
->dev
, "Set jack polarity to %d\n", mode
);
204 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info
*info
)
206 switch (info
->micd_modes
[0].bias
) {
218 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info
*info
)
220 struct arizona
*arizona
= info
->arizona
;
221 const char *widget
= arizona_extcon_get_micbias(info
);
222 struct snd_soc_dapm_context
*dapm
= arizona
->dapm
;
225 mutex_lock(&dapm
->card
->dapm_mutex
);
227 ret
= snd_soc_dapm_force_enable_pin(dapm
, widget
);
229 dev_warn(arizona
->dev
, "Failed to enable %s: %d\n",
232 mutex_unlock(&dapm
->card
->dapm_mutex
);
234 snd_soc_dapm_sync(dapm
);
236 if (!arizona
->pdata
.micd_force_micbias
) {
237 mutex_lock(&dapm
->card
->dapm_mutex
);
239 ret
= snd_soc_dapm_disable_pin(arizona
->dapm
, widget
);
241 dev_warn(arizona
->dev
, "Failed to disable %s: %d\n",
244 mutex_unlock(&dapm
->card
->dapm_mutex
);
246 snd_soc_dapm_sync(dapm
);
250 static void arizona_start_mic(struct arizona_extcon_info
*info
)
252 struct arizona
*arizona
= info
->arizona
;
256 /* Microphone detection can't use idle mode */
257 pm_runtime_get(info
->dev
);
259 if (info
->detecting
) {
260 ret
= regulator_allow_bypass(info
->micvdd
, false);
262 dev_err(arizona
->dev
,
263 "Failed to regulate MICVDD: %d\n",
268 ret
= regulator_enable(info
->micvdd
);
270 dev_err(arizona
->dev
, "Failed to enable MICVDD: %d\n",
274 if (info
->micd_reva
) {
275 regmap_write(arizona
->regmap
, 0x80, 0x3);
276 regmap_write(arizona
->regmap
, 0x294, 0);
277 regmap_write(arizona
->regmap
, 0x80, 0x0);
280 regmap_update_bits(arizona
->regmap
,
281 ARIZONA_ACCESSORY_DETECT_MODE_1
,
282 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
284 arizona_extcon_pulse_micbias(info
);
286 regmap_update_bits_check(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
287 ARIZONA_MICD_ENA
, ARIZONA_MICD_ENA
,
290 regulator_disable(info
->micvdd
);
291 pm_runtime_put_autosuspend(info
->dev
);
295 static void arizona_stop_mic(struct arizona_extcon_info
*info
)
297 struct arizona
*arizona
= info
->arizona
;
298 const char *widget
= arizona_extcon_get_micbias(info
);
299 struct snd_soc_dapm_context
*dapm
= arizona
->dapm
;
303 regmap_update_bits_check(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
307 mutex_lock(&dapm
->card
->dapm_mutex
);
309 ret
= snd_soc_dapm_disable_pin(dapm
, widget
);
311 dev_warn(arizona
->dev
,
312 "Failed to disable %s: %d\n",
315 mutex_unlock(&dapm
->card
->dapm_mutex
);
317 snd_soc_dapm_sync(dapm
);
319 if (info
->micd_reva
) {
320 regmap_write(arizona
->regmap
, 0x80, 0x3);
321 regmap_write(arizona
->regmap
, 0x294, 2);
322 regmap_write(arizona
->regmap
, 0x80, 0x0);
325 ret
= regulator_allow_bypass(info
->micvdd
, true);
327 dev_err(arizona
->dev
, "Failed to bypass MICVDD: %d\n",
332 regulator_disable(info
->micvdd
);
333 pm_runtime_mark_last_busy(info
->dev
);
334 pm_runtime_put_autosuspend(info
->dev
);
339 unsigned int factor_a
;
340 unsigned int factor_b
;
341 } arizona_hpdet_b_ranges
[] = {
350 } arizona_hpdet_c_ranges
[] = {
357 static int arizona_hpdet_read(struct arizona_extcon_info
*info
)
359 struct arizona
*arizona
= info
->arizona
;
360 unsigned int val
, range
;
363 ret
= regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_2
, &val
);
365 dev_err(arizona
->dev
, "Failed to read HPDET status: %d\n",
370 switch (info
->hpdet_ip
) {
372 if (!(val
& ARIZONA_HP_DONE
)) {
373 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
378 val
&= ARIZONA_HP_LVL_MASK
;
382 if (!(val
& ARIZONA_HP_DONE_B
)) {
383 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
388 ret
= regmap_read(arizona
->regmap
, ARIZONA_HP_DACVAL
, &val
);
390 dev_err(arizona
->dev
, "Failed to read HP value: %d\n",
395 regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
397 range
= (range
& ARIZONA_HP_IMPEDANCE_RANGE_MASK
)
398 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
;
400 if (range
< ARRAY_SIZE(arizona_hpdet_b_ranges
) - 1 &&
401 (val
< 100 || val
>= 0x3fb)) {
403 dev_dbg(arizona
->dev
, "Moving to HPDET range %d\n",
405 regmap_update_bits(arizona
->regmap
,
406 ARIZONA_HEADPHONE_DETECT_1
,
407 ARIZONA_HP_IMPEDANCE_RANGE_MASK
,
409 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
);
413 /* If we go out of range report top of range */
414 if (val
< 100 || val
>= 0x3fb) {
415 dev_dbg(arizona
->dev
, "Measurement out of range\n");
416 return ARIZONA_HPDET_MAX
;
419 dev_dbg(arizona
->dev
, "HPDET read %d in range %d\n",
422 val
= arizona_hpdet_b_ranges
[range
].factor_b
424 arizona_hpdet_b_ranges
[range
].factor_a
);
428 dev_warn(arizona
->dev
, "Unknown HPDET IP revision %d\n",
431 if (!(val
& ARIZONA_HP_DONE_B
)) {
432 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
437 val
&= ARIZONA_HP_LVL_B_MASK
;
438 /* Convert to ohms, the value is in 0.5 ohm increments */
441 regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
443 range
= (range
& ARIZONA_HP_IMPEDANCE_RANGE_MASK
)
444 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
;
446 /* Skip up a range, or report? */
447 if (range
< ARRAY_SIZE(arizona_hpdet_c_ranges
) - 1 &&
448 (val
>= arizona_hpdet_c_ranges
[range
].max
)) {
450 dev_dbg(arizona
->dev
, "Moving to HPDET range %d-%d\n",
451 arizona_hpdet_c_ranges
[range
].min
,
452 arizona_hpdet_c_ranges
[range
].max
);
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 (range
&& (val
< arizona_hpdet_c_ranges
[range
].min
)) {
462 dev_dbg(arizona
->dev
, "Reporting range boundary %d\n",
463 arizona_hpdet_c_ranges
[range
].min
);
464 val
= arizona_hpdet_c_ranges
[range
].min
;
468 dev_dbg(arizona
->dev
, "HP impedance %d ohms\n", val
);
472 static int arizona_hpdet_do_id(struct arizona_extcon_info
*info
, int *reading
,
475 struct arizona
*arizona
= info
->arizona
;
476 int id_gpio
= arizona
->pdata
.hpdet_id_gpio
;
479 * If we're using HPDET for accessory identification we need
480 * to take multiple measurements, step through them in sequence.
482 if (arizona
->pdata
.hpdet_acc_id
) {
483 info
->hpdet_res
[info
->num_hpdet_res
++] = *reading
;
485 /* Only check the mic directly if we didn't already ID it */
486 if (id_gpio
&& info
->num_hpdet_res
== 1) {
487 dev_dbg(arizona
->dev
, "Measuring mic\n");
489 regmap_update_bits(arizona
->regmap
,
490 ARIZONA_ACCESSORY_DETECT_MODE_1
,
491 ARIZONA_ACCDET_MODE_MASK
|
493 ARIZONA_ACCDET_MODE_HPR
|
494 info
->micd_modes
[0].src
);
496 gpio_set_value_cansleep(id_gpio
, 1);
498 regmap_update_bits(arizona
->regmap
,
499 ARIZONA_HEADPHONE_DETECT_1
,
500 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
504 /* OK, got both. Now, compare... */
505 dev_dbg(arizona
->dev
, "HPDET measured %d %d\n",
506 info
->hpdet_res
[0], info
->hpdet_res
[1]);
508 /* Take the headphone impedance for the main report */
509 *reading
= info
->hpdet_res
[0];
511 /* Sometimes we get false readings due to slow insert */
512 if (*reading
>= ARIZONA_HPDET_MAX
&& !info
->hpdet_retried
) {
513 dev_dbg(arizona
->dev
, "Retrying high impedance\n");
514 info
->num_hpdet_res
= 0;
515 info
->hpdet_retried
= true;
516 arizona_start_hpdet_acc_id(info
);
517 pm_runtime_put(info
->dev
);
522 * If we measure the mic as high impedance
524 if (!id_gpio
|| info
->hpdet_res
[1] > 50) {
525 dev_dbg(arizona
->dev
, "Detected mic\n");
527 info
->detecting
= true;
529 dev_dbg(arizona
->dev
, "Detected headphone\n");
532 /* Make sure everything is reset back to the real polarity */
533 regmap_update_bits(arizona
->regmap
,
534 ARIZONA_ACCESSORY_DETECT_MODE_1
,
536 info
->micd_modes
[0].src
);
542 static irqreturn_t
arizona_hpdet_irq(int irq
, void *data
)
544 struct arizona_extcon_info
*info
= data
;
545 struct arizona
*arizona
= info
->arizona
;
546 int id_gpio
= arizona
->pdata
.hpdet_id_gpio
;
547 int report
= ARIZONA_CABLE_HEADPHONE
;
551 mutex_lock(&info
->lock
);
553 /* If we got a spurious IRQ for some reason then ignore it */
554 if (!info
->hpdet_active
) {
555 dev_warn(arizona
->dev
, "Spurious HPDET IRQ\n");
556 mutex_unlock(&info
->lock
);
560 /* If the cable was removed while measuring ignore the result */
561 ret
= extcon_get_cable_state_(&info
->edev
, ARIZONA_CABLE_MECHANICAL
);
563 dev_err(arizona
->dev
, "Failed to check cable state: %d\n",
567 dev_dbg(arizona
->dev
, "Ignoring HPDET for removed cable\n");
571 ret
= arizona_hpdet_read(info
);
578 /* Reset back to starting range */
579 regmap_update_bits(arizona
->regmap
,
580 ARIZONA_HEADPHONE_DETECT_1
,
581 ARIZONA_HP_IMPEDANCE_RANGE_MASK
| ARIZONA_HP_POLL
,
584 ret
= arizona_hpdet_do_id(info
, &reading
, &mic
);
590 /* Report high impedence cables as line outputs */
592 report
= ARIZONA_CABLE_LINEOUT
;
594 report
= ARIZONA_CABLE_HEADPHONE
;
596 ret
= extcon_set_cable_state_(&info
->edev
, report
, true);
598 dev_err(arizona
->dev
, "Failed to report HP/line: %d\n",
602 /* Reset back to starting range */
603 regmap_update_bits(arizona
->regmap
,
604 ARIZONA_HEADPHONE_DETECT_1
,
605 ARIZONA_HP_IMPEDANCE_RANGE_MASK
| ARIZONA_HP_POLL
,
608 arizona_extcon_do_magic(info
, 0);
611 gpio_set_value_cansleep(id_gpio
, 0);
613 /* Revert back to MICDET mode */
614 regmap_update_bits(arizona
->regmap
,
615 ARIZONA_ACCESSORY_DETECT_MODE_1
,
616 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
618 /* If we have a mic then reenable MICDET */
619 if (mic
|| info
->mic
)
620 arizona_start_mic(info
);
622 if (info
->hpdet_active
) {
623 pm_runtime_put_autosuspend(info
->dev
);
624 info
->hpdet_active
= false;
627 info
->hpdet_done
= true;
630 mutex_unlock(&info
->lock
);
635 static void arizona_identify_headphone(struct arizona_extcon_info
*info
)
637 struct arizona
*arizona
= info
->arizona
;
640 if (info
->hpdet_done
)
643 dev_dbg(arizona
->dev
, "Starting HPDET\n");
645 /* Make sure we keep the device enabled during the measurement */
646 pm_runtime_get(info
->dev
);
648 info
->hpdet_active
= true;
651 arizona_stop_mic(info
);
653 arizona_extcon_do_magic(info
, 0x4000);
655 ret
= regmap_update_bits(arizona
->regmap
,
656 ARIZONA_ACCESSORY_DETECT_MODE_1
,
657 ARIZONA_ACCDET_MODE_MASK
,
658 ARIZONA_ACCDET_MODE_HPL
);
660 dev_err(arizona
->dev
, "Failed to set HPDETL mode: %d\n", ret
);
664 ret
= regmap_update_bits(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
665 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
667 dev_err(arizona
->dev
, "Can't start HPDETL measurement: %d\n",
675 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
676 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
678 /* Just report headphone */
679 ret
= extcon_update_state(&info
->edev
,
680 1 << ARIZONA_CABLE_HEADPHONE
,
681 1 << ARIZONA_CABLE_HEADPHONE
);
683 dev_err(arizona
->dev
, "Failed to report headphone: %d\n", ret
);
686 arizona_start_mic(info
);
688 info
->hpdet_active
= false;
691 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info
*info
)
693 struct arizona
*arizona
= info
->arizona
;
698 dev_dbg(arizona
->dev
, "Starting identification via HPDET\n");
700 /* Make sure we keep the device enabled during the measurement */
701 pm_runtime_get_sync(info
->dev
);
703 info
->hpdet_active
= true;
705 arizona_extcon_do_magic(info
, 0x4000);
707 ret
= regmap_update_bits(arizona
->regmap
,
708 ARIZONA_ACCESSORY_DETECT_MODE_1
,
709 ARIZONA_ACCDET_SRC
| ARIZONA_ACCDET_MODE_MASK
,
710 info
->micd_modes
[0].src
|
711 ARIZONA_ACCDET_MODE_HPL
);
713 dev_err(arizona
->dev
, "Failed to set HPDETL mode: %d\n", ret
);
717 if (arizona
->pdata
.hpdet_acc_id_line
) {
718 ret
= regmap_update_bits(arizona
->regmap
,
719 ARIZONA_HEADPHONE_DETECT_1
,
720 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
722 dev_err(arizona
->dev
,
723 "Can't start HPDETL measurement: %d\n",
728 arizona_hpdet_do_id(info
, &hp_reading
, &mic
);
734 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
735 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
737 /* Just report headphone */
738 ret
= extcon_update_state(&info
->edev
,
739 1 << ARIZONA_CABLE_HEADPHONE
,
740 1 << ARIZONA_CABLE_HEADPHONE
);
742 dev_err(arizona
->dev
, "Failed to report headphone: %d\n", ret
);
744 info
->hpdet_active
= false;
747 static void arizona_micd_timeout_work(struct work_struct
*work
)
749 struct arizona_extcon_info
*info
= container_of(work
,
750 struct arizona_extcon_info
,
751 micd_timeout_work
.work
);
753 mutex_lock(&info
->lock
);
755 dev_dbg(info
->arizona
->dev
, "MICD timed out, reporting HP\n");
756 arizona_identify_headphone(info
);
758 info
->detecting
= false;
760 arizona_stop_mic(info
);
762 mutex_unlock(&info
->lock
);
765 static void arizona_micd_detect(struct work_struct
*work
)
767 struct arizona_extcon_info
*info
= container_of(work
,
768 struct arizona_extcon_info
,
769 micd_detect_work
.work
);
770 struct arizona
*arizona
= info
->arizona
;
771 unsigned int val
= 0, lvl
;
774 cancel_delayed_work_sync(&info
->micd_timeout_work
);
776 mutex_lock(&info
->lock
);
778 /* If the cable was removed while measuring ignore the result */
779 ret
= extcon_get_cable_state_(&info
->edev
, ARIZONA_CABLE_MECHANICAL
);
781 dev_err(arizona
->dev
, "Failed to check cable state: %d\n",
783 mutex_unlock(&info
->lock
);
786 dev_dbg(arizona
->dev
, "Ignoring MICDET for removed cable\n");
787 mutex_unlock(&info
->lock
);
791 for (i
= 0; i
< 10 && !(val
& MICD_LVL_0_TO_8
); i
++) {
792 ret
= regmap_read(arizona
->regmap
, ARIZONA_MIC_DETECT_3
, &val
);
794 dev_err(arizona
->dev
,
795 "Failed to read MICDET: %d\n", ret
);
796 mutex_unlock(&info
->lock
);
800 dev_dbg(arizona
->dev
, "MICDET: %x\n", val
);
802 if (!(val
& ARIZONA_MICD_VALID
)) {
803 dev_warn(arizona
->dev
,
804 "Microphone detection state invalid\n");
805 mutex_unlock(&info
->lock
);
810 if (i
== 10 && !(val
& MICD_LVL_0_TO_8
)) {
811 dev_err(arizona
->dev
, "Failed to get valid MICDET value\n");
812 mutex_unlock(&info
->lock
);
816 /* Due to jack detect this should never happen */
817 if (!(val
& ARIZONA_MICD_STS
)) {
818 dev_warn(arizona
->dev
, "Detected open circuit\n");
819 info
->detecting
= false;
823 /* If we got a high impedence we should have a headset, report it. */
824 if (info
->detecting
&& (val
& ARIZONA_MICD_LVL_8
)) {
825 arizona_identify_headphone(info
);
827 ret
= extcon_update_state(&info
->edev
,
828 1 << ARIZONA_CABLE_MICROPHONE
,
829 1 << ARIZONA_CABLE_MICROPHONE
);
832 dev_err(arizona
->dev
, "Headset report failed: %d\n",
835 /* Don't need to regulate for button detection */
836 ret
= regulator_allow_bypass(info
->micvdd
, false);
838 dev_err(arizona
->dev
, "Failed to bypass MICVDD: %d\n",
843 info
->detecting
= false;
847 /* If we detected a lower impedence during initial startup
848 * then we probably have the wrong polarity, flip it. Don't
849 * do this for the lowest impedences to speed up detection of
850 * plain headphones. If both polarities report a low
851 * impedence then give up and report headphones.
853 if (info
->detecting
&& (val
& MICD_LVL_1_TO_7
)) {
854 if (info
->jack_flips
>= info
->micd_num_modes
* 10) {
855 dev_dbg(arizona
->dev
, "Detected HP/line\n");
856 arizona_identify_headphone(info
);
858 info
->detecting
= false;
860 arizona_stop_mic(info
);
863 if (info
->micd_mode
== info
->micd_num_modes
)
865 arizona_extcon_set_mode(info
, info
->micd_mode
);
874 * If we're still detecting and we detect a short then we've
875 * got a headphone. Otherwise it's a button press.
877 if (val
& MICD_LVL_0_TO_7
) {
879 dev_dbg(arizona
->dev
, "Mic button detected\n");
881 lvl
= val
& ARIZONA_MICD_LVL_MASK
;
882 lvl
>>= ARIZONA_MICD_LVL_SHIFT
;
884 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
885 input_report_key(info
->input
,
886 info
->micd_ranges
[i
].key
, 0);
889 WARN_ON(ffs(lvl
) - 1 >= info
->num_micd_ranges
);
890 if (lvl
&& ffs(lvl
) - 1 < info
->num_micd_ranges
) {
891 key
= info
->micd_ranges
[ffs(lvl
) - 1].key
;
892 input_report_key(info
->input
, key
, 1);
893 input_sync(info
->input
);
896 } else if (info
->detecting
) {
897 dev_dbg(arizona
->dev
, "Headphone detected\n");
898 info
->detecting
= false;
899 arizona_stop_mic(info
);
901 arizona_identify_headphone(info
);
903 dev_warn(arizona
->dev
, "Button with no mic: %x\n",
907 dev_dbg(arizona
->dev
, "Mic button released\n");
908 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
909 input_report_key(info
->input
,
910 info
->micd_ranges
[i
].key
, 0);
911 input_sync(info
->input
);
912 arizona_extcon_pulse_micbias(info
);
917 queue_delayed_work(system_power_efficient_wq
,
918 &info
->micd_timeout_work
,
919 msecs_to_jiffies(info
->micd_timeout
));
921 pm_runtime_mark_last_busy(info
->dev
);
922 mutex_unlock(&info
->lock
);
925 static irqreturn_t
arizona_micdet(int irq
, void *data
)
927 struct arizona_extcon_info
*info
= data
;
928 struct arizona
*arizona
= info
->arizona
;
929 int debounce
= arizona
->pdata
.micd_detect_debounce
;
931 cancel_delayed_work_sync(&info
->micd_detect_work
);
932 cancel_delayed_work_sync(&info
->micd_timeout_work
);
934 mutex_lock(&info
->lock
);
935 if (!info
->detecting
)
937 mutex_unlock(&info
->lock
);
940 queue_delayed_work(system_power_efficient_wq
,
941 &info
->micd_detect_work
,
942 msecs_to_jiffies(debounce
));
944 arizona_micd_detect(&info
->micd_detect_work
.work
);
949 static void arizona_hpdet_work(struct work_struct
*work
)
951 struct arizona_extcon_info
*info
= container_of(work
,
952 struct arizona_extcon_info
,
955 mutex_lock(&info
->lock
);
956 arizona_start_hpdet_acc_id(info
);
957 mutex_unlock(&info
->lock
);
960 static irqreturn_t
arizona_jackdet(int irq
, void *data
)
962 struct arizona_extcon_info
*info
= data
;
963 struct arizona
*arizona
= info
->arizona
;
964 unsigned int val
, present
, mask
;
965 bool cancelled_hp
, cancelled_mic
;
968 cancelled_hp
= cancel_delayed_work_sync(&info
->hpdet_work
);
969 cancelled_mic
= cancel_delayed_work_sync(&info
->micd_timeout_work
);
971 pm_runtime_get_sync(info
->dev
);
973 mutex_lock(&info
->lock
);
975 if (arizona
->pdata
.jd_gpio5
) {
976 mask
= ARIZONA_MICD_CLAMP_STS
;
979 mask
= ARIZONA_JD1_STS
;
980 present
= ARIZONA_JD1_STS
;
983 ret
= regmap_read(arizona
->regmap
, ARIZONA_AOD_IRQ_RAW_STATUS
, &val
);
985 dev_err(arizona
->dev
, "Failed to read jackdet status: %d\n",
987 mutex_unlock(&info
->lock
);
988 pm_runtime_put_autosuspend(info
->dev
);
993 if (val
== info
->last_jackdet
) {
994 dev_dbg(arizona
->dev
, "Suppressing duplicate JACKDET\n");
996 queue_delayed_work(system_power_efficient_wq
,
998 msecs_to_jiffies(HPDET_DEBOUNCE
));
1000 if (cancelled_mic
) {
1001 int micd_timeout
= info
->micd_timeout
;
1003 queue_delayed_work(system_power_efficient_wq
,
1004 &info
->micd_timeout_work
,
1005 msecs_to_jiffies(micd_timeout
));
1010 info
->last_jackdet
= val
;
1012 if (info
->last_jackdet
== present
) {
1013 dev_dbg(arizona
->dev
, "Detected jack\n");
1014 ret
= extcon_set_cable_state_(&info
->edev
,
1015 ARIZONA_CABLE_MECHANICAL
, true);
1018 dev_err(arizona
->dev
, "Mechanical report failed: %d\n",
1021 if (!arizona
->pdata
.hpdet_acc_id
) {
1022 info
->detecting
= true;
1024 info
->jack_flips
= 0;
1026 arizona_start_mic(info
);
1028 queue_delayed_work(system_power_efficient_wq
,
1030 msecs_to_jiffies(HPDET_DEBOUNCE
));
1033 regmap_update_bits(arizona
->regmap
,
1034 ARIZONA_JACK_DETECT_DEBOUNCE
,
1035 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
, 0);
1037 dev_dbg(arizona
->dev
, "Detected jack removal\n");
1039 arizona_stop_mic(info
);
1041 info
->num_hpdet_res
= 0;
1042 for (i
= 0; i
< ARRAY_SIZE(info
->hpdet_res
); i
++)
1043 info
->hpdet_res
[i
] = 0;
1045 info
->hpdet_done
= false;
1046 info
->hpdet_retried
= false;
1048 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
1049 input_report_key(info
->input
,
1050 info
->micd_ranges
[i
].key
, 0);
1051 input_sync(info
->input
);
1053 ret
= extcon_update_state(&info
->edev
, 0xffffffff, 0);
1055 dev_err(arizona
->dev
, "Removal report failed: %d\n",
1058 regmap_update_bits(arizona
->regmap
,
1059 ARIZONA_JACK_DETECT_DEBOUNCE
,
1060 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
,
1061 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
);
1064 if (arizona
->pdata
.micd_timeout
)
1065 info
->micd_timeout
= arizona
->pdata
.micd_timeout
;
1067 info
->micd_timeout
= DEFAULT_MICD_TIMEOUT
;
1070 /* Clear trig_sts to make sure DCVDD is not forced up */
1071 regmap_write(arizona
->regmap
, ARIZONA_AOD_WKUP_AND_TRIG
,
1072 ARIZONA_MICD_CLAMP_FALL_TRIG_STS
|
1073 ARIZONA_MICD_CLAMP_RISE_TRIG_STS
|
1074 ARIZONA_JD1_FALL_TRIG_STS
|
1075 ARIZONA_JD1_RISE_TRIG_STS
);
1077 mutex_unlock(&info
->lock
);
1079 pm_runtime_mark_last_busy(info
->dev
);
1080 pm_runtime_put_autosuspend(info
->dev
);
1085 /* Map a level onto a slot in the register bank */
1086 static void arizona_micd_set_level(struct arizona
*arizona
, int index
,
1092 reg
= ARIZONA_MIC_DETECT_LEVEL_4
- (index
/ 2);
1101 /* Program the level itself */
1102 regmap_update_bits(arizona
->regmap
, reg
, mask
, level
);
1105 static int arizona_extcon_probe(struct platform_device
*pdev
)
1107 struct arizona
*arizona
= dev_get_drvdata(pdev
->dev
.parent
);
1108 struct arizona_pdata
*pdata
= &arizona
->pdata
;
1109 struct arizona_extcon_info
*info
;
1111 int jack_irq_fall
, jack_irq_rise
;
1112 int ret
, mode
, i
, j
;
1114 if (!arizona
->dapm
|| !arizona
->dapm
->card
)
1115 return -EPROBE_DEFER
;
1117 info
= devm_kzalloc(&pdev
->dev
, sizeof(*info
), GFP_KERNEL
);
1119 dev_err(&pdev
->dev
, "Failed to allocate memory\n");
1124 info
->micvdd
= devm_regulator_get(arizona
->dev
, "MICVDD");
1125 if (IS_ERR(info
->micvdd
)) {
1126 ret
= PTR_ERR(info
->micvdd
);
1127 dev_err(arizona
->dev
, "Failed to get MICVDD: %d\n", ret
);
1131 mutex_init(&info
->lock
);
1132 info
->arizona
= arizona
;
1133 info
->dev
= &pdev
->dev
;
1134 info
->last_jackdet
= ~(ARIZONA_MICD_CLAMP_STS
| ARIZONA_JD1_STS
);
1135 INIT_DELAYED_WORK(&info
->hpdet_work
, arizona_hpdet_work
);
1136 INIT_DELAYED_WORK(&info
->micd_detect_work
, arizona_micd_detect
);
1137 INIT_DELAYED_WORK(&info
->micd_timeout_work
, arizona_micd_timeout_work
);
1138 platform_set_drvdata(pdev
, info
);
1140 switch (arizona
->type
) {
1142 switch (arizona
->rev
) {
1144 info
->micd_reva
= true;
1147 info
->micd_clamp
= true;
1153 switch (arizona
->rev
) {
1157 info
->micd_clamp
= true;
1166 info
->edev
.name
= "Headset Jack";
1167 info
->edev
.dev
.parent
= arizona
->dev
;
1168 info
->edev
.supported_cable
= arizona_cable
;
1170 ret
= extcon_dev_register(&info
->edev
);
1172 dev_err(arizona
->dev
, "extcon_dev_register() failed: %d\n",
1177 info
->input
= devm_input_allocate_device(&pdev
->dev
);
1179 dev_err(arizona
->dev
, "Can't allocate input dev\n");
1184 info
->input
->name
= "Headset";
1185 info
->input
->phys
= "arizona/extcon";
1186 info
->input
->dev
.parent
= &pdev
->dev
;
1188 if (pdata
->num_micd_configs
) {
1189 info
->micd_modes
= pdata
->micd_configs
;
1190 info
->micd_num_modes
= pdata
->num_micd_configs
;
1192 info
->micd_modes
= micd_default_modes
;
1193 info
->micd_num_modes
= ARRAY_SIZE(micd_default_modes
);
1196 if (arizona
->pdata
.micd_pol_gpio
> 0) {
1197 if (info
->micd_modes
[0].gpio
)
1198 mode
= GPIOF_OUT_INIT_HIGH
;
1200 mode
= GPIOF_OUT_INIT_LOW
;
1202 ret
= devm_gpio_request_one(&pdev
->dev
,
1203 arizona
->pdata
.micd_pol_gpio
,
1207 dev_err(arizona
->dev
, "Failed to request GPIO%d: %d\n",
1208 arizona
->pdata
.micd_pol_gpio
, ret
);
1213 if (arizona
->pdata
.hpdet_id_gpio
> 0) {
1214 ret
= devm_gpio_request_one(&pdev
->dev
,
1215 arizona
->pdata
.hpdet_id_gpio
,
1219 dev_err(arizona
->dev
, "Failed to request GPIO%d: %d\n",
1220 arizona
->pdata
.hpdet_id_gpio
, ret
);
1225 if (arizona
->pdata
.micd_bias_start_time
)
1226 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1227 ARIZONA_MICD_BIAS_STARTTIME_MASK
,
1228 arizona
->pdata
.micd_bias_start_time
1229 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT
);
1231 if (arizona
->pdata
.micd_rate
)
1232 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1233 ARIZONA_MICD_RATE_MASK
,
1234 arizona
->pdata
.micd_rate
1235 << ARIZONA_MICD_RATE_SHIFT
);
1237 if (arizona
->pdata
.micd_dbtime
)
1238 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1239 ARIZONA_MICD_DBTIME_MASK
,
1240 arizona
->pdata
.micd_dbtime
1241 << ARIZONA_MICD_DBTIME_SHIFT
);
1243 BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels
) != 0x40);
1245 if (arizona
->pdata
.num_micd_ranges
) {
1246 info
->micd_ranges
= pdata
->micd_ranges
;
1247 info
->num_micd_ranges
= pdata
->num_micd_ranges
;
1249 info
->micd_ranges
= micd_default_ranges
;
1250 info
->num_micd_ranges
= ARRAY_SIZE(micd_default_ranges
);
1253 if (arizona
->pdata
.num_micd_ranges
> ARIZONA_MAX_MICD_RANGE
) {
1254 dev_err(arizona
->dev
, "Too many MICD ranges: %d\n",
1255 arizona
->pdata
.num_micd_ranges
);
1258 if (info
->num_micd_ranges
> 1) {
1259 for (i
= 1; i
< info
->num_micd_ranges
; i
++) {
1260 if (info
->micd_ranges
[i
- 1].max
>
1261 info
->micd_ranges
[i
].max
) {
1262 dev_err(arizona
->dev
,
1263 "MICD ranges must be sorted\n");
1270 /* Disable all buttons by default */
1271 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_2
,
1272 ARIZONA_MICD_LVL_SEL_MASK
, 0x81);
1274 /* Set up all the buttons the user specified */
1275 for (i
= 0; i
< info
->num_micd_ranges
; i
++) {
1276 for (j
= 0; j
< ARRAY_SIZE(arizona_micd_levels
); j
++)
1277 if (arizona_micd_levels
[j
] >= info
->micd_ranges
[i
].max
)
1280 if (j
== ARRAY_SIZE(arizona_micd_levels
)) {
1281 dev_err(arizona
->dev
, "Unsupported MICD level %d\n",
1282 info
->micd_ranges
[i
].max
);
1287 dev_dbg(arizona
->dev
, "%d ohms for MICD threshold %d\n",
1288 arizona_micd_levels
[j
], i
);
1290 arizona_micd_set_level(arizona
, i
, j
);
1291 input_set_capability(info
->input
, EV_KEY
,
1292 info
->micd_ranges
[i
].key
);
1294 /* Enable reporting of that range */
1295 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_2
,
1299 /* Set all the remaining keys to a maximum */
1300 for (; i
< ARIZONA_MAX_MICD_RANGE
; i
++)
1301 arizona_micd_set_level(arizona
, i
, 0x3f);
1304 * If we have a clamp use it, activating in conjunction with
1305 * GPIO5 if that is connected for jack detect operation.
1307 if (info
->micd_clamp
) {
1308 if (arizona
->pdata
.jd_gpio5
) {
1309 /* Put the GPIO into input mode with optional pull */
1311 if (arizona
->pdata
.jd_gpio5_nopull
)
1312 val
&= ~ARIZONA_GPN_PU
;
1314 regmap_write(arizona
->regmap
, ARIZONA_GPIO5_CTRL
,
1317 regmap_update_bits(arizona
->regmap
,
1318 ARIZONA_MICD_CLAMP_CONTROL
,
1319 ARIZONA_MICD_CLAMP_MODE_MASK
, 0x9);
1321 regmap_update_bits(arizona
->regmap
,
1322 ARIZONA_MICD_CLAMP_CONTROL
,
1323 ARIZONA_MICD_CLAMP_MODE_MASK
, 0x4);
1326 regmap_update_bits(arizona
->regmap
,
1327 ARIZONA_JACK_DETECT_DEBOUNCE
,
1328 ARIZONA_MICD_CLAMP_DB
,
1329 ARIZONA_MICD_CLAMP_DB
);
1332 arizona_extcon_set_mode(info
, 0);
1334 pm_runtime_enable(&pdev
->dev
);
1335 pm_runtime_idle(&pdev
->dev
);
1336 pm_runtime_get_sync(&pdev
->dev
);
1338 if (arizona
->pdata
.jd_gpio5
) {
1339 jack_irq_rise
= ARIZONA_IRQ_MICD_CLAMP_RISE
;
1340 jack_irq_fall
= ARIZONA_IRQ_MICD_CLAMP_FALL
;
1342 jack_irq_rise
= ARIZONA_IRQ_JD_RISE
;
1343 jack_irq_fall
= ARIZONA_IRQ_JD_FALL
;
1346 ret
= arizona_request_irq(arizona
, jack_irq_rise
,
1347 "JACKDET rise", arizona_jackdet
, info
);
1349 dev_err(&pdev
->dev
, "Failed to get JACKDET rise IRQ: %d\n",
1354 ret
= arizona_set_irq_wake(arizona
, jack_irq_rise
, 1);
1356 dev_err(&pdev
->dev
, "Failed to set JD rise IRQ wake: %d\n",
1361 ret
= arizona_request_irq(arizona
, jack_irq_fall
,
1362 "JACKDET fall", arizona_jackdet
, info
);
1364 dev_err(&pdev
->dev
, "Failed to get JD fall IRQ: %d\n", ret
);
1368 ret
= arizona_set_irq_wake(arizona
, jack_irq_fall
, 1);
1370 dev_err(&pdev
->dev
, "Failed to set JD fall IRQ wake: %d\n",
1375 ret
= arizona_request_irq(arizona
, ARIZONA_IRQ_MICDET
,
1376 "MICDET", arizona_micdet
, info
);
1378 dev_err(&pdev
->dev
, "Failed to get MICDET IRQ: %d\n", ret
);
1382 ret
= arizona_request_irq(arizona
, ARIZONA_IRQ_HPDET
,
1383 "HPDET", arizona_hpdet_irq
, info
);
1385 dev_err(&pdev
->dev
, "Failed to get HPDET IRQ: %d\n", ret
);
1389 arizona_clk32k_enable(arizona
);
1390 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_DEBOUNCE
,
1391 ARIZONA_JD1_DB
, ARIZONA_JD1_DB
);
1392 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_ANALOGUE
,
1393 ARIZONA_JD1_ENA
, ARIZONA_JD1_ENA
);
1395 ret
= regulator_allow_bypass(info
->micvdd
, true);
1397 dev_warn(arizona
->dev
, "Failed to set MICVDD to bypass: %d\n",
1400 pm_runtime_put(&pdev
->dev
);
1402 ret
= input_register_device(info
->input
);
1404 dev_err(&pdev
->dev
, "Can't register input device: %d\n", ret
);
1411 arizona_free_irq(arizona
, ARIZONA_IRQ_HPDET
, info
);
1413 arizona_free_irq(arizona
, ARIZONA_IRQ_MICDET
, info
);
1415 arizona_set_irq_wake(arizona
, jack_irq_fall
, 0);
1417 arizona_free_irq(arizona
, jack_irq_fall
, info
);
1419 arizona_set_irq_wake(arizona
, jack_irq_rise
, 0);
1421 arizona_free_irq(arizona
, jack_irq_rise
, info
);
1424 pm_runtime_disable(&pdev
->dev
);
1425 extcon_dev_unregister(&info
->edev
);
1430 static int arizona_extcon_remove(struct platform_device
*pdev
)
1432 struct arizona_extcon_info
*info
= platform_get_drvdata(pdev
);
1433 struct arizona
*arizona
= info
->arizona
;
1434 int jack_irq_rise
, jack_irq_fall
;
1436 pm_runtime_disable(&pdev
->dev
);
1438 regmap_update_bits(arizona
->regmap
,
1439 ARIZONA_MICD_CLAMP_CONTROL
,
1440 ARIZONA_MICD_CLAMP_MODE_MASK
, 0);
1442 if (arizona
->pdata
.jd_gpio5
) {
1443 jack_irq_rise
= ARIZONA_IRQ_MICD_CLAMP_RISE
;
1444 jack_irq_fall
= ARIZONA_IRQ_MICD_CLAMP_FALL
;
1446 jack_irq_rise
= ARIZONA_IRQ_JD_RISE
;
1447 jack_irq_fall
= ARIZONA_IRQ_JD_FALL
;
1450 arizona_set_irq_wake(arizona
, jack_irq_rise
, 0);
1451 arizona_set_irq_wake(arizona
, jack_irq_fall
, 0);
1452 arizona_free_irq(arizona
, ARIZONA_IRQ_HPDET
, info
);
1453 arizona_free_irq(arizona
, ARIZONA_IRQ_MICDET
, info
);
1454 arizona_free_irq(arizona
, jack_irq_rise
, info
);
1455 arizona_free_irq(arizona
, jack_irq_fall
, info
);
1456 cancel_delayed_work_sync(&info
->hpdet_work
);
1457 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_ANALOGUE
,
1458 ARIZONA_JD1_ENA
, 0);
1459 arizona_clk32k_disable(arizona
);
1460 extcon_dev_unregister(&info
->edev
);
1465 static struct platform_driver arizona_extcon_driver
= {
1467 .name
= "arizona-extcon",
1468 .owner
= THIS_MODULE
,
1470 .probe
= arizona_extcon_probe
,
1471 .remove
= arizona_extcon_remove
,
1474 module_platform_driver(arizona_extcon_driver
);
1476 MODULE_DESCRIPTION("Arizona Extcon driver");
1477 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1478 MODULE_LICENSE("GPL");
1479 MODULE_ALIAS("platform:extcon-arizona");