Version:  2.0.40 2.2.26 2.4.37 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5

Linux/drivers/extcon/extcon-arizona.c

  1 /*
  2  * extcon-arizona.c - Extcon driver Wolfson Arizona devices
  3  *
  4  *  Copyright (C) 2012-2014 Wolfson Microelectronics plc
  5  *
  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.
 10  *
 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.
 15  */
 16 
 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/consumer.h>
 24 #include <linux/gpio.h>
 25 #include <linux/input.h>
 26 #include <linux/platform_device.h>
 27 #include <linux/pm_runtime.h>
 28 #include <linux/property.h>
 29 #include <linux/regulator/consumer.h>
 30 #include <linux/extcon.h>
 31 
 32 #include <sound/soc.h>
 33 
 34 #include <linux/mfd/arizona/core.h>
 35 #include <linux/mfd/arizona/pdata.h>
 36 #include <linux/mfd/arizona/registers.h>
 37 #include <dt-bindings/mfd/arizona.h>
 38 
 39 #define ARIZONA_MAX_MICD_RANGE 8
 40 
 41 #define ARIZONA_MICD_CLAMP_MODE_JDL      0x4
 42 #define ARIZONA_MICD_CLAMP_MODE_JDH      0x5
 43 #define ARIZONA_MICD_CLAMP_MODE_JDL_GP5H 0x9
 44 #define ARIZONA_MICD_CLAMP_MODE_JDH_GP5H 0xb
 45 
 46 #define ARIZONA_TST_CAP_DEFAULT 0x3
 47 #define ARIZONA_TST_CAP_CLAMP   0x1
 48 
 49 #define ARIZONA_HPDET_MAX 10000
 50 
 51 #define HPDET_DEBOUNCE 500
 52 #define DEFAULT_MICD_TIMEOUT 2000
 53 
 54 #define QUICK_HEADPHONE_MAX_OHM 3
 55 #define MICROPHONE_MIN_OHM      1257
 56 #define MICROPHONE_MAX_OHM      30000
 57 
 58 #define MICD_DBTIME_TWO_READINGS 2
 59 #define MICD_DBTIME_FOUR_READINGS 4
 60 
 61 #define MICD_LVL_1_TO_7 (ARIZONA_MICD_LVL_1 | ARIZONA_MICD_LVL_2 | \
 62                          ARIZONA_MICD_LVL_3 | ARIZONA_MICD_LVL_4 | \
 63                          ARIZONA_MICD_LVL_5 | ARIZONA_MICD_LVL_6 | \
 64                          ARIZONA_MICD_LVL_7)
 65 
 66 #define MICD_LVL_0_TO_7 (ARIZONA_MICD_LVL_0 | MICD_LVL_1_TO_7)
 67 
 68 #define MICD_LVL_0_TO_8 (MICD_LVL_0_TO_7 | ARIZONA_MICD_LVL_8)
 69 
 70 struct arizona_extcon_info {
 71         struct device *dev;
 72         struct arizona *arizona;
 73         struct mutex lock;
 74         struct regulator *micvdd;
 75         struct input_dev *input;
 76 
 77         u16 last_jackdet;
 78 
 79         int micd_mode;
 80         const struct arizona_micd_config *micd_modes;
 81         int micd_num_modes;
 82 
 83         const struct arizona_micd_range *micd_ranges;
 84         int num_micd_ranges;
 85 
 86         int micd_timeout;
 87 
 88         bool micd_reva;
 89         bool micd_clamp;
 90 
 91         struct delayed_work hpdet_work;
 92         struct delayed_work micd_detect_work;
 93         struct delayed_work micd_timeout_work;
 94 
 95         bool hpdet_active;
 96         bool hpdet_done;
 97         bool hpdet_retried;
 98 
 99         int num_hpdet_res;
100         unsigned int hpdet_res[3];
101 
102         bool mic;
103         bool detecting;
104         int jack_flips;
105 
106         int hpdet_ip_version;
107 
108         struct extcon_dev *edev;
109 
110         struct gpio_desc *micd_pol_gpio;
111 };
112 
113 static const struct arizona_micd_config micd_default_modes[] = {
114         { ARIZONA_ACCDET_SRC, 1, 0 },
115         { 0,                  2, 1 },
116 };
117 
118 static const struct arizona_micd_range micd_default_ranges[] = {
119         { .max =  11, .key = BTN_0 },
120         { .max =  28, .key = BTN_1 },
121         { .max =  54, .key = BTN_2 },
122         { .max = 100, .key = BTN_3 },
123         { .max = 186, .key = BTN_4 },
124         { .max = 430, .key = BTN_5 },
125 };
126 
127 /* The number of levels in arizona_micd_levels valid for button thresholds */
128 #define ARIZONA_NUM_MICD_BUTTON_LEVELS 64
129 
130 static const int arizona_micd_levels[] = {
131         3, 6, 8, 11, 13, 16, 18, 21, 23, 26, 28, 31, 34, 36, 39, 41, 44, 46,
132         49, 52, 54, 57, 60, 62, 65, 67, 70, 73, 75, 78, 81, 83, 89, 94, 100,
133         105, 111, 116, 122, 127, 139, 150, 161, 173, 186, 196, 209, 220, 245,
134         270, 295, 321, 348, 375, 402, 430, 489, 550, 614, 681, 752, 903, 1071,
135         1257, 30000,
136 };
137 
138 static const unsigned int arizona_cable[] = {
139         EXTCON_MECHANICAL,
140         EXTCON_JACK_MICROPHONE,
141         EXTCON_JACK_HEADPHONE,
142         EXTCON_JACK_LINE_OUT,
143         EXTCON_NONE,
144 };
145 
146 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info);
147 
148 static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info,
149                                     bool clamp)
150 {
151         struct arizona *arizona = info->arizona;
152         unsigned int mask = 0, val = 0;
153         unsigned int cap_sel = 0;
154         int ret;
155 
156         switch (arizona->type) {
157         case WM8998:
158         case WM1814:
159                 mask = 0;
160                 break;
161         case WM5110:
162         case WM8280:
163                 mask = ARIZONA_HP1L_SHRTO | ARIZONA_HP1L_FLWR |
164                        ARIZONA_HP1L_SHRTI;
165                 if (clamp) {
166                         val = ARIZONA_HP1L_SHRTO;
167                         cap_sel = ARIZONA_TST_CAP_CLAMP;
168                 } else {
169                         val = ARIZONA_HP1L_FLWR | ARIZONA_HP1L_SHRTI;
170                         cap_sel = ARIZONA_TST_CAP_DEFAULT;
171                 }
172 
173                 ret = regmap_update_bits(arizona->regmap,
174                                          ARIZONA_HP_TEST_CTRL_1,
175                                          ARIZONA_HP1_TST_CAP_SEL_MASK,
176                                          cap_sel);
177                 if (ret != 0)
178                         dev_warn(arizona->dev,
179                                  "Failed to set TST_CAP_SEL: %d\n", ret);
180                 break;
181         default:
182                 mask = ARIZONA_RMV_SHRT_HP1L;
183                 if (clamp)
184                         val = ARIZONA_RMV_SHRT_HP1L;
185                 break;
186         };
187 
188         mutex_lock(&arizona->dapm->card->dapm_mutex);
189 
190         arizona->hpdet_clamp = clamp;
191 
192         /* Keep the HP output stages disabled while doing the clamp */
193         if (clamp) {
194                 ret = regmap_update_bits(arizona->regmap,
195                                          ARIZONA_OUTPUT_ENABLES_1,
196                                          ARIZONA_OUT1L_ENA |
197                                          ARIZONA_OUT1R_ENA, 0);
198                 if (ret != 0)
199                         dev_warn(arizona->dev,
200                                 "Failed to disable headphone outputs: %d\n",
201                                  ret);
202         }
203 
204         if (mask) {
205                 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L,
206                                          mask, val);
207                 if (ret != 0)
208                         dev_warn(arizona->dev, "Failed to do clamp: %d\n",
209                                  ret);
210 
211                 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R,
212                                          mask, val);
213                 if (ret != 0)
214                         dev_warn(arizona->dev, "Failed to do clamp: %d\n",
215                                  ret);
216         }
217 
218         /* Restore the desired state while not doing the clamp */
219         if (!clamp) {
220                 ret = regmap_update_bits(arizona->regmap,
221                                          ARIZONA_OUTPUT_ENABLES_1,
222                                          ARIZONA_OUT1L_ENA |
223                                          ARIZONA_OUT1R_ENA, arizona->hp_ena);
224                 if (ret != 0)
225                         dev_warn(arizona->dev,
226                                  "Failed to restore headphone outputs: %d\n",
227                                  ret);
228         }
229 
230         mutex_unlock(&arizona->dapm->card->dapm_mutex);
231 }
232 
233 static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode)
234 {
235         struct arizona *arizona = info->arizona;
236 
237         mode %= info->micd_num_modes;
238 
239         if (arizona->pdata.micd_pol_gpio > 0)
240                 gpio_set_value_cansleep(arizona->pdata.micd_pol_gpio,
241                                         info->micd_modes[mode].gpio);
242         else
243                 gpiod_set_value_cansleep(info->micd_pol_gpio,
244                                          info->micd_modes[mode].gpio);
245 
246         regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
247                            ARIZONA_MICD_BIAS_SRC_MASK,
248                            info->micd_modes[mode].bias <<
249                            ARIZONA_MICD_BIAS_SRC_SHIFT);
250         regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
251                            ARIZONA_ACCDET_SRC, info->micd_modes[mode].src);
252 
253         info->micd_mode = mode;
254 
255         dev_dbg(arizona->dev, "Set jack polarity to %d\n", mode);
256 }
257 
258 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info *info)
259 {
260         switch (info->micd_modes[0].bias) {
261         case 1:
262                 return "MICBIAS1";
263         case 2:
264                 return "MICBIAS2";
265         case 3:
266                 return "MICBIAS3";
267         default:
268                 return "MICVDD";
269         }
270 }
271 
272 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info)
273 {
274         struct arizona *arizona = info->arizona;
275         const char *widget = arizona_extcon_get_micbias(info);
276         struct snd_soc_dapm_context *dapm = arizona->dapm;
277         int ret;
278 
279         ret = snd_soc_dapm_force_enable_pin(dapm, widget);
280         if (ret != 0)
281                 dev_warn(arizona->dev, "Failed to enable %s: %d\n",
282                          widget, ret);
283 
284         snd_soc_dapm_sync(dapm);
285 
286         if (!arizona->pdata.micd_force_micbias) {
287                 ret = snd_soc_dapm_disable_pin(arizona->dapm, widget);
288                 if (ret != 0)
289                         dev_warn(arizona->dev, "Failed to disable %s: %d\n",
290                                  widget, ret);
291 
292                 snd_soc_dapm_sync(dapm);
293         }
294 }
295 
296 static void arizona_start_mic(struct arizona_extcon_info *info)
297 {
298         struct arizona *arizona = info->arizona;
299         bool change;
300         int ret;
301         unsigned int mode;
302 
303         /* Microphone detection can't use idle mode */
304         pm_runtime_get(info->dev);
305 
306         if (info->detecting) {
307                 ret = regulator_allow_bypass(info->micvdd, false);
308                 if (ret != 0) {
309                         dev_err(arizona->dev,
310                                 "Failed to regulate MICVDD: %d\n",
311                                 ret);
312                 }
313         }
314 
315         ret = regulator_enable(info->micvdd);
316         if (ret != 0) {
317                 dev_err(arizona->dev, "Failed to enable MICVDD: %d\n",
318                         ret);
319         }
320 
321         if (info->micd_reva) {
322                 regmap_write(arizona->regmap, 0x80, 0x3);
323                 regmap_write(arizona->regmap, 0x294, 0);
324                 regmap_write(arizona->regmap, 0x80, 0x0);
325         }
326 
327         if (info->detecting && arizona->pdata.micd_software_compare)
328                 mode = ARIZONA_ACCDET_MODE_ADC;
329         else
330                 mode = ARIZONA_ACCDET_MODE_MIC;
331 
332         regmap_update_bits(arizona->regmap,
333                            ARIZONA_ACCESSORY_DETECT_MODE_1,
334                            ARIZONA_ACCDET_MODE_MASK, mode);
335 
336         arizona_extcon_pulse_micbias(info);
337 
338         regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
339                                  ARIZONA_MICD_ENA, ARIZONA_MICD_ENA,
340                                  &change);
341         if (!change) {
342                 regulator_disable(info->micvdd);
343                 pm_runtime_put_autosuspend(info->dev);
344         }
345 }
346 
347 static void arizona_stop_mic(struct arizona_extcon_info *info)
348 {
349         struct arizona *arizona = info->arizona;
350         const char *widget = arizona_extcon_get_micbias(info);
351         struct snd_soc_dapm_context *dapm = arizona->dapm;
352         bool change;
353         int ret;
354 
355         regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
356                                  ARIZONA_MICD_ENA, 0,
357                                  &change);
358 
359         ret = snd_soc_dapm_disable_pin(dapm, widget);
360         if (ret != 0)
361                 dev_warn(arizona->dev,
362                          "Failed to disable %s: %d\n",
363                          widget, ret);
364 
365         snd_soc_dapm_sync(dapm);
366 
367         if (info->micd_reva) {
368                 regmap_write(arizona->regmap, 0x80, 0x3);
369                 regmap_write(arizona->regmap, 0x294, 2);
370                 regmap_write(arizona->regmap, 0x80, 0x0);
371         }
372 
373         ret = regulator_allow_bypass(info->micvdd, true);
374         if (ret != 0) {
375                 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
376                         ret);
377         }
378 
379         if (change) {
380                 regulator_disable(info->micvdd);
381                 pm_runtime_mark_last_busy(info->dev);
382                 pm_runtime_put_autosuspend(info->dev);
383         }
384 }
385 
386 static struct {
387         unsigned int threshold;
388         unsigned int factor_a;
389         unsigned int factor_b;
390 } arizona_hpdet_b_ranges[] = {
391         { 100,  5528,   362464 },
392         { 169, 11084,  6186851 },
393         { 169, 11065, 65460395 },
394 };
395 
396 #define ARIZONA_HPDET_B_RANGE_MAX 0x3fb
397 
398 static struct {
399         int min;
400         int max;
401 } arizona_hpdet_c_ranges[] = {
402         { 0,       30 },
403         { 8,      100 },
404         { 100,   1000 },
405         { 1000, 10000 },
406 };
407 
408 static int arizona_hpdet_read(struct arizona_extcon_info *info)
409 {
410         struct arizona *arizona = info->arizona;
411         unsigned int val, range;
412         int ret;
413 
414         ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2, &val);
415         if (ret != 0) {
416                 dev_err(arizona->dev, "Failed to read HPDET status: %d\n",
417                         ret);
418                 return ret;
419         }
420 
421         switch (info->hpdet_ip_version) {
422         case 0:
423                 if (!(val & ARIZONA_HP_DONE)) {
424                         dev_err(arizona->dev, "HPDET did not complete: %x\n",
425                                 val);
426                         return -EAGAIN;
427                 }
428 
429                 val &= ARIZONA_HP_LVL_MASK;
430                 break;
431 
432         case 1:
433                 if (!(val & ARIZONA_HP_DONE_B)) {
434                         dev_err(arizona->dev, "HPDET did not complete: %x\n",
435                                 val);
436                         return -EAGAIN;
437                 }
438 
439                 ret = regmap_read(arizona->regmap, ARIZONA_HP_DACVAL, &val);
440                 if (ret != 0) {
441                         dev_err(arizona->dev, "Failed to read HP value: %d\n",
442                                 ret);
443                         return -EAGAIN;
444                 }
445 
446                 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
447                             &range);
448                 range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
449                            >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
450 
451                 if (range < ARRAY_SIZE(arizona_hpdet_b_ranges) - 1 &&
452                     (val < arizona_hpdet_b_ranges[range].threshold ||
453                      val >= ARIZONA_HPDET_B_RANGE_MAX)) {
454                         range++;
455                         dev_dbg(arizona->dev, "Moving to HPDET range %d\n",
456                                 range);
457                         regmap_update_bits(arizona->regmap,
458                                            ARIZONA_HEADPHONE_DETECT_1,
459                                            ARIZONA_HP_IMPEDANCE_RANGE_MASK,
460                                            range <<
461                                            ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
462                         return -EAGAIN;
463                 }
464 
465                 /* If we go out of range report top of range */
466                 if (val < arizona_hpdet_b_ranges[range].threshold ||
467                     val >= ARIZONA_HPDET_B_RANGE_MAX) {
468                         dev_dbg(arizona->dev, "Measurement out of range\n");
469                         return ARIZONA_HPDET_MAX;
470                 }
471 
472                 dev_dbg(arizona->dev, "HPDET read %d in range %d\n",
473                         val, range);
474 
475                 val = arizona_hpdet_b_ranges[range].factor_b
476                         / ((val * 100) -
477                            arizona_hpdet_b_ranges[range].factor_a);
478                 break;
479 
480         case 2:
481                 if (!(val & ARIZONA_HP_DONE_B)) {
482                         dev_err(arizona->dev, "HPDET did not complete: %x\n",
483                                 val);
484                         return -EAGAIN;
485                 }
486 
487                 val &= ARIZONA_HP_LVL_B_MASK;
488                 /* Convert to ohms, the value is in 0.5 ohm increments */
489                 val /= 2;
490 
491                 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
492                             &range);
493                 range = (range & ARIZONA_HP_IMPEDANCE_RANGE_MASK)
494                            >> ARIZONA_HP_IMPEDANCE_RANGE_SHIFT;
495 
496                 /* Skip up a range, or report? */
497                 if (range < ARRAY_SIZE(arizona_hpdet_c_ranges) - 1 &&
498                     (val >= arizona_hpdet_c_ranges[range].max)) {
499                         range++;
500                         dev_dbg(arizona->dev, "Moving to HPDET range %d-%d\n",
501                                 arizona_hpdet_c_ranges[range].min,
502                                 arizona_hpdet_c_ranges[range].max);
503                         regmap_update_bits(arizona->regmap,
504                                            ARIZONA_HEADPHONE_DETECT_1,
505                                            ARIZONA_HP_IMPEDANCE_RANGE_MASK,
506                                            range <<
507                                            ARIZONA_HP_IMPEDANCE_RANGE_SHIFT);
508                         return -EAGAIN;
509                 }
510 
511                 if (range && (val < arizona_hpdet_c_ranges[range].min)) {
512                         dev_dbg(arizona->dev, "Reporting range boundary %d\n",
513                                 arizona_hpdet_c_ranges[range].min);
514                         val = arizona_hpdet_c_ranges[range].min;
515                 }
516                 break;
517 
518         default:
519                 dev_warn(arizona->dev, "Unknown HPDET IP revision %d\n",
520                          info->hpdet_ip_version);
521                 return -EINVAL;
522         }
523 
524         dev_dbg(arizona->dev, "HP impedance %d ohms\n", val);
525         return val;
526 }
527 
528 static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading,
529                                bool *mic)
530 {
531         struct arizona *arizona = info->arizona;
532         int id_gpio = arizona->pdata.hpdet_id_gpio;
533 
534         /*
535          * If we're using HPDET for accessory identification we need
536          * to take multiple measurements, step through them in sequence.
537          */
538         if (arizona->pdata.hpdet_acc_id) {
539                 info->hpdet_res[info->num_hpdet_res++] = *reading;
540 
541                 /* Only check the mic directly if we didn't already ID it */
542                 if (id_gpio && info->num_hpdet_res == 1) {
543                         dev_dbg(arizona->dev, "Measuring mic\n");
544 
545                         regmap_update_bits(arizona->regmap,
546                                            ARIZONA_ACCESSORY_DETECT_MODE_1,
547                                            ARIZONA_ACCDET_MODE_MASK |
548                                            ARIZONA_ACCDET_SRC,
549                                            ARIZONA_ACCDET_MODE_HPR |
550                                            info->micd_modes[0].src);
551 
552                         gpio_set_value_cansleep(id_gpio, 1);
553 
554                         regmap_update_bits(arizona->regmap,
555                                            ARIZONA_HEADPHONE_DETECT_1,
556                                            ARIZONA_HP_POLL, ARIZONA_HP_POLL);
557                         return -EAGAIN;
558                 }
559 
560                 /* OK, got both.  Now, compare... */
561                 dev_dbg(arizona->dev, "HPDET measured %d %d\n",
562                         info->hpdet_res[0], info->hpdet_res[1]);
563 
564                 /* Take the headphone impedance for the main report */
565                 *reading = info->hpdet_res[0];
566 
567                 /* Sometimes we get false readings due to slow insert */
568                 if (*reading >= ARIZONA_HPDET_MAX && !info->hpdet_retried) {
569                         dev_dbg(arizona->dev, "Retrying high impedance\n");
570                         info->num_hpdet_res = 0;
571                         info->hpdet_retried = true;
572                         arizona_start_hpdet_acc_id(info);
573                         pm_runtime_put(info->dev);
574                         return -EAGAIN;
575                 }
576 
577                 /*
578                  * If we measure the mic as high impedance
579                  */
580                 if (!id_gpio || info->hpdet_res[1] > 50) {
581                         dev_dbg(arizona->dev, "Detected mic\n");
582                         *mic = true;
583                         info->detecting = true;
584                 } else {
585                         dev_dbg(arizona->dev, "Detected headphone\n");
586                 }
587 
588                 /* Make sure everything is reset back to the real polarity */
589                 regmap_update_bits(arizona->regmap,
590                                    ARIZONA_ACCESSORY_DETECT_MODE_1,
591                                    ARIZONA_ACCDET_SRC,
592                                    info->micd_modes[0].src);
593         }
594 
595         return 0;
596 }
597 
598 static irqreturn_t arizona_hpdet_irq(int irq, void *data)
599 {
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;
604         int ret, reading;
605         bool mic = false;
606 
607         mutex_lock(&info->lock);
608 
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);
613                 return IRQ_NONE;
614         }
615 
616         /* If the cable was removed while measuring ignore the result */
617         ret = extcon_get_cable_state_(info->edev, EXTCON_MECHANICAL);
618         if (ret < 0) {
619                 dev_err(arizona->dev, "Failed to check cable state: %d\n",
620                         ret);
621                 goto out;
622         } else if (!ret) {
623                 dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
624                 goto done;
625         }
626 
627         ret = arizona_hpdet_read(info);
628         if (ret == -EAGAIN)
629                 goto out;
630         else if (ret < 0)
631                 goto done;
632         reading = ret;
633 
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,
638                            0);
639 
640         ret = arizona_hpdet_do_id(info, &reading, &mic);
641         if (ret == -EAGAIN)
642                 goto out;
643         else if (ret < 0)
644                 goto done;
645 
646         /* Report high impedence cables as line outputs */
647         if (reading >= 5000)
648                 report = EXTCON_JACK_LINE_OUT;
649         else
650                 report = EXTCON_JACK_HEADPHONE;
651 
652         ret = extcon_set_cable_state_(info->edev, report, true);
653         if (ret != 0)
654                 dev_err(arizona->dev, "Failed to report HP/line: %d\n",
655                         ret);
656 
657 done:
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,
662                            0);
663 
664         arizona_extcon_hp_clamp(info, false);
665 
666         if (id_gpio)
667                 gpio_set_value_cansleep(id_gpio, 0);
668 
669         /* Revert back to MICDET mode */
670         regmap_update_bits(arizona->regmap,
671                            ARIZONA_ACCESSORY_DETECT_MODE_1,
672                            ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
673 
674         /* If we have a mic then reenable MICDET */
675         if (mic || info->mic)
676                 arizona_start_mic(info);
677 
678         if (info->hpdet_active) {
679                 pm_runtime_put_autosuspend(info->dev);
680                 info->hpdet_active = false;
681         }
682 
683         info->hpdet_done = true;
684 
685 out:
686         mutex_unlock(&info->lock);
687 
688         return IRQ_HANDLED;
689 }
690 
691 static void arizona_identify_headphone(struct arizona_extcon_info *info)
692 {
693         struct arizona *arizona = info->arizona;
694         int ret;
695 
696         if (info->hpdet_done)
697                 return;
698 
699         dev_dbg(arizona->dev, "Starting HPDET\n");
700 
701         /* Make sure we keep the device enabled during the measurement */
702         pm_runtime_get(info->dev);
703 
704         info->hpdet_active = true;
705 
706         if (info->mic)
707                 arizona_stop_mic(info);
708 
709         arizona_extcon_hp_clamp(info, true);
710 
711         ret = regmap_update_bits(arizona->regmap,
712                                  ARIZONA_ACCESSORY_DETECT_MODE_1,
713                                  ARIZONA_ACCDET_MODE_MASK,
714                                  arizona->pdata.hpdet_channel);
715         if (ret != 0) {
716                 dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
717                 goto err;
718         }
719 
720         ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
721                                  ARIZONA_HP_POLL, ARIZONA_HP_POLL);
722         if (ret != 0) {
723                 dev_err(arizona->dev, "Can't start HPDETL measurement: %d\n",
724                         ret);
725                 goto err;
726         }
727 
728         return;
729 
730 err:
731         regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
732                            ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
733 
734         /* Just report headphone */
735         ret = extcon_set_cable_state_(info->edev, EXTCON_JACK_HEADPHONE, true);
736         if (ret != 0)
737                 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
738 
739         if (info->mic)
740                 arizona_start_mic(info);
741 
742         info->hpdet_active = false;
743 }
744 
745 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
746 {
747         struct arizona *arizona = info->arizona;
748         int hp_reading = 32;
749         bool mic;
750         int ret;
751 
752         dev_dbg(arizona->dev, "Starting identification via HPDET\n");
753 
754         /* Make sure we keep the device enabled during the measurement */
755         pm_runtime_get_sync(info->dev);
756 
757         info->hpdet_active = true;
758 
759         arizona_extcon_hp_clamp(info, true);
760 
761         ret = regmap_update_bits(arizona->regmap,
762                                  ARIZONA_ACCESSORY_DETECT_MODE_1,
763                                  ARIZONA_ACCDET_SRC | ARIZONA_ACCDET_MODE_MASK,
764                                  info->micd_modes[0].src |
765                                  arizona->pdata.hpdet_channel);
766         if (ret != 0) {
767                 dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
768                 goto err;
769         }
770 
771         if (arizona->pdata.hpdet_acc_id_line) {
772                 ret = regmap_update_bits(arizona->regmap,
773                                          ARIZONA_HEADPHONE_DETECT_1,
774                                          ARIZONA_HP_POLL, ARIZONA_HP_POLL);
775                 if (ret != 0) {
776                         dev_err(arizona->dev,
777                                 "Can't start HPDETL measurement: %d\n",
778                                 ret);
779                         goto err;
780                 }
781         } else {
782                 arizona_hpdet_do_id(info, &hp_reading, &mic);
783         }
784 
785         return;
786 
787 err:
788         regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
789                            ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
790 
791         /* Just report headphone */
792         ret = extcon_set_cable_state_(info->edev, EXTCON_JACK_HEADPHONE, true);
793         if (ret != 0)
794                 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
795 
796         info->hpdet_active = false;
797 }
798 
799 static void arizona_micd_timeout_work(struct work_struct *work)
800 {
801         struct arizona_extcon_info *info = container_of(work,
802                                                 struct arizona_extcon_info,
803                                                 micd_timeout_work.work);
804 
805         mutex_lock(&info->lock);
806 
807         dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
808 
809         info->detecting = false;
810 
811         arizona_identify_headphone(info);
812 
813         arizona_stop_mic(info);
814 
815         mutex_unlock(&info->lock);
816 }
817 
818 static void arizona_micd_detect(struct work_struct *work)
819 {
820         struct arizona_extcon_info *info = container_of(work,
821                                                 struct arizona_extcon_info,
822                                                 micd_detect_work.work);
823         struct arizona *arizona = info->arizona;
824         unsigned int val = 0, lvl;
825         int ret, i, key;
826 
827         cancel_delayed_work_sync(&info->micd_timeout_work);
828 
829         mutex_lock(&info->lock);
830 
831         /* If the cable was removed while measuring ignore the result */
832         ret = extcon_get_cable_state_(info->edev, EXTCON_MECHANICAL);
833         if (ret < 0) {
834                 dev_err(arizona->dev, "Failed to check cable state: %d\n",
835                                 ret);
836                 mutex_unlock(&info->lock);
837                 return;
838         } else if (!ret) {
839                 dev_dbg(arizona->dev, "Ignoring MICDET for removed cable\n");
840                 mutex_unlock(&info->lock);
841                 return;
842         }
843 
844         if (info->detecting && arizona->pdata.micd_software_compare) {
845                 /* Must disable MICD before we read the ADCVAL */
846                 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
847                                    ARIZONA_MICD_ENA, 0);
848                 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_4, &val);
849                 if (ret != 0) {
850                         dev_err(arizona->dev,
851                                 "Failed to read MICDET_ADCVAL: %d\n",
852                                 ret);
853                         mutex_unlock(&info->lock);
854                         return;
855                 }
856 
857                 dev_dbg(arizona->dev, "MICDET_ADCVAL: %x\n", val);
858 
859                 val &= ARIZONA_MICDET_ADCVAL_MASK;
860                 if (val < ARRAY_SIZE(arizona_micd_levels))
861                         val = arizona_micd_levels[val];
862                 else
863                         val = INT_MAX;
864 
865                 if (val <= QUICK_HEADPHONE_MAX_OHM)
866                         val = ARIZONA_MICD_STS | ARIZONA_MICD_LVL_0;
867                 else if (val <= MICROPHONE_MIN_OHM)
868                         val = ARIZONA_MICD_STS | ARIZONA_MICD_LVL_1;
869                 else if (val <= MICROPHONE_MAX_OHM)
870                         val = ARIZONA_MICD_STS | ARIZONA_MICD_LVL_8;
871                 else
872                         val = ARIZONA_MICD_LVL_8;
873         }
874 
875         for (i = 0; i < 10 && !(val & MICD_LVL_0_TO_8); i++) {
876                 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
877                 if (ret != 0) {
878                         dev_err(arizona->dev,
879                                 "Failed to read MICDET: %d\n", ret);
880                         mutex_unlock(&info->lock);
881                         return;
882                 }
883 
884                 dev_dbg(arizona->dev, "MICDET: %x\n", val);
885 
886                 if (!(val & ARIZONA_MICD_VALID)) {
887                         dev_warn(arizona->dev,
888                                  "Microphone detection state invalid\n");
889                         mutex_unlock(&info->lock);
890                         return;
891                 }
892         }
893 
894         if (i == 10 && !(val & MICD_LVL_0_TO_8)) {
895                 dev_err(arizona->dev, "Failed to get valid MICDET value\n");
896                 mutex_unlock(&info->lock);
897                 return;
898         }
899 
900         /* Due to jack detect this should never happen */
901         if (!(val & ARIZONA_MICD_STS)) {
902                 dev_warn(arizona->dev, "Detected open circuit\n");
903                 info->mic = false;
904                 arizona_stop_mic(info);
905                 info->detecting = false;
906                 arizona_identify_headphone(info);
907                 goto handled;
908         }
909 
910         /* If we got a high impedence we should have a headset, report it. */
911         if (info->detecting && (val & ARIZONA_MICD_LVL_8)) {
912                 info->mic = true;
913                 info->detecting = false;
914 
915                 arizona_identify_headphone(info);
916 
917                 ret = extcon_set_cable_state_(info->edev,
918                                               EXTCON_JACK_MICROPHONE, true);
919                 if (ret != 0)
920                         dev_err(arizona->dev, "Headset report failed: %d\n",
921                                 ret);
922 
923                 /* Don't need to regulate for button detection */
924                 ret = regulator_allow_bypass(info->micvdd, true);
925                 if (ret != 0) {
926                         dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
927                                 ret);
928                 }
929 
930                 goto handled;
931         }
932 
933         /* If we detected a lower impedence during initial startup
934          * then we probably have the wrong polarity, flip it.  Don't
935          * do this for the lowest impedences to speed up detection of
936          * plain headphones.  If both polarities report a low
937          * impedence then give up and report headphones.
938          */
939         if (info->detecting && (val & MICD_LVL_1_TO_7)) {
940                 if (info->jack_flips >= info->micd_num_modes * 10) {
941                         dev_dbg(arizona->dev, "Detected HP/line\n");
942 
943                         info->detecting = false;
944 
945                         arizona_identify_headphone(info);
946 
947                         arizona_stop_mic(info);
948                 } else {
949                         info->micd_mode++;
950                         if (info->micd_mode == info->micd_num_modes)
951                                 info->micd_mode = 0;
952                         arizona_extcon_set_mode(info, info->micd_mode);
953 
954                         info->jack_flips++;
955                 }
956 
957                 goto handled;
958         }
959 
960         /*
961          * If we're still detecting and we detect a short then we've
962          * got a headphone.  Otherwise it's a button press.
963          */
964         if (val & MICD_LVL_0_TO_7) {
965                 if (info->mic) {
966                         dev_dbg(arizona->dev, "Mic button detected\n");
967 
968                         lvl = val & ARIZONA_MICD_LVL_MASK;
969                         lvl >>= ARIZONA_MICD_LVL_SHIFT;
970 
971                         for (i = 0; i < info->num_micd_ranges; i++)
972                                 input_report_key(info->input,
973                                                  info->micd_ranges[i].key, 0);
974 
975                         WARN_ON(!lvl);
976                         WARN_ON(ffs(lvl) - 1 >= info->num_micd_ranges);
977                         if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) {
978                                 key = info->micd_ranges[ffs(lvl) - 1].key;
979                                 input_report_key(info->input, key, 1);
980                                 input_sync(info->input);
981                         }
982 
983                 } else if (info->detecting) {
984                         dev_dbg(arizona->dev, "Headphone detected\n");
985                         info->detecting = false;
986                         arizona_stop_mic(info);
987 
988                         arizona_identify_headphone(info);
989                 } else {
990                         dev_warn(arizona->dev, "Button with no mic: %x\n",
991                                  val);
992                 }
993         } else {
994                 dev_dbg(arizona->dev, "Mic button released\n");
995                 for (i = 0; i < info->num_micd_ranges; i++)
996                         input_report_key(info->input,
997                                          info->micd_ranges[i].key, 0);
998                 input_sync(info->input);
999                 arizona_extcon_pulse_micbias(info);
1000         }
1001 
1002 handled:
1003         if (info->detecting) {
1004                 if (arizona->pdata.micd_software_compare)
1005                         regmap_update_bits(arizona->regmap,
1006                                            ARIZONA_MIC_DETECT_1,
1007                                            ARIZONA_MICD_ENA,
1008                                            ARIZONA_MICD_ENA);
1009 
1010                 queue_delayed_work(system_power_efficient_wq,
1011                                    &info->micd_timeout_work,
1012                                    msecs_to_jiffies(info->micd_timeout));
1013         }
1014 
1015         pm_runtime_mark_last_busy(info->dev);
1016         mutex_unlock(&info->lock);
1017 }
1018 
1019 static irqreturn_t arizona_micdet(int irq, void *data)
1020 {
1021         struct arizona_extcon_info *info = data;
1022         struct arizona *arizona = info->arizona;
1023         int debounce = arizona->pdata.micd_detect_debounce;
1024 
1025         cancel_delayed_work_sync(&info->micd_detect_work);
1026         cancel_delayed_work_sync(&info->micd_timeout_work);
1027 
1028         mutex_lock(&info->lock);
1029         if (!info->detecting)
1030                 debounce = 0;
1031         mutex_unlock(&info->lock);
1032 
1033         if (debounce)
1034                 queue_delayed_work(system_power_efficient_wq,
1035                                    &info->micd_detect_work,
1036                                    msecs_to_jiffies(debounce));
1037         else
1038                 arizona_micd_detect(&info->micd_detect_work.work);
1039 
1040         return IRQ_HANDLED;
1041 }
1042 
1043 static void arizona_hpdet_work(struct work_struct *work)
1044 {
1045         struct arizona_extcon_info *info = container_of(work,
1046                                                 struct arizona_extcon_info,
1047                                                 hpdet_work.work);
1048 
1049         mutex_lock(&info->lock);
1050         arizona_start_hpdet_acc_id(info);
1051         mutex_unlock(&info->lock);
1052 }
1053 
1054 static irqreturn_t arizona_jackdet(int irq, void *data)
1055 {
1056         struct arizona_extcon_info *info = data;
1057         struct arizona *arizona = info->arizona;
1058         unsigned int val, present, mask;
1059         bool cancelled_hp, cancelled_mic;
1060         int ret, i;
1061 
1062         cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
1063         cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);
1064 
1065         pm_runtime_get_sync(info->dev);
1066 
1067         mutex_lock(&info->lock);
1068 
1069         if (info->micd_clamp) {
1070                 mask = ARIZONA_MICD_CLAMP_STS;
1071                 present = 0;
1072         } else {
1073                 mask = ARIZONA_JD1_STS;
1074                 if (arizona->pdata.jd_invert)
1075                         present = 0;
1076                 else
1077                         present = ARIZONA_JD1_STS;
1078         }
1079 
1080         ret = regmap_read(arizona->regmap, ARIZONA_AOD_IRQ_RAW_STATUS, &val);
1081         if (ret != 0) {
1082                 dev_err(arizona->dev, "Failed to read jackdet status: %d\n",
1083                         ret);
1084                 mutex_unlock(&info->lock);
1085                 pm_runtime_put_autosuspend(info->dev);
1086                 return IRQ_NONE;
1087         }
1088 
1089         val &= mask;
1090         if (val == info->last_jackdet) {
1091                 dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
1092                 if (cancelled_hp)
1093                         queue_delayed_work(system_power_efficient_wq,
1094                                            &info->hpdet_work,
1095                                            msecs_to_jiffies(HPDET_DEBOUNCE));
1096 
1097                 if (cancelled_mic) {
1098                         int micd_timeout = info->micd_timeout;
1099 
1100                         queue_delayed_work(system_power_efficient_wq,
1101                                            &info->micd_timeout_work,
1102                                            msecs_to_jiffies(micd_timeout));
1103                 }
1104 
1105                 goto out;
1106         }
1107         info->last_jackdet = val;
1108 
1109         if (info->last_jackdet == present) {
1110                 dev_dbg(arizona->dev, "Detected jack\n");
1111                 ret = extcon_set_cable_state_(info->edev,
1112                                               EXTCON_MECHANICAL, true);
1113 
1114                 if (ret != 0)
1115                         dev_err(arizona->dev, "Mechanical report failed: %d\n",
1116                                 ret);
1117 
1118                 if (!arizona->pdata.hpdet_acc_id) {
1119                         info->detecting = true;
1120                         info->mic = false;
1121                         info->jack_flips = 0;
1122 
1123                         arizona_start_mic(info);
1124                 } else {
1125                         queue_delayed_work(system_power_efficient_wq,
1126                                            &info->hpdet_work,
1127                                            msecs_to_jiffies(HPDET_DEBOUNCE));
1128                 }
1129 
1130                 if (info->micd_clamp || !arizona->pdata.jd_invert)
1131                         regmap_update_bits(arizona->regmap,
1132                                            ARIZONA_JACK_DETECT_DEBOUNCE,
1133                                            ARIZONA_MICD_CLAMP_DB |
1134                                            ARIZONA_JD1_DB, 0);
1135         } else {
1136                 dev_dbg(arizona->dev, "Detected jack removal\n");
1137 
1138                 arizona_stop_mic(info);
1139 
1140                 info->num_hpdet_res = 0;
1141                 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
1142                         info->hpdet_res[i] = 0;
1143                 info->mic = false;
1144                 info->hpdet_done = false;
1145                 info->hpdet_retried = false;
1146 
1147                 for (i = 0; i < info->num_micd_ranges; i++)
1148                         input_report_key(info->input,
1149                                          info->micd_ranges[i].key, 0);
1150                 input_sync(info->input);
1151 
1152                 ret = extcon_update_state(info->edev, 0xffffffff, 0);
1153                 if (ret != 0)
1154                         dev_err(arizona->dev, "Removal report failed: %d\n",
1155                                 ret);
1156 
1157                 regmap_update_bits(arizona->regmap,
1158                                    ARIZONA_JACK_DETECT_DEBOUNCE,
1159                                    ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB,
1160                                    ARIZONA_MICD_CLAMP_DB | ARIZONA_JD1_DB);
1161         }
1162 
1163         if (arizona->pdata.micd_timeout)
1164                 info->micd_timeout = arizona->pdata.micd_timeout;
1165         else
1166                 info->micd_timeout = DEFAULT_MICD_TIMEOUT;
1167 
1168 out:
1169         /* Clear trig_sts to make sure DCVDD is not forced up */
1170         regmap_write(arizona->regmap, ARIZONA_AOD_WKUP_AND_TRIG,
1171                      ARIZONA_MICD_CLAMP_FALL_TRIG_STS |
1172                      ARIZONA_MICD_CLAMP_RISE_TRIG_STS |
1173                      ARIZONA_JD1_FALL_TRIG_STS |
1174                      ARIZONA_JD1_RISE_TRIG_STS);
1175 
1176         mutex_unlock(&info->lock);
1177 
1178         pm_runtime_mark_last_busy(info->dev);
1179         pm_runtime_put_autosuspend(info->dev);
1180 
1181         return IRQ_HANDLED;
1182 }
1183 
1184 /* Map a level onto a slot in the register bank */
1185 static void arizona_micd_set_level(struct arizona *arizona, int index,
1186                                    unsigned int level)
1187 {
1188         int reg;
1189         unsigned int mask;
1190 
1191         reg = ARIZONA_MIC_DETECT_LEVEL_4 - (index / 2);
1192 
1193         if (!(index % 2)) {
1194                 mask = 0x3f00;
1195                 level <<= 8;
1196         } else {
1197                 mask = 0x3f;
1198         }
1199 
1200         /* Program the level itself */
1201         regmap_update_bits(arizona->regmap, reg, mask, level);
1202 }
1203 
1204 static int arizona_extcon_get_micd_configs(struct device *dev,
1205                                            struct arizona *arizona)
1206 {
1207         const char * const prop = "wlf,micd-configs";
1208         const int entries_per_config = 3;
1209         struct arizona_micd_config *micd_configs;
1210         int nconfs, ret;
1211         int i, j;
1212         u32 *vals;
1213 
1214         nconfs = device_property_read_u32_array(arizona->dev, prop, NULL, 0);
1215         if (nconfs <= 0)
1216                 return 0;
1217 
1218         vals = kcalloc(nconfs, sizeof(u32), GFP_KERNEL);
1219         if (!vals)
1220                 return -ENOMEM;
1221 
1222         ret = device_property_read_u32_array(arizona->dev, prop, vals, nconfs);
1223         if (ret < 0)
1224                 goto out;
1225 
1226         nconfs /= entries_per_config;
1227 
1228         micd_configs = devm_kzalloc(dev,
1229                                     nconfs * sizeof(struct arizona_micd_range),
1230                                     GFP_KERNEL);
1231         if (!micd_configs) {
1232                 ret = -ENOMEM;
1233                 goto out;
1234         }
1235 
1236         for (i = 0, j = 0; i < nconfs; ++i) {
1237                 micd_configs[i].src = vals[j++] ? ARIZONA_ACCDET_SRC : 0;
1238                 micd_configs[i].bias = vals[j++];
1239                 micd_configs[i].gpio = vals[j++];
1240         }
1241 
1242         arizona->pdata.micd_configs = micd_configs;
1243         arizona->pdata.num_micd_configs = nconfs;
1244 
1245 out:
1246         kfree(vals);
1247         return ret;
1248 }
1249 
1250 static int arizona_extcon_device_get_pdata(struct device *dev,
1251                                            struct arizona *arizona)
1252 {
1253         struct arizona_pdata *pdata = &arizona->pdata;
1254         unsigned int val = ARIZONA_ACCDET_MODE_HPL;
1255         int ret;
1256 
1257         device_property_read_u32(arizona->dev, "wlf,hpdet-channel", &val);
1258         switch (val) {
1259         case ARIZONA_ACCDET_MODE_HPL:
1260         case ARIZONA_ACCDET_MODE_HPR:
1261                 pdata->hpdet_channel = val;
1262                 break;
1263         default:
1264                 dev_err(arizona->dev,
1265                         "Wrong wlf,hpdet-channel DT value %d\n", val);
1266                 pdata->hpdet_channel = ARIZONA_ACCDET_MODE_HPL;
1267         }
1268 
1269         device_property_read_u32(arizona->dev, "wlf,micd-detect-debounce",
1270                                  &pdata->micd_detect_debounce);
1271 
1272         device_property_read_u32(arizona->dev, "wlf,micd-bias-start-time",
1273                                  &pdata->micd_bias_start_time);
1274 
1275         device_property_read_u32(arizona->dev, "wlf,micd-rate",
1276                                  &pdata->micd_rate);
1277 
1278         device_property_read_u32(arizona->dev, "wlf,micd-dbtime",
1279                                  &pdata->micd_dbtime);
1280 
1281         device_property_read_u32(arizona->dev, "wlf,micd-timeout-ms",
1282                                  &pdata->micd_timeout);
1283 
1284         pdata->micd_force_micbias = device_property_read_bool(arizona->dev,
1285                                                 "wlf,micd-force-micbias");
1286 
1287         pdata->micd_software_compare = device_property_read_bool(arizona->dev,
1288                                                 "wlf,micd-software-compare");
1289 
1290         pdata->jd_invert = device_property_read_bool(arizona->dev,
1291                                                      "wlf,jd-invert");
1292 
1293         device_property_read_u32(arizona->dev, "wlf,gpsw", &pdata->gpsw);
1294 
1295         pdata->jd_gpio5 = device_property_read_bool(arizona->dev,
1296                                                     "wlf,use-jd2");
1297         pdata->jd_gpio5_nopull = device_property_read_bool(arizona->dev,
1298                                                 "wlf,use-jd2-nopull");
1299 
1300         ret = arizona_extcon_get_micd_configs(dev, arizona);
1301         if (ret < 0)
1302                 dev_err(arizona->dev, "Failed to read micd configs: %d\n", ret);
1303 
1304         return 0;
1305 }
1306 
1307 static int arizona_extcon_probe(struct platform_device *pdev)
1308 {
1309         struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1310         struct arizona_pdata *pdata = &arizona->pdata;
1311         struct arizona_extcon_info *info;
1312         unsigned int val;
1313         unsigned int clamp_mode;
1314         int jack_irq_fall, jack_irq_rise;
1315         int ret, mode, i, j;
1316 
1317         if (!arizona->dapm || !arizona->dapm->card)
1318                 return -EPROBE_DEFER;
1319 
1320         info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
1321         if (!info)
1322                 return -ENOMEM;
1323 
1324         if (!dev_get_platdata(arizona->dev))
1325                 arizona_extcon_device_get_pdata(&pdev->dev, arizona);
1326 
1327         info->micvdd = devm_regulator_get(&pdev->dev, "MICVDD");
1328         if (IS_ERR(info->micvdd)) {
1329                 ret = PTR_ERR(info->micvdd);
1330                 dev_err(arizona->dev, "Failed to get MICVDD: %d\n", ret);
1331                 return ret;
1332         }
1333 
1334         mutex_init(&info->lock);
1335         info->arizona = arizona;
1336         info->dev = &pdev->dev;
1337         info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS);
1338         INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
1339         INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect);
1340         INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
1341         platform_set_drvdata(pdev, info);
1342 
1343         switch (arizona->type) {
1344         case WM5102:
1345                 switch (arizona->rev) {
1346                 case 0:
1347                         info->micd_reva = true;
1348                         break;
1349                 default:
1350                         info->micd_clamp = true;
1351                         info->hpdet_ip_version = 1;
1352                         break;
1353                 }
1354                 break;
1355         case WM5110:
1356         case WM8280:
1357                 switch (arizona->rev) {
1358                 case 0 ... 2:
1359                         break;
1360                 default:
1361                         info->micd_clamp = true;
1362                         info->hpdet_ip_version = 2;
1363                         break;
1364                 }
1365                 break;
1366         case WM8998:
1367         case WM1814:
1368                 info->micd_clamp = true;
1369                 info->hpdet_ip_version = 2;
1370                 break;
1371         default:
1372                 break;
1373         }
1374 
1375         info->edev = devm_extcon_dev_allocate(&pdev->dev, arizona_cable);
1376         if (IS_ERR(info->edev)) {
1377                 dev_err(&pdev->dev, "failed to allocate extcon device\n");
1378                 return -ENOMEM;
1379         }
1380 
1381         ret = devm_extcon_dev_register(&pdev->dev, info->edev);
1382         if (ret < 0) {
1383                 dev_err(arizona->dev, "extcon_dev_register() failed: %d\n",
1384                         ret);
1385                 return ret;
1386         }
1387 
1388         info->input = devm_input_allocate_device(&pdev->dev);
1389         if (!info->input) {
1390                 dev_err(arizona->dev, "Can't allocate input dev\n");
1391                 ret = -ENOMEM;
1392                 goto err_register;
1393         }
1394 
1395         info->input->name = "Headset";
1396         info->input->phys = "arizona/extcon";
1397 
1398         if (pdata->num_micd_configs) {
1399                 info->micd_modes = pdata->micd_configs;
1400                 info->micd_num_modes = pdata->num_micd_configs;
1401         } else {
1402                 info->micd_modes = micd_default_modes;
1403                 info->micd_num_modes = ARRAY_SIZE(micd_default_modes);
1404         }
1405 
1406         if (arizona->pdata.gpsw > 0)
1407                 regmap_update_bits(arizona->regmap, ARIZONA_GP_SWITCH_1,
1408                                 ARIZONA_SW1_MODE_MASK, arizona->pdata.gpsw);
1409 
1410         if (arizona->pdata.micd_pol_gpio > 0) {
1411                 if (info->micd_modes[0].gpio)
1412                         mode = GPIOF_OUT_INIT_HIGH;
1413                 else
1414                         mode = GPIOF_OUT_INIT_LOW;
1415 
1416                 ret = devm_gpio_request_one(&pdev->dev,
1417                                             arizona->pdata.micd_pol_gpio,
1418                                             mode,
1419                                             "MICD polarity");
1420                 if (ret != 0) {
1421                         dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1422                                 arizona->pdata.micd_pol_gpio, ret);
1423                         goto err_register;
1424                 }
1425         } else {
1426                 if (info->micd_modes[0].gpio)
1427                         mode = GPIOD_OUT_HIGH;
1428                 else
1429                         mode = GPIOD_OUT_LOW;
1430 
1431                 /* We can't use devm here because we need to do the get
1432                  * against the MFD device, as that is where the of_node
1433                  * will reside, but if we devm against that the GPIO
1434                  * will not be freed if the extcon driver is unloaded.
1435                  */
1436                 info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
1437                                                          "wlf,micd-pol",
1438                                                          GPIOD_OUT_LOW);
1439                 if (IS_ERR(info->micd_pol_gpio)) {
1440                         ret = PTR_ERR(info->micd_pol_gpio);
1441                         dev_err(arizona->dev,
1442                                 "Failed to get microphone polarity GPIO: %d\n",
1443                                 ret);
1444                         goto err_register;
1445                 }
1446         }
1447 
1448         if (arizona->pdata.hpdet_id_gpio > 0) {
1449                 ret = devm_gpio_request_one(&pdev->dev,
1450                                             arizona->pdata.hpdet_id_gpio,
1451                                             GPIOF_OUT_INIT_LOW,
1452                                             "HPDET");
1453                 if (ret != 0) {
1454                         dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1455                                 arizona->pdata.hpdet_id_gpio, ret);
1456                         goto err_gpio;
1457                 }
1458         }
1459 
1460         if (arizona->pdata.micd_bias_start_time)
1461                 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1462                                    ARIZONA_MICD_BIAS_STARTTIME_MASK,
1463                                    arizona->pdata.micd_bias_start_time
1464                                    << ARIZONA_MICD_BIAS_STARTTIME_SHIFT);
1465 
1466         if (arizona->pdata.micd_rate)
1467                 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1468                                    ARIZONA_MICD_RATE_MASK,
1469                                    arizona->pdata.micd_rate
1470                                    << ARIZONA_MICD_RATE_SHIFT);
1471 
1472         switch (arizona->pdata.micd_dbtime) {
1473         case MICD_DBTIME_FOUR_READINGS:
1474                 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1475                                    ARIZONA_MICD_DBTIME_MASK,
1476                                    ARIZONA_MICD_DBTIME);
1477                 break;
1478         case MICD_DBTIME_TWO_READINGS:
1479                 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1480                                    ARIZONA_MICD_DBTIME_MASK, 0);
1481                 break;
1482         default:
1483                 break;
1484         }
1485 
1486         BUILD_BUG_ON(ARRAY_SIZE(arizona_micd_levels) <
1487                      ARIZONA_NUM_MICD_BUTTON_LEVELS);
1488 
1489         if (arizona->pdata.num_micd_ranges) {
1490                 info->micd_ranges = pdata->micd_ranges;
1491                 info->num_micd_ranges = pdata->num_micd_ranges;
1492         } else {
1493                 info->micd_ranges = micd_default_ranges;
1494                 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges);
1495         }
1496 
1497         if (arizona->pdata.num_micd_ranges > ARIZONA_MAX_MICD_RANGE) {
1498                 dev_err(arizona->dev, "Too many MICD ranges: %d\n",
1499                         arizona->pdata.num_micd_ranges);
1500         }
1501 
1502         if (info->num_micd_ranges > 1) {
1503                 for (i = 1; i < info->num_micd_ranges; i++) {
1504                         if (info->micd_ranges[i - 1].max >
1505                             info->micd_ranges[i].max) {
1506                                 dev_err(arizona->dev,
1507                                         "MICD ranges must be sorted\n");
1508                                 ret = -EINVAL;
1509                                 goto err_gpio;
1510                         }
1511                 }
1512         }
1513 
1514         /* Disable all buttons by default */
1515         regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1516                            ARIZONA_MICD_LVL_SEL_MASK, 0x81);
1517 
1518         /* Set up all the buttons the user specified */
1519         for (i = 0; i < info->num_micd_ranges; i++) {
1520                 for (j = 0; j < ARIZONA_NUM_MICD_BUTTON_LEVELS; j++)
1521                         if (arizona_micd_levels[j] >= info->micd_ranges[i].max)
1522                                 break;
1523 
1524                 if (j == ARIZONA_NUM_MICD_BUTTON_LEVELS) {
1525                         dev_err(arizona->dev, "Unsupported MICD level %d\n",
1526                                 info->micd_ranges[i].max);
1527                         ret = -EINVAL;
1528                         goto err_gpio;
1529                 }
1530 
1531                 dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n",
1532                         arizona_micd_levels[j], i);
1533 
1534                 arizona_micd_set_level(arizona, i, j);
1535                 input_set_capability(info->input, EV_KEY,
1536                                      info->micd_ranges[i].key);
1537 
1538                 /* Enable reporting of that range */
1539                 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1540                                    1 << i, 1 << i);
1541         }
1542 
1543         /* Set all the remaining keys to a maximum */
1544         for (; i < ARIZONA_MAX_MICD_RANGE; i++)
1545                 arizona_micd_set_level(arizona, i, 0x3f);
1546 
1547         /*
1548          * If we have a clamp use it, activating in conjunction with
1549          * GPIO5 if that is connected for jack detect operation.
1550          */
1551         if (info->micd_clamp) {
1552                 if (arizona->pdata.jd_gpio5) {
1553                         /* Put the GPIO into input mode with optional pull */
1554                         val = 0xc101;
1555                         if (arizona->pdata.jd_gpio5_nopull)
1556                                 val &= ~ARIZONA_GPN_PU;
1557 
1558                         regmap_write(arizona->regmap, ARIZONA_GPIO5_CTRL,
1559                                      val);
1560 
1561                         if (arizona->pdata.jd_invert)
1562                                 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDH_GP5H;
1563                         else
1564                                 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDL_GP5H;
1565                 } else {
1566                         if (arizona->pdata.jd_invert)
1567                                 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDH;
1568                         else
1569                                 clamp_mode = ARIZONA_MICD_CLAMP_MODE_JDL;
1570                 }
1571 
1572                 regmap_update_bits(arizona->regmap,
1573                                    ARIZONA_MICD_CLAMP_CONTROL,
1574                                    ARIZONA_MICD_CLAMP_MODE_MASK, clamp_mode);
1575 
1576                 regmap_update_bits(arizona->regmap,
1577                                    ARIZONA_JACK_DETECT_DEBOUNCE,
1578                                    ARIZONA_MICD_CLAMP_DB,
1579                                    ARIZONA_MICD_CLAMP_DB);
1580         }
1581 
1582         arizona_extcon_set_mode(info, 0);
1583 
1584         pm_runtime_enable(&pdev->dev);
1585         pm_runtime_idle(&pdev->dev);
1586         pm_runtime_get_sync(&pdev->dev);
1587 
1588         if (info->micd_clamp) {
1589                 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1590                 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1591         } else {
1592                 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1593                 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1594         }
1595 
1596         ret = arizona_request_irq(arizona, jack_irq_rise,
1597                                   "JACKDET rise", arizona_jackdet, info);
1598         if (ret != 0) {
1599                 dev_err(&pdev->dev, "Failed to get JACKDET rise IRQ: %d\n",
1600                         ret);
1601                 goto err_gpio;
1602         }
1603 
1604         ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1);
1605         if (ret != 0) {
1606                 dev_err(&pdev->dev, "Failed to set JD rise IRQ wake: %d\n",
1607                         ret);
1608                 goto err_rise;
1609         }
1610 
1611         ret = arizona_request_irq(arizona, jack_irq_fall,
1612                                   "JACKDET fall", arizona_jackdet, info);
1613         if (ret != 0) {
1614                 dev_err(&pdev->dev, "Failed to get JD fall IRQ: %d\n", ret);
1615                 goto err_rise_wake;
1616         }
1617 
1618         ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1);
1619         if (ret != 0) {
1620                 dev_err(&pdev->dev, "Failed to set JD fall IRQ wake: %d\n",
1621                         ret);
1622                 goto err_fall;
1623         }
1624 
1625         ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET,
1626                                   "MICDET", arizona_micdet, info);
1627         if (ret != 0) {
1628                 dev_err(&pdev->dev, "Failed to get MICDET IRQ: %d\n", ret);
1629                 goto err_fall_wake;
1630         }
1631 
1632         ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET,
1633                                   "HPDET", arizona_hpdet_irq, info);
1634         if (ret != 0) {
1635                 dev_err(&pdev->dev, "Failed to get HPDET IRQ: %d\n", ret);
1636                 goto err_micdet;
1637         }
1638 
1639         arizona_clk32k_enable(arizona);
1640         regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_DEBOUNCE,
1641                            ARIZONA_JD1_DB, ARIZONA_JD1_DB);
1642         regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1643                            ARIZONA_JD1_ENA, ARIZONA_JD1_ENA);
1644 
1645         ret = regulator_allow_bypass(info->micvdd, true);
1646         if (ret != 0)
1647                 dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n",
1648                          ret);
1649 
1650         pm_runtime_put(&pdev->dev);
1651 
1652         ret = input_register_device(info->input);
1653         if (ret) {
1654                 dev_err(&pdev->dev, "Can't register input device: %d\n", ret);
1655                 goto err_hpdet;
1656         }
1657 
1658         return 0;
1659 
1660 err_hpdet:
1661         arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1662 err_micdet:
1663         arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1664 err_fall_wake:
1665         arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1666 err_fall:
1667         arizona_free_irq(arizona, jack_irq_fall, info);
1668 err_rise_wake:
1669         arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1670 err_rise:
1671         arizona_free_irq(arizona, jack_irq_rise, info);
1672 err_gpio:
1673         gpiod_put(info->micd_pol_gpio);
1674 err_register:
1675         pm_runtime_disable(&pdev->dev);
1676         return ret;
1677 }
1678 
1679 static int arizona_extcon_remove(struct platform_device *pdev)
1680 {
1681         struct arizona_extcon_info *info = platform_get_drvdata(pdev);
1682         struct arizona *arizona = info->arizona;
1683         int jack_irq_rise, jack_irq_fall;
1684 
1685         gpiod_put(info->micd_pol_gpio);
1686 
1687         pm_runtime_disable(&pdev->dev);
1688 
1689         regmap_update_bits(arizona->regmap,
1690                            ARIZONA_MICD_CLAMP_CONTROL,
1691                            ARIZONA_MICD_CLAMP_MODE_MASK, 0);
1692 
1693         if (info->micd_clamp) {
1694                 jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
1695                 jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
1696         } else {
1697                 jack_irq_rise = ARIZONA_IRQ_JD_RISE;
1698                 jack_irq_fall = ARIZONA_IRQ_JD_FALL;
1699         }
1700 
1701         arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1702         arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1703         arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1704         arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1705         arizona_free_irq(arizona, jack_irq_rise, info);
1706         arizona_free_irq(arizona, jack_irq_fall, info);
1707         cancel_delayed_work_sync(&info->hpdet_work);
1708         regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1709                            ARIZONA_JD1_ENA, 0);
1710         arizona_clk32k_disable(arizona);
1711 
1712         return 0;
1713 }
1714 
1715 static struct platform_driver arizona_extcon_driver = {
1716         .driver         = {
1717                 .name   = "arizona-extcon",
1718         },
1719         .probe          = arizona_extcon_probe,
1720         .remove         = arizona_extcon_remove,
1721 };
1722 
1723 module_platform_driver(arizona_extcon_driver);
1724 
1725 MODULE_DESCRIPTION("Arizona Extcon driver");
1726 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1727 MODULE_LICENSE("GPL");
1728 MODULE_ALIAS("platform:extcon-arizona");
1729 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us