Linux Audio

Check our new training course

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