Linux Audio

Check our new training course

Buildroot integration, development and maintenance

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