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