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;
439 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
441 range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
442 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
444 /* Skip up or down a range? */
445 if (range && (val < arizona_hpdet_c_ranges[range].min)) {
447 dev_dbg(arizona->dev, "Moving to HPDET range %d-%d\n",
448 arizona_hpdet_c_ranges[range].min,
449 arizona_hpdet_c_ranges[range].max);
450 regmap_update_bits(arizona->regmap,
451 ARIZONA_HEADPHONE_DETECT_1,
452 ARIZONA_HP_IMPEDANCE_RANGE_MASK,
454 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
458 if (range < ARRAY_SIZE(arizona_hpdet_c_ranges) - 1 &&
459 (val >= arizona_hpdet_c_ranges[range].max)) {
461 dev_dbg(arizona->dev, "Moving to HPDET range %d-%d\n",
462 arizona_hpdet_c_ranges[range].min,
463 arizona_hpdet_c_ranges[range].max);
464 regmap_update_bits(arizona->regmap,
465 ARIZONA_HEADPHONE_DETECT_1,
466 ARIZONA_HP_IMPEDANCE_RANGE_MASK,
468 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
473 dev_dbg(arizona->dev, "HP impedance %d ohms\n", val);
477 static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading,
480 struct arizona *arizona = info->arizona;
481 int id_gpio = arizona->pdata.hpdet_id_gpio;
484 * If we're using HPDET for accessory identification we need
485 * to take multiple measurements, step through them in sequence.
487 if (arizona->pdata.hpdet_acc_id) {
488 info->hpdet_res[info->num_hpdet_res++] = *reading;
490 /* Only check the mic directly if we didn't already ID it */
491 if (id_gpio && info->num_hpdet_res == 1) {
492 dev_dbg(arizona->dev, "Measuring mic\n");
494 regmap_update_bits(arizona->regmap,
495 ARIZONA_ACCESSORY_DETECT_MODE_1,
496 ARIZONA_ACCDET_MODE_MASK |
498 ARIZONA_ACCDET_MODE_HPR |
499 info->micd_modes[0].src);
501 gpio_set_value_cansleep(id_gpio, 1);
503 regmap_update_bits(arizona->regmap,
504 ARIZONA_HEADPHONE_DETECT_1,
505 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
509 /* OK, got both. Now, compare... */
510 dev_dbg(arizona->dev, "HPDET measured %d %d\n",
511 info->hpdet_res[0], info->hpdet_res[1]);
513 /* Take the headphone impedance for the main report */
514 *reading = info->hpdet_res[0];
516 /* Sometimes we get false readings due to slow insert */
517 if (*reading >= ARIZONA_HPDET_MAX && !info->hpdet_retried) {
518 dev_dbg(arizona->dev, "Retrying high impedance\n");
519 info->num_hpdet_res = 0;
520 info->hpdet_retried = true;
521 arizona_start_hpdet_acc_id(info);
522 pm_runtime_put(info->dev);
527 * If we measure the mic as high impedance
529 if (!id_gpio || info->hpdet_res[1] > 50) {
530 dev_dbg(arizona->dev, "Detected mic\n");
532 info->detecting = true;
534 dev_dbg(arizona->dev, "Detected headphone\n");
537 /* Make sure everything is reset back to the real polarity */
538 regmap_update_bits(arizona->regmap,
539 ARIZONA_ACCESSORY_DETECT_MODE_1,
541 info->micd_modes[0].src);
547 static irqreturn_t arizona_hpdet_irq(int irq, void *data)
549 struct arizona_extcon_info *info = data;
550 struct arizona *arizona = info->arizona;
551 int id_gpio = arizona->pdata.hpdet_id_gpio;
552 int report = ARIZONA_CABLE_HEADPHONE;
556 mutex_lock(&info->lock);
558 /* If we got a spurious IRQ for some reason then ignore it */
559 if (!info->hpdet_active) {
560 dev_warn(arizona->dev, "Spurious HPDET IRQ\n");
561 mutex_unlock(&info->lock);
565 /* If the cable was removed while measuring ignore the result */
566 ret = extcon_get_cable_state_(&info->edev, ARIZONA_CABLE_MECHANICAL);
568 dev_err(arizona->dev, "Failed to check cable state: %d\n",
572 dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
576 ret = arizona_hpdet_read(info);
583 /* Reset back to starting range */
584 regmap_update_bits(arizona->regmap,
585 ARIZONA_HEADPHONE_DETECT_1,
586 ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL,
589 ret = arizona_hpdet_do_id(info, &reading, &mic);
595 /* Report high impedence cables as line outputs */
597 report = ARIZONA_CABLE_LINEOUT;
599 report = ARIZONA_CABLE_HEADPHONE;
601 ret = extcon_set_cable_state_(&info->edev, report, true);
603 dev_err(arizona->dev, "Failed to report HP/line: %d\n",
607 /* Reset back to starting range */
608 regmap_update_bits(arizona->regmap,
609 ARIZONA_HEADPHONE_DETECT_1,
610 ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL,
613 arizona_extcon_do_magic(info, 0);
616 gpio_set_value_cansleep(id_gpio, 0);
618 /* Revert back to MICDET mode */
619 regmap_update_bits(arizona->regmap,
620 ARIZONA_ACCESSORY_DETECT_MODE_1,
621 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
623 /* If we have a mic then reenable MICDET */
624 if (mic || info->mic)
625 arizona_start_mic(info);
627 if (info->hpdet_active) {
628 pm_runtime_put_autosuspend(info->dev);
629 info->hpdet_active = false;
632 info->hpdet_done = true;
635 mutex_unlock(&info->lock);
640 static void arizona_identify_headphone(struct arizona_extcon_info *info)
642 struct arizona *arizona = info->arizona;
645 if (info->hpdet_done)
648 dev_dbg(arizona->dev, "Starting HPDET\n");
650 /* Make sure we keep the device enabled during the measurement */
651 pm_runtime_get(info->dev);
653 info->hpdet_active = true;
656 arizona_stop_mic(info);
658 arizona_extcon_do_magic(info, 0x4000);
660 ret = regmap_update_bits(arizona->regmap,
661 ARIZONA_ACCESSORY_DETECT_MODE_1,
662 ARIZONA_ACCDET_MODE_MASK,
663 ARIZONA_ACCDET_MODE_HPL);
665 dev_err(arizona->dev, "Failed to set HPDETL mode: %d\n", ret);
669 ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
670 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
672 dev_err(arizona->dev, "Can't start HPDETL measurement: %d\n",
680 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
681 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
683 /* Just report headphone */
684 ret = extcon_update_state(&info->edev,
685 1 << ARIZONA_CABLE_HEADPHONE,
686 1 << ARIZONA_CABLE_HEADPHONE);
688 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
691 arizona_start_mic(info);
693 info->hpdet_active = false;
696 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
698 struct arizona *arizona = info->arizona;
703 dev_dbg(arizona->dev, "Starting identification via HPDET\n");
705 /* Make sure we keep the device enabled during the measurement */
706 pm_runtime_get_sync(info->dev);
708 info->hpdet_active = true;
710 arizona_extcon_do_magic(info, 0x4000);
712 ret = regmap_update_bits(arizona->regmap,
713 ARIZONA_ACCESSORY_DETECT_MODE_1,
714 ARIZONA_ACCDET_SRC | ARIZONA_ACCDET_MODE_MASK,
715 info->micd_modes[0].src |
716 ARIZONA_ACCDET_MODE_HPL);
718 dev_err(arizona->dev, "Failed to set HPDETL mode: %d\n", ret);
722 if (arizona->pdata.hpdet_acc_id_line) {
723 ret = regmap_update_bits(arizona->regmap,
724 ARIZONA_HEADPHONE_DETECT_1,
725 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
727 dev_err(arizona->dev,
728 "Can't start HPDETL measurement: %d\n",
733 arizona_hpdet_do_id(info, &hp_reading, &mic);
739 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
740 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
742 /* Just report headphone */
743 ret = extcon_update_state(&info->edev,
744 1 << ARIZONA_CABLE_HEADPHONE,
745 1 << ARIZONA_CABLE_HEADPHONE);
747 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
749 info->hpdet_active = false;
752 static void arizona_micd_timeout_work(struct work_struct *work)
754 struct arizona_extcon_info *info = container_of(work,
755 struct arizona_extcon_info,
756 micd_timeout_work.work);
758 mutex_lock(&info->lock);
760 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
761 arizona_identify_headphone(info);
763 info->detecting = false;
765 arizona_stop_mic(info);
767 mutex_unlock(&info->lock);
770 static void arizona_micd_detect(struct work_struct *work)
772 struct arizona_extcon_info *info = container_of(work,
773 struct arizona_extcon_info,
774 micd_detect_work.work);
775 struct arizona *arizona = info->arizona;
776 unsigned int val = 0, lvl;
779 cancel_delayed_work_sync(&info->micd_timeout_work);
781 mutex_lock(&info->lock);
783 for (i = 0; i < 10 && !(val & MICD_LVL_0_TO_8); i++) {
784 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
786 dev_err(arizona->dev,
787 "Failed to read MICDET: %d\n", ret);
788 mutex_unlock(&info->lock);
792 dev_dbg(arizona->dev, "MICDET: %x\n", val);
794 if (!(val & ARIZONA_MICD_VALID)) {
795 dev_warn(arizona->dev,
796 "Microphone detection state invalid\n");
797 mutex_unlock(&info->lock);
802 if (i == 10 && !(val & MICD_LVL_0_TO_8)) {
803 dev_err(arizona->dev, "Failed to get valid MICDET value\n");
804 mutex_unlock(&info->lock);
808 /* Due to jack detect this should never happen */
809 if (!(val & ARIZONA_MICD_STS)) {
810 dev_warn(arizona->dev, "Detected open circuit\n");
811 info->detecting = false;
815 /* If we got a high impedence we should have a headset, report it. */
816 if (info->detecting && (val & ARIZONA_MICD_LVL_8)) {
817 arizona_identify_headphone(info);
819 ret = extcon_update_state(&info->edev,
820 1 << ARIZONA_CABLE_MICROPHONE,
821 1 << ARIZONA_CABLE_MICROPHONE);
824 dev_err(arizona->dev, "Headset report failed: %d\n",
827 /* Don't need to regulate for button detection */
828 ret = regulator_allow_bypass(info->micvdd, false);
830 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
835 info->detecting = false;
839 /* If we detected a lower impedence during initial startup
840 * then we probably have the wrong polarity, flip it. Don't
841 * do this for the lowest impedences to speed up detection of
842 * plain headphones. If both polarities report a low
843 * impedence then give up and report headphones.
845 if (info->detecting && (val & MICD_LVL_1_TO_7)) {
846 if (info->jack_flips >= info->micd_num_modes * 10) {
847 dev_dbg(arizona->dev, "Detected HP/line\n");
848 arizona_identify_headphone(info);
850 info->detecting = false;
852 arizona_stop_mic(info);
855 if (info->micd_mode == info->micd_num_modes)
857 arizona_extcon_set_mode(info, info->micd_mode);
866 * If we're still detecting and we detect a short then we've
867 * got a headphone. Otherwise it's a button press.
869 if (val & MICD_LVL_0_TO_7) {
871 dev_dbg(arizona->dev, "Mic button detected\n");
873 lvl = val & ARIZONA_MICD_LVL_MASK;
874 lvl >>= ARIZONA_MICD_LVL_SHIFT;
876 for (i = 0; i < info->num_micd_ranges; i++)
877 input_report_key(info->input,
878 info->micd_ranges[i].key, 0);
881 WARN_ON(ffs(lvl) - 1 >= info->num_micd_ranges);
882 if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) {
883 key = info->micd_ranges[ffs(lvl) - 1].key;
884 input_report_key(info->input, key, 1);
885 input_sync(info->input);
888 } else if (info->detecting) {
889 dev_dbg(arizona->dev, "Headphone detected\n");
890 info->detecting = false;
891 arizona_stop_mic(info);
893 arizona_identify_headphone(info);
895 dev_warn(arizona->dev, "Button with no mic: %x\n",
899 dev_dbg(arizona->dev, "Mic button released\n");
900 for (i = 0; i < info->num_micd_ranges; i++)
901 input_report_key(info->input,
902 info->micd_ranges[i].key, 0);
903 input_sync(info->input);
904 arizona_extcon_pulse_micbias(info);
909 queue_delayed_work(system_power_efficient_wq,
910 &info->micd_timeout_work,
911 msecs_to_jiffies(info->micd_timeout));
913 pm_runtime_mark_last_busy(info->dev);
914 mutex_unlock(&info->lock);
917 static irqreturn_t arizona_micdet(int irq, void *data)
919 struct arizona_extcon_info *info = data;
920 struct arizona *arizona = info->arizona;
921 int debounce = arizona->pdata.micd_detect_debounce;
923 cancel_delayed_work_sync(&info->micd_detect_work);
924 cancel_delayed_work_sync(&info->micd_timeout_work);
926 mutex_lock(&info->lock);
927 if (!info->detecting)
929 mutex_unlock(&info->lock);
932 queue_delayed_work(system_power_efficient_wq,
933 &info->micd_detect_work,
934 msecs_to_jiffies(debounce));
936 arizona_micd_detect(&info->micd_detect_work.work);
941 static void arizona_hpdet_work(struct work_struct *work)
943 struct arizona_extcon_info *info = container_of(work,
944 struct arizona_extcon_info,
947 mutex_lock(&info->lock);
948 arizona_start_hpdet_acc_id(info);
949 mutex_unlock(&info->lock);
952 static irqreturn_t arizona_jackdet(int irq, void *data)
954 struct arizona_extcon_info *info = data;
955 struct arizona *arizona = info->arizona;
956 unsigned int val, present, mask;
957 bool cancelled_hp, cancelled_mic;
960 cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
961 cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);
963 pm_runtime_get_sync(info->dev);
965 mutex_lock(&info->lock);
967 if (arizona->pdata.jd_gpio5) {
968 mask = ARIZONA_MICD_CLAMP_STS;
971 mask = ARIZONA_JD1_STS;
972 present = ARIZONA_JD1_STS;
975 ret = regmap_read(arizona->regmap, ARIZONA_AOD_IRQ_RAW_STATUS, &val);
977 dev_err(arizona->dev, "Failed to read jackdet status: %d\n",
979 mutex_unlock(&info->lock);
980 pm_runtime_put_autosuspend(info->dev);
985 if (val == info->last_jackdet) {
986 dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
988 queue_delayed_work(system_power_efficient_wq,
990 msecs_to_jiffies(HPDET_DEBOUNCE));
993 int micd_timeout = info->micd_timeout;
995 queue_delayed_work(system_power_efficient_wq,
996 &info->micd_timeout_work,
997 msecs_to_jiffies(micd_timeout));
1002 info->last_jackdet = val;
1004 if (info->last_jackdet == present) {
1005 dev_dbg(arizona->dev, "Detected jack\n");
1006 ret = extcon_set_cable_state_(&info->edev,
1007 ARIZONA_CABLE_MECHANICAL, true);
1010 dev_err(arizona->dev, "Mechanical report failed: %d\n",
1013 if (!arizona->pdata.hpdet_acc_id) {
1014 info->detecting = true;
1016 info->jack_flips = 0;
1018 arizona_start_mic(info);
1020 queue_delayed_work(system_power_efficient_wq,
1022 msecs_to_jiffies(HPDET_DEBOUNCE));
1025 regmap_update_bits(arizona->regmap,
1026 ARIZONA_JACK_DETECT_DEBOUNCE,
1027 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB, 0);
1029 dev_dbg(arizona->dev, "Detected jack removal\n");
1031 arizona_stop_mic(info);
1033 info->num_hpdet_res = 0;
1034 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
1035 info->hpdet_res[i] = 0;
1037 info->hpdet_done = false;
1038 info->hpdet_retried = false;
1040 for (i = 0; i < info->num_micd_ranges; i++)
1041 input_report_key(info->input,
1042 info->micd_ranges[i].key, 0);
1043 input_sync(info->input);
1045 ret = extcon_update_state(&info->edev, 0xffffffff, 0);
1047 dev_err(arizona->dev, "Removal report failed: %d\n",
1050 regmap_update_bits(arizona->regmap,
1051 ARIZONA_JACK_DETECT_DEBOUNCE,
1052 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB,
1053 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB);
1056 if (arizona->pdata.micd_timeout)
1057 info->micd_timeout = arizona->pdata.micd_timeout;
1059 info->micd_timeout = DEFAULT_MICD_TIMEOUT;
1062 /* Clear trig_sts to make sure DCVDD is not forced up */
1063 regmap_write(arizona->regmap, ARIZONA_AOD_WKUP_AND_TRIG,
1064 ARIZONA_MICD_CLAMP_FALL_TRIG_STS |
1065 ARIZONA_MICD_CLAMP_RISE_TRIG_STS |
1066 ARIZONA_JD1_FALL_TRIG_STS |
1067 ARIZONA_JD1_RISE_TRIG_STS);
1069 mutex_unlock(&info->lock);
1071 pm_runtime_mark_last_busy(info->dev);
1072 pm_runtime_put_autosuspend(info->dev);
1077 /* Map a level onto a slot in the register bank */
1078 static void arizona_micd_set_level(struct arizona *arizona, int index,
1084 reg = ARIZONA_MIC_DETECT_LEVEL_4 - (index / 2);
1093 /* Program the level itself */
1094 regmap_update_bits(arizona->regmap, reg, mask, level);
1097 static int arizona_extcon_probe(struct platform_device *pdev)
1099 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1100 struct arizona_pdata *pdata = &arizona->pdata;
1101 struct arizona_extcon_info *info;
1103 int jack_irq_fall, jack_irq_rise;
1104 int ret, mode, i, j;
1106 if (!arizona->dapm || !arizona->dapm->card)
1107 return -EPROBE_DEFER;
1109 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
1111 dev_err(&pdev->dev, "Failed to allocate memory\n");
1116 info->micvdd = devm_regulator_get(arizona->dev, "MICVDD");
1117 if (IS_ERR(info->micvdd)) {
1118 ret = PTR_ERR(info->micvdd);
1119 dev_err(arizona->dev, "Failed to get MICVDD: %d\n", ret);
1123 mutex_init(&info->lock);
1124 info->arizona = arizona;
1125 info->dev = &pdev->dev;
1126 info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS);
1127 INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
1128 INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect);
1129 INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
1130 platform_set_drvdata(pdev, info);
1132 switch (arizona->type) {
1134 switch (arizona->rev) {
1136 info->micd_reva = true;
1139 info->micd_clamp = true;
1148 info->edev.name = "Headset Jack";
1149 info->edev.dev.parent = arizona->dev;
1150 info->edev.supported_cable = arizona_cable;
1152 ret = extcon_dev_register(&info->edev);
1154 dev_err(arizona->dev, "extcon_dev_register() failed: %d\n",
1159 info->input = devm_input_allocate_device(&pdev->dev);
1161 dev_err(arizona->dev, "Can't allocate input dev\n");
1166 info->input->name = "Headset";
1167 info->input->phys = "arizona/extcon";
1168 info->input->dev.parent = &pdev->dev;
1170 if (pdata->num_micd_configs) {
1171 info->micd_modes = pdata->micd_configs;
1172 info->micd_num_modes = pdata->num_micd_configs;
1174 info->micd_modes = micd_default_modes;
1175 info->micd_num_modes = ARRAY_SIZE(micd_default_modes);
1178 if (arizona->pdata.micd_pol_gpio > 0) {
1179 if (info->micd_modes[0].gpio)
1180 mode = GPIOF_OUT_INIT_HIGH;
1182 mode = GPIOF_OUT_INIT_LOW;
1184 ret = devm_gpio_request_one(&pdev->dev,
1185 arizona->pdata.micd_pol_gpio,
1189 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1190 arizona->pdata.micd_pol_gpio, ret);
1195 if (arizona->pdata.hpdet_id_gpio > 0) {
1196 ret = devm_gpio_request_one(&pdev->dev,
1197 arizona->pdata.hpdet_id_gpio,
1201 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1202 arizona->pdata.hpdet_id_gpio, ret);
1207 if (arizona->pdata.micd_bias_start_time)
1208 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1209 ARIZONA_MICD_BIAS_STARTTIME_MASK,
1210 arizona->pdata.micd_bias_start_time
1211 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT);
1213 if (arizona->pdata.micd_rate)
1214 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1215 ARIZONA_MICD_RATE_MASK,
1216 arizona->pdata.micd_rate
1217 << ARIZONA_MICD_RATE_SHIFT);
1219 if (arizona->pdata.micd_dbtime)
1220 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1221 ARIZONA_MICD_DBTIME_MASK,
1222 arizona->pdata.micd_dbtime
1223 << ARIZONA_MICD_DBTIME_SHIFT);
1225 BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels) != 0x40);
1227 if (arizona->pdata.num_micd_ranges) {
1228 info->micd_ranges = pdata->micd_ranges;
1229 info->num_micd_ranges = pdata->num_micd_ranges;
1231 info->micd_ranges = micd_default_ranges;
1232 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges);
1235 if (arizona->pdata.num_micd_ranges > ARIZONA_MAX_MICD_RANGE) {
1236 dev_err(arizona->dev, "Too many MICD ranges: %d\n",
1237 arizona->pdata.num_micd_ranges);
1240 if (info->num_micd_ranges > 1) {
1241 for (i = 1; i < info->num_micd_ranges; i++) {
1242 if (info->micd_ranges[i - 1].max >
1243 info->micd_ranges[i].max) {
1244 dev_err(arizona->dev,
1245 "MICD ranges must be sorted\n");
1252 /* Disable all buttons by default */
1253 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1254 ARIZONA_MICD_LVL_SEL_MASK, 0x81);
1256 /* Set up all the buttons the user specified */
1257 for (i = 0; i < info->num_micd_ranges; i++) {
1258 for (j = 0; j < ARRAY_SIZE(arizona_micd_levels); j++)
1259 if (arizona_micd_levels[j] >= info->micd_ranges[i].max)
1262 if (j == ARRAY_SIZE(arizona_micd_levels)) {
1263 dev_err(arizona->dev, "Unsupported MICD level %d\n",
1264 info->micd_ranges[i].max);
1269 dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n",
1270 arizona_micd_levels[j], i);
1272 arizona_micd_set_level(arizona, i, j);
1273 input_set_capability(info->input, EV_KEY,
1274 info->micd_ranges[i].key);
1276 /* Enable reporting of that range */
1277 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1281 /* Set all the remaining keys to a maximum */
1282 for (; i < ARIZONA_MAX_MICD_RANGE; i++)
1283 arizona_micd_set_level(arizona, i, 0x3f);
1286 * If we have a clamp use it, activating in conjunction with
1287 * GPIO5 if that is connected for jack detect operation.
1289 if (info->micd_clamp) {
1290 if (arizona->pdata.jd_gpio5) {
1291 /* Put the GPIO into input mode with optional pull */
1293 if (arizona->pdata.jd_gpio5_nopull)
1294 val &= ~ARIZONA_GPN_PU;
1296 regmap_write(arizona->regmap, ARIZONA_GPIO5_CTRL,
1299 regmap_update_bits(arizona->regmap,
1300 ARIZONA_MICD_CLAMP_CONTROL,
1301 ARIZONA_MICD_CLAMP_MODE_MASK, 0x9);
1303 regmap_update_bits(arizona->regmap,
1304 ARIZONA_MICD_CLAMP_CONTROL,
1305 ARIZONA_MICD_CLAMP_MODE_MASK, 0x4);
1308 regmap_update_bits(arizona->regmap,
1309 ARIZONA_JACK_DETECT_DEBOUNCE,
1310 ARIZONA_MICD_CLAMP_DB,
1311 ARIZONA_MICD_CLAMP_DB);
1314 arizona_extcon_set_mode(info, 0);
1316 pm_runtime_enable(&pdev->dev);
1317 pm_runtime_idle(&pdev->dev);
1318 pm_runtime_get_sync(&pdev->dev);
1320 if (arizona->pdata.jd_gpio5) {
1321 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1322 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1324 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1325 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1328 ret = arizona_request_irq(arizona, jack_irq_rise,
1329 "JACKDET rise", arizona_jackdet, info);
1331 dev_err(&pdev->dev, "Failed to get JACKDET rise IRQ: %d\n",
1336 ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1);
1338 dev_err(&pdev->dev, "Failed to set JD rise IRQ wake: %d\n",
1343 ret = arizona_request_irq(arizona, jack_irq_fall,
1344 "JACKDET fall", arizona_jackdet, info);
1346 dev_err(&pdev->dev, "Failed to get JD fall IRQ: %d\n", ret);
1350 ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1);
1352 dev_err(&pdev->dev, "Failed to set JD fall IRQ wake: %d\n",
1357 ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET,
1358 "MICDET", arizona_micdet, info);
1360 dev_err(&pdev->dev, "Failed to get MICDET IRQ: %d\n", ret);
1364 ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET,
1365 "HPDET", arizona_hpdet_irq, info);
1367 dev_err(&pdev->dev, "Failed to get HPDET IRQ: %d\n", ret);
1371 arizona_clk32k_enable(arizona);
1372 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_DEBOUNCE,
1373 ARIZONA_JD1_DB, ARIZONA_JD1_DB);
1374 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1375 ARIZONA_JD1_ENA, ARIZONA_JD1_ENA);
1377 ret = regulator_allow_bypass(info->micvdd, true);
1379 dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n",
1382 pm_runtime_put(&pdev->dev);
1384 ret = input_register_device(info->input);
1386 dev_err(&pdev->dev, "Can't register input device: %d\n", ret);
1393 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1395 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1397 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1399 arizona_free_irq(arizona, jack_irq_fall, info);
1401 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1403 arizona_free_irq(arizona, jack_irq_rise, info);
1406 pm_runtime_disable(&pdev->dev);
1407 extcon_dev_unregister(&info->edev);
1412 static int arizona_extcon_remove(struct platform_device *pdev)
1414 struct arizona_extcon_info *info = platform_get_drvdata(pdev);
1415 struct arizona *arizona = info->arizona;
1416 int jack_irq_rise, jack_irq_fall;
1418 pm_runtime_disable(&pdev->dev);
1420 regmap_update_bits(arizona->regmap,
1421 ARIZONA_MICD_CLAMP_CONTROL,
1422 ARIZONA_MICD_CLAMP_MODE_MASK, 0);
1424 if (arizona->pdata.jd_gpio5) {
1425 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1426 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1428 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1429 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1432 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1433 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1434 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1435 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1436 arizona_free_irq(arizona, jack_irq_rise, info);
1437 arizona_free_irq(arizona, jack_irq_fall, info);
1438 cancel_delayed_work_sync(&info->hpdet_work);
1439 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1440 ARIZONA_JD1_ENA, 0);
1441 arizona_clk32k_disable(arizona);
1442 extcon_dev_unregister(&info->edev);
1447 static struct platform_driver arizona_extcon_driver = {
1449 .name = "arizona-extcon",
1450 .owner = THIS_MODULE,
1452 .probe = arizona_extcon_probe,
1453 .remove = arizona_extcon_remove,
1456 module_platform_driver(arizona_extcon_driver);
1458 MODULE_DESCRIPTION("Arizona Extcon driver");
1459 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1460 MODULE_LICENSE("GPL");
1461 MODULE_ALIAS("platform:extcon-arizona");