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_MICD_CLAMP_MODE_JDL 0x4
43 #define ARIZONA_MICD_CLAMP_MODE_JDH 0x5
44 #define ARIZONA_MICD_CLAMP_MODE_JDL_GP5H 0x9
45 #define ARIZONA_MICD_CLAMP_MODE_JDH_GP5H 0xb
47 #define ARIZONA_HPDET_MAX 10000
49 #define HPDET_DEBOUNCE 500
50 #define DEFAULT_MICD_TIMEOUT 2000
52 #define MICD_LVL_1_TO_7 (ARIZONA_MICD_LVL_1 | ARIZONA_MICD_LVL_2 | \
53 ARIZONA_MICD_LVL_3 | ARIZONA_MICD_LVL_4 | \
54 ARIZONA_MICD_LVL_5 | ARIZONA_MICD_LVL_6 | \
57 #define MICD_LVL_0_TO_7 (ARIZONA_MICD_LVL_0 | MICD_LVL_1_TO_7)
59 #define MICD_LVL_0_TO_8 (MICD_LVL_0_TO_7 | ARIZONA_MICD_LVL_8)
61 struct arizona_extcon_info
{
63 struct arizona
*arizona
;
65 struct regulator
*micvdd
;
66 struct input_dev
*input
;
71 const struct arizona_micd_config
*micd_modes
;
74 const struct arizona_micd_range
*micd_ranges
;
82 struct delayed_work hpdet_work
;
83 struct delayed_work micd_detect_work
;
84 struct delayed_work micd_timeout_work
;
91 unsigned int hpdet_res
[3];
99 struct extcon_dev
*edev
;
102 static const struct arizona_micd_config micd_default_modes
[] = {
103 { ARIZONA_ACCDET_SRC
, 1, 0 },
107 static const struct arizona_micd_range micd_default_ranges
[] = {
108 { .max
= 11, .key
= BTN_0
},
109 { .max
= 28, .key
= BTN_1
},
110 { .max
= 54, .key
= BTN_2
},
111 { .max
= 100, .key
= BTN_3
},
112 { .max
= 186, .key
= BTN_4
},
113 { .max
= 430, .key
= BTN_5
},
116 static const int arizona_micd_levels
[] = {
117 3, 6, 8, 11, 13, 16, 18, 21, 23, 26, 28, 31, 34, 36, 39, 41, 44, 46,
118 49, 52, 54, 57, 60, 62, 65, 67, 70, 73, 75, 78, 81, 83, 89, 94, 100,
119 105, 111, 116, 122, 127, 139, 150, 161, 173, 186, 196, 209, 220, 245,
120 270, 295, 321, 348, 375, 402, 430, 489, 550, 614, 681, 752, 903, 1071,
124 #define ARIZONA_CABLE_MECHANICAL 0
125 #define ARIZONA_CABLE_MICROPHONE 1
126 #define ARIZONA_CABLE_HEADPHONE 2
127 #define ARIZONA_CABLE_LINEOUT 3
129 static const char *arizona_cable
[] = {
137 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info
*info
);
139 static void arizona_extcon_do_magic(struct arizona_extcon_info
*info
,
142 struct arizona
*arizona
= info
->arizona
;
145 mutex_lock(&arizona
->dapm
->card
->dapm_mutex
);
147 arizona
->hpdet_magic
= magic
;
149 /* Keep the HP output stages disabled while doing the magic */
151 ret
= regmap_update_bits(arizona
->regmap
,
152 ARIZONA_OUTPUT_ENABLES_1
,
154 ARIZONA_OUT1R_ENA
, 0);
156 dev_warn(arizona
->dev
,
157 "Failed to disable headphone outputs: %d\n",
161 ret
= regmap_update_bits(arizona
->regmap
, 0x225, 0x4000,
164 dev_warn(arizona
->dev
, "Failed to do magic: %d\n",
167 ret
= regmap_update_bits(arizona
->regmap
, 0x226, 0x4000,
170 dev_warn(arizona
->dev
, "Failed to do magic: %d\n",
173 /* Restore the desired state while not doing the magic */
175 ret
= regmap_update_bits(arizona
->regmap
,
176 ARIZONA_OUTPUT_ENABLES_1
,
178 ARIZONA_OUT1R_ENA
, arizona
->hp_ena
);
180 dev_warn(arizona
->dev
,
181 "Failed to restore headphone outputs: %d\n",
185 mutex_unlock(&arizona
->dapm
->card
->dapm_mutex
);
188 static void arizona_extcon_set_mode(struct arizona_extcon_info
*info
, int mode
)
190 struct arizona
*arizona
= info
->arizona
;
192 mode
%= info
->micd_num_modes
;
194 if (arizona
->pdata
.micd_pol_gpio
> 0)
195 gpio_set_value_cansleep(arizona
->pdata
.micd_pol_gpio
,
196 info
->micd_modes
[mode
].gpio
);
197 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
198 ARIZONA_MICD_BIAS_SRC_MASK
,
199 info
->micd_modes
[mode
].bias
<<
200 ARIZONA_MICD_BIAS_SRC_SHIFT
);
201 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
202 ARIZONA_ACCDET_SRC
, info
->micd_modes
[mode
].src
);
204 info
->micd_mode
= mode
;
206 dev_dbg(arizona
->dev
, "Set jack polarity to %d\n", mode
);
209 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info
*info
)
211 switch (info
->micd_modes
[0].bias
) {
223 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info
*info
)
225 struct arizona
*arizona
= info
->arizona
;
226 const char *widget
= arizona_extcon_get_micbias(info
);
227 struct snd_soc_dapm_context
*dapm
= arizona
->dapm
;
230 ret
= snd_soc_dapm_force_enable_pin(dapm
, widget
);
232 dev_warn(arizona
->dev
, "Failed to enable %s: %d\n",
235 snd_soc_dapm_sync(dapm
);
237 if (!arizona
->pdata
.micd_force_micbias
) {
238 ret
= snd_soc_dapm_disable_pin(arizona
->dapm
, widget
);
240 dev_warn(arizona
->dev
, "Failed to disable %s: %d\n",
243 snd_soc_dapm_sync(dapm
);
247 static void arizona_start_mic(struct arizona_extcon_info
*info
)
249 struct arizona
*arizona
= info
->arizona
;
253 /* Microphone detection can't use idle mode */
254 pm_runtime_get(info
->dev
);
256 if (info
->detecting
) {
257 ret
= regulator_allow_bypass(info
->micvdd
, false);
259 dev_err(arizona
->dev
,
260 "Failed to regulate MICVDD: %d\n",
265 ret
= regulator_enable(info
->micvdd
);
267 dev_err(arizona
->dev
, "Failed to enable MICVDD: %d\n",
271 if (info
->micd_reva
) {
272 regmap_write(arizona
->regmap
, 0x80, 0x3);
273 regmap_write(arizona
->regmap
, 0x294, 0);
274 regmap_write(arizona
->regmap
, 0x80, 0x0);
277 regmap_update_bits(arizona
->regmap
,
278 ARIZONA_ACCESSORY_DETECT_MODE_1
,
279 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
281 arizona_extcon_pulse_micbias(info
);
283 regmap_update_bits_check(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
284 ARIZONA_MICD_ENA
, ARIZONA_MICD_ENA
,
287 regulator_disable(info
->micvdd
);
288 pm_runtime_put_autosuspend(info
->dev
);
292 static void arizona_stop_mic(struct arizona_extcon_info
*info
)
294 struct arizona
*arizona
= info
->arizona
;
295 const char *widget
= arizona_extcon_get_micbias(info
);
296 struct snd_soc_dapm_context
*dapm
= arizona
->dapm
;
300 regmap_update_bits_check(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
304 ret
= snd_soc_dapm_disable_pin(dapm
, widget
);
306 dev_warn(arizona
->dev
,
307 "Failed to disable %s: %d\n",
310 snd_soc_dapm_sync(dapm
);
312 if (info
->micd_reva
) {
313 regmap_write(arizona
->regmap
, 0x80, 0x3);
314 regmap_write(arizona
->regmap
, 0x294, 2);
315 regmap_write(arizona
->regmap
, 0x80, 0x0);
318 ret
= regulator_allow_bypass(info
->micvdd
, true);
320 dev_err(arizona
->dev
, "Failed to bypass MICVDD: %d\n",
325 regulator_disable(info
->micvdd
);
326 pm_runtime_mark_last_busy(info
->dev
);
327 pm_runtime_put_autosuspend(info
->dev
);
332 unsigned int threshold
;
333 unsigned int factor_a
;
334 unsigned int factor_b
;
335 } arizona_hpdet_b_ranges
[] = {
336 { 100, 5528, 362464 },
337 { 169, 11084, 6186851 },
338 { 169, 11065, 65460395 },
341 #define ARIZONA_HPDET_B_RANGE_MAX 0x3fb
346 } arizona_hpdet_c_ranges
[] = {
353 static int arizona_hpdet_read(struct arizona_extcon_info
*info
)
355 struct arizona
*arizona
= info
->arizona
;
356 unsigned int val
, range
;
359 ret
= regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_2
, &val
);
361 dev_err(arizona
->dev
, "Failed to read HPDET status: %d\n",
366 switch (info
->hpdet_ip
) {
368 if (!(val
& ARIZONA_HP_DONE
)) {
369 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
374 val
&= ARIZONA_HP_LVL_MASK
;
378 if (!(val
& ARIZONA_HP_DONE_B
)) {
379 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
384 ret
= regmap_read(arizona
->regmap
, ARIZONA_HP_DACVAL
, &val
);
386 dev_err(arizona
->dev
, "Failed to read HP value: %d\n",
391 regmap_read(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
393 range
= (range
& ARIZONA_HP_IMPEDANCE_RANGE_MASK
)
394 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
;
396 if (range
< ARRAY_SIZE(arizona_hpdet_b_ranges
) - 1 &&
397 (val
< arizona_hpdet_b_ranges
[range
].threshold
||
398 val
>= ARIZONA_HPDET_B_RANGE_MAX
)) {
400 dev_dbg(arizona
->dev
, "Moving to HPDET range %d\n",
402 regmap_update_bits(arizona
->regmap
,
403 ARIZONA_HEADPHONE_DETECT_1
,
404 ARIZONA_HP_IMPEDANCE_RANGE_MASK
,
406 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
);
410 /* If we go out of range report top of range */
411 if (val
< arizona_hpdet_b_ranges
[range
].threshold
||
412 val
>= ARIZONA_HPDET_B_RANGE_MAX
) {
413 dev_dbg(arizona
->dev
, "Measurement out of range\n");
414 return ARIZONA_HPDET_MAX
;
417 dev_dbg(arizona
->dev
, "HPDET read %d in range %d\n",
420 val
= arizona_hpdet_b_ranges
[range
].factor_b
422 arizona_hpdet_b_ranges
[range
].factor_a
);
426 dev_warn(arizona
->dev
, "Unknown HPDET IP revision %d\n",
429 if (!(val
& ARIZONA_HP_DONE_B
)) {
430 dev_err(arizona
->dev
, "HPDET did not complete: %x\n",
435 val
&= ARIZONA_HP_LVL_B_MASK
;
436 /* Convert to ohms, the value is in 0.5 ohm increments */
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 a range, or report? */
445 if (range
< ARRAY_SIZE(arizona_hpdet_c_ranges
) - 1 &&
446 (val
>= arizona_hpdet_c_ranges
[range
].max
)) {
448 dev_dbg(arizona
->dev
, "Moving to HPDET range %d-%d\n",
449 arizona_hpdet_c_ranges
[range
].min
,
450 arizona_hpdet_c_ranges
[range
].max
);
451 regmap_update_bits(arizona
->regmap
,
452 ARIZONA_HEADPHONE_DETECT_1
,
453 ARIZONA_HP_IMPEDANCE_RANGE_MASK
,
455 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT
);
459 if (range
&& (val
< arizona_hpdet_c_ranges
[range
].min
)) {
460 dev_dbg(arizona
->dev
, "Reporting range boundary %d\n",
461 arizona_hpdet_c_ranges
[range
].min
);
462 val
= arizona_hpdet_c_ranges
[range
].min
;
466 dev_dbg(arizona
->dev
, "HP impedance %d ohms\n", val
);
470 static int arizona_hpdet_do_id(struct arizona_extcon_info
*info
, int *reading
,
473 struct arizona
*arizona
= info
->arizona
;
474 int id_gpio
= arizona
->pdata
.hpdet_id_gpio
;
477 * If we're using HPDET for accessory identification we need
478 * to take multiple measurements, step through them in sequence.
480 if (arizona
->pdata
.hpdet_acc_id
) {
481 info
->hpdet_res
[info
->num_hpdet_res
++] = *reading
;
483 /* Only check the mic directly if we didn't already ID it */
484 if (id_gpio
&& info
->num_hpdet_res
== 1) {
485 dev_dbg(arizona
->dev
, "Measuring mic\n");
487 regmap_update_bits(arizona
->regmap
,
488 ARIZONA_ACCESSORY_DETECT_MODE_1
,
489 ARIZONA_ACCDET_MODE_MASK
|
491 ARIZONA_ACCDET_MODE_HPR
|
492 info
->micd_modes
[0].src
);
494 gpio_set_value_cansleep(id_gpio
, 1);
496 regmap_update_bits(arizona
->regmap
,
497 ARIZONA_HEADPHONE_DETECT_1
,
498 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
502 /* OK, got both. Now, compare... */
503 dev_dbg(arizona
->dev
, "HPDET measured %d %d\n",
504 info
->hpdet_res
[0], info
->hpdet_res
[1]);
506 /* Take the headphone impedance for the main report */
507 *reading
= info
->hpdet_res
[0];
509 /* Sometimes we get false readings due to slow insert */
510 if (*reading
>= ARIZONA_HPDET_MAX
&& !info
->hpdet_retried
) {
511 dev_dbg(arizona
->dev
, "Retrying high impedance\n");
512 info
->num_hpdet_res
= 0;
513 info
->hpdet_retried
= true;
514 arizona_start_hpdet_acc_id(info
);
515 pm_runtime_put(info
->dev
);
520 * If we measure the mic as high impedance
522 if (!id_gpio
|| info
->hpdet_res
[1] > 50) {
523 dev_dbg(arizona
->dev
, "Detected mic\n");
525 info
->detecting
= true;
527 dev_dbg(arizona
->dev
, "Detected headphone\n");
530 /* Make sure everything is reset back to the real polarity */
531 regmap_update_bits(arizona
->regmap
,
532 ARIZONA_ACCESSORY_DETECT_MODE_1
,
534 info
->micd_modes
[0].src
);
540 static irqreturn_t
arizona_hpdet_irq(int irq
, void *data
)
542 struct arizona_extcon_info
*info
= data
;
543 struct arizona
*arizona
= info
->arizona
;
544 int id_gpio
= arizona
->pdata
.hpdet_id_gpio
;
545 int report
= ARIZONA_CABLE_HEADPHONE
;
549 mutex_lock(&info
->lock
);
551 /* If we got a spurious IRQ for some reason then ignore it */
552 if (!info
->hpdet_active
) {
553 dev_warn(arizona
->dev
, "Spurious HPDET IRQ\n");
554 mutex_unlock(&info
->lock
);
558 /* If the cable was removed while measuring ignore the result */
559 ret
= extcon_get_cable_state_(info
->edev
, ARIZONA_CABLE_MECHANICAL
);
561 dev_err(arizona
->dev
, "Failed to check cable state: %d\n",
565 dev_dbg(arizona
->dev
, "Ignoring HPDET for removed cable\n");
569 ret
= arizona_hpdet_read(info
);
576 /* Reset back to starting range */
577 regmap_update_bits(arizona
->regmap
,
578 ARIZONA_HEADPHONE_DETECT_1
,
579 ARIZONA_HP_IMPEDANCE_RANGE_MASK
| ARIZONA_HP_POLL
,
582 ret
= arizona_hpdet_do_id(info
, &reading
, &mic
);
588 /* Report high impedence cables as line outputs */
590 report
= ARIZONA_CABLE_LINEOUT
;
592 report
= ARIZONA_CABLE_HEADPHONE
;
594 ret
= extcon_set_cable_state_(info
->edev
, report
, true);
596 dev_err(arizona
->dev
, "Failed to report HP/line: %d\n",
600 /* Reset back to starting range */
601 regmap_update_bits(arizona
->regmap
,
602 ARIZONA_HEADPHONE_DETECT_1
,
603 ARIZONA_HP_IMPEDANCE_RANGE_MASK
| ARIZONA_HP_POLL
,
606 arizona_extcon_do_magic(info
, 0);
609 gpio_set_value_cansleep(id_gpio
, 0);
611 /* Revert back to MICDET mode */
612 regmap_update_bits(arizona
->regmap
,
613 ARIZONA_ACCESSORY_DETECT_MODE_1
,
614 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
616 /* If we have a mic then reenable MICDET */
617 if (mic
|| info
->mic
)
618 arizona_start_mic(info
);
620 if (info
->hpdet_active
) {
621 pm_runtime_put_autosuspend(info
->dev
);
622 info
->hpdet_active
= false;
625 info
->hpdet_done
= true;
628 mutex_unlock(&info
->lock
);
633 static void arizona_identify_headphone(struct arizona_extcon_info
*info
)
635 struct arizona
*arizona
= info
->arizona
;
638 if (info
->hpdet_done
)
641 dev_dbg(arizona
->dev
, "Starting HPDET\n");
643 /* Make sure we keep the device enabled during the measurement */
644 pm_runtime_get(info
->dev
);
646 info
->hpdet_active
= true;
649 arizona_stop_mic(info
);
651 arizona_extcon_do_magic(info
, 0x4000);
653 ret
= regmap_update_bits(arizona
->regmap
,
654 ARIZONA_ACCESSORY_DETECT_MODE_1
,
655 ARIZONA_ACCDET_MODE_MASK
,
656 ARIZONA_ACCDET_MODE_HPL
);
658 dev_err(arizona
->dev
, "Failed to set HPDETL mode: %d\n", ret
);
662 ret
= regmap_update_bits(arizona
->regmap
, ARIZONA_HEADPHONE_DETECT_1
,
663 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
665 dev_err(arizona
->dev
, "Can't start HPDETL measurement: %d\n",
673 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
674 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
676 /* Just report headphone */
677 ret
= extcon_set_cable_state_(info
->edev
,
678 ARIZONA_CABLE_HEADPHONE
, true);
680 dev_err(arizona
->dev
, "Failed to report headphone: %d\n", ret
);
683 arizona_start_mic(info
);
685 info
->hpdet_active
= false;
688 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info
*info
)
690 struct arizona
*arizona
= info
->arizona
;
695 dev_dbg(arizona
->dev
, "Starting identification via HPDET\n");
697 /* Make sure we keep the device enabled during the measurement */
698 pm_runtime_get_sync(info
->dev
);
700 info
->hpdet_active
= true;
702 arizona_extcon_do_magic(info
, 0x4000);
704 ret
= regmap_update_bits(arizona
->regmap
,
705 ARIZONA_ACCESSORY_DETECT_MODE_1
,
706 ARIZONA_ACCDET_SRC
| ARIZONA_ACCDET_MODE_MASK
,
707 info
->micd_modes
[0].src
|
708 ARIZONA_ACCDET_MODE_HPL
);
710 dev_err(arizona
->dev
, "Failed to set HPDETL mode: %d\n", ret
);
714 if (arizona
->pdata
.hpdet_acc_id_line
) {
715 ret
= regmap_update_bits(arizona
->regmap
,
716 ARIZONA_HEADPHONE_DETECT_1
,
717 ARIZONA_HP_POLL
, ARIZONA_HP_POLL
);
719 dev_err(arizona
->dev
,
720 "Can't start HPDETL measurement: %d\n",
725 arizona_hpdet_do_id(info
, &hp_reading
, &mic
);
731 regmap_update_bits(arizona
->regmap
, ARIZONA_ACCESSORY_DETECT_MODE_1
,
732 ARIZONA_ACCDET_MODE_MASK
, ARIZONA_ACCDET_MODE_MIC
);
734 /* Just report headphone */
735 ret
= extcon_set_cable_state_(info
->edev
,
736 ARIZONA_CABLE_HEADPHONE
, true);
738 dev_err(arizona
->dev
, "Failed to report headphone: %d\n", ret
);
740 info
->hpdet_active
= false;
743 static void arizona_micd_timeout_work(struct work_struct
*work
)
745 struct arizona_extcon_info
*info
= container_of(work
,
746 struct arizona_extcon_info
,
747 micd_timeout_work
.work
);
749 mutex_lock(&info
->lock
);
751 dev_dbg(info
->arizona
->dev
, "MICD timed out, reporting HP\n");
752 arizona_identify_headphone(info
);
754 info
->detecting
= false;
756 arizona_stop_mic(info
);
758 mutex_unlock(&info
->lock
);
761 static void arizona_micd_detect(struct work_struct
*work
)
763 struct arizona_extcon_info
*info
= container_of(work
,
764 struct arizona_extcon_info
,
765 micd_detect_work
.work
);
766 struct arizona
*arizona
= info
->arizona
;
767 unsigned int val
= 0, lvl
;
770 cancel_delayed_work_sync(&info
->micd_timeout_work
);
772 mutex_lock(&info
->lock
);
774 /* If the cable was removed while measuring ignore the result */
775 ret
= extcon_get_cable_state_(info
->edev
, ARIZONA_CABLE_MECHANICAL
);
777 dev_err(arizona
->dev
, "Failed to check cable state: %d\n",
779 mutex_unlock(&info
->lock
);
782 dev_dbg(arizona
->dev
, "Ignoring MICDET for removed cable\n");
783 mutex_unlock(&info
->lock
);
787 for (i
= 0; i
< 10 && !(val
& MICD_LVL_0_TO_8
); i
++) {
788 ret
= regmap_read(arizona
->regmap
, ARIZONA_MIC_DETECT_3
, &val
);
790 dev_err(arizona
->dev
,
791 "Failed to read MICDET: %d\n", ret
);
792 mutex_unlock(&info
->lock
);
796 dev_dbg(arizona
->dev
, "MICDET: %x\n", val
);
798 if (!(val
& ARIZONA_MICD_VALID
)) {
799 dev_warn(arizona
->dev
,
800 "Microphone detection state invalid\n");
801 mutex_unlock(&info
->lock
);
806 if (i
== 10 && !(val
& MICD_LVL_0_TO_8
)) {
807 dev_err(arizona
->dev
, "Failed to get valid MICDET value\n");
808 mutex_unlock(&info
->lock
);
812 /* Due to jack detect this should never happen */
813 if (!(val
& ARIZONA_MICD_STS
)) {
814 dev_warn(arizona
->dev
, "Detected open circuit\n");
815 info
->detecting
= false;
819 /* If we got a high impedence we should have a headset, report it. */
820 if (info
->detecting
&& (val
& ARIZONA_MICD_LVL_8
)) {
821 arizona_identify_headphone(info
);
823 ret
= extcon_set_cable_state_(info
->edev
,
824 ARIZONA_CABLE_MICROPHONE
, true);
827 dev_err(arizona
->dev
, "Headset report failed: %d\n",
830 /* Don't need to regulate for button detection */
831 ret
= regulator_allow_bypass(info
->micvdd
, true);
833 dev_err(arizona
->dev
, "Failed to bypass MICVDD: %d\n",
838 info
->detecting
= false;
842 /* If we detected a lower impedence during initial startup
843 * then we probably have the wrong polarity, flip it. Don't
844 * do this for the lowest impedences to speed up detection of
845 * plain headphones. If both polarities report a low
846 * impedence then give up and report headphones.
848 if (info
->detecting
&& (val
& MICD_LVL_1_TO_7
)) {
849 if (info
->jack_flips
>= info
->micd_num_modes
* 10) {
850 dev_dbg(arizona
->dev
, "Detected HP/line\n");
851 arizona_identify_headphone(info
);
853 info
->detecting
= false;
855 arizona_stop_mic(info
);
858 if (info
->micd_mode
== info
->micd_num_modes
)
860 arizona_extcon_set_mode(info
, info
->micd_mode
);
869 * If we're still detecting and we detect a short then we've
870 * got a headphone. Otherwise it's a button press.
872 if (val
& MICD_LVL_0_TO_7
) {
874 dev_dbg(arizona
->dev
, "Mic button detected\n");
876 lvl
= val
& ARIZONA_MICD_LVL_MASK
;
877 lvl
>>= ARIZONA_MICD_LVL_SHIFT
;
879 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
880 input_report_key(info
->input
,
881 info
->micd_ranges
[i
].key
, 0);
884 WARN_ON(ffs(lvl
) - 1 >= info
->num_micd_ranges
);
885 if (lvl
&& ffs(lvl
) - 1 < info
->num_micd_ranges
) {
886 key
= info
->micd_ranges
[ffs(lvl
) - 1].key
;
887 input_report_key(info
->input
, key
, 1);
888 input_sync(info
->input
);
891 } else if (info
->detecting
) {
892 dev_dbg(arizona
->dev
, "Headphone detected\n");
893 info
->detecting
= false;
894 arizona_stop_mic(info
);
896 arizona_identify_headphone(info
);
898 dev_warn(arizona
->dev
, "Button with no mic: %x\n",
902 dev_dbg(arizona
->dev
, "Mic button released\n");
903 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
904 input_report_key(info
->input
,
905 info
->micd_ranges
[i
].key
, 0);
906 input_sync(info
->input
);
907 arizona_extcon_pulse_micbias(info
);
912 queue_delayed_work(system_power_efficient_wq
,
913 &info
->micd_timeout_work
,
914 msecs_to_jiffies(info
->micd_timeout
));
916 pm_runtime_mark_last_busy(info
->dev
);
917 mutex_unlock(&info
->lock
);
920 static irqreturn_t
arizona_micdet(int irq
, void *data
)
922 struct arizona_extcon_info
*info
= data
;
923 struct arizona
*arizona
= info
->arizona
;
924 int debounce
= arizona
->pdata
.micd_detect_debounce
;
926 cancel_delayed_work_sync(&info
->micd_detect_work
);
927 cancel_delayed_work_sync(&info
->micd_timeout_work
);
929 mutex_lock(&info
->lock
);
930 if (!info
->detecting
)
932 mutex_unlock(&info
->lock
);
935 queue_delayed_work(system_power_efficient_wq
,
936 &info
->micd_detect_work
,
937 msecs_to_jiffies(debounce
));
939 arizona_micd_detect(&info
->micd_detect_work
.work
);
944 static void arizona_hpdet_work(struct work_struct
*work
)
946 struct arizona_extcon_info
*info
= container_of(work
,
947 struct arizona_extcon_info
,
950 mutex_lock(&info
->lock
);
951 arizona_start_hpdet_acc_id(info
);
952 mutex_unlock(&info
->lock
);
955 static irqreturn_t
arizona_jackdet(int irq
, void *data
)
957 struct arizona_extcon_info
*info
= data
;
958 struct arizona
*arizona
= info
->arizona
;
959 unsigned int val
, present
, mask
;
960 bool cancelled_hp
, cancelled_mic
;
963 cancelled_hp
= cancel_delayed_work_sync(&info
->hpdet_work
);
964 cancelled_mic
= cancel_delayed_work_sync(&info
->micd_timeout_work
);
966 pm_runtime_get_sync(info
->dev
);
968 mutex_lock(&info
->lock
);
970 if (arizona
->pdata
.jd_gpio5
) {
971 mask
= ARIZONA_MICD_CLAMP_STS
;
972 if (arizona
->pdata
.jd_invert
)
973 present
= ARIZONA_MICD_CLAMP_STS
;
977 mask
= ARIZONA_JD1_STS
;
978 if (arizona
->pdata
.jd_invert
)
981 present
= ARIZONA_JD1_STS
;
984 ret
= regmap_read(arizona
->regmap
, ARIZONA_AOD_IRQ_RAW_STATUS
, &val
);
986 dev_err(arizona
->dev
, "Failed to read jackdet status: %d\n",
988 mutex_unlock(&info
->lock
);
989 pm_runtime_put_autosuspend(info
->dev
);
994 if (val
== info
->last_jackdet
) {
995 dev_dbg(arizona
->dev
, "Suppressing duplicate JACKDET\n");
997 queue_delayed_work(system_power_efficient_wq
,
999 msecs_to_jiffies(HPDET_DEBOUNCE
));
1001 if (cancelled_mic
) {
1002 int micd_timeout
= info
->micd_timeout
;
1004 queue_delayed_work(system_power_efficient_wq
,
1005 &info
->micd_timeout_work
,
1006 msecs_to_jiffies(micd_timeout
));
1011 info
->last_jackdet
= val
;
1013 if (info
->last_jackdet
== present
) {
1014 dev_dbg(arizona
->dev
, "Detected jack\n");
1015 ret
= extcon_set_cable_state_(info
->edev
,
1016 ARIZONA_CABLE_MECHANICAL
, true);
1019 dev_err(arizona
->dev
, "Mechanical report failed: %d\n",
1022 if (!arizona
->pdata
.hpdet_acc_id
) {
1023 info
->detecting
= true;
1025 info
->jack_flips
= 0;
1027 arizona_start_mic(info
);
1029 queue_delayed_work(system_power_efficient_wq
,
1031 msecs_to_jiffies(HPDET_DEBOUNCE
));
1034 regmap_update_bits(arizona
->regmap
,
1035 ARIZONA_JACK_DETECT_DEBOUNCE
,
1036 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
, 0);
1038 dev_dbg(arizona
->dev
, "Detected jack removal\n");
1040 arizona_stop_mic(info
);
1042 info
->num_hpdet_res
= 0;
1043 for (i
= 0; i
< ARRAY_SIZE(info
->hpdet_res
); i
++)
1044 info
->hpdet_res
[i
] = 0;
1046 info
->hpdet_done
= false;
1047 info
->hpdet_retried
= false;
1049 for (i
= 0; i
< info
->num_micd_ranges
; i
++)
1050 input_report_key(info
->input
,
1051 info
->micd_ranges
[i
].key
, 0);
1052 input_sync(info
->input
);
1054 ret
= extcon_update_state(info
->edev
, 0xffffffff, 0);
1056 dev_err(arizona
->dev
, "Removal report failed: %d\n",
1059 regmap_update_bits(arizona
->regmap
,
1060 ARIZONA_JACK_DETECT_DEBOUNCE
,
1061 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
,
1062 ARIZONA_MICD_CLAMP_DB
| ARIZONA_JD1_DB
);
1065 if (arizona
->pdata
.micd_timeout
)
1066 info
->micd_timeout
= arizona
->pdata
.micd_timeout
;
1068 info
->micd_timeout
= DEFAULT_MICD_TIMEOUT
;
1071 /* Clear trig_sts to make sure DCVDD is not forced up */
1072 regmap_write(arizona
->regmap
, ARIZONA_AOD_WKUP_AND_TRIG
,
1073 ARIZONA_MICD_CLAMP_FALL_TRIG_STS
|
1074 ARIZONA_MICD_CLAMP_RISE_TRIG_STS
|
1075 ARIZONA_JD1_FALL_TRIG_STS
|
1076 ARIZONA_JD1_RISE_TRIG_STS
);
1078 mutex_unlock(&info
->lock
);
1080 pm_runtime_mark_last_busy(info
->dev
);
1081 pm_runtime_put_autosuspend(info
->dev
);
1086 /* Map a level onto a slot in the register bank */
1087 static void arizona_micd_set_level(struct arizona
*arizona
, int index
,
1093 reg
= ARIZONA_MIC_DETECT_LEVEL_4
- (index
/ 2);
1102 /* Program the level itself */
1103 regmap_update_bits(arizona
->regmap
, reg
, mask
, level
);
1106 static int arizona_extcon_probe(struct platform_device
*pdev
)
1108 struct arizona
*arizona
= dev_get_drvdata(pdev
->dev
.parent
);
1109 struct arizona_pdata
*pdata
= &arizona
->pdata
;
1110 struct arizona_extcon_info
*info
;
1112 unsigned int clamp_mode
;
1113 int jack_irq_fall
, jack_irq_rise
;
1114 int ret
, mode
, i
, j
;
1116 if (!arizona
->dapm
|| !arizona
->dapm
->card
)
1117 return -EPROBE_DEFER
;
1119 info
= devm_kzalloc(&pdev
->dev
, sizeof(*info
), GFP_KERNEL
);
1123 info
->micvdd
= devm_regulator_get(&pdev
->dev
, "MICVDD");
1124 if (IS_ERR(info
->micvdd
)) {
1125 ret
= PTR_ERR(info
->micvdd
);
1126 dev_err(arizona
->dev
, "Failed to get MICVDD: %d\n", ret
);
1130 mutex_init(&info
->lock
);
1131 info
->arizona
= arizona
;
1132 info
->dev
= &pdev
->dev
;
1133 info
->last_jackdet
= ~(ARIZONA_MICD_CLAMP_STS
| ARIZONA_JD1_STS
);
1134 INIT_DELAYED_WORK(&info
->hpdet_work
, arizona_hpdet_work
);
1135 INIT_DELAYED_WORK(&info
->micd_detect_work
, arizona_micd_detect
);
1136 INIT_DELAYED_WORK(&info
->micd_timeout_work
, arizona_micd_timeout_work
);
1137 platform_set_drvdata(pdev
, info
);
1139 switch (arizona
->type
) {
1141 switch (arizona
->rev
) {
1143 info
->micd_reva
= true;
1146 info
->micd_clamp
= true;
1152 switch (arizona
->rev
) {
1156 info
->micd_clamp
= true;
1165 info
->edev
= devm_extcon_dev_allocate(&pdev
->dev
, arizona_cable
);
1166 if (IS_ERR(info
->edev
)) {
1167 dev_err(&pdev
->dev
, "failed to allocate extcon device\n");
1170 info
->edev
->name
= "Headset Jack";
1172 ret
= devm_extcon_dev_register(&pdev
->dev
, info
->edev
);
1174 dev_err(arizona
->dev
, "extcon_dev_register() failed: %d\n",
1179 info
->input
= devm_input_allocate_device(&pdev
->dev
);
1181 dev_err(arizona
->dev
, "Can't allocate input dev\n");
1186 info
->input
->name
= "Headset";
1187 info
->input
->phys
= "arizona/extcon";
1189 if (pdata
->num_micd_configs
) {
1190 info
->micd_modes
= pdata
->micd_configs
;
1191 info
->micd_num_modes
= pdata
->num_micd_configs
;
1193 info
->micd_modes
= micd_default_modes
;
1194 info
->micd_num_modes
= ARRAY_SIZE(micd_default_modes
);
1197 if (arizona
->pdata
.micd_pol_gpio
> 0) {
1198 if (info
->micd_modes
[0].gpio
)
1199 mode
= GPIOF_OUT_INIT_HIGH
;
1201 mode
= GPIOF_OUT_INIT_LOW
;
1203 ret
= devm_gpio_request_one(&pdev
->dev
,
1204 arizona
->pdata
.micd_pol_gpio
,
1208 dev_err(arizona
->dev
, "Failed to request GPIO%d: %d\n",
1209 arizona
->pdata
.micd_pol_gpio
, ret
);
1214 if (arizona
->pdata
.hpdet_id_gpio
> 0) {
1215 ret
= devm_gpio_request_one(&pdev
->dev
,
1216 arizona
->pdata
.hpdet_id_gpio
,
1220 dev_err(arizona
->dev
, "Failed to request GPIO%d: %d\n",
1221 arizona
->pdata
.hpdet_id_gpio
, ret
);
1226 if (arizona
->pdata
.micd_bias_start_time
)
1227 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1228 ARIZONA_MICD_BIAS_STARTTIME_MASK
,
1229 arizona
->pdata
.micd_bias_start_time
1230 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT
);
1232 if (arizona
->pdata
.micd_rate
)
1233 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1234 ARIZONA_MICD_RATE_MASK
,
1235 arizona
->pdata
.micd_rate
1236 << ARIZONA_MICD_RATE_SHIFT
);
1238 if (arizona
->pdata
.micd_dbtime
)
1239 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_1
,
1240 ARIZONA_MICD_DBTIME_MASK
,
1241 arizona
->pdata
.micd_dbtime
1242 << ARIZONA_MICD_DBTIME_SHIFT
);
1244 BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels
) != 0x40);
1246 if (arizona
->pdata
.num_micd_ranges
) {
1247 info
->micd_ranges
= pdata
->micd_ranges
;
1248 info
->num_micd_ranges
= pdata
->num_micd_ranges
;
1250 info
->micd_ranges
= micd_default_ranges
;
1251 info
->num_micd_ranges
= ARRAY_SIZE(micd_default_ranges
);
1254 if (arizona
->pdata
.num_micd_ranges
> ARIZONA_MAX_MICD_RANGE
) {
1255 dev_err(arizona
->dev
, "Too many MICD ranges: %d\n",
1256 arizona
->pdata
.num_micd_ranges
);
1259 if (info
->num_micd_ranges
> 1) {
1260 for (i
= 1; i
< info
->num_micd_ranges
; i
++) {
1261 if (info
->micd_ranges
[i
- 1].max
>
1262 info
->micd_ranges
[i
].max
) {
1263 dev_err(arizona
->dev
,
1264 "MICD ranges must be sorted\n");
1271 /* Disable all buttons by default */
1272 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_2
,
1273 ARIZONA_MICD_LVL_SEL_MASK
, 0x81);
1275 /* Set up all the buttons the user specified */
1276 for (i
= 0; i
< info
->num_micd_ranges
; i
++) {
1277 for (j
= 0; j
< ARRAY_SIZE(arizona_micd_levels
); j
++)
1278 if (arizona_micd_levels
[j
] >= info
->micd_ranges
[i
].max
)
1281 if (j
== ARRAY_SIZE(arizona_micd_levels
)) {
1282 dev_err(arizona
->dev
, "Unsupported MICD level %d\n",
1283 info
->micd_ranges
[i
].max
);
1288 dev_dbg(arizona
->dev
, "%d ohms for MICD threshold %d\n",
1289 arizona_micd_levels
[j
], i
);
1291 arizona_micd_set_level(arizona
, i
, j
);
1292 input_set_capability(info
->input
, EV_KEY
,
1293 info
->micd_ranges
[i
].key
);
1295 /* Enable reporting of that range */
1296 regmap_update_bits(arizona
->regmap
, ARIZONA_MIC_DETECT_2
,
1300 /* Set all the remaining keys to a maximum */
1301 for (; i
< ARIZONA_MAX_MICD_RANGE
; i
++)
1302 arizona_micd_set_level(arizona
, i
, 0x3f);
1305 * If we have a clamp use it, activating in conjunction with
1306 * GPIO5 if that is connected for jack detect operation.
1308 if (info
->micd_clamp
) {
1309 if (arizona
->pdata
.jd_gpio5
) {
1310 /* Put the GPIO into input mode with optional pull */
1312 if (arizona
->pdata
.jd_gpio5_nopull
)
1313 val
&= ~ARIZONA_GPN_PU
;
1315 regmap_write(arizona
->regmap
, ARIZONA_GPIO5_CTRL
,
1318 if (arizona
->pdata
.jd_invert
)
1319 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDH_GP5H
;
1321 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDL_GP5H
;
1323 if (arizona
->pdata
.jd_invert
)
1324 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDH
;
1326 clamp_mode
= ARIZONA_MICD_CLAMP_MODE_JDL
;
1329 regmap_update_bits(arizona
->regmap
,
1330 ARIZONA_MICD_CLAMP_CONTROL
,
1331 ARIZONA_MICD_CLAMP_MODE_MASK
, clamp_mode
);
1333 regmap_update_bits(arizona
->regmap
,
1334 ARIZONA_JACK_DETECT_DEBOUNCE
,
1335 ARIZONA_MICD_CLAMP_DB
,
1336 ARIZONA_MICD_CLAMP_DB
);
1339 arizona_extcon_set_mode(info
, 0);
1341 pm_runtime_enable(&pdev
->dev
);
1342 pm_runtime_idle(&pdev
->dev
);
1343 pm_runtime_get_sync(&pdev
->dev
);
1345 if (arizona
->pdata
.jd_gpio5
) {
1346 jack_irq_rise
= ARIZONA_IRQ_MICD_CLAMP_RISE
;
1347 jack_irq_fall
= ARIZONA_IRQ_MICD_CLAMP_FALL
;
1349 jack_irq_rise
= ARIZONA_IRQ_JD_RISE
;
1350 jack_irq_fall
= ARIZONA_IRQ_JD_FALL
;
1353 ret
= arizona_request_irq(arizona
, jack_irq_rise
,
1354 "JACKDET rise", arizona_jackdet
, info
);
1356 dev_err(&pdev
->dev
, "Failed to get JACKDET rise IRQ: %d\n",
1361 ret
= arizona_set_irq_wake(arizona
, jack_irq_rise
, 1);
1363 dev_err(&pdev
->dev
, "Failed to set JD rise IRQ wake: %d\n",
1368 ret
= arizona_request_irq(arizona
, jack_irq_fall
,
1369 "JACKDET fall", arizona_jackdet
, info
);
1371 dev_err(&pdev
->dev
, "Failed to get JD fall IRQ: %d\n", ret
);
1375 ret
= arizona_set_irq_wake(arizona
, jack_irq_fall
, 1);
1377 dev_err(&pdev
->dev
, "Failed to set JD fall IRQ wake: %d\n",
1382 ret
= arizona_request_irq(arizona
, ARIZONA_IRQ_MICDET
,
1383 "MICDET", arizona_micdet
, info
);
1385 dev_err(&pdev
->dev
, "Failed to get MICDET IRQ: %d\n", ret
);
1389 ret
= arizona_request_irq(arizona
, ARIZONA_IRQ_HPDET
,
1390 "HPDET", arizona_hpdet_irq
, info
);
1392 dev_err(&pdev
->dev
, "Failed to get HPDET IRQ: %d\n", ret
);
1396 arizona_clk32k_enable(arizona
);
1397 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_DEBOUNCE
,
1398 ARIZONA_JD1_DB
, ARIZONA_JD1_DB
);
1399 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_ANALOGUE
,
1400 ARIZONA_JD1_ENA
, ARIZONA_JD1_ENA
);
1402 ret
= regulator_allow_bypass(info
->micvdd
, true);
1404 dev_warn(arizona
->dev
, "Failed to set MICVDD to bypass: %d\n",
1407 pm_runtime_put(&pdev
->dev
);
1409 ret
= input_register_device(info
->input
);
1411 dev_err(&pdev
->dev
, "Can't register input device: %d\n", ret
);
1418 arizona_free_irq(arizona
, ARIZONA_IRQ_HPDET
, info
);
1420 arizona_free_irq(arizona
, ARIZONA_IRQ_MICDET
, info
);
1422 arizona_set_irq_wake(arizona
, jack_irq_fall
, 0);
1424 arizona_free_irq(arizona
, jack_irq_fall
, info
);
1426 arizona_set_irq_wake(arizona
, jack_irq_rise
, 0);
1428 arizona_free_irq(arizona
, jack_irq_rise
, info
);
1431 pm_runtime_disable(&pdev
->dev
);
1435 static int arizona_extcon_remove(struct platform_device
*pdev
)
1437 struct arizona_extcon_info
*info
= platform_get_drvdata(pdev
);
1438 struct arizona
*arizona
= info
->arizona
;
1439 int jack_irq_rise
, jack_irq_fall
;
1441 pm_runtime_disable(&pdev
->dev
);
1443 regmap_update_bits(arizona
->regmap
,
1444 ARIZONA_MICD_CLAMP_CONTROL
,
1445 ARIZONA_MICD_CLAMP_MODE_MASK
, 0);
1447 if (arizona
->pdata
.jd_gpio5
) {
1448 jack_irq_rise
= ARIZONA_IRQ_MICD_CLAMP_RISE
;
1449 jack_irq_fall
= ARIZONA_IRQ_MICD_CLAMP_FALL
;
1451 jack_irq_rise
= ARIZONA_IRQ_JD_RISE
;
1452 jack_irq_fall
= ARIZONA_IRQ_JD_FALL
;
1455 arizona_set_irq_wake(arizona
, jack_irq_rise
, 0);
1456 arizona_set_irq_wake(arizona
, jack_irq_fall
, 0);
1457 arizona_free_irq(arizona
, ARIZONA_IRQ_HPDET
, info
);
1458 arizona_free_irq(arizona
, ARIZONA_IRQ_MICDET
, info
);
1459 arizona_free_irq(arizona
, jack_irq_rise
, info
);
1460 arizona_free_irq(arizona
, jack_irq_fall
, info
);
1461 cancel_delayed_work_sync(&info
->hpdet_work
);
1462 regmap_update_bits(arizona
->regmap
, ARIZONA_JACK_DETECT_ANALOGUE
,
1463 ARIZONA_JD1_ENA
, 0);
1464 arizona_clk32k_disable(arizona
);
1469 static struct platform_driver arizona_extcon_driver
= {
1471 .name
= "arizona-extcon",
1472 .owner
= THIS_MODULE
,
1474 .probe
= arizona_extcon_probe
,
1475 .remove
= arizona_extcon_remove
,
1478 module_platform_driver(arizona_extcon_driver
);
1480 MODULE_DESCRIPTION("Arizona Extcon driver");
1481 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1482 MODULE_LICENSE("GPL");
1483 MODULE_ALIAS("platform:extcon-arizona");