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",
606 arizona_extcon_do_magic(info, 0);
610 gpio_set_value_cansleep(id_gpio, 0);
612 /* Revert back to MICDET mode */
613 regmap_update_bits(arizona->regmap,
614 ARIZONA_ACCESSORY_DETECT_MODE_1,
615 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
617 /* If we have a mic then reenable MICDET */
618 if (mic || info->mic)
619 arizona_start_mic(info);
621 if (info->hpdet_active) {
622 pm_runtime_put_autosuspend(info->dev);
623 info->hpdet_active = false;
626 info->hpdet_done = true;
629 mutex_unlock(&info->lock);
634 static void arizona_identify_headphone(struct arizona_extcon_info *info)
636 struct arizona *arizona = info->arizona;
639 if (info->hpdet_done)
642 dev_dbg(arizona->dev, "Starting HPDET\n");
644 /* Make sure we keep the device enabled during the measurement */
645 pm_runtime_get(info->dev);
647 info->hpdet_active = true;
650 arizona_stop_mic(info);
652 arizona_extcon_do_magic(info, 0x4000);
654 ret = regmap_update_bits(arizona->regmap,
655 ARIZONA_ACCESSORY_DETECT_MODE_1,
656 ARIZONA_ACCDET_MODE_MASK,
657 ARIZONA_ACCDET_MODE_HPL);
659 dev_err(arizona->dev, "Failed to set HPDETL mode: %d\n", ret);
663 ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
664 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
666 dev_err(arizona->dev, "Can't start HPDETL measurement: %d\n",
674 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
675 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
677 /* Just report headphone */
678 ret = extcon_update_state(&info->edev,
679 1 << ARIZONA_CABLE_HEADPHONE,
680 1 << ARIZONA_CABLE_HEADPHONE);
682 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
685 arizona_start_mic(info);
687 info->hpdet_active = false;
690 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
692 struct arizona *arizona = info->arizona;
697 dev_dbg(arizona->dev, "Starting identification via HPDET\n");
699 /* Make sure we keep the device enabled during the measurement */
700 pm_runtime_get_sync(info->dev);
702 info->hpdet_active = true;
704 arizona_extcon_do_magic(info, 0x4000);
706 ret = regmap_update_bits(arizona->regmap,
707 ARIZONA_ACCESSORY_DETECT_MODE_1,
708 ARIZONA_ACCDET_SRC | ARIZONA_ACCDET_MODE_MASK,
709 info->micd_modes[0].src |
710 ARIZONA_ACCDET_MODE_HPL);
712 dev_err(arizona->dev, "Failed to set HPDETL mode: %d\n", ret);
716 if (arizona->pdata.hpdet_acc_id_line) {
717 ret = regmap_update_bits(arizona->regmap,
718 ARIZONA_HEADPHONE_DETECT_1,
719 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
721 dev_err(arizona->dev,
722 "Can't start HPDETL measurement: %d\n",
727 arizona_hpdet_do_id(info, &hp_reading, &mic);
733 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
734 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
736 /* Just report headphone */
737 ret = extcon_update_state(&info->edev,
738 1 << ARIZONA_CABLE_HEADPHONE,
739 1 << ARIZONA_CABLE_HEADPHONE);
741 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
743 info->hpdet_active = false;
746 static void arizona_micd_timeout_work(struct work_struct *work)
748 struct arizona_extcon_info *info = container_of(work,
749 struct arizona_extcon_info,
750 micd_timeout_work.work);
752 mutex_lock(&info->lock);
754 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
755 arizona_identify_headphone(info);
757 info->detecting = false;
759 arizona_stop_mic(info);
761 mutex_unlock(&info->lock);
764 static void arizona_micd_detect(struct work_struct *work)
766 struct arizona_extcon_info *info = container_of(work,
767 struct arizona_extcon_info,
768 micd_detect_work.work);
769 struct arizona *arizona = info->arizona;
770 unsigned int val = 0, lvl;
773 cancel_delayed_work_sync(&info->micd_timeout_work);
775 mutex_lock(&info->lock);
777 for (i = 0; i < 10 && !(val & MICD_LVL_0_TO_8); i++) {
778 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
780 dev_err(arizona->dev,
781 "Failed to read MICDET: %d\n", ret);
782 mutex_unlock(&info->lock);
786 dev_dbg(arizona->dev, "MICDET: %x\n", val);
788 if (!(val & ARIZONA_MICD_VALID)) {
789 dev_warn(arizona->dev,
790 "Microphone detection state invalid\n");
791 mutex_unlock(&info->lock);
796 if (i == 10 && !(val & MICD_LVL_0_TO_8)) {
797 dev_err(arizona->dev, "Failed to get valid MICDET value\n");
798 mutex_unlock(&info->lock);
802 /* Due to jack detect this should never happen */
803 if (!(val & ARIZONA_MICD_STS)) {
804 dev_warn(arizona->dev, "Detected open circuit\n");
805 info->detecting = false;
809 /* If we got a high impedence we should have a headset, report it. */
810 if (info->detecting && (val & ARIZONA_MICD_LVL_8)) {
811 arizona_identify_headphone(info);
813 ret = extcon_update_state(&info->edev,
814 1 << ARIZONA_CABLE_MICROPHONE,
815 1 << ARIZONA_CABLE_MICROPHONE);
818 dev_err(arizona->dev, "Headset report failed: %d\n",
821 /* Don't need to regulate for button detection */
822 ret = regulator_allow_bypass(info->micvdd, false);
824 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
829 info->detecting = false;
833 /* If we detected a lower impedence during initial startup
834 * then we probably have the wrong polarity, flip it. Don't
835 * do this for the lowest impedences to speed up detection of
836 * plain headphones. If both polarities report a low
837 * impedence then give up and report headphones.
839 if (info->detecting && (val & MICD_LVL_1_TO_7)) {
840 if (info->jack_flips >= info->micd_num_modes * 10) {
841 dev_dbg(arizona->dev, "Detected HP/line\n");
842 arizona_identify_headphone(info);
844 info->detecting = false;
846 arizona_stop_mic(info);
849 if (info->micd_mode == info->micd_num_modes)
851 arizona_extcon_set_mode(info, info->micd_mode);
860 * If we're still detecting and we detect a short then we've
861 * got a headphone. Otherwise it's a button press.
863 if (val & MICD_LVL_0_TO_7) {
865 dev_dbg(arizona->dev, "Mic button detected\n");
867 lvl = val & ARIZONA_MICD_LVL_MASK;
868 lvl >>= ARIZONA_MICD_LVL_SHIFT;
870 for (i = 0; i < info->num_micd_ranges; i++)
871 input_report_key(info->input,
872 info->micd_ranges[i].key, 0);
875 WARN_ON(ffs(lvl) - 1 >= info->num_micd_ranges);
876 if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) {
877 key = info->micd_ranges[ffs(lvl) - 1].key;
878 input_report_key(info->input, key, 1);
879 input_sync(info->input);
882 } else if (info->detecting) {
883 dev_dbg(arizona->dev, "Headphone detected\n");
884 info->detecting = false;
885 arizona_stop_mic(info);
887 arizona_identify_headphone(info);
889 dev_warn(arizona->dev, "Button with no mic: %x\n",
893 dev_dbg(arizona->dev, "Mic button released\n");
894 for (i = 0; i < info->num_micd_ranges; i++)
895 input_report_key(info->input,
896 info->micd_ranges[i].key, 0);
897 input_sync(info->input);
898 arizona_extcon_pulse_micbias(info);
903 queue_delayed_work(system_power_efficient_wq,
904 &info->micd_timeout_work,
905 msecs_to_jiffies(info->micd_timeout));
907 pm_runtime_mark_last_busy(info->dev);
908 mutex_unlock(&info->lock);
911 static irqreturn_t arizona_micdet(int irq, void *data)
913 struct arizona_extcon_info *info = data;
914 struct arizona *arizona = info->arizona;
915 int debounce = arizona->pdata.micd_detect_debounce;
917 cancel_delayed_work_sync(&info->micd_detect_work);
918 cancel_delayed_work_sync(&info->micd_timeout_work);
920 mutex_lock(&info->lock);
921 if (!info->detecting)
923 mutex_unlock(&info->lock);
926 queue_delayed_work(system_power_efficient_wq,
927 &info->micd_detect_work,
928 msecs_to_jiffies(debounce));
930 arizona_micd_detect(&info->micd_detect_work.work);
935 static void arizona_hpdet_work(struct work_struct *work)
937 struct arizona_extcon_info *info = container_of(work,
938 struct arizona_extcon_info,
941 mutex_lock(&info->lock);
942 arizona_start_hpdet_acc_id(info);
943 mutex_unlock(&info->lock);
946 static irqreturn_t arizona_jackdet(int irq, void *data)
948 struct arizona_extcon_info *info = data;
949 struct arizona *arizona = info->arizona;
950 unsigned int val, present, mask;
951 bool cancelled_hp, cancelled_mic;
954 cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
955 cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);
957 pm_runtime_get_sync(info->dev);
959 mutex_lock(&info->lock);
961 if (arizona->pdata.jd_gpio5) {
962 mask = ARIZONA_MICD_CLAMP_STS;
965 mask = ARIZONA_JD1_STS;
966 present = ARIZONA_JD1_STS;
969 ret = regmap_read(arizona->regmap, ARIZONA_AOD_IRQ_RAW_STATUS, &val);
971 dev_err(arizona->dev, "Failed to read jackdet status: %d\n",
973 mutex_unlock(&info->lock);
974 pm_runtime_put_autosuspend(info->dev);
979 if (val == info->last_jackdet) {
980 dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
982 queue_delayed_work(system_power_efficient_wq,
984 msecs_to_jiffies(HPDET_DEBOUNCE));
987 int micd_timeout = info->micd_timeout;
989 queue_delayed_work(system_power_efficient_wq,
990 &info->micd_timeout_work,
991 msecs_to_jiffies(micd_timeout));
996 info->last_jackdet = val;
998 if (info->last_jackdet == present) {
999 dev_dbg(arizona->dev, "Detected jack\n");
1000 ret = extcon_set_cable_state_(&info->edev,
1001 ARIZONA_CABLE_MECHANICAL, true);
1004 dev_err(arizona->dev, "Mechanical report failed: %d\n",
1007 if (!arizona->pdata.hpdet_acc_id) {
1008 info->detecting = true;
1010 info->jack_flips = 0;
1012 arizona_start_mic(info);
1014 queue_delayed_work(system_power_efficient_wq,
1016 msecs_to_jiffies(HPDET_DEBOUNCE));
1019 regmap_update_bits(arizona->regmap,
1020 ARIZONA_JACK_DETECT_DEBOUNCE,
1021 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB, 0);
1023 dev_dbg(arizona->dev, "Detected jack removal\n");
1025 arizona_stop_mic(info);
1027 info->num_hpdet_res = 0;
1028 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
1029 info->hpdet_res[i] = 0;
1031 info->hpdet_done = false;
1032 info->hpdet_retried = false;
1034 for (i = 0; i < info->num_micd_ranges; i++)
1035 input_report_key(info->input,
1036 info->micd_ranges[i].key, 0);
1037 input_sync(info->input);
1039 ret = extcon_update_state(&info->edev, 0xffffffff, 0);
1041 dev_err(arizona->dev, "Removal report failed: %d\n",
1044 regmap_update_bits(arizona->regmap,
1045 ARIZONA_JACK_DETECT_DEBOUNCE,
1046 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB,
1047 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB);
1050 if (arizona->pdata.micd_timeout)
1051 info->micd_timeout = arizona->pdata.micd_timeout;
1053 info->micd_timeout = DEFAULT_MICD_TIMEOUT;
1056 /* Clear trig_sts to make sure DCVDD is not forced up */
1057 regmap_write(arizona->regmap, ARIZONA_AOD_WKUP_AND_TRIG,
1058 ARIZONA_MICD_CLAMP_FALL_TRIG_STS |
1059 ARIZONA_MICD_CLAMP_RISE_TRIG_STS |
1060 ARIZONA_JD1_FALL_TRIG_STS |
1061 ARIZONA_JD1_RISE_TRIG_STS);
1063 mutex_unlock(&info->lock);
1065 pm_runtime_mark_last_busy(info->dev);
1066 pm_runtime_put_autosuspend(info->dev);
1071 /* Map a level onto a slot in the register bank */
1072 static void arizona_micd_set_level(struct arizona *arizona, int index,
1078 reg = ARIZONA_MIC_DETECT_LEVEL_4 - (index / 2);
1087 /* Program the level itself */
1088 regmap_update_bits(arizona->regmap, reg, mask, level);
1091 static int arizona_extcon_probe(struct platform_device *pdev)
1093 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1094 struct arizona_pdata *pdata = &arizona->pdata;
1095 struct arizona_extcon_info *info;
1097 int jack_irq_fall, jack_irq_rise;
1098 int ret, mode, i, j;
1100 if (!arizona->dapm || !arizona->dapm->card)
1101 return -EPROBE_DEFER;
1103 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
1105 dev_err(&pdev->dev, "Failed to allocate memory\n");
1110 info->micvdd = devm_regulator_get(arizona->dev, "MICVDD");
1111 if (IS_ERR(info->micvdd)) {
1112 ret = PTR_ERR(info->micvdd);
1113 dev_err(arizona->dev, "Failed to get MICVDD: %d\n", ret);
1117 mutex_init(&info->lock);
1118 info->arizona = arizona;
1119 info->dev = &pdev->dev;
1120 info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS);
1121 INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
1122 INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect);
1123 INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
1124 platform_set_drvdata(pdev, info);
1126 switch (arizona->type) {
1128 switch (arizona->rev) {
1130 info->micd_reva = true;
1133 info->micd_clamp = true;
1142 info->edev.name = "Headset Jack";
1143 info->edev.dev.parent = arizona->dev;
1144 info->edev.supported_cable = arizona_cable;
1146 ret = extcon_dev_register(&info->edev);
1148 dev_err(arizona->dev, "extcon_dev_register() failed: %d\n",
1153 info->input = devm_input_allocate_device(&pdev->dev);
1155 dev_err(arizona->dev, "Can't allocate input dev\n");
1160 info->input->name = "Headset";
1161 info->input->phys = "arizona/extcon";
1162 info->input->dev.parent = &pdev->dev;
1164 if (pdata->num_micd_configs) {
1165 info->micd_modes = pdata->micd_configs;
1166 info->micd_num_modes = pdata->num_micd_configs;
1168 info->micd_modes = micd_default_modes;
1169 info->micd_num_modes = ARRAY_SIZE(micd_default_modes);
1172 if (arizona->pdata.micd_pol_gpio > 0) {
1173 if (info->micd_modes[0].gpio)
1174 mode = GPIOF_OUT_INIT_HIGH;
1176 mode = GPIOF_OUT_INIT_LOW;
1178 ret = devm_gpio_request_one(&pdev->dev,
1179 arizona->pdata.micd_pol_gpio,
1183 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1184 arizona->pdata.micd_pol_gpio, ret);
1189 if (arizona->pdata.hpdet_id_gpio > 0) {
1190 ret = devm_gpio_request_one(&pdev->dev,
1191 arizona->pdata.hpdet_id_gpio,
1195 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1196 arizona->pdata.hpdet_id_gpio, ret);
1201 if (arizona->pdata.micd_bias_start_time)
1202 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1203 ARIZONA_MICD_BIAS_STARTTIME_MASK,
1204 arizona->pdata.micd_bias_start_time
1205 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT);
1207 if (arizona->pdata.micd_rate)
1208 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1209 ARIZONA_MICD_RATE_MASK,
1210 arizona->pdata.micd_rate
1211 << ARIZONA_MICD_RATE_SHIFT);
1213 if (arizona->pdata.micd_dbtime)
1214 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1215 ARIZONA_MICD_DBTIME_MASK,
1216 arizona->pdata.micd_dbtime
1217 << ARIZONA_MICD_DBTIME_SHIFT);
1219 BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels) != 0x40);
1221 if (arizona->pdata.num_micd_ranges) {
1222 info->micd_ranges = pdata->micd_ranges;
1223 info->num_micd_ranges = pdata->num_micd_ranges;
1225 info->micd_ranges = micd_default_ranges;
1226 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges);
1229 if (arizona->pdata.num_micd_ranges > ARIZONA_MAX_MICD_RANGE) {
1230 dev_err(arizona->dev, "Too many MICD ranges: %d\n",
1231 arizona->pdata.num_micd_ranges);
1234 if (info->num_micd_ranges > 1) {
1235 for (i = 1; i < info->num_micd_ranges; i++) {
1236 if (info->micd_ranges[i - 1].max >
1237 info->micd_ranges[i].max) {
1238 dev_err(arizona->dev,
1239 "MICD ranges must be sorted\n");
1246 /* Disable all buttons by default */
1247 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1248 ARIZONA_MICD_LVL_SEL_MASK, 0x81);
1250 /* Set up all the buttons the user specified */
1251 for (i = 0; i < info->num_micd_ranges; i++) {
1252 for (j = 0; j < ARRAY_SIZE(arizona_micd_levels); j++)
1253 if (arizona_micd_levels[j] >= info->micd_ranges[i].max)
1256 if (j == ARRAY_SIZE(arizona_micd_levels)) {
1257 dev_err(arizona->dev, "Unsupported MICD level %d\n",
1258 info->micd_ranges[i].max);
1263 dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n",
1264 arizona_micd_levels[j], i);
1266 arizona_micd_set_level(arizona, i, j);
1267 input_set_capability(info->input, EV_KEY,
1268 info->micd_ranges[i].key);
1270 /* Enable reporting of that range */
1271 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1275 /* Set all the remaining keys to a maximum */
1276 for (; i < ARIZONA_MAX_MICD_RANGE; i++)
1277 arizona_micd_set_level(arizona, i, 0x3f);
1280 * If we have a clamp use it, activating in conjunction with
1281 * GPIO5 if that is connected for jack detect operation.
1283 if (info->micd_clamp) {
1284 if (arizona->pdata.jd_gpio5) {
1285 /* Put the GPIO into input mode with optional pull */
1287 if (arizona->pdata.jd_gpio5_nopull)
1288 val &= ~ARIZONA_GPN_PU;
1290 regmap_write(arizona->regmap, ARIZONA_GPIO5_CTRL,
1293 regmap_update_bits(arizona->regmap,
1294 ARIZONA_MICD_CLAMP_CONTROL,
1295 ARIZONA_MICD_CLAMP_MODE_MASK, 0x9);
1297 regmap_update_bits(arizona->regmap,
1298 ARIZONA_MICD_CLAMP_CONTROL,
1299 ARIZONA_MICD_CLAMP_MODE_MASK, 0x4);
1302 regmap_update_bits(arizona->regmap,
1303 ARIZONA_JACK_DETECT_DEBOUNCE,
1304 ARIZONA_MICD_CLAMP_DB,
1305 ARIZONA_MICD_CLAMP_DB);
1308 arizona_extcon_set_mode(info, 0);
1310 pm_runtime_enable(&pdev->dev);
1311 pm_runtime_idle(&pdev->dev);
1312 pm_runtime_get_sync(&pdev->dev);
1314 if (arizona->pdata.jd_gpio5) {
1315 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1316 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1318 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1319 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1322 ret = arizona_request_irq(arizona, jack_irq_rise,
1323 "JACKDET rise", arizona_jackdet, info);
1325 dev_err(&pdev->dev, "Failed to get JACKDET rise IRQ: %d\n",
1330 ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1);
1332 dev_err(&pdev->dev, "Failed to set JD rise IRQ wake: %d\n",
1337 ret = arizona_request_irq(arizona, jack_irq_fall,
1338 "JACKDET fall", arizona_jackdet, info);
1340 dev_err(&pdev->dev, "Failed to get JD fall IRQ: %d\n", ret);
1344 ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1);
1346 dev_err(&pdev->dev, "Failed to set JD fall IRQ wake: %d\n",
1351 ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET,
1352 "MICDET", arizona_micdet, info);
1354 dev_err(&pdev->dev, "Failed to get MICDET IRQ: %d\n", ret);
1358 ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET,
1359 "HPDET", arizona_hpdet_irq, info);
1361 dev_err(&pdev->dev, "Failed to get HPDET IRQ: %d\n", ret);
1365 arizona_clk32k_enable(arizona);
1366 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_DEBOUNCE,
1367 ARIZONA_JD1_DB, ARIZONA_JD1_DB);
1368 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1369 ARIZONA_JD1_ENA, ARIZONA_JD1_ENA);
1371 ret = regulator_allow_bypass(info->micvdd, true);
1373 dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n",
1376 pm_runtime_put(&pdev->dev);
1378 ret = input_register_device(info->input);
1380 dev_err(&pdev->dev, "Can't register input device: %d\n", ret);
1387 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1389 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1391 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1393 arizona_free_irq(arizona, jack_irq_fall, info);
1395 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1397 arizona_free_irq(arizona, jack_irq_rise, info);
1400 pm_runtime_disable(&pdev->dev);
1401 extcon_dev_unregister(&info->edev);
1406 static int arizona_extcon_remove(struct platform_device *pdev)
1408 struct arizona_extcon_info *info = platform_get_drvdata(pdev);
1409 struct arizona *arizona = info->arizona;
1410 int jack_irq_rise, jack_irq_fall;
1412 pm_runtime_disable(&pdev->dev);
1414 regmap_update_bits(arizona->regmap,
1415 ARIZONA_MICD_CLAMP_CONTROL,
1416 ARIZONA_MICD_CLAMP_MODE_MASK, 0);
1418 if (arizona->pdata.jd_gpio5) {
1419 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1420 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1422 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1423 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1426 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1427 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1428 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1429 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1430 arizona_free_irq(arizona, jack_irq_rise, info);
1431 arizona_free_irq(arizona, jack_irq_fall, info);
1432 cancel_delayed_work_sync(&info->hpdet_work);
1433 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1434 ARIZONA_JD1_ENA, 0);
1435 arizona_clk32k_disable(arizona);
1436 extcon_dev_unregister(&info->edev);
1441 static struct platform_driver arizona_extcon_driver = {
1443 .name = "arizona-extcon",
1444 .owner = THIS_MODULE,
1446 .probe = arizona_extcon_probe,
1447 .remove = arizona_extcon_remove,
1450 module_platform_driver(arizona_extcon_driver);
1452 MODULE_DESCRIPTION("Arizona Extcon driver");
1453 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1454 MODULE_LICENSE("GPL");
1455 MODULE_ALIAS("platform:extcon-arizona");