1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * extcon-arizona.c - Extcon driver Wolfson Arizona devices
5 * Copyright (C) 2012-2014 Wolfson Microelectronics plc
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/i2c.h>
11 #include <linux/slab.h>
12 #include <linux/interrupt.h>
13 #include <linux/err.h>
14 #include <linux/gpio/consumer.h>
15 #include <linux/gpio.h>
16 #include <linux/input.h>
17 #include <linux/platform_device.h>
18 #include <linux/pm_runtime.h>
19 #include <linux/property.h>
20 #include <linux/regulator/consumer.h>
21 #include <linux/extcon-provider.h>
23 #include <sound/soc.h>
25 #include <linux/mfd/arizona/core.h>
26 #include <linux/mfd/arizona/pdata.h>
27 #include <linux/mfd/arizona/registers.h>
28 #include <dt-bindings/mfd/arizona.h>
30 #define ARIZONA_MAX_MICD_RANGE 8
32 #define ARIZONA_MICD_CLAMP_MODE_JDL 0x4
33 #define ARIZONA_MICD_CLAMP_MODE_JDH 0x5
34 #define ARIZONA_MICD_CLAMP_MODE_JDL_GP5H 0x9
35 #define ARIZONA_MICD_CLAMP_MODE_JDH_GP5H 0xb
37 #define ARIZONA_TST_CAP_DEFAULT 0x3
38 #define ARIZONA_TST_CAP_CLAMP 0x1
40 #define ARIZONA_HPDET_MAX 10000
42 #define HPDET_DEBOUNCE 500
43 #define DEFAULT_MICD_TIMEOUT 2000
45 #define ARIZONA_HPDET_WAIT_COUNT 15
46 #define ARIZONA_HPDET_WAIT_DELAY_MS 20
48 #define QUICK_HEADPHONE_MAX_OHM 3
49 #define MICROPHONE_MIN_OHM 1257
50 #define MICROPHONE_MAX_OHM 30000
52 #define MICD_DBTIME_TWO_READINGS 2
53 #define MICD_DBTIME_FOUR_READINGS 4
55 #define MICD_LVL_1_TO_7 (ARIZONA_MICD_LVL_1 | ARIZONA_MICD_LVL_2 | \
56 ARIZONA_MICD_LVL_3 | ARIZONA_MICD_LVL_4 | \
57 ARIZONA_MICD_LVL_5 | ARIZONA_MICD_LVL_6 | \
60 #define MICD_LVL_0_TO_7 (ARIZONA_MICD_LVL_0 | MICD_LVL_1_TO_7)
62 #define MICD_LVL_0_TO_8 (MICD_LVL_0_TO_7 | ARIZONA_MICD_LVL_8)
64 struct arizona_extcon_info
{
66 struct arizona
*arizona
;
68 struct regulator
*micvdd
;
69 struct input_dev
*input
;
74 const struct arizona_micd_config
*micd_modes
;
77 const struct arizona_micd_range
*micd_ranges
;
83 struct delayed_work hpdet_work
;
84 struct delayed_work micd_detect_work
;
85 struct delayed_work micd_timeout_work
;
92 unsigned int hpdet_res
[3];
100 struct extcon_dev
*edev
;
102 struct gpio_desc
*micd_pol_gpio
;
105 static const struct arizona_micd_config micd_default_modes
[] = {
106 { ARIZONA_ACCDET_SRC
, 1, 0 },
110 static const struct arizona_micd_range micd_default_ranges
[] = {
111 { .max
= 11, .key
= BTN_0
},
112 { .max
= 28, .key
= BTN_1
},
113 { .max
= 54, .key
= BTN_2
},
114 { .max
= 100, .key
= BTN_3
},
115 { .max
= 186, .key
= BTN_4
},
116 { .max
= 430, .key
= BTN_5
},
119 /* The number of levels in arizona_micd_levels valid for button thresholds */
120 #define ARIZONA_NUM_MICD_BUTTON_LEVELS 64
122 static const int arizona_micd_levels
[] = {
123 3, 6, 8, 11, 13, 16, 18, 21, 23, 26, 28, 31, 34, 36, 39, 41, 44, 46,
124 49, 52, 54, 57, 60, 62, 65, 67, 70, 73, 75, 78, 81, 83, 89, 94, 100,
125 105, 111, 116, 122, 127, 139, 150, 161, 173, 186, 196, 209, 220, 245,
126 270, 295, 321, 348, 375, 402, 430, 489, 550, 614, 681, 752, 903, 1071,
130 static const unsigned int arizona_cable
[] = {
132 EXTCON_JACK_MICROPHONE
,
133 EXTCON_JACK_HEADPHONE
,
134 EXTCON_JACK_LINE_OUT
,
138 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info
*info
);
140 static void arizona_extcon_hp_clamp(struct arizona_extcon_info
*info
,
143 struct arizona
*arizona
= info
->arizona
;
144 unsigned int mask
= 0, val
= 0;
145 unsigned int cap_sel
= 0;
148 switch (arizona
->type
) {
155 mask
= ARIZONA_HP1L_SHRTO
| ARIZONA_HP1L_FLWR
|
158 val
= ARIZONA_HP1L_SHRTO
;
159 cap_sel
= ARIZONA_TST_CAP_CLAMP
;
161 val
= ARIZONA_HP1L_FLWR
| ARIZONA_HP1L_SHRTI
;
162 cap_sel
= ARIZONA_TST_CAP_DEFAULT
;
165 ret
= regmap_update_bits(arizona
->regmap
,
166 ARIZONA_HP_TEST_CTRL_1
,
167 ARIZONA_HP1_TST_CAP_SEL_MASK
,
170 dev_warn(arizona
->dev
,
171 "Failed to set TST_CAP_SEL: %d\n", ret
);
174 mask
= ARIZONA_RMV_SHRT_HP1L
;
176 val
= ARIZONA_RMV_SHRT_HP1L
;
180 snd_soc_dapm_mutex_lock(arizona
->dapm
);
182 arizona
->hpdet_clamp
= clamp
;
184 /* Keep the HP output stages disabled while doing the clamp */
186 ret
= regmap_update_bits(arizona
->regmap
,
187 ARIZONA_OUTPUT_ENABLES_1
,
189 ARIZONA_OUT1R_ENA
, 0);
191 dev_warn(arizona
->dev
,
192 "Failed to disable headphone outputs: %d\n",
197 ret
= regmap_update_bits(arizona
->regmap
, ARIZONA_HP_CTRL_1L
,
200 dev_warn(arizona
->dev
, "Failed to do clamp: %d\n",
203 ret
= regmap_update_bits(arizona
->regmap
, ARIZONA_HP_CTRL_1R
,
206 dev_warn(arizona
->dev
, "Failed to do clamp: %d\n",
210 /* Restore the desired state while not doing the clamp */
212 ret
= regmap_update_bits(arizona
->regmap
,
213 ARIZONA_OUTPUT_ENABLES_1
,
215 ARIZONA_OUT1R_ENA
, arizona
->hp_ena
);
217 dev_warn(arizona
->dev
,
218 "Failed to restore headphone outputs: %d\n",
222 snd_soc_dapm_mutex_unlock(arizona
->dapm
);
225 static void arizona_extcon_set_mode(struct arizona_extcon_info
*info
, int mode
)
227 struct arizona
*arizona
= info
->arizona
;
229 mode
%= info
->micd_num_modes
;
231 gpiod_set_value_cansleep(info
->micd_pol_gpio
,
232 info
->micd_modes
[mode
].gpio
);
234 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
235 ARIZONA_MICD_BIAS_SRC_MASK
,
236 info
->micd_modes
[mode
].bias
<<
237 ARIZONA_MICD_BIAS_SRC_SHIFT
);
238 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
239 ARIZONA_ACCDET_SRC
, info
->micd_modes
[mode
].src
);
241 info
->micd_mode
= mode
;
243 dev_dbg(arizona
->dev
, "Set jack polarity to %d\n", mode
);
246 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info
*info
)
248 switch (info
->micd_modes
[0].bias
) {
260 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info
*info
)
262 struct arizona
*arizona
= info
->arizona
;
263 const char *widget
= arizona_extcon_get_micbias(info
);
264 struct snd_soc_dapm_context
*dapm
= arizona
->dapm
;
265 struct snd_soc_component
*component
= snd_soc_dapm_to_component(dapm
);
268 ret
= snd_soc_component_force_enable_pin(component
, widget
);
270 dev_warn(arizona
->dev
, "Failed to enable %s: %d\n",
273 snd_soc_dapm_sync(dapm
);
275 if (!arizona
->pdata
.micd_force_micbias
) {
276 ret
= snd_soc_component_disable_pin(component
, widget
);
278 dev_warn(arizona
->dev
, "Failed to disable %s: %d\n",
281 snd_soc_dapm_sync(dapm
);
285 static void arizona_start_mic(struct arizona_extcon_info
*info
)
287 struct arizona
*arizona
= info
->arizona
;
292 /* Microphone detection can't use idle mode */
293 pm_runtime_get(info
->dev
);
295 if (info
->detecting
) {
296 ret
= regulator_allow_bypass(info
->micvdd
, false);
298 dev_err(arizona
->dev
,
299 "Failed to regulate MICVDD: %d\n",
304 ret
= regulator_enable(info
->micvdd
);
306 dev_err(arizona
->dev
, "Failed to enable MICVDD: %d\n",
310 if (info
->micd_reva
) {
311 const struct reg_sequence reva
[] = {
317 regmap_multi_reg_write(arizona
->regmap
, reva
, ARRAY_SIZE(reva
));
320 if (info
->detecting
&& arizona
->pdata
.micd_software_compare
)
321 mode
= ARIZONA_ACCDET_MODE_ADC
;
323 mode
= ARIZONA_ACCDET_MODE_MIC
;
325 regmap_update_bits(arizona
->regmap
,
326 ARIZONA_ACCESSORY_DETECT_MODE_1
,
327 ARIZONA_ACCDET_MODE_MASK
, mode
);
329 arizona_extcon_pulse_micbias(info
);
331 ret
= regmap_update_bits_check(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
332 ARIZONA_MICD_ENA
, ARIZONA_MICD_ENA
,
335 dev_err(arizona
->dev
, "Failed to enable micd: %d\n", ret
);
336 } else if (!change
) {
337 regulator_disable(info
->micvdd
);
338 pm_runtime_put_autosuspend(info
->dev
);
342 static void arizona_stop_mic(struct arizona_extcon_info
*info
)
344 struct arizona
*arizona
= info
->arizona
;
345 const char *widget
= arizona_extcon_get_micbias(info
);
346 struct snd_soc_dapm_context
*dapm
= arizona
->dapm
;
347 struct snd_soc_component
*component
= snd_soc_dapm_to_component(dapm
);
351 ret
= regmap_update_bits_check(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
355 dev_err(arizona
->dev
, "Failed to disable micd: %d\n", ret
);
357 ret
= snd_soc_component_disable_pin(component
, widget
);
359 dev_warn(arizona
->dev
,
360 "Failed to disable %s: %d\n",
363 snd_soc_dapm_sync(dapm
);
365 if (info
->micd_reva
) {
366 const struct reg_sequence reva
[] = {
372 regmap_multi_reg_write(arizona
->regmap
, reva
, ARRAY_SIZE(reva
));
375 ret
= regulator_allow_bypass(info
->micvdd
, true);
377 dev_err(arizona
->dev
, "Failed to bypass MICVDD: %d\n",
382 regulator_disable(info
->micvdd
);
383 pm_runtime_mark_last_busy(info
->dev
);
384 pm_runtime_put_autosuspend(info
->dev
);
389 unsigned int threshold
;
390 unsigned int factor_a
;
391 unsigned int factor_b
;
392 } arizona_hpdet_b_ranges
[] = {
393 { 100, 5528, 362464 },
394 { 169, 11084, 6186851 },
395 { 169, 11065, 65460395 },
398 #define ARIZONA_HPDET_B_RANGE_MAX 0x3fb
403 } arizona_hpdet_c_ranges
[] = {
410 static int arizona_hpdet_read(struct arizona_extcon_info
*info
)
412 struct arizona
*arizona
= info
->arizona
;
413 unsigned int val
, range
;
416 ret
= regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_2
, &val
);
418 dev_err(arizona
->dev
, "Failed to read HPDET status: %d\n",
423 switch (info
->hpdet_ip_version
) {
425 if (!(val
& ARIZONA_HP_DONE
)) {
426 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
431 val
&= ARIZONA_HP_LVL_MASK
;
435 if (!(val
& ARIZONA_HP_DONE_B
)) {
436 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
441 ret
= regmap_read(arizona
->regmap
, ARIZONA_HP_DACVAL
, &val
);
443 dev_err(arizona
->dev
, "Failed to read HP value: %d\n",
448 regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
450 range
= (range
& ARIZONA_HP_IMPEDANCE_RANGE_MASK
)
451 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
;
453 if (range
< ARRAY_SIZE(arizona_hpdet_b_ranges
) - 1 &&
454 (val
< arizona_hpdet_b_ranges
[range
].threshold
||
455 val
>= ARIZONA_HPDET_B_RANGE_MAX
)) {
457 dev_dbg(arizona
->dev
, "Moving to HPDET range %d\n",
459 regmap_update_bits(arizona
->regmap
,
460 ARIZONA_HEADPHONE_DETECT_1
,
461 ARIZONA_HP_IMPEDANCE_RANGE_MASK
,
463 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
);
467 /* If we go out of range report top of range */
468 if (val
< arizona_hpdet_b_ranges
[range
].threshold
||
469 val
>= ARIZONA_HPDET_B_RANGE_MAX
) {
470 dev_dbg(arizona
->dev
, "Measurement out of range\n");
471 return ARIZONA_HPDET_MAX
;
474 dev_dbg(arizona
->dev
, "HPDET read %d in range %d\n",
477 val
= arizona_hpdet_b_ranges
[range
].factor_b
479 arizona_hpdet_b_ranges
[range
].factor_a
);
483 if (!(val
& ARIZONA_HP_DONE_B
)) {
484 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
489 val
&= ARIZONA_HP_LVL_B_MASK
;
490 /* Convert to ohms, the value is in 0.5 ohm increments */
493 regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
495 range
= (range
& ARIZONA_HP_IMPEDANCE_RANGE_MASK
)
496 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
;
498 /* Skip up a range, or report? */
499 if (range
< ARRAY_SIZE(arizona_hpdet_c_ranges
) - 1 &&
500 (val
>= arizona_hpdet_c_ranges
[range
].max
)) {
502 dev_dbg(arizona
->dev
, "Moving to HPDET range %d-%d\n",
503 arizona_hpdet_c_ranges
[range
].min
,
504 arizona_hpdet_c_ranges
[range
].max
);
505 regmap_update_bits(arizona
->regmap
,
506 ARIZONA_HEADPHONE_DETECT_1
,
507 ARIZONA_HP_IMPEDANCE_RANGE_MASK
,
509 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
);
513 if (range
&& (val
< arizona_hpdet_c_ranges
[range
].min
)) {
514 dev_dbg(arizona
->dev
, "Reporting range boundary %d\n",
515 arizona_hpdet_c_ranges
[range
].min
);
516 val
= arizona_hpdet_c_ranges
[range
].min
;
521 dev_warn(arizona
->dev
, "Unknown HPDET IP revision %d\n",
522 info
->hpdet_ip_version
);
526 dev_dbg(arizona
->dev
, "HP impedance %d ohms\n", val
);
530 static int arizona_hpdet_do_id(struct arizona_extcon_info
*info
, int *reading
,
533 struct arizona
*arizona
= info
->arizona
;
534 int id_gpio
= arizona
->pdata
.hpdet_id_gpio
;
536 if (!arizona
->pdata
.hpdet_acc_id
)
540 * If we're using HPDET for accessory identification we need
541 * to take multiple measurements, step through them in sequence.
543 info
->hpdet_res
[info
->num_hpdet_res
++] = *reading
;
545 /* Only check the mic directly if we didn't already ID it */
546 if (id_gpio
&& info
->num_hpdet_res
== 1) {
547 dev_dbg(arizona
->dev
, "Measuring mic\n");
549 regmap_update_bits(arizona
->regmap
,
550 ARIZONA_ACCESSORY_DETECT_MODE_1
,
551 ARIZONA_ACCDET_MODE_MASK
|
553 ARIZONA_ACCDET_MODE_HPR
|
554 info
->micd_modes
[0].src
);
556 gpio_set_value_cansleep(id_gpio
, 1);
558 regmap_update_bits(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
559 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
563 /* OK, got both. Now, compare... */
564 dev_dbg(arizona
->dev
, "HPDET measured %d %d\n",
565 info
->hpdet_res
[0], info
->hpdet_res
[1]);
567 /* Take the headphone impedance for the main report */
568 *reading
= info
->hpdet_res
[0];
570 /* Sometimes we get false readings due to slow insert */
571 if (*reading
>= ARIZONA_HPDET_MAX
&& !info
->hpdet_retried
) {
572 dev_dbg(arizona
->dev
, "Retrying high impedance\n");
573 info
->num_hpdet_res
= 0;
574 info
->hpdet_retried
= true;
575 arizona_start_hpdet_acc_id(info
);
576 pm_runtime_put(info
->dev
);
581 * If we measure the mic as high impedance
583 if (!id_gpio
|| info
->hpdet_res
[1] > 50) {
584 dev_dbg(arizona
->dev
, "Detected mic\n");
586 info
->detecting
= true;
588 dev_dbg(arizona
->dev
, "Detected headphone\n");
591 /* Make sure everything is reset back to the real polarity */
592 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
593 ARIZONA_ACCDET_SRC
, info
->micd_modes
[0].src
);
598 static irqreturn_t
arizona_hpdet_irq(int irq
, void *data
)
600 struct arizona_extcon_info
*info
= data
;
601 struct arizona
*arizona
= info
->arizona
;
602 int id_gpio
= arizona
->pdata
.hpdet_id_gpio
;
603 unsigned int report
= EXTCON_JACK_HEADPHONE
;
607 mutex_lock(&info
->lock
);
609 /* If we got a spurious IRQ for some reason then ignore it */
610 if (!info
->hpdet_active
) {
611 dev_warn(arizona
->dev
, "Spurious HPDET IRQ\n");
612 mutex_unlock(&info
->lock
);
616 /* If the cable was removed while measuring ignore the result */
617 ret
= extcon_get_state(info
->edev
, EXTCON_MECHANICAL
);
619 dev_err(arizona
->dev
, "Failed to check cable state: %d\n",
623 dev_dbg(arizona
->dev
, "Ignoring HPDET for removed cable\n");
627 ret
= arizona_hpdet_read(info
);
634 /* Reset back to starting range */
635 regmap_update_bits(arizona
->regmap
,
636 ARIZONA_HEADPHONE_DETECT_1
,
637 ARIZONA_HP_IMPEDANCE_RANGE_MASK
| ARIZONA_HP_POLL
,
640 ret
= arizona_hpdet_do_id(info
, &reading
, &mic
);
646 /* Report high impedence cables as line outputs */
648 report
= EXTCON_JACK_LINE_OUT
;
650 report
= EXTCON_JACK_HEADPHONE
;
652 ret
= extcon_set_state_sync(info
->edev
, report
, true);
654 dev_err(arizona
->dev
, "Failed to report HP/line: %d\n",
658 /* Reset back to starting range */
659 regmap_update_bits(arizona
->regmap
,
660 ARIZONA_HEADPHONE_DETECT_1
,
661 ARIZONA_HP_IMPEDANCE_RANGE_MASK
| ARIZONA_HP_POLL
,
664 arizona_extcon_hp_clamp(info
, false);
667 gpio_set_value_cansleep(id_gpio
, 0);
669 /* If we have a mic then reenable MICDET */
670 if (mic
|| info
->mic
)
671 arizona_start_mic(info
);
673 if (info
->hpdet_active
) {
674 pm_runtime_put_autosuspend(info
->dev
);
675 info
->hpdet_active
= false;
678 info
->hpdet_done
= true;
681 mutex_unlock(&info
->lock
);
686 static void arizona_identify_headphone(struct arizona_extcon_info
*info
)
688 struct arizona
*arizona
= info
->arizona
;
691 if (info
->hpdet_done
)
694 dev_dbg(arizona
->dev
, "Starting HPDET\n");
696 /* Make sure we keep the device enabled during the measurement */
697 pm_runtime_get(info
->dev
);
699 info
->hpdet_active
= true;
701 arizona_stop_mic(info
);
703 arizona_extcon_hp_clamp(info
, true);
705 ret
= regmap_update_bits(arizona
->regmap
,
706 ARIZONA_ACCESSORY_DETECT_MODE_1
,
707 ARIZONA_ACCDET_MODE_MASK
,
708 arizona
->pdata
.hpdet_channel
);
710 dev_err(arizona
->dev
, "Failed to set HPDET mode: %d\n", ret
);
714 ret
= regmap_update_bits(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
715 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
717 dev_err(arizona
->dev
, "Can't start HPDETL measurement: %d\n",
725 arizona_extcon_hp_clamp(info
, false);
726 pm_runtime_put_autosuspend(info
->dev
);
728 /* Just report headphone */
729 ret
= extcon_set_state_sync(info
->edev
, EXTCON_JACK_HEADPHONE
, true);
731 dev_err(arizona
->dev
, "Failed to report headphone: %d\n", ret
);
734 arizona_start_mic(info
);
736 info
->hpdet_active
= false;
739 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info
*info
)
741 struct arizona
*arizona
= info
->arizona
;
746 dev_dbg(arizona
->dev
, "Starting identification via HPDET\n");
748 /* Make sure we keep the device enabled during the measurement */
749 pm_runtime_get_sync(info
->dev
);
751 info
->hpdet_active
= true;
753 arizona_extcon_hp_clamp(info
, true);
755 ret
= regmap_update_bits(arizona
->regmap
,
756 ARIZONA_ACCESSORY_DETECT_MODE_1
,
757 ARIZONA_ACCDET_SRC
| ARIZONA_ACCDET_MODE_MASK
,
758 info
->micd_modes
[0].src
|
759 arizona
->pdata
.hpdet_channel
);
761 dev_err(arizona
->dev
, "Failed to set HPDET mode: %d\n", ret
);
765 if (arizona
->pdata
.hpdet_acc_id_line
) {
766 ret
= regmap_update_bits(arizona
->regmap
,
767 ARIZONA_HEADPHONE_DETECT_1
,
768 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
770 dev_err(arizona
->dev
,
771 "Can't start HPDETL measurement: %d\n",
776 arizona_hpdet_do_id(info
, &hp_reading
, &mic
);
782 /* Just report headphone */
783 ret
= extcon_set_state_sync(info
->edev
, EXTCON_JACK_HEADPHONE
, true);
785 dev_err(arizona
->dev
, "Failed to report headphone: %d\n", ret
);
787 info
->hpdet_active
= false;
790 static void arizona_micd_timeout_work(struct work_struct
*work
)
792 struct arizona_extcon_info
*info
= container_of(work
,
793 struct arizona_extcon_info
,
794 micd_timeout_work
.work
);
796 mutex_lock(&info
->lock
);
798 dev_dbg(info
->arizona
->dev
, "MICD timed out, reporting HP\n");
800 info
->detecting
= false;
802 arizona_identify_headphone(info
);
804 mutex_unlock(&info
->lock
);
807 static int arizona_micd_adc_read(struct arizona_extcon_info
*info
)
809 struct arizona
*arizona
= info
->arizona
;
813 /* Must disable MICD before we read the ADCVAL */
814 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
815 ARIZONA_MICD_ENA
, 0);
817 ret
= regmap_read(arizona
->regmap
, ARIZONA_MIC_DETECT_4
, &val
);
819 dev_err(arizona
->dev
,
820 "Failed to read MICDET_ADCVAL: %d\n", ret
);
824 dev_dbg(arizona
->dev
, "MICDET_ADCVAL: %x\n", val
);
826 val
&= ARIZONA_MICDET_ADCVAL_MASK
;
827 if (val
< ARRAY_SIZE(arizona_micd_levels
))
828 val
= arizona_micd_levels
[val
];
832 if (val
<= QUICK_HEADPHONE_MAX_OHM
)
833 val
= ARIZONA_MICD_STS
| ARIZONA_MICD_LVL_0
;
834 else if (val
<= MICROPHONE_MIN_OHM
)
835 val
= ARIZONA_MICD_STS
| ARIZONA_MICD_LVL_1
;
836 else if (val
<= MICROPHONE_MAX_OHM
)
837 val
= ARIZONA_MICD_STS
| ARIZONA_MICD_LVL_8
;
839 val
= ARIZONA_MICD_LVL_8
;
844 static int arizona_micd_read(struct arizona_extcon_info
*info
)
846 struct arizona
*arizona
= info
->arizona
;
847 unsigned int val
= 0;
850 for (i
= 0; i
< 10 && !(val
& MICD_LVL_0_TO_8
); i
++) {
851 ret
= regmap_read(arizona
->regmap
, ARIZONA_MIC_DETECT_3
, &val
);
853 dev_err(arizona
->dev
,
854 "Failed to read MICDET: %d\n", ret
);
858 dev_dbg(arizona
->dev
, "MICDET: %x\n", val
);
860 if (!(val
& ARIZONA_MICD_VALID
)) {
861 dev_warn(arizona
->dev
,
862 "Microphone detection state invalid\n");
867 if (i
== 10 && !(val
& MICD_LVL_0_TO_8
)) {
868 dev_err(arizona
->dev
, "Failed to get valid MICDET value\n");
875 static int arizona_micdet_reading(void *priv
)
877 struct arizona_extcon_info
*info
= priv
;
878 struct arizona
*arizona
= info
->arizona
;
881 if (info
->detecting
&& arizona
->pdata
.micd_software_compare
)
882 ret
= arizona_micd_adc_read(info
);
884 ret
= arizona_micd_read(info
);
890 /* Due to jack detect this should never happen */
891 if (!(val
& ARIZONA_MICD_STS
)) {
892 dev_warn(arizona
->dev
, "Detected open circuit\n");
894 info
->detecting
= false;
895 arizona_identify_headphone(info
);
899 /* If we got a high impedence we should have a headset, report it. */
900 if (val
& ARIZONA_MICD_LVL_8
) {
902 info
->detecting
= false;
904 arizona_identify_headphone(info
);
906 ret
= extcon_set_state_sync(info
->edev
,
907 EXTCON_JACK_MICROPHONE
, true);
909 dev_err(arizona
->dev
, "Headset report failed: %d\n",
912 /* Don't need to regulate for button detection */
913 ret
= regulator_allow_bypass(info
->micvdd
, true);
915 dev_err(arizona
->dev
, "Failed to bypass MICVDD: %d\n",
922 /* If we detected a lower impedence during initial startup
923 * then we probably have the wrong polarity, flip it. Don't
924 * do this for the lowest impedences to speed up detection of
925 * plain headphones. If both polarities report a low
926 * impedence then give up and report headphones.
928 if (val
& MICD_LVL_1_TO_7
) {
929 if (info
->jack_flips
>= info
->micd_num_modes
* 10) {
930 dev_dbg(arizona
->dev
, "Detected HP/line\n");
932 info
->detecting
= false;
934 arizona_identify_headphone(info
);
937 if (info
->micd_mode
== info
->micd_num_modes
)
939 arizona_extcon_set_mode(info
, info
->micd_mode
);
943 if (arizona
->pdata
.micd_software_compare
)
944 regmap_update_bits(arizona
->regmap
,
945 ARIZONA_MIC_DETECT_1
,
949 queue_delayed_work(system_power_efficient_wq
,
950 &info
->micd_timeout_work
,
951 msecs_to_jiffies(arizona
->pdata
.micd_timeout
));
958 * If we're still detecting and we detect a short then we've
961 dev_dbg(arizona
->dev
, "Headphone detected\n");
962 info
->detecting
= false;
964 arizona_identify_headphone(info
);
969 static int arizona_button_reading(void *priv
)
971 struct arizona_extcon_info
*info
= priv
;
972 struct arizona
*arizona
= info
->arizona
;
973 int val
, key
, lvl
, i
;
975 val
= arizona_micd_read(info
);
980 * If we're still detecting and we detect a short then we've
981 * got a headphone. Otherwise it's a button press.
983 if (val
& MICD_LVL_0_TO_7
) {
985 dev_dbg(arizona
->dev
, "Mic button detected\n");
987 lvl
= val
& ARIZONA_MICD_LVL_MASK
;
988 lvl
>>= ARIZONA_MICD_LVL_SHIFT
;
990 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
991 input_report_key(info
->input
,
992 info
->micd_ranges
[i
].key
, 0);
994 if (lvl
&& ffs(lvl
) - 1 < info
->num_micd_ranges
) {
995 key
= info
->micd_ranges
[ffs(lvl
) - 1].key
;
996 input_report_key(info
->input
, key
, 1);
997 input_sync(info
->input
);
999 dev_err(arizona
->dev
, "Button out of range\n");
1002 dev_warn(arizona
->dev
, "Button with no mic: %x\n",
1006 dev_dbg(arizona
->dev
, "Mic button released\n");
1007 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
1008 input_report_key(info
->input
,
1009 info
->micd_ranges
[i
].key
, 0);
1010 input_sync(info
->input
);
1011 arizona_extcon_pulse_micbias(info
);
1017 static void arizona_micd_detect(struct work_struct
*work
)
1019 struct arizona_extcon_info
*info
= container_of(work
,
1020 struct arizona_extcon_info
,
1021 micd_detect_work
.work
);
1022 struct arizona
*arizona
= info
->arizona
;
1025 cancel_delayed_work_sync(&info
->micd_timeout_work
);
1027 mutex_lock(&info
->lock
);
1029 /* If the cable was removed while measuring ignore the result */
1030 ret
= extcon_get_state(info
->edev
, EXTCON_MECHANICAL
);
1032 dev_err(arizona
->dev
, "Failed to check cable state: %d\n",
1034 mutex_unlock(&info
->lock
);
1037 dev_dbg(arizona
->dev
, "Ignoring MICDET for removed cable\n");
1038 mutex_unlock(&info
->lock
);
1042 if (info
->detecting
)
1043 arizona_micdet_reading(info
);
1045 arizona_button_reading(info
);
1047 pm_runtime_mark_last_busy(info
->dev
);
1048 mutex_unlock(&info
->lock
);
1051 static irqreturn_t
arizona_micdet(int irq
, void *data
)
1053 struct arizona_extcon_info
*info
= data
;
1054 struct arizona
*arizona
= info
->arizona
;
1055 int debounce
= arizona
->pdata
.micd_detect_debounce
;
1057 cancel_delayed_work_sync(&info
->micd_detect_work
);
1058 cancel_delayed_work_sync(&info
->micd_timeout_work
);
1060 mutex_lock(&info
->lock
);
1061 if (!info
->detecting
)
1063 mutex_unlock(&info
->lock
);
1066 queue_delayed_work(system_power_efficient_wq
,
1067 &info
->micd_detect_work
,
1068 msecs_to_jiffies(debounce
));
1070 arizona_micd_detect(&info
->micd_detect_work
.work
);
1075 static void arizona_hpdet_work(struct work_struct
*work
)
1077 struct arizona_extcon_info
*info
= container_of(work
,
1078 struct arizona_extcon_info
,
1081 mutex_lock(&info
->lock
);
1082 arizona_start_hpdet_acc_id(info
);
1083 mutex_unlock(&info
->lock
);
1086 static int arizona_hpdet_wait(struct arizona_extcon_info
*info
)
1088 struct arizona
*arizona
= info
->arizona
;
1092 for (i
= 0; i
< ARIZONA_HPDET_WAIT_COUNT
; i
++) {
1093 ret
= regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_2
,
1096 dev_err(arizona
->dev
,
1097 "Failed to read HPDET state: %d\n", ret
);
1101 switch (info
->hpdet_ip_version
) {
1103 if (val
& ARIZONA_HP_DONE
)
1107 if (val
& ARIZONA_HP_DONE_B
)
1112 msleep(ARIZONA_HPDET_WAIT_DELAY_MS
);
1115 dev_warn(arizona
->dev
, "HPDET did not appear to complete\n");
1120 static irqreturn_t
arizona_jackdet(int irq
, void *data
)
1122 struct arizona_extcon_info
*info
= data
;
1123 struct arizona
*arizona
= info
->arizona
;
1124 unsigned int val
, present
, mask
;
1125 bool cancelled_hp
, cancelled_mic
;
1128 cancelled_hp
= cancel_delayed_work_sync(&info
->hpdet_work
);
1129 cancelled_mic
= cancel_delayed_work_sync(&info
->micd_timeout_work
);
1131 pm_runtime_get_sync(info
->dev
);
1133 mutex_lock(&info
->lock
);
1135 if (info
->micd_clamp
) {
1136 mask
= ARIZONA_MICD_CLAMP_STS
;
1139 mask
= ARIZONA_JD1_STS
;
1140 if (arizona
->pdata
.jd_invert
)
1143 present
= ARIZONA_JD1_STS
;
1146 ret
= regmap_read(arizona
->regmap
, ARIZONA_AOD_IRQ_RAW_STATUS
, &val
);
1148 dev_err(arizona
->dev
, "Failed to read jackdet status: %d\n",
1150 mutex_unlock(&info
->lock
);
1151 pm_runtime_put_autosuspend(info
->dev
);
1156 if (val
== info
->last_jackdet
) {
1157 dev_dbg(arizona
->dev
, "Suppressing duplicate JACKDET\n");
1159 queue_delayed_work(system_power_efficient_wq
,
1161 msecs_to_jiffies(HPDET_DEBOUNCE
));
1163 if (cancelled_mic
) {
1164 int micd_timeout
= arizona
->pdata
.micd_timeout
;
1166 queue_delayed_work(system_power_efficient_wq
,
1167 &info
->micd_timeout_work
,
1168 msecs_to_jiffies(micd_timeout
));
1173 info
->last_jackdet
= val
;
1175 if (info
->last_jackdet
== present
) {
1176 dev_dbg(arizona
->dev
, "Detected jack\n");
1177 ret
= extcon_set_state_sync(info
->edev
,
1178 EXTCON_MECHANICAL
, true);
1181 dev_err(arizona
->dev
, "Mechanical report failed: %d\n",
1184 info
->detecting
= true;
1186 info
->jack_flips
= 0;
1188 if (!arizona
->pdata
.hpdet_acc_id
) {
1189 arizona_start_mic(info
);
1191 queue_delayed_work(system_power_efficient_wq
,
1193 msecs_to_jiffies(HPDET_DEBOUNCE
));
1196 if (info
->micd_clamp
|| !arizona
->pdata
.jd_invert
)
1197 regmap_update_bits(arizona
->regmap
,
1198 ARIZONA_JACK_DETECT_DEBOUNCE
,
1199 ARIZONA_MICD_CLAMP_DB
|
1202 dev_dbg(arizona
->dev
, "Detected jack removal\n");
1204 arizona_stop_mic(info
);
1206 info
->num_hpdet_res
= 0;
1207 for (i
= 0; i
< ARRAY_SIZE(info
->hpdet_res
); i
++)
1208 info
->hpdet_res
[i
] = 0;
1210 info
->hpdet_done
= false;
1211 info
->hpdet_retried
= false;
1213 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
1214 input_report_key(info
->input
,
1215 info
->micd_ranges
[i
].key
, 0);
1216 input_sync(info
->input
);
1218 for (i
= 0; i
< ARRAY_SIZE(arizona_cable
) - 1; i
++) {
1219 ret
= extcon_set_state_sync(info
->edev
,
1220 arizona_cable
[i
], false);
1222 dev_err(arizona
->dev
,
1223 "Removal report failed: %d\n", ret
);
1227 * If the jack was removed during a headphone detection we
1228 * need to wait for the headphone detection to finish, as
1229 * it can not be aborted. We don't want to be able to start
1230 * a new headphone detection from a fresh insert until this
1233 arizona_hpdet_wait(info
);
1235 regmap_update_bits(arizona
->regmap
,
1236 ARIZONA_JACK_DETECT_DEBOUNCE
,
1237 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
,
1238 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
);
1242 /* Clear trig_sts to make sure DCVDD is not forced up */
1243 regmap_write(arizona
->regmap
, ARIZONA_AOD_WKUP_AND_TRIG
,
1244 ARIZONA_MICD_CLAMP_FALL_TRIG_STS
|
1245 ARIZONA_MICD_CLAMP_RISE_TRIG_STS
|
1246 ARIZONA_JD1_FALL_TRIG_STS
|
1247 ARIZONA_JD1_RISE_TRIG_STS
);
1249 mutex_unlock(&info
->lock
);
1251 pm_runtime_mark_last_busy(info
->dev
);
1252 pm_runtime_put_autosuspend(info
->dev
);
1257 /* Map a level onto a slot in the register bank */
1258 static void arizona_micd_set_level(struct arizona
*arizona
, int index
,
1264 reg
= ARIZONA_MIC_DETECT_LEVEL_4
- (index
/ 2);
1273 /* Program the level itself */
1274 regmap_update_bits(arizona
->regmap
, reg
, mask
, level
);
1277 static int arizona_extcon_get_micd_configs(struct device
*dev
,
1278 struct arizona
*arizona
)
1280 const char * const prop
= "wlf,micd-configs";
1281 const int entries_per_config
= 3;
1282 struct arizona_micd_config
*micd_configs
;
1287 nconfs
= device_property_count_u32(arizona
->dev
, prop
);
1291 vals
= kcalloc(nconfs
, sizeof(u32
), GFP_KERNEL
);
1295 ret
= device_property_read_u32_array(arizona
->dev
, prop
, vals
, nconfs
);
1299 nconfs
/= entries_per_config
;
1300 micd_configs
= devm_kcalloc(dev
, nconfs
, sizeof(*micd_configs
),
1302 if (!micd_configs
) {
1307 for (i
= 0, j
= 0; i
< nconfs
; ++i
) {
1308 micd_configs
[i
].src
= vals
[j
++] ? ARIZONA_ACCDET_SRC
: 0;
1309 micd_configs
[i
].bias
= vals
[j
++];
1310 micd_configs
[i
].gpio
= vals
[j
++];
1313 arizona
->pdata
.micd_configs
= micd_configs
;
1314 arizona
->pdata
.num_micd_configs
= nconfs
;
1321 static int arizona_extcon_device_get_pdata(struct device
*dev
,
1322 struct arizona
*arizona
)
1324 struct arizona_pdata
*pdata
= &arizona
->pdata
;
1325 unsigned int val
= ARIZONA_ACCDET_MODE_HPL
;
1328 device_property_read_u32(arizona
->dev
, "wlf,hpdet-channel", &val
);
1330 case ARIZONA_ACCDET_MODE_HPL
:
1331 case ARIZONA_ACCDET_MODE_HPR
:
1332 pdata
->hpdet_channel
= val
;
1335 dev_err(arizona
->dev
,
1336 "Wrong wlf,hpdet-channel DT value %d\n", val
);
1337 pdata
->hpdet_channel
= ARIZONA_ACCDET_MODE_HPL
;
1340 device_property_read_u32(arizona
->dev
, "wlf,micd-detect-debounce",
1341 &pdata
->micd_detect_debounce
);
1343 device_property_read_u32(arizona
->dev
, "wlf,micd-bias-start-time",
1344 &pdata
->micd_bias_start_time
);
1346 device_property_read_u32(arizona
->dev
, "wlf,micd-rate",
1349 device_property_read_u32(arizona
->dev
, "wlf,micd-dbtime",
1350 &pdata
->micd_dbtime
);
1352 device_property_read_u32(arizona
->dev
, "wlf,micd-timeout-ms",
1353 &pdata
->micd_timeout
);
1355 pdata
->micd_force_micbias
= device_property_read_bool(arizona
->dev
,
1356 "wlf,micd-force-micbias");
1358 pdata
->micd_software_compare
= device_property_read_bool(arizona
->dev
,
1359 "wlf,micd-software-compare");
1361 pdata
->jd_invert
= device_property_read_bool(arizona
->dev
,
1364 device_property_read_u32(arizona
->dev
, "wlf,gpsw", &pdata
->gpsw
);
1366 pdata
->jd_gpio5
= device_property_read_bool(arizona
->dev
,
1368 pdata
->jd_gpio5_nopull
= device_property_read_bool(arizona
->dev
,
1369 "wlf,use-jd2-nopull");
1371 ret
= arizona_extcon_get_micd_configs(dev
, arizona
);
1373 dev_err(arizona
->dev
, "Failed to read micd configs: %d\n", ret
);
1378 static int arizona_extcon_probe(struct platform_device
*pdev
)
1380 struct arizona
*arizona
= dev_get_drvdata(pdev
->dev
.parent
);
1381 struct arizona_pdata
*pdata
= &arizona
->pdata
;
1382 struct arizona_extcon_info
*info
;
1384 unsigned int clamp_mode
;
1385 int jack_irq_fall
, jack_irq_rise
;
1386 int ret
, mode
, i
, j
;
1388 if (!arizona
->dapm
|| !arizona
->dapm
->card
)
1389 return -EPROBE_DEFER
;
1391 info
= devm_kzalloc(&pdev
->dev
, sizeof(*info
), GFP_KERNEL
);
1395 if (!dev_get_platdata(arizona
->dev
))
1396 arizona_extcon_device_get_pdata(&pdev
->dev
, arizona
);
1398 info
->micvdd
= devm_regulator_get(&pdev
->dev
, "MICVDD");
1399 if (IS_ERR(info
->micvdd
)) {
1400 ret
= PTR_ERR(info
->micvdd
);
1401 dev_err(arizona
->dev
, "Failed to get MICVDD: %d\n", ret
);
1405 mutex_init(&info
->lock
);
1406 info
->arizona
= arizona
;
1407 info
->dev
= &pdev
->dev
;
1408 info
->last_jackdet
= ~(ARIZONA_MICD_CLAMP_STS
| ARIZONA_JD1_STS
);
1409 INIT_DELAYED_WORK(&info
->hpdet_work
, arizona_hpdet_work
);
1410 INIT_DELAYED_WORK(&info
->micd_detect_work
, arizona_micd_detect
);
1411 INIT_DELAYED_WORK(&info
->micd_timeout_work
, arizona_micd_timeout_work
);
1412 platform_set_drvdata(pdev
, info
);
1414 switch (arizona
->type
) {
1416 switch (arizona
->rev
) {
1418 info
->micd_reva
= true;
1421 info
->micd_clamp
= true;
1422 info
->hpdet_ip_version
= 1;
1428 switch (arizona
->rev
) {
1432 info
->micd_clamp
= true;
1433 info
->hpdet_ip_version
= 2;
1439 info
->micd_clamp
= true;
1440 info
->hpdet_ip_version
= 2;
1446 info
->edev
= devm_extcon_dev_allocate(&pdev
->dev
, arizona_cable
);
1447 if (IS_ERR(info
->edev
)) {
1448 dev_err(&pdev
->dev
, "failed to allocate extcon device\n");
1452 ret
= devm_extcon_dev_register(&pdev
->dev
, info
->edev
);
1454 dev_err(arizona
->dev
, "extcon_dev_register() failed: %d\n",
1459 info
->input
= devm_input_allocate_device(&pdev
->dev
);
1461 dev_err(arizona
->dev
, "Can't allocate input dev\n");
1466 info
->input
->name
= "Headset";
1467 info
->input
->phys
= "arizona/extcon";
1469 if (!pdata
->micd_timeout
)
1470 pdata
->micd_timeout
= DEFAULT_MICD_TIMEOUT
;
1472 if (pdata
->num_micd_configs
) {
1473 info
->micd_modes
= pdata
->micd_configs
;
1474 info
->micd_num_modes
= pdata
->num_micd_configs
;
1476 info
->micd_modes
= micd_default_modes
;
1477 info
->micd_num_modes
= ARRAY_SIZE(micd_default_modes
);
1480 if (arizona
->pdata
.gpsw
> 0)
1481 regmap_update_bits(arizona
->regmap
, ARIZONA_GP_SWITCH_1
,
1482 ARIZONA_SW1_MODE_MASK
, arizona
->pdata
.gpsw
);
1484 if (pdata
->micd_pol_gpio
> 0) {
1485 if (info
->micd_modes
[0].gpio
)
1486 mode
= GPIOF_OUT_INIT_HIGH
;
1488 mode
= GPIOF_OUT_INIT_LOW
;
1490 ret
= devm_gpio_request_one(&pdev
->dev
, pdata
->micd_pol_gpio
,
1491 mode
, "MICD polarity");
1493 dev_err(arizona
->dev
, "Failed to request GPIO%d: %d\n",
1494 pdata
->micd_pol_gpio
, ret
);
1498 info
->micd_pol_gpio
= gpio_to_desc(pdata
->micd_pol_gpio
);
1500 if (info
->micd_modes
[0].gpio
)
1501 mode
= GPIOD_OUT_HIGH
;
1503 mode
= GPIOD_OUT_LOW
;
1505 /* We can't use devm here because we need to do the get
1506 * against the MFD device, as that is where the of_node
1507 * will reside, but if we devm against that the GPIO
1508 * will not be freed if the extcon driver is unloaded.
1510 info
->micd_pol_gpio
= gpiod_get_optional(arizona
->dev
,
1513 if (IS_ERR(info
->micd_pol_gpio
)) {
1514 ret
= PTR_ERR(info
->micd_pol_gpio
);
1515 dev_err(arizona
->dev
,
1516 "Failed to get microphone polarity GPIO: %d\n",
1522 if (arizona
->pdata
.hpdet_id_gpio
> 0) {
1523 ret
= devm_gpio_request_one(&pdev
->dev
,
1524 arizona
->pdata
.hpdet_id_gpio
,
1528 dev_err(arizona
->dev
, "Failed to request GPIO%d: %d\n",
1529 arizona
->pdata
.hpdet_id_gpio
, ret
);
1534 if (arizona
->pdata
.micd_bias_start_time
)
1535 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1536 ARIZONA_MICD_BIAS_STARTTIME_MASK
,
1537 arizona
->pdata
.micd_bias_start_time
1538 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT
);
1540 if (arizona
->pdata
.micd_rate
)
1541 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1542 ARIZONA_MICD_RATE_MASK
,
1543 arizona
->pdata
.micd_rate
1544 << ARIZONA_MICD_RATE_SHIFT
);
1546 switch (arizona
->pdata
.micd_dbtime
) {
1547 case MICD_DBTIME_FOUR_READINGS
:
1548 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1549 ARIZONA_MICD_DBTIME_MASK
,
1550 ARIZONA_MICD_DBTIME
);
1552 case MICD_DBTIME_TWO_READINGS
:
1553 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1554 ARIZONA_MICD_DBTIME_MASK
, 0);
1560 BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels
) <
1561 ARIZONA_NUM_MICD_BUTTON_LEVELS
);
1563 if (arizona
->pdata
.num_micd_ranges
) {
1564 info
->micd_ranges
= pdata
->micd_ranges
;
1565 info
->num_micd_ranges
= pdata
->num_micd_ranges
;
1567 info
->micd_ranges
= micd_default_ranges
;
1568 info
->num_micd_ranges
= ARRAY_SIZE(micd_default_ranges
);
1571 if (arizona
->pdata
.num_micd_ranges
> ARIZONA_MAX_MICD_RANGE
) {
1572 dev_err(arizona
->dev
, "Too many MICD ranges: %d\n",
1573 arizona
->pdata
.num_micd_ranges
);
1576 if (info
->num_micd_ranges
> 1) {
1577 for (i
= 1; i
< info
->num_micd_ranges
; i
++) {
1578 if (info
->micd_ranges
[i
- 1].max
>
1579 info
->micd_ranges
[i
].max
) {
1580 dev_err(arizona
->dev
,
1581 "MICD ranges must be sorted\n");
1588 /* Disable all buttons by default */
1589 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_2
,
1590 ARIZONA_MICD_LVL_SEL_MASK
, 0x81);
1592 /* Set up all the buttons the user specified */
1593 for (i
= 0; i
< info
->num_micd_ranges
; i
++) {
1594 for (j
= 0; j
< ARIZONA_NUM_MICD_BUTTON_LEVELS
; j
++)
1595 if (arizona_micd_levels
[j
] >= info
->micd_ranges
[i
].max
)
1598 if (j
== ARIZONA_NUM_MICD_BUTTON_LEVELS
) {
1599 dev_err(arizona
->dev
, "Unsupported MICD level %d\n",
1600 info
->micd_ranges
[i
].max
);
1605 dev_dbg(arizona
->dev
, "%d ohms for MICD threshold %d\n",
1606 arizona_micd_levels
[j
], i
);
1608 arizona_micd_set_level(arizona
, i
, j
);
1609 input_set_capability(info
->input
, EV_KEY
,
1610 info
->micd_ranges
[i
].key
);
1612 /* Enable reporting of that range */
1613 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_2
,
1617 /* Set all the remaining keys to a maximum */
1618 for (; i
< ARIZONA_MAX_MICD_RANGE
; i
++)
1619 arizona_micd_set_level(arizona
, i
, 0x3f);
1622 * If we have a clamp use it, activating in conjunction with
1623 * GPIO5 if that is connected for jack detect operation.
1625 if (info
->micd_clamp
) {
1626 if (arizona
->pdata
.jd_gpio5
) {
1627 /* Put the GPIO into input mode with optional pull */
1629 if (arizona
->pdata
.jd_gpio5_nopull
)
1630 val
&= ~ARIZONA_GPN_PU
;
1632 regmap_write(arizona
->regmap
, ARIZONA_GPIO5_CTRL
,
1635 if (arizona
->pdata
.jd_invert
)
1636 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDH_GP5H
;
1638 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDL_GP5H
;
1640 if (arizona
->pdata
.jd_invert
)
1641 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDH
;
1643 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDL
;
1646 regmap_update_bits(arizona
->regmap
,
1647 ARIZONA_MICD_CLAMP_CONTROL
,
1648 ARIZONA_MICD_CLAMP_MODE_MASK
, clamp_mode
);
1650 regmap_update_bits(arizona
->regmap
,
1651 ARIZONA_JACK_DETECT_DEBOUNCE
,
1652 ARIZONA_MICD_CLAMP_DB
,
1653 ARIZONA_MICD_CLAMP_DB
);
1656 arizona_extcon_set_mode(info
, 0);
1658 pm_runtime_enable(&pdev
->dev
);
1659 pm_runtime_idle(&pdev
->dev
);
1660 pm_runtime_get_sync(&pdev
->dev
);
1662 if (info
->micd_clamp
) {
1663 jack_irq_rise
= ARIZONA_IRQ_MICD_CLAMP_RISE
;
1664 jack_irq_fall
= ARIZONA_IRQ_MICD_CLAMP_FALL
;
1666 jack_irq_rise
= ARIZONA_IRQ_JD_RISE
;
1667 jack_irq_fall
= ARIZONA_IRQ_JD_FALL
;
1670 ret
= arizona_request_irq(arizona
, jack_irq_rise
,
1671 "JACKDET rise", arizona_jackdet
, info
);
1673 dev_err(&pdev
->dev
, "Failed to get JACKDET rise IRQ: %d\n",
1678 ret
= arizona_set_irq_wake(arizona
, jack_irq_rise
, 1);
1680 dev_err(&pdev
->dev
, "Failed to set JD rise IRQ wake: %d\n",
1685 ret
= arizona_request_irq(arizona
, jack_irq_fall
,
1686 "JACKDET fall", arizona_jackdet
, info
);
1688 dev_err(&pdev
->dev
, "Failed to get JD fall IRQ: %d\n", ret
);
1692 ret
= arizona_set_irq_wake(arizona
, jack_irq_fall
, 1);
1694 dev_err(&pdev
->dev
, "Failed to set JD fall IRQ wake: %d\n",
1699 ret
= arizona_request_irq(arizona
, ARIZONA_IRQ_MICDET
,
1700 "MICDET", arizona_micdet
, info
);
1702 dev_err(&pdev
->dev
, "Failed to get MICDET IRQ: %d\n", ret
);
1706 ret
= arizona_request_irq(arizona
, ARIZONA_IRQ_HPDET
,
1707 "HPDET", arizona_hpdet_irq
, info
);
1709 dev_err(&pdev
->dev
, "Failed to get HPDET IRQ: %d\n", ret
);
1713 arizona_clk32k_enable(arizona
);
1714 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_DEBOUNCE
,
1715 ARIZONA_JD1_DB
, ARIZONA_JD1_DB
);
1716 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_ANALOGUE
,
1717 ARIZONA_JD1_ENA
, ARIZONA_JD1_ENA
);
1719 ret
= regulator_allow_bypass(info
->micvdd
, true);
1721 dev_warn(arizona
->dev
, "Failed to set MICVDD to bypass: %d\n",
1724 pm_runtime_put(&pdev
->dev
);
1726 ret
= input_register_device(info
->input
);
1728 dev_err(&pdev
->dev
, "Can't register input device: %d\n", ret
);
1735 arizona_free_irq(arizona
, ARIZONA_IRQ_HPDET
, info
);
1737 arizona_free_irq(arizona
, ARIZONA_IRQ_MICDET
, info
);
1739 arizona_set_irq_wake(arizona
, jack_irq_fall
, 0);
1741 arizona_free_irq(arizona
, jack_irq_fall
, info
);
1743 arizona_set_irq_wake(arizona
, jack_irq_rise
, 0);
1745 arizona_free_irq(arizona
, jack_irq_rise
, info
);
1747 gpiod_put(info
->micd_pol_gpio
);
1749 pm_runtime_disable(&pdev
->dev
);
1753 static int arizona_extcon_remove(struct platform_device
*pdev
)
1755 struct arizona_extcon_info
*info
= platform_get_drvdata(pdev
);
1756 struct arizona
*arizona
= info
->arizona
;
1757 int jack_irq_rise
, jack_irq_fall
;
1761 ret
= regmap_update_bits_check(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1762 ARIZONA_MICD_ENA
, 0,
1765 dev_err(&pdev
->dev
, "Failed to disable micd on remove: %d\n",
1767 } else if (change
) {
1768 regulator_disable(info
->micvdd
);
1769 pm_runtime_put(info
->dev
);
1772 gpiod_put(info
->micd_pol_gpio
);
1774 pm_runtime_disable(&pdev
->dev
);
1776 regmap_update_bits(arizona
->regmap
,
1777 ARIZONA_MICD_CLAMP_CONTROL
,
1778 ARIZONA_MICD_CLAMP_MODE_MASK
, 0);
1780 if (info
->micd_clamp
) {
1781 jack_irq_rise
= ARIZONA_IRQ_MICD_CLAMP_RISE
;
1782 jack_irq_fall
= ARIZONA_IRQ_MICD_CLAMP_FALL
;
1784 jack_irq_rise
= ARIZONA_IRQ_JD_RISE
;
1785 jack_irq_fall
= ARIZONA_IRQ_JD_FALL
;
1788 arizona_set_irq_wake(arizona
, jack_irq_rise
, 0);
1789 arizona_set_irq_wake(arizona
, jack_irq_fall
, 0);
1790 arizona_free_irq(arizona
, ARIZONA_IRQ_HPDET
, info
);
1791 arizona_free_irq(arizona
, ARIZONA_IRQ_MICDET
, info
);
1792 arizona_free_irq(arizona
, jack_irq_rise
, info
);
1793 arizona_free_irq(arizona
, jack_irq_fall
, info
);
1794 cancel_delayed_work_sync(&info
->hpdet_work
);
1795 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_ANALOGUE
,
1796 ARIZONA_JD1_ENA
, 0);
1797 arizona_clk32k_disable(arizona
);
1802 static struct platform_driver arizona_extcon_driver
= {
1804 .name
= "arizona-extcon",
1806 .probe
= arizona_extcon_probe
,
1807 .remove
= arizona_extcon_remove
,
1810 module_platform_driver(arizona_extcon_driver
);
1812 MODULE_DESCRIPTION("Arizona Extcon driver");
1813 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1814 MODULE_LICENSE("GPL");
1815 MODULE_ALIAS("platform:extcon-arizona");