Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.3-rc1 1781 lines 46 kB view raw
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");