PM / sleep: Asynchronous threads for suspend_noirq
[linux/fpc-iii.git] / drivers / extcon / extcon-arizona.c
blobc20602f601ee22732635aa3fa04fe94e44ed6020
1 /*
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 | \
50 ARIZONA_MICD_LVL_7)
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 {
57 struct device *dev;
58 struct arizona *arizona;
59 struct mutex lock;
60 struct regulator *micvdd;
61 struct input_dev *input;
63 u16 last_jackdet;
65 int micd_mode;
66 const struct arizona_micd_config *micd_modes;
67 int micd_num_modes;
69 const struct arizona_micd_range *micd_ranges;
70 int num_micd_ranges;
72 int micd_timeout;
74 bool micd_reva;
75 bool micd_clamp;
77 struct delayed_work hpdet_work;
78 struct delayed_work micd_detect_work;
79 struct delayed_work micd_timeout_work;
81 bool hpdet_active;
82 bool hpdet_done;
83 bool hpdet_retried;
85 int num_hpdet_res;
86 unsigned int hpdet_res[3];
88 bool mic;
89 bool detecting;
90 int jack_flips;
92 int hpdet_ip;
94 struct extcon_dev edev;
97 static const struct arizona_micd_config micd_default_modes[] = {
98 { ARIZONA_ACCDET_SRC, 1, 0 },
99 { 0, 2, 1 },
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,
116 1257,
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[] = {
125 "Mechanical",
126 "Microphone",
127 "Headphone",
128 "Line-out",
129 NULL,
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,
135 unsigned int magic)
137 struct arizona *arizona = info->arizona;
138 int ret;
140 mutex_lock(&arizona->dapm->card->dapm_mutex);
142 arizona->hpdet_magic = magic;
144 /* Keep the HP output stages disabled while doing the magic */
145 if (magic) {
146 ret = regmap_update_bits(arizona->regmap,
147 ARIZONA_OUTPUT_ENABLES_1,
148 ARIZONA_OUT1L_ENA |
149 ARIZONA_OUT1R_ENA, 0);
150 if (ret != 0)
151 dev_warn(arizona->dev,
152 "Failed to disable headphone outputs: %d\n",
153 ret);
156 ret = regmap_update_bits(arizona->regmap, 0x225, 0x4000,
157 magic);
158 if (ret != 0)
159 dev_warn(arizona->dev, "Failed to do magic: %d\n",
160 ret);
162 ret = regmap_update_bits(arizona->regmap, 0x226, 0x4000,
163 magic);
164 if (ret != 0)
165 dev_warn(arizona->dev, "Failed to do magic: %d\n",
166 ret);
168 /* Restore the desired state while not doing the magic */
169 if (!magic) {
170 ret = regmap_update_bits(arizona->regmap,
171 ARIZONA_OUTPUT_ENABLES_1,
172 ARIZONA_OUT1L_ENA |
173 ARIZONA_OUT1R_ENA, arizona->hp_ena);
174 if (ret != 0)
175 dev_warn(arizona->dev,
176 "Failed to restore headphone outputs: %d\n",
177 ret);
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) {
207 case 1:
208 return "MICBIAS1";
209 case 2:
210 return "MICBIAS2";
211 case 3:
212 return "MICBIAS3";
213 default:
214 return "MICVDD";
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;
223 int ret;
225 mutex_lock(&dapm->card->dapm_mutex);
227 ret = snd_soc_dapm_force_enable_pin(dapm, widget);
228 if (ret != 0)
229 dev_warn(arizona->dev, "Failed to enable %s: %d\n",
230 widget, ret);
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);
240 if (ret != 0)
241 dev_warn(arizona->dev, "Failed to disable %s: %d\n",
242 widget, ret);
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;
253 bool change;
254 int ret;
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);
261 if (ret != 0) {
262 dev_err(arizona->dev,
263 "Failed to regulate MICVDD: %d\n",
264 ret);
268 ret = regulator_enable(info->micvdd);
269 if (ret != 0) {
270 dev_err(arizona->dev, "Failed to enable MICVDD: %d\n",
271 ret);
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,
288 &change);
289 if (!change) {
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;
300 bool change;
301 int ret;
303 regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
304 ARIZONA_MICD_ENA, 0,
305 &change);
307 mutex_lock(&dapm->card->dapm_mutex);
309 ret = snd_soc_dapm_disable_pin(dapm, widget);
310 if (ret != 0)
311 dev_warn(arizona->dev,
312 "Failed to disable %s: %d\n",
313 widget, ret);
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);
326 if (ret != 0) {
327 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
328 ret);
331 if (change) {
332 regulator_disable(info->micvdd);
333 pm_runtime_mark_last_busy(info->dev);
334 pm_runtime_put_autosuspend(info->dev);
338 static struct {
339 unsigned int factor_a;
340 unsigned int factor_b;
341 } arizona_hpdet_b_ranges[] = {
342 { 5528, 362464 },
343 { 11084, 6186851 },
344 { 11065, 65460395 },
347 static struct {
348 int min;
349 int max;
350 } arizona_hpdet_c_ranges[] = {
351 { 0, 30 },
352 { 8, 100 },
353 { 100, 1000 },
354 { 1000, 10000 },
357 static int arizona_hpdet_read(struct arizona_extcon_info *info)
359 struct arizona *arizona = info->arizona;
360 unsigned int val, range;
361 int ret;
363 ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2, &val);
364 if (ret != 0) {
365 dev_err(arizona->dev, "Failed to read HPDET status: %d\n",
366 ret);
367 return ret;
370 switch (info->hpdet_ip) {
371 case 0:
372 if (!(val & ARIZONA_HP_DONE)) {
373 dev_err(arizona->dev, "HPDET did not complete: %x\n",
374 val);
375 return -EAGAIN;
378 val &= ARIZONA_HP_LVL_MASK;
379 break;
381 case 1:
382 if (!(val & ARIZONA_HP_DONE_B)) {
383 dev_err(arizona->dev, "HPDET did not complete: %x\n",
384 val);
385 return -EAGAIN;
388 ret = regmap_read(arizona->regmap, ARIZONA_HP_DACVAL, &val);
389 if (ret != 0) {
390 dev_err(arizona->dev, "Failed to read HP value: %d\n",
391 ret);
392 return -EAGAIN;
395 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
396 &range);
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)) {
402 range++;
403 dev_dbg(arizona->dev, "Moving to HPDET range %d\n",
404 range);
405 regmap_update_bits(arizona->regmap,
406 ARIZONA_HEADPHONE_DETECT_1,
407 ARIZONA_HP_IMPEDANCE_RANGE_MASK,
408 range <<
409 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
410 return -EAGAIN;
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",
420 val, range);
422 val = arizona_hpdet_b_ranges[range].factor_b
423 / ((val * 100) -
424 arizona_hpdet_b_ranges[range].factor_a);
425 break;
427 default:
428 dev_warn(arizona->dev, "Unknown HPDET IP revision %d\n",
429 info->hpdet_ip);
430 case 2:
431 if (!(val & ARIZONA_HP_DONE_B)) {
432 dev_err(arizona->dev, "HPDET did not complete: %x\n",
433 val);
434 return -EAGAIN;
437 val &= ARIZONA_HP_LVL_B_MASK;
438 /* Convert to ohms, the value is in 0.5 ohm increments */
439 val /= 2;
441 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
442 &range);
443 range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
444 >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
446 /* Skip up a range, or report? */
447 if (range < ARRAY_SIZE(arizona_hpdet_c_ranges) - 1 &&
448 (val >= arizona_hpdet_c_ranges[range].max)) {
449 range++;
450 dev_dbg(arizona->dev, "Moving to HPDET range %d-%d\n",
451 arizona_hpdet_c_ranges[range].min,
452 arizona_hpdet_c_ranges[range].max);
453 regmap_update_bits(arizona->regmap,
454 ARIZONA_HEADPHONE_DETECT_1,
455 ARIZONA_HP_IMPEDANCE_RANGE_MASK,
456 range <<
457 ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
458 return -EAGAIN;
461 if (range && (val < arizona_hpdet_c_ranges[range].min)) {
462 dev_dbg(arizona->dev, "Reporting range boundary %d\n",
463 arizona_hpdet_c_ranges[range].min);
464 val = arizona_hpdet_c_ranges[range].min;
468 dev_dbg(arizona->dev, "HP impedance %d ohms\n", val);
469 return val;
472 static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading,
473 bool *mic)
475 struct arizona *arizona = info->arizona;
476 int id_gpio = arizona->pdata.hpdet_id_gpio;
479 * If we're using HPDET for accessory identification we need
480 * to take multiple measurements, step through them in sequence.
482 if (arizona->pdata.hpdet_acc_id) {
483 info->hpdet_res[info->num_hpdet_res++] = *reading;
485 /* Only check the mic directly if we didn't already ID it */
486 if (id_gpio && info->num_hpdet_res == 1) {
487 dev_dbg(arizona->dev, "Measuring mic\n");
489 regmap_update_bits(arizona->regmap,
490 ARIZONA_ACCESSORY_DETECT_MODE_1,
491 ARIZONA_ACCDET_MODE_MASK |
492 ARIZONA_ACCDET_SRC,
493 ARIZONA_ACCDET_MODE_HPR |
494 info->micd_modes[0].src);
496 gpio_set_value_cansleep(id_gpio, 1);
498 regmap_update_bits(arizona->regmap,
499 ARIZONA_HEADPHONE_DETECT_1,
500 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
501 return -EAGAIN;
504 /* OK, got both. Now, compare... */
505 dev_dbg(arizona->dev, "HPDET measured %d %d\n",
506 info->hpdet_res[0], info->hpdet_res[1]);
508 /* Take the headphone impedance for the main report */
509 *reading = info->hpdet_res[0];
511 /* Sometimes we get false readings due to slow insert */
512 if (*reading >= ARIZONA_HPDET_MAX && !info->hpdet_retried) {
513 dev_dbg(arizona->dev, "Retrying high impedance\n");
514 info->num_hpdet_res = 0;
515 info->hpdet_retried = true;
516 arizona_start_hpdet_acc_id(info);
517 pm_runtime_put(info->dev);
518 return -EAGAIN;
522 * If we measure the mic as high impedance
524 if (!id_gpio || info->hpdet_res[1] > 50) {
525 dev_dbg(arizona->dev, "Detected mic\n");
526 *mic = true;
527 info->detecting = true;
528 } else {
529 dev_dbg(arizona->dev, "Detected headphone\n");
532 /* Make sure everything is reset back to the real polarity */
533 regmap_update_bits(arizona->regmap,
534 ARIZONA_ACCESSORY_DETECT_MODE_1,
535 ARIZONA_ACCDET_SRC,
536 info->micd_modes[0].src);
539 return 0;
542 static irqreturn_t arizona_hpdet_irq(int irq, void *data)
544 struct arizona_extcon_info *info = data;
545 struct arizona *arizona = info->arizona;
546 int id_gpio = arizona->pdata.hpdet_id_gpio;
547 int report = ARIZONA_CABLE_HEADPHONE;
548 int ret, reading;
549 bool mic = false;
551 mutex_lock(&info->lock);
553 /* If we got a spurious IRQ for some reason then ignore it */
554 if (!info->hpdet_active) {
555 dev_warn(arizona->dev, "Spurious HPDET IRQ\n");
556 mutex_unlock(&info->lock);
557 return IRQ_NONE;
560 /* If the cable was removed while measuring ignore the result */
561 ret = extcon_get_cable_state_(&info->edev, ARIZONA_CABLE_MECHANICAL);
562 if (ret < 0) {
563 dev_err(arizona->dev, "Failed to check cable state: %d\n",
564 ret);
565 goto out;
566 } else if (!ret) {
567 dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
568 goto done;
571 ret = arizona_hpdet_read(info);
572 if (ret == -EAGAIN)
573 goto out;
574 else if (ret < 0)
575 goto done;
576 reading = ret;
578 /* Reset back to starting range */
579 regmap_update_bits(arizona->regmap,
580 ARIZONA_HEADPHONE_DETECT_1,
581 ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL,
584 ret = arizona_hpdet_do_id(info, &reading, &mic);
585 if (ret == -EAGAIN)
586 goto out;
587 else if (ret < 0)
588 goto done;
590 /* Report high impedence cables as line outputs */
591 if (reading >= 5000)
592 report = ARIZONA_CABLE_LINEOUT;
593 else
594 report = ARIZONA_CABLE_HEADPHONE;
596 ret = extcon_set_cable_state_(&info->edev, report, true);
597 if (ret != 0)
598 dev_err(arizona->dev, "Failed to report HP/line: %d\n",
599 ret);
601 done:
602 /* Reset back to starting range */
603 regmap_update_bits(arizona->regmap,
604 ARIZONA_HEADPHONE_DETECT_1,
605 ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL,
608 arizona_extcon_do_magic(info, 0);
610 if (id_gpio)
611 gpio_set_value_cansleep(id_gpio, 0);
613 /* Revert back to MICDET mode */
614 regmap_update_bits(arizona->regmap,
615 ARIZONA_ACCESSORY_DETECT_MODE_1,
616 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
618 /* If we have a mic then reenable MICDET */
619 if (mic || info->mic)
620 arizona_start_mic(info);
622 if (info->hpdet_active) {
623 pm_runtime_put_autosuspend(info->dev);
624 info->hpdet_active = false;
627 info->hpdet_done = true;
629 out:
630 mutex_unlock(&info->lock);
632 return IRQ_HANDLED;
635 static void arizona_identify_headphone(struct arizona_extcon_info *info)
637 struct arizona *arizona = info->arizona;
638 int ret;
640 if (info->hpdet_done)
641 return;
643 dev_dbg(arizona->dev, "Starting HPDET\n");
645 /* Make sure we keep the device enabled during the measurement */
646 pm_runtime_get(info->dev);
648 info->hpdet_active = true;
650 if (info->mic)
651 arizona_stop_mic(info);
653 arizona_extcon_do_magic(info, 0x4000);
655 ret = regmap_update_bits(arizona->regmap,
656 ARIZONA_ACCESSORY_DETECT_MODE_1,
657 ARIZONA_ACCDET_MODE_MASK,
658 ARIZONA_ACCDET_MODE_HPL);
659 if (ret != 0) {
660 dev_err(arizona->dev, "Failed to set HPDETL mode: %d\n", ret);
661 goto err;
664 ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
665 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
666 if (ret != 0) {
667 dev_err(arizona->dev, "Can't start HPDETL measurement: %d\n",
668 ret);
669 goto err;
672 return;
674 err:
675 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
676 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
678 /* Just report headphone */
679 ret = extcon_update_state(&info->edev,
680 1 << ARIZONA_CABLE_HEADPHONE,
681 1 << ARIZONA_CABLE_HEADPHONE);
682 if (ret != 0)
683 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
685 if (info->mic)
686 arizona_start_mic(info);
688 info->hpdet_active = false;
691 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
693 struct arizona *arizona = info->arizona;
694 int hp_reading = 32;
695 bool mic;
696 int ret;
698 dev_dbg(arizona->dev, "Starting identification via HPDET\n");
700 /* Make sure we keep the device enabled during the measurement */
701 pm_runtime_get_sync(info->dev);
703 info->hpdet_active = true;
705 arizona_extcon_do_magic(info, 0x4000);
707 ret = regmap_update_bits(arizona->regmap,
708 ARIZONA_ACCESSORY_DETECT_MODE_1,
709 ARIZONA_ACCDET_SRC | ARIZONA_ACCDET_MODE_MASK,
710 info->micd_modes[0].src |
711 ARIZONA_ACCDET_MODE_HPL);
712 if (ret != 0) {
713 dev_err(arizona->dev, "Failed to set HPDETL mode: %d\n", ret);
714 goto err;
717 if (arizona->pdata.hpdet_acc_id_line) {
718 ret = regmap_update_bits(arizona->regmap,
719 ARIZONA_HEADPHONE_DETECT_1,
720 ARIZONA_HP_POLL, ARIZONA_HP_POLL);
721 if (ret != 0) {
722 dev_err(arizona->dev,
723 "Can't start HPDETL measurement: %d\n",
724 ret);
725 goto err;
727 } else {
728 arizona_hpdet_do_id(info, &hp_reading, &mic);
731 return;
733 err:
734 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
735 ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
737 /* Just report headphone */
738 ret = extcon_update_state(&info->edev,
739 1 << ARIZONA_CABLE_HEADPHONE,
740 1 << ARIZONA_CABLE_HEADPHONE);
741 if (ret != 0)
742 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
744 info->hpdet_active = false;
747 static void arizona_micd_timeout_work(struct work_struct *work)
749 struct arizona_extcon_info *info = container_of(work,
750 struct arizona_extcon_info,
751 micd_timeout_work.work);
753 mutex_lock(&info->lock);
755 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
756 arizona_identify_headphone(info);
758 info->detecting = false;
760 arizona_stop_mic(info);
762 mutex_unlock(&info->lock);
765 static void arizona_micd_detect(struct work_struct *work)
767 struct arizona_extcon_info *info = container_of(work,
768 struct arizona_extcon_info,
769 micd_detect_work.work);
770 struct arizona *arizona = info->arizona;
771 unsigned int val = 0, lvl;
772 int ret, i, key;
774 cancel_delayed_work_sync(&info->micd_timeout_work);
776 mutex_lock(&info->lock);
778 /* If the cable was removed while measuring ignore the result */
779 ret = extcon_get_cable_state_(&info->edev, ARIZONA_CABLE_MECHANICAL);
780 if (ret < 0) {
781 dev_err(arizona->dev, "Failed to check cable state: %d\n",
782 ret);
783 mutex_unlock(&info->lock);
784 return;
785 } else if (!ret) {
786 dev_dbg(arizona->dev, "Ignoring MICDET for removed cable\n");
787 mutex_unlock(&info->lock);
788 return;
791 for (i = 0; i < 10 && !(val & MICD_LVL_0_TO_8); i++) {
792 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
793 if (ret != 0) {
794 dev_err(arizona->dev,
795 "Failed to read MICDET: %d\n", ret);
796 mutex_unlock(&info->lock);
797 return;
800 dev_dbg(arizona->dev, "MICDET: %x\n", val);
802 if (!(val & ARIZONA_MICD_VALID)) {
803 dev_warn(arizona->dev,
804 "Microphone detection state invalid\n");
805 mutex_unlock(&info->lock);
806 return;
810 if (i == 10 && !(val & MICD_LVL_0_TO_8)) {
811 dev_err(arizona->dev, "Failed to get valid MICDET value\n");
812 mutex_unlock(&info->lock);
813 return;
816 /* Due to jack detect this should never happen */
817 if (!(val & ARIZONA_MICD_STS)) {
818 dev_warn(arizona->dev, "Detected open circuit\n");
819 info->detecting = false;
820 goto handled;
823 /* If we got a high impedence we should have a headset, report it. */
824 if (info->detecting && (val & ARIZONA_MICD_LVL_8)) {
825 arizona_identify_headphone(info);
827 ret = extcon_update_state(&info->edev,
828 1 << ARIZONA_CABLE_MICROPHONE,
829 1 << ARIZONA_CABLE_MICROPHONE);
831 if (ret != 0)
832 dev_err(arizona->dev, "Headset report failed: %d\n",
833 ret);
835 /* Don't need to regulate for button detection */
836 ret = regulator_allow_bypass(info->micvdd, false);
837 if (ret != 0) {
838 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
839 ret);
842 info->mic = true;
843 info->detecting = false;
844 goto handled;
847 /* If we detected a lower impedence during initial startup
848 * then we probably have the wrong polarity, flip it. Don't
849 * do this for the lowest impedences to speed up detection of
850 * plain headphones. If both polarities report a low
851 * impedence then give up and report headphones.
853 if (info->detecting && (val & MICD_LVL_1_TO_7)) {
854 if (info->jack_flips >= info->micd_num_modes * 10) {
855 dev_dbg(arizona->dev, "Detected HP/line\n");
856 arizona_identify_headphone(info);
858 info->detecting = false;
860 arizona_stop_mic(info);
861 } else {
862 info->micd_mode++;
863 if (info->micd_mode == info->micd_num_modes)
864 info->micd_mode = 0;
865 arizona_extcon_set_mode(info, info->micd_mode);
867 info->jack_flips++;
870 goto handled;
874 * If we're still detecting and we detect a short then we've
875 * got a headphone. Otherwise it's a button press.
877 if (val & MICD_LVL_0_TO_7) {
878 if (info->mic) {
879 dev_dbg(arizona->dev, "Mic button detected\n");
881 lvl = val & ARIZONA_MICD_LVL_MASK;
882 lvl >>= ARIZONA_MICD_LVL_SHIFT;
884 for (i = 0; i < info->num_micd_ranges; i++)
885 input_report_key(info->input,
886 info->micd_ranges[i].key, 0);
888 WARN_ON(!lvl);
889 WARN_ON(ffs(lvl) - 1 >= info->num_micd_ranges);
890 if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) {
891 key = info->micd_ranges[ffs(lvl) - 1].key;
892 input_report_key(info->input, key, 1);
893 input_sync(info->input);
896 } else if (info->detecting) {
897 dev_dbg(arizona->dev, "Headphone detected\n");
898 info->detecting = false;
899 arizona_stop_mic(info);
901 arizona_identify_headphone(info);
902 } else {
903 dev_warn(arizona->dev, "Button with no mic: %x\n",
904 val);
906 } else {
907 dev_dbg(arizona->dev, "Mic button released\n");
908 for (i = 0; i < info->num_micd_ranges; i++)
909 input_report_key(info->input,
910 info->micd_ranges[i].key, 0);
911 input_sync(info->input);
912 arizona_extcon_pulse_micbias(info);
915 handled:
916 if (info->detecting)
917 queue_delayed_work(system_power_efficient_wq,
918 &info->micd_timeout_work,
919 msecs_to_jiffies(info->micd_timeout));
921 pm_runtime_mark_last_busy(info->dev);
922 mutex_unlock(&info->lock);
925 static irqreturn_t arizona_micdet(int irq, void *data)
927 struct arizona_extcon_info *info = data;
928 struct arizona *arizona = info->arizona;
929 int debounce = arizona->pdata.micd_detect_debounce;
931 cancel_delayed_work_sync(&info->micd_detect_work);
932 cancel_delayed_work_sync(&info->micd_timeout_work);
934 mutex_lock(&info->lock);
935 if (!info->detecting)
936 debounce = 0;
937 mutex_unlock(&info->lock);
939 if (debounce)
940 queue_delayed_work(system_power_efficient_wq,
941 &info->micd_detect_work,
942 msecs_to_jiffies(debounce));
943 else
944 arizona_micd_detect(&info->micd_detect_work.work);
946 return IRQ_HANDLED;
949 static void arizona_hpdet_work(struct work_struct *work)
951 struct arizona_extcon_info *info = container_of(work,
952 struct arizona_extcon_info,
953 hpdet_work.work);
955 mutex_lock(&info->lock);
956 arizona_start_hpdet_acc_id(info);
957 mutex_unlock(&info->lock);
960 static irqreturn_t arizona_jackdet(int irq, void *data)
962 struct arizona_extcon_info *info = data;
963 struct arizona *arizona = info->arizona;
964 unsigned int val, present, mask;
965 bool cancelled_hp, cancelled_mic;
966 int ret, i;
968 cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
969 cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);
971 pm_runtime_get_sync(info->dev);
973 mutex_lock(&info->lock);
975 if (arizona->pdata.jd_gpio5) {
976 mask = ARIZONA_MICD_CLAMP_STS;
977 present = 0;
978 } else {
979 mask = ARIZONA_JD1_STS;
980 present = ARIZONA_JD1_STS;
983 ret = regmap_read(arizona->regmap, ARIZONA_AOD_IRQ_RAW_STATUS, &val);
984 if (ret != 0) {
985 dev_err(arizona->dev, "Failed to read jackdet status: %d\n",
986 ret);
987 mutex_unlock(&info->lock);
988 pm_runtime_put_autosuspend(info->dev);
989 return IRQ_NONE;
992 val &= mask;
993 if (val == info->last_jackdet) {
994 dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
995 if (cancelled_hp)
996 queue_delayed_work(system_power_efficient_wq,
997 &info->hpdet_work,
998 msecs_to_jiffies(HPDET_DEBOUNCE));
1000 if (cancelled_mic) {
1001 int micd_timeout = info->micd_timeout;
1003 queue_delayed_work(system_power_efficient_wq,
1004 &info->micd_timeout_work,
1005 msecs_to_jiffies(micd_timeout));
1008 goto out;
1010 info->last_jackdet = val;
1012 if (info->last_jackdet == present) {
1013 dev_dbg(arizona->dev, "Detected jack\n");
1014 ret = extcon_set_cable_state_(&info->edev,
1015 ARIZONA_CABLE_MECHANICAL, true);
1017 if (ret != 0)
1018 dev_err(arizona->dev, "Mechanical report failed: %d\n",
1019 ret);
1021 if (!arizona->pdata.hpdet_acc_id) {
1022 info->detecting = true;
1023 info->mic = false;
1024 info->jack_flips = 0;
1026 arizona_start_mic(info);
1027 } else {
1028 queue_delayed_work(system_power_efficient_wq,
1029 &info->hpdet_work,
1030 msecs_to_jiffies(HPDET_DEBOUNCE));
1033 regmap_update_bits(arizona->regmap,
1034 ARIZONA_JACK_DETECT_DEBOUNCE,
1035 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB, 0);
1036 } else {
1037 dev_dbg(arizona->dev, "Detected jack removal\n");
1039 arizona_stop_mic(info);
1041 info->num_hpdet_res = 0;
1042 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
1043 info->hpdet_res[i] = 0;
1044 info->mic = false;
1045 info->hpdet_done = false;
1046 info->hpdet_retried = false;
1048 for (i = 0; i < info->num_micd_ranges; i++)
1049 input_report_key(info->input,
1050 info->micd_ranges[i].key, 0);
1051 input_sync(info->input);
1053 ret = extcon_update_state(&info->edev, 0xffffffff, 0);
1054 if (ret != 0)
1055 dev_err(arizona->dev, "Removal report failed: %d\n",
1056 ret);
1058 regmap_update_bits(arizona->regmap,
1059 ARIZONA_JACK_DETECT_DEBOUNCE,
1060 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB,
1061 ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB);
1064 if (arizona->pdata.micd_timeout)
1065 info->micd_timeout = arizona->pdata.micd_timeout;
1066 else
1067 info->micd_timeout = DEFAULT_MICD_TIMEOUT;
1069 out:
1070 /* Clear trig_sts to make sure DCVDD is not forced up */
1071 regmap_write(arizona->regmap, ARIZONA_AOD_WKUP_AND_TRIG,
1072 ARIZONA_MICD_CLAMP_FALL_TRIG_STS |
1073 ARIZONA_MICD_CLAMP_RISE_TRIG_STS |
1074 ARIZONA_JD1_FALL_TRIG_STS |
1075 ARIZONA_JD1_RISE_TRIG_STS);
1077 mutex_unlock(&info->lock);
1079 pm_runtime_mark_last_busy(info->dev);
1080 pm_runtime_put_autosuspend(info->dev);
1082 return IRQ_HANDLED;
1085 /* Map a level onto a slot in the register bank */
1086 static void arizona_micd_set_level(struct arizona *arizona, int index,
1087 unsigned int level)
1089 int reg;
1090 unsigned int mask;
1092 reg = ARIZONA_MIC_DETECT_LEVEL_4 - (index / 2);
1094 if (!(index % 2)) {
1095 mask = 0x3f00;
1096 level <<= 8;
1097 } else {
1098 mask = 0x3f;
1101 /* Program the level itself */
1102 regmap_update_bits(arizona->regmap, reg, mask, level);
1105 static int arizona_extcon_probe(struct platform_device *pdev)
1107 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1108 struct arizona_pdata *pdata = &arizona->pdata;
1109 struct arizona_extcon_info *info;
1110 unsigned int val;
1111 int jack_irq_fall, jack_irq_rise;
1112 int ret, mode, i, j;
1114 if (!arizona->dapm || !arizona->dapm->card)
1115 return -EPROBE_DEFER;
1117 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
1118 if (!info) {
1119 dev_err(&pdev->dev, "Failed to allocate memory\n");
1120 ret = -ENOMEM;
1121 goto err;
1124 info->micvdd = devm_regulator_get(arizona->dev, "MICVDD");
1125 if (IS_ERR(info->micvdd)) {
1126 ret = PTR_ERR(info->micvdd);
1127 dev_err(arizona->dev, "Failed to get MICVDD: %d\n", ret);
1128 goto err;
1131 mutex_init(&info->lock);
1132 info->arizona = arizona;
1133 info->dev = &pdev->dev;
1134 info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS);
1135 INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
1136 INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect);
1137 INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
1138 platform_set_drvdata(pdev, info);
1140 switch (arizona->type) {
1141 case WM5102:
1142 switch (arizona->rev) {
1143 case 0:
1144 info->micd_reva = true;
1145 break;
1146 default:
1147 info->micd_clamp = true;
1148 info->hpdet_ip = 1;
1149 break;
1151 break;
1152 case WM5110:
1153 switch (arizona->rev) {
1154 case 0 ... 2:
1155 break;
1156 default:
1157 info->micd_clamp = true;
1158 info->hpdet_ip = 2;
1159 break;
1161 break;
1162 default:
1163 break;
1166 info->edev.name = "Headset Jack";
1167 info->edev.dev.parent = arizona->dev;
1168 info->edev.supported_cable = arizona_cable;
1170 ret = extcon_dev_register(&info->edev);
1171 if (ret < 0) {
1172 dev_err(arizona->dev, "extcon_dev_register() failed: %d\n",
1173 ret);
1174 goto err;
1177 info->input = devm_input_allocate_device(&pdev->dev);
1178 if (!info->input) {
1179 dev_err(arizona->dev, "Can't allocate input dev\n");
1180 ret = -ENOMEM;
1181 goto err_register;
1184 info->input->name = "Headset";
1185 info->input->phys = "arizona/extcon";
1186 info->input->dev.parent = &pdev->dev;
1188 if (pdata->num_micd_configs) {
1189 info->micd_modes = pdata->micd_configs;
1190 info->micd_num_modes = pdata->num_micd_configs;
1191 } else {
1192 info->micd_modes = micd_default_modes;
1193 info->micd_num_modes = ARRAY_SIZE(micd_default_modes);
1196 if (arizona->pdata.micd_pol_gpio > 0) {
1197 if (info->micd_modes[0].gpio)
1198 mode = GPIOF_OUT_INIT_HIGH;
1199 else
1200 mode = GPIOF_OUT_INIT_LOW;
1202 ret = devm_gpio_request_one(&pdev->dev,
1203 arizona->pdata.micd_pol_gpio,
1204 mode,
1205 "MICD polarity");
1206 if (ret != 0) {
1207 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1208 arizona->pdata.micd_pol_gpio, ret);
1209 goto err_register;
1213 if (arizona->pdata.hpdet_id_gpio > 0) {
1214 ret = devm_gpio_request_one(&pdev->dev,
1215 arizona->pdata.hpdet_id_gpio,
1216 GPIOF_OUT_INIT_LOW,
1217 "HPDET");
1218 if (ret != 0) {
1219 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1220 arizona->pdata.hpdet_id_gpio, ret);
1221 goto err_register;
1225 if (arizona->pdata.micd_bias_start_time)
1226 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1227 ARIZONA_MICD_BIAS_STARTTIME_MASK,
1228 arizona->pdata.micd_bias_start_time
1229 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT);
1231 if (arizona->pdata.micd_rate)
1232 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1233 ARIZONA_MICD_RATE_MASK,
1234 arizona->pdata.micd_rate
1235 << ARIZONA_MICD_RATE_SHIFT);
1237 if (arizona->pdata.micd_dbtime)
1238 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1239 ARIZONA_MICD_DBTIME_MASK,
1240 arizona->pdata.micd_dbtime
1241 << ARIZONA_MICD_DBTIME_SHIFT);
1243 BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels) != 0x40);
1245 if (arizona->pdata.num_micd_ranges) {
1246 info->micd_ranges = pdata->micd_ranges;
1247 info->num_micd_ranges = pdata->num_micd_ranges;
1248 } else {
1249 info->micd_ranges = micd_default_ranges;
1250 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges);
1253 if (arizona->pdata.num_micd_ranges > ARIZONA_MAX_MICD_RANGE) {
1254 dev_err(arizona->dev, "Too many MICD ranges: %d\n",
1255 arizona->pdata.num_micd_ranges);
1258 if (info->num_micd_ranges > 1) {
1259 for (i = 1; i < info->num_micd_ranges; i++) {
1260 if (info->micd_ranges[i - 1].max >
1261 info->micd_ranges[i].max) {
1262 dev_err(arizona->dev,
1263 "MICD ranges must be sorted\n");
1264 ret = -EINVAL;
1265 goto err_input;
1270 /* Disable all buttons by default */
1271 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1272 ARIZONA_MICD_LVL_SEL_MASK, 0x81);
1274 /* Set up all the buttons the user specified */
1275 for (i = 0; i < info->num_micd_ranges; i++) {
1276 for (j = 0; j < ARRAY_SIZE(arizona_micd_levels); j++)
1277 if (arizona_micd_levels[j] >= info->micd_ranges[i].max)
1278 break;
1280 if (j == ARRAY_SIZE(arizona_micd_levels)) {
1281 dev_err(arizona->dev, "Unsupported MICD level %d\n",
1282 info->micd_ranges[i].max);
1283 ret = -EINVAL;
1284 goto err_input;
1287 dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n",
1288 arizona_micd_levels[j], i);
1290 arizona_micd_set_level(arizona, i, j);
1291 input_set_capability(info->input, EV_KEY,
1292 info->micd_ranges[i].key);
1294 /* Enable reporting of that range */
1295 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1296 1 << i, 1 << i);
1299 /* Set all the remaining keys to a maximum */
1300 for (; i < ARIZONA_MAX_MICD_RANGE; i++)
1301 arizona_micd_set_level(arizona, i, 0x3f);
1304 * If we have a clamp use it, activating in conjunction with
1305 * GPIO5 if that is connected for jack detect operation.
1307 if (info->micd_clamp) {
1308 if (arizona->pdata.jd_gpio5) {
1309 /* Put the GPIO into input mode with optional pull */
1310 val = 0xc101;
1311 if (arizona->pdata.jd_gpio5_nopull)
1312 val &= ~ARIZONA_GPN_PU;
1314 regmap_write(arizona->regmap, ARIZONA_GPIO5_CTRL,
1315 val);
1317 regmap_update_bits(arizona->regmap,
1318 ARIZONA_MICD_CLAMP_CONTROL,
1319 ARIZONA_MICD_CLAMP_MODE_MASK, 0x9);
1320 } else {
1321 regmap_update_bits(arizona->regmap,
1322 ARIZONA_MICD_CLAMP_CONTROL,
1323 ARIZONA_MICD_CLAMP_MODE_MASK, 0x4);
1326 regmap_update_bits(arizona->regmap,
1327 ARIZONA_JACK_DETECT_DEBOUNCE,
1328 ARIZONA_MICD_CLAMP_DB,
1329 ARIZONA_MICD_CLAMP_DB);
1332 arizona_extcon_set_mode(info, 0);
1334 pm_runtime_enable(&pdev->dev);
1335 pm_runtime_idle(&pdev->dev);
1336 pm_runtime_get_sync(&pdev->dev);
1338 if (arizona->pdata.jd_gpio5) {
1339 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1340 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1341 } else {
1342 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1343 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1346 ret = arizona_request_irq(arizona, jack_irq_rise,
1347 "JACKDET rise", arizona_jackdet, info);
1348 if (ret != 0) {
1349 dev_err(&pdev->dev, "Failed to get JACKDET rise IRQ: %d\n",
1350 ret);
1351 goto err_input;
1354 ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1);
1355 if (ret != 0) {
1356 dev_err(&pdev->dev, "Failed to set JD rise IRQ wake: %d\n",
1357 ret);
1358 goto err_rise;
1361 ret = arizona_request_irq(arizona, jack_irq_fall,
1362 "JACKDET fall", arizona_jackdet, info);
1363 if (ret != 0) {
1364 dev_err(&pdev->dev, "Failed to get JD fall IRQ: %d\n", ret);
1365 goto err_rise_wake;
1368 ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1);
1369 if (ret != 0) {
1370 dev_err(&pdev->dev, "Failed to set JD fall IRQ wake: %d\n",
1371 ret);
1372 goto err_fall;
1375 ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET,
1376 "MICDET", arizona_micdet, info);
1377 if (ret != 0) {
1378 dev_err(&pdev->dev, "Failed to get MICDET IRQ: %d\n", ret);
1379 goto err_fall_wake;
1382 ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET,
1383 "HPDET", arizona_hpdet_irq, info);
1384 if (ret != 0) {
1385 dev_err(&pdev->dev, "Failed to get HPDET IRQ: %d\n", ret);
1386 goto err_micdet;
1389 arizona_clk32k_enable(arizona);
1390 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_DEBOUNCE,
1391 ARIZONA_JD1_DB, ARIZONA_JD1_DB);
1392 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1393 ARIZONA_JD1_ENA, ARIZONA_JD1_ENA);
1395 ret = regulator_allow_bypass(info->micvdd, true);
1396 if (ret != 0)
1397 dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n",
1398 ret);
1400 pm_runtime_put(&pdev->dev);
1402 ret = input_register_device(info->input);
1403 if (ret) {
1404 dev_err(&pdev->dev, "Can't register input device: %d\n", ret);
1405 goto err_hpdet;
1408 return 0;
1410 err_hpdet:
1411 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1412 err_micdet:
1413 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1414 err_fall_wake:
1415 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1416 err_fall:
1417 arizona_free_irq(arizona, jack_irq_fall, info);
1418 err_rise_wake:
1419 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1420 err_rise:
1421 arizona_free_irq(arizona, jack_irq_rise, info);
1422 err_input:
1423 err_register:
1424 pm_runtime_disable(&pdev->dev);
1425 extcon_dev_unregister(&info->edev);
1426 err:
1427 return ret;
1430 static int arizona_extcon_remove(struct platform_device *pdev)
1432 struct arizona_extcon_info *info = platform_get_drvdata(pdev);
1433 struct arizona *arizona = info->arizona;
1434 int jack_irq_rise, jack_irq_fall;
1436 pm_runtime_disable(&pdev->dev);
1438 regmap_update_bits(arizona->regmap,
1439 ARIZONA_MICD_CLAMP_CONTROL,
1440 ARIZONA_MICD_CLAMP_MODE_MASK, 0);
1442 if (arizona->pdata.jd_gpio5) {
1443 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1444 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1445 } else {
1446 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1447 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1450 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1451 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1452 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1453 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1454 arizona_free_irq(arizona, jack_irq_rise, info);
1455 arizona_free_irq(arizona, jack_irq_fall, info);
1456 cancel_delayed_work_sync(&info->hpdet_work);
1457 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1458 ARIZONA_JD1_ENA, 0);
1459 arizona_clk32k_disable(arizona);
1460 extcon_dev_unregister(&info->edev);
1462 return 0;
1465 static struct platform_driver arizona_extcon_driver = {
1466 .driver = {
1467 .name = "arizona-extcon",
1468 .owner = THIS_MODULE,
1470 .probe = arizona_extcon_probe,
1471 .remove = arizona_extcon_remove,
1474 module_platform_driver(arizona_extcon_driver);
1476 MODULE_DESCRIPTION("Arizona Extcon driver");
1477 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1478 MODULE_LICENSE("GPL");
1479 MODULE_ALIAS("platform:extcon-arizona");