Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// mt6359-accdet.c  --  ALSA SoC mt6359 accdet driver
   4//
   5// Copyright (C) 2021 MediaTek Inc.
   6// Author: Argus Lin <argus.lin@mediatek.com>
   7//
   8
   9#include <linux/of.h>
  10#include <linux/input.h>
  11#include <linux/kthread.h>
  12#include <linux/io.h>
  13#include <linux/sched/clock.h>
  14#include <linux/workqueue.h>
  15#include <linux/timer.h>
  16#include <linux/delay.h>
  17#include <linux/module.h>
  18#include <linux/platform_device.h>
  19#include <linux/init.h>
  20#include <linux/irqdomain.h>
  21#include <linux/irq.h>
  22#include <linux/regmap.h>
  23#include <sound/soc.h>
  24#include <sound/jack.h>
  25#include <linux/mfd/mt6397/core.h>
  26
  27#include "mt6359-accdet.h"
  28#include "mt6359.h"
  29
  30/* global variable definitions */
  31#define REGISTER_VAL(x)	((x) - 1)
  32
  33/* mt6359 accdet capability */
  34#define ACCDET_PMIC_EINT_IRQ		BIT(0)
  35#define ACCDET_AP_GPIO_EINT		BIT(1)
  36
  37#define ACCDET_PMIC_EINT0		BIT(2)
  38#define ACCDET_PMIC_EINT1		BIT(3)
  39#define ACCDET_PMIC_BI_EINT		BIT(4)
  40
  41#define ACCDET_PMIC_GPIO_TRIG_EINT	BIT(5)
  42#define ACCDET_PMIC_INVERTER_TRIG_EINT	BIT(6)
  43#define ACCDET_PMIC_RSV_EINT		BIT(7)
  44
  45#define ACCDET_THREE_KEY		BIT(8)
  46#define ACCDET_FOUR_KEY			BIT(9)
  47#define ACCDET_TRI_KEY_CDD		BIT(10)
  48#define ACCDET_RSV_KEY			BIT(11)
  49
  50#define ACCDET_ANALOG_FASTDISCHARGE	BIT(12)
  51#define ACCDET_DIGITAL_FASTDISCHARGE	BIT(13)
  52#define ACCDET_AD_FASTDISCHRAGE		BIT(14)
  53
  54static struct platform_driver mt6359_accdet_driver;
  55static const struct snd_soc_component_driver mt6359_accdet_soc_driver;
  56
  57/* local function declaration */
  58static void accdet_set_debounce(struct mt6359_accdet *priv, int state,
  59				unsigned int debounce);
  60static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv);
  61static void config_digital_init_by_mode(struct mt6359_accdet *priv);
  62static void config_eint_init_by_mode(struct mt6359_accdet *priv);
  63static inline void mt6359_accdet_init(struct mt6359_accdet *priv);
  64static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv);
  65static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv);
  66static void mt6359_accdet_jack_report(struct mt6359_accdet *priv);
  67static void recover_eint_analog_setting(struct mt6359_accdet *priv);
  68static void recover_eint_digital_setting(struct mt6359_accdet *priv);
  69static void recover_eint_setting(struct mt6359_accdet *priv);
  70
  71static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv)
  72{
  73	if (priv->data->eint_detect_mode == 0x3 ||
  74	    priv->data->eint_detect_mode == 0x4) {
  75		/* ESD switches off */
  76		regmap_update_bits(priv->regmap,
  77				   RG_ACCDETSPARE_ADDR, 1 << 8, 0);
  78	}
  79	if (priv->data->eint_detect_mode == 0x4) {
  80		if (priv->caps & ACCDET_PMIC_EINT0) {
  81			/* enable RG_EINT0CONFIGACCDET */
  82			regmap_update_bits(priv->regmap,
  83					   RG_EINT0CONFIGACCDET_ADDR,
  84					   RG_EINT0CONFIGACCDET_MASK_SFT,
  85					   BIT(RG_EINT0CONFIGACCDET_SFT));
  86		} else if (priv->caps & ACCDET_PMIC_EINT1) {
  87			/* enable RG_EINT1CONFIGACCDET */
  88			regmap_update_bits(priv->regmap,
  89					   RG_EINT1CONFIGACCDET_ADDR,
  90					   RG_EINT1CONFIGACCDET_MASK_SFT,
  91					   BIT(RG_EINT1CONFIGACCDET_SFT));
  92		}
  93		if (priv->data->eint_use_ext_res == 0x3 ||
  94		    priv->data->eint_use_ext_res == 0x4) {
  95			/*select 500k, use internal resistor */
  96			regmap_update_bits(priv->regmap,
  97					   RG_EINT0HIRENB_ADDR,
  98					   RG_EINT0HIRENB_MASK_SFT,
  99					   BIT(RG_EINT0HIRENB_SFT));
 100		}
 101	}
 102	return 0;
 103}
 104
 105static unsigned int adjust_eint_digital_setting(struct mt6359_accdet *priv)
 106{
 107	if (priv->caps & ACCDET_PMIC_EINT0) {
 108		/* disable inverter */
 109		regmap_update_bits(priv->regmap,
 110				   ACCDET_EINT0_INVERTER_SW_EN_ADDR,
 111				   ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT, 0);
 112	} else if (priv->caps & ACCDET_PMIC_EINT1) {
 113		/* disable inverter */
 114		regmap_update_bits(priv->regmap,
 115				   ACCDET_EINT1_INVERTER_SW_EN_ADDR,
 116				   ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT, 0);
 117	}
 118
 119	if (priv->data->eint_detect_mode == 0x4) {
 120		if (priv->caps & ACCDET_PMIC_EINT0) {
 121			/* set DA stable signal */
 122			regmap_update_bits(priv->regmap,
 123					   ACCDET_DA_STABLE_ADDR,
 124					   ACCDET_EINT0_CEN_STABLE_MASK_SFT, 0);
 125		} else if (priv->caps & ACCDET_PMIC_EINT1) {
 126			/* set DA stable signal */
 127			regmap_update_bits(priv->regmap,
 128					   ACCDET_DA_STABLE_ADDR,
 129					   ACCDET_EINT1_CEN_STABLE_MASK_SFT, 0);
 130		}
 131	}
 132	return 0;
 133}
 134
 135static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv)
 136{
 137	if (priv->jd_sts == M_PLUG_IN) {
 138		/* adjust digital setting */
 139		adjust_eint_digital_setting(priv);
 140		/* adjust analog setting */
 141		adjust_eint_analog_setting(priv);
 142	} else if (priv->jd_sts == M_PLUG_OUT) {
 143		/* set debounce to 1ms */
 144		accdet_set_debounce(priv, eint_state000,
 145				    priv->data->pwm_deb->eint_debounce0);
 146	} else {
 147		dev_dbg(priv->dev, "should not be here %s()\n", __func__);
 148	}
 149
 150	return 0;
 151}
 152
 153static void recover_eint_analog_setting(struct mt6359_accdet *priv)
 154{
 155	if (priv->data->eint_detect_mode == 0x3 ||
 156	    priv->data->eint_detect_mode == 0x4) {
 157		/* ESD switches on */
 158		regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
 159				   1 << 8, 1 << 8);
 160	}
 161	if (priv->data->eint_detect_mode == 0x4) {
 162		if (priv->caps & ACCDET_PMIC_EINT0) {
 163			/* disable RG_EINT0CONFIGACCDET */
 164			regmap_update_bits(priv->regmap,
 165					   RG_EINT0CONFIGACCDET_ADDR,
 166					   RG_EINT0CONFIGACCDET_MASK_SFT, 0);
 167		} else if (priv->caps & ACCDET_PMIC_EINT1) {
 168			/* disable RG_EINT1CONFIGACCDET */
 169			regmap_update_bits(priv->regmap,
 170					   RG_EINT1CONFIGACCDET_ADDR,
 171					   RG_EINT1CONFIGACCDET_MASK_SFT, 0);
 172		}
 173		regmap_update_bits(priv->regmap, RG_EINT0HIRENB_ADDR,
 174				   RG_EINT0HIRENB_MASK_SFT, 0);
 175	}
 176}
 177
 178static void recover_eint_digital_setting(struct mt6359_accdet *priv)
 179{
 180	if (priv->caps & ACCDET_PMIC_EINT0) {
 181		regmap_update_bits(priv->regmap,
 182				   ACCDET_EINT0_M_SW_EN_ADDR,
 183				   ACCDET_EINT0_M_SW_EN_MASK_SFT, 0);
 184	} else if (priv->caps & ACCDET_PMIC_EINT1) {
 185		regmap_update_bits(priv->regmap,
 186				   ACCDET_EINT1_M_SW_EN_ADDR,
 187				   ACCDET_EINT1_M_SW_EN_MASK_SFT, 0);
 188	}
 189	if (priv->data->eint_detect_mode == 0x4) {
 190		/* enable eint0cen */
 191		if (priv->caps & ACCDET_PMIC_EINT0) {
 192			/* enable eint0cen */
 193			regmap_update_bits(priv->regmap,
 194					   ACCDET_DA_STABLE_ADDR,
 195					   ACCDET_EINT0_CEN_STABLE_MASK_SFT,
 196					   BIT(ACCDET_EINT0_CEN_STABLE_SFT));
 197		} else if (priv->caps & ACCDET_PMIC_EINT1) {
 198			/* enable eint1cen */
 199			regmap_update_bits(priv->regmap,
 200					   ACCDET_DA_STABLE_ADDR,
 201					   ACCDET_EINT1_CEN_STABLE_MASK_SFT,
 202					   BIT(ACCDET_EINT1_CEN_STABLE_SFT));
 203		}
 204	}
 205
 206	if (priv->data->eint_detect_mode != 0x1) {
 207		if (priv->caps & ACCDET_PMIC_EINT0) {
 208			/* enable inverter */
 209			regmap_update_bits(priv->regmap,
 210					   ACCDET_EINT0_INVERTER_SW_EN_ADDR,
 211					   ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT,
 212					   BIT(ACCDET_EINT0_INVERTER_SW_EN_SFT));
 213		} else if (priv->caps & ACCDET_PMIC_EINT1) {
 214			/* enable inverter */
 215			regmap_update_bits(priv->regmap,
 216					   ACCDET_EINT1_INVERTER_SW_EN_ADDR,
 217					   ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT,
 218					   BIT(ACCDET_EINT1_INVERTER_SW_EN_SFT));
 219		}
 220	}
 221}
 222
 223static void recover_eint_setting(struct mt6359_accdet *priv)
 224{
 225	if (priv->jd_sts == M_PLUG_OUT) {
 226		recover_eint_analog_setting(priv);
 227		recover_eint_digital_setting(priv);
 228	}
 229}
 230
 231static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv)
 232{
 233	int ret;
 234	unsigned int value = 0;
 235
 236	regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
 237			   ACCDET_IRQ_CLR_MASK_SFT, BIT(ACCDET_IRQ_CLR_SFT));
 238	usleep_range(200, 300);
 239	ret = regmap_read_poll_timeout(priv->regmap,
 240				       ACCDET_IRQ_ADDR,
 241				       value,
 242				       (value & ACCDET_IRQ_MASK_SFT) == 0,
 243				       0,
 244				       1000);
 245	if (ret)
 246		dev_warn(priv->dev, "%s(), ret %d\n", __func__, ret);
 247	/* clear accdet int, modify  for fix interrupt trigger twice error */
 248	regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
 249			   ACCDET_IRQ_CLR_MASK_SFT, 0);
 250	regmap_update_bits(priv->regmap, RG_INT_STATUS_ACCDET_ADDR,
 251			   RG_INT_STATUS_ACCDET_MASK_SFT,
 252			   BIT(RG_INT_STATUS_ACCDET_SFT));
 253
 254	/* recover accdet debounce0,3 */
 255	accdet_set_debounce(priv, accdet_state000,
 256			    priv->data->pwm_deb->debounce0);
 257	accdet_set_debounce(priv, accdet_state001,
 258			    priv->data->pwm_deb->debounce1);
 259	accdet_set_debounce(priv, accdet_state011,
 260			    priv->data->pwm_deb->debounce3);
 261
 262	priv->jack_type = 0;
 263	priv->btn_type = 0;
 264	priv->accdet_status = 0x3;
 265	mt6359_accdet_jack_report(priv);
 266}
 267
 268static void accdet_set_debounce(struct mt6359_accdet *priv, int state,
 269				unsigned int debounce)
 270{
 271	switch (state) {
 272	case accdet_state000:
 273		regmap_write(priv->regmap, ACCDET_DEBOUNCE0_ADDR, debounce);
 274		break;
 275	case accdet_state001:
 276		regmap_write(priv->regmap, ACCDET_DEBOUNCE1_ADDR, debounce);
 277		break;
 278	case accdet_state010:
 279		regmap_write(priv->regmap, ACCDET_DEBOUNCE2_ADDR, debounce);
 280		break;
 281	case accdet_state011:
 282		regmap_write(priv->regmap, ACCDET_DEBOUNCE3_ADDR, debounce);
 283		break;
 284	case accdet_auxadc:
 285		regmap_write(priv->regmap,
 286			     ACCDET_CONNECT_AUXADC_TIME_DIG_ADDR, debounce);
 287		break;
 288	case eint_state000:
 289		regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE0_ADDR,
 290				   0xF << ACCDET_EINT_DEBOUNCE0_SFT,
 291				   debounce << ACCDET_EINT_DEBOUNCE0_SFT);
 292		break;
 293	case eint_state001:
 294		regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE1_ADDR,
 295				   0xF << ACCDET_EINT_DEBOUNCE1_SFT,
 296				   debounce << ACCDET_EINT_DEBOUNCE1_SFT);
 297		break;
 298	case eint_state010:
 299		regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE2_ADDR,
 300				   0xF << ACCDET_EINT_DEBOUNCE2_SFT,
 301				   debounce << ACCDET_EINT_DEBOUNCE2_SFT);
 302		break;
 303	case eint_state011:
 304		regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE3_ADDR,
 305				   0xF << ACCDET_EINT_DEBOUNCE3_SFT,
 306				   debounce << ACCDET_EINT_DEBOUNCE3_SFT);
 307		break;
 308	case eint_inverter_state000:
 309		regmap_write(priv->regmap, ACCDET_EINT_INVERTER_DEBOUNCE_ADDR,
 310			     debounce);
 311		break;
 312	default:
 313		dev_warn(priv->dev, "Error: %s error state (%d)\n", __func__,
 314			 state);
 315		break;
 316	}
 317}
 318
 319static void mt6359_accdet_jack_report(struct mt6359_accdet *priv)
 320{
 321	int report = 0;
 322
 323	if (!priv->jack)
 324		return;
 325
 326	report = priv->jack_type | priv->btn_type;
 327	snd_soc_jack_report(priv->jack, report, MT6359_ACCDET_JACK_MASK);
 328}
 329
 330static unsigned int check_button(struct mt6359_accdet *priv, unsigned int v)
 331{
 332	if (priv->caps & ACCDET_FOUR_KEY) {
 333		if (v < priv->data->four_key.down &&
 334		    v >= priv->data->four_key.up)
 335			priv->btn_type = SND_JACK_BTN_1;
 336		if (v < priv->data->four_key.up &&
 337		    v >= priv->data->four_key.voice)
 338			priv->btn_type = SND_JACK_BTN_2;
 339		if (v < priv->data->four_key.voice &&
 340		    v >= priv->data->four_key.mid)
 341			priv->btn_type = SND_JACK_BTN_3;
 342		if (v < priv->data->four_key.mid)
 343			priv->btn_type = SND_JACK_BTN_0;
 344	} else {
 345		if (v < priv->data->three_key.down &&
 346		    v >= priv->data->three_key.up)
 347			priv->btn_type = SND_JACK_BTN_1;
 348		if (v < priv->data->three_key.up &&
 349		    v >= priv->data->three_key.mid)
 350			priv->btn_type = SND_JACK_BTN_2;
 351		if (v < priv->data->three_key.mid)
 352			priv->btn_type = SND_JACK_BTN_0;
 353	}
 354	return 0;
 355}
 356
 357static void is_key_pressed(struct mt6359_accdet *priv, bool pressed)
 358{
 359	priv->btn_type = priv->jack_type & ~MT6359_ACCDET_BTN_MASK;
 360
 361	if (pressed)
 362		check_button(priv, priv->cali_voltage);
 363}
 364
 365static inline void check_jack_btn_type(struct mt6359_accdet *priv)
 366{
 367	unsigned int val = 0;
 368
 369	regmap_read(priv->regmap, ACCDET_MEM_IN_ADDR, &val);
 370
 371	priv->accdet_status =
 372		(val >> ACCDET_STATE_MEM_IN_OFFSET) & ACCDET_STATE_AB_MASK;
 373
 374	switch (priv->accdet_status) {
 375	case 0:
 376		if (priv->jack_type == SND_JACK_HEADSET)
 377			is_key_pressed(priv, true);
 378		else
 379			priv->jack_type = SND_JACK_HEADPHONE;
 380		break;
 381	case 1:
 382		if (priv->jack_type == SND_JACK_HEADSET) {
 383			is_key_pressed(priv, false);
 384		} else {
 385			priv->jack_type = SND_JACK_HEADSET;
 386			accdet_set_debounce(priv, eint_state011, 0x1);
 387		}
 388		break;
 389	case 3:
 390	default:
 391		priv->jack_type = 0;
 392		break;
 393	}
 394}
 395
 396static void mt6359_accdet_work(struct work_struct *work)
 397{
 398	struct mt6359_accdet *priv =
 399		container_of(work, struct mt6359_accdet, accdet_work);
 400
 401	mutex_lock(&priv->res_lock);
 402	priv->pre_accdet_status = priv->accdet_status;
 403	check_jack_btn_type(priv);
 404
 405	if (priv->jack_plugged &&
 406	    priv->pre_accdet_status != priv->accdet_status)
 407		mt6359_accdet_jack_report(priv);
 408	mutex_unlock(&priv->res_lock);
 409}
 410
 411static void mt6359_accdet_jd_work(struct work_struct *work)
 412{
 413	int ret;
 414	unsigned int value = 0;
 415
 416	struct mt6359_accdet *priv =
 417		container_of(work, struct mt6359_accdet, jd_work);
 418
 419	mutex_lock(&priv->res_lock);
 420	if (priv->jd_sts == M_PLUG_IN) {
 421		priv->jack_plugged = true;
 422
 423		/* set and clear initial bit every eint interrupt */
 424		regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
 425				   ACCDET_SEQ_INIT_MASK_SFT,
 426				   BIT(ACCDET_SEQ_INIT_SFT));
 427		regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
 428				   ACCDET_SEQ_INIT_MASK_SFT, 0);
 429		ret = regmap_read_poll_timeout(priv->regmap,
 430					       ACCDET_SEQ_INIT_ADDR,
 431					       value,
 432					       (value & ACCDET_SEQ_INIT_MASK_SFT) == 0,
 433					       0,
 434					       1000);
 435		if (ret)
 436			dev_err(priv->dev, "%s(), ret %d\n", __func__, ret);
 437
 438		/* enable ACCDET unit */
 439		regmap_update_bits(priv->regmap, ACCDET_SW_EN_ADDR,
 440				   ACCDET_SW_EN_MASK_SFT, BIT(ACCDET_SW_EN_SFT));
 441	} else if (priv->jd_sts == M_PLUG_OUT) {
 442		priv->jack_plugged = false;
 443
 444		accdet_set_debounce(priv, accdet_state011,
 445				    priv->data->pwm_deb->debounce3);
 446		regmap_update_bits(priv->regmap, ACCDET_SW_EN_ADDR,
 447				   ACCDET_SW_EN_MASK_SFT, 0);
 448		mt6359_accdet_recover_jd_setting(priv);
 449	}
 450
 451	if (priv->caps & ACCDET_PMIC_EINT_IRQ)
 452		recover_eint_setting(priv);
 453	mutex_unlock(&priv->res_lock);
 454}
 455
 456static irqreturn_t mt6359_accdet_irq(int irq, void *data)
 457{
 458	struct mt6359_accdet *priv = data;
 459	unsigned int irq_val = 0, val = 0, value = 0;
 460	int ret;
 461
 462	mutex_lock(&priv->res_lock);
 463	regmap_read(priv->regmap, ACCDET_IRQ_ADDR, &irq_val);
 464
 465	if (irq_val & ACCDET_IRQ_MASK_SFT) {
 466		regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
 467				   ACCDET_IRQ_CLR_MASK_SFT,
 468				   BIT(ACCDET_IRQ_CLR_SFT));
 469		ret = regmap_read_poll_timeout(priv->regmap,
 470					       ACCDET_IRQ_ADDR,
 471					       value,
 472					       (value & ACCDET_IRQ_MASK_SFT) == 0,
 473					       0,
 474					       1000);
 475		if (ret) {
 476			dev_err(priv->dev, "%s(), ret %d\n", __func__, ret);
 477			mutex_unlock(&priv->res_lock);
 478			return IRQ_NONE;
 479		}
 480		regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
 481				   ACCDET_IRQ_CLR_MASK_SFT, 0);
 482		regmap_update_bits(priv->regmap, RG_INT_STATUS_ACCDET_ADDR,
 483				   RG_INT_STATUS_ACCDET_MASK_SFT,
 484				   BIT(RG_INT_STATUS_ACCDET_SFT));
 485
 486		queue_work(priv->accdet_workqueue, &priv->accdet_work);
 487	} else {
 488		if (irq_val & ACCDET_EINT0_IRQ_MASK_SFT) {
 489			regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
 490					   ACCDET_EINT0_IRQ_CLR_MASK_SFT,
 491					   BIT(ACCDET_EINT0_IRQ_CLR_SFT));
 492			ret = regmap_read_poll_timeout(priv->regmap,
 493						       ACCDET_IRQ_ADDR,
 494						       value,
 495						       (value & ACCDET_EINT0_IRQ_MASK_SFT) == 0,
 496						       0,
 497						       1000);
 498			if (ret) {
 499				dev_err(priv->dev, "%s(), ret %d\n", __func__,
 500					ret);
 501				mutex_unlock(&priv->res_lock);
 502				return IRQ_NONE;
 503			}
 504			regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
 505					   ACCDET_EINT0_IRQ_CLR_MASK_SFT, 0);
 506			regmap_update_bits(priv->regmap,
 507					   RG_INT_STATUS_ACCDET_ADDR,
 508					   RG_INT_STATUS_ACCDET_EINT0_MASK_SFT,
 509					   BIT(RG_INT_STATUS_ACCDET_EINT0_SFT));
 510		}
 511		if (irq_val & ACCDET_EINT1_IRQ_MASK_SFT) {
 512			regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
 513					   ACCDET_EINT1_IRQ_CLR_MASK_SFT,
 514					   BIT(ACCDET_EINT1_IRQ_CLR_SFT));
 515			ret = regmap_read_poll_timeout(priv->regmap,
 516						       ACCDET_IRQ_ADDR,
 517						       value,
 518						       (value & ACCDET_EINT1_IRQ_MASK_SFT) == 0,
 519						       0,
 520						       1000);
 521			if (ret) {
 522				dev_err(priv->dev, "%s(), ret %d\n", __func__,
 523					ret);
 524				mutex_unlock(&priv->res_lock);
 525				return IRQ_NONE;
 526			}
 527			regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
 528					   ACCDET_EINT1_IRQ_CLR_MASK_SFT, 0);
 529			regmap_update_bits(priv->regmap,
 530					   RG_INT_STATUS_ACCDET_ADDR,
 531					   RG_INT_STATUS_ACCDET_EINT1_MASK_SFT,
 532					   BIT(RG_INT_STATUS_ACCDET_EINT1_SFT));
 533		}
 534		/* get jack detection status */
 535		regmap_read(priv->regmap, ACCDET_EINT0_MEM_IN_ADDR, &val);
 536		priv->jd_sts = ((val >> ACCDET_EINT0_MEM_IN_SFT) &
 537				   ACCDET_EINT0_MEM_IN_MASK);
 538		/* adjust eint digital/analog setting */
 539		mt6359_accdet_jd_setting(priv);
 540
 541		queue_work(priv->jd_workqueue, &priv->jd_work);
 542	}
 543	mutex_unlock(&priv->res_lock);
 544
 545	return IRQ_HANDLED;
 546}
 547
 548static int mt6359_accdet_parse_dt(struct mt6359_accdet *priv)
 549{
 550	int ret;
 551	struct device *dev = priv->dev;
 552	struct device_node *node = NULL;
 553	int pwm_deb[15] = {0};
 554	unsigned int tmp = 0;
 555
 556	node = of_get_child_by_name(dev->parent->of_node, "accdet");
 557	if (!node)
 558		return -EINVAL;
 559
 560	ret = of_property_read_u32(node, "mediatek,mic-vol",
 561				   &priv->data->mic_vol);
 562	if (ret)
 563		priv->data->mic_vol = 8;
 564
 565	ret = of_property_read_u32(node, "mediatek,plugout-debounce",
 566				   &priv->data->plugout_deb);
 567	if (ret)
 568		priv->data->plugout_deb = 1;
 569
 570	ret = of_property_read_u32(node, "mediatek,mic-mode",
 571				   &priv->data->mic_mode);
 572	if (ret)
 573		priv->data->mic_mode = 2;
 574
 575	ret = of_property_read_u32_array(node, "mediatek,pwm-deb-setting",
 576					 pwm_deb, ARRAY_SIZE(pwm_deb));
 577	/* debounce8(auxadc debounce) is default, needn't get from dts */
 578	if (!ret)
 579		memcpy(priv->data->pwm_deb, pwm_deb, sizeof(pwm_deb));
 580
 581	ret = of_property_read_u32(node, "mediatek,eint-level-pol",
 582				   &priv->data->eint_pol);
 583	if (ret)
 584		priv->data->eint_pol = 8;
 585
 586	ret = of_property_read_u32(node, "mediatek,eint-use-ap", &tmp);
 587	if (ret)
 588		tmp = 0;
 589	if (tmp == 0)
 590		priv->caps |= ACCDET_PMIC_EINT_IRQ;
 591	else if (tmp == 1)
 592		priv->caps |= ACCDET_AP_GPIO_EINT;
 593
 594	ret = of_property_read_u32(node, "mediatek,eint-detect-mode",
 595				   &priv->data->eint_detect_mode);
 596	if (ret) {
 597		/* eint detection mode equals to EINT HW Mode */
 598		priv->data->eint_detect_mode = 0x4;
 599	}
 600
 601	ret = of_property_read_u32(node, "mediatek,eint-num", &tmp);
 602	if (ret)
 603		tmp = 0;
 604	if (tmp == 0)
 605		priv->caps |= ACCDET_PMIC_EINT0;
 606	else if (tmp == 1)
 607		priv->caps |= ACCDET_PMIC_EINT1;
 608	else if (tmp == 2)
 609		priv->caps |= ACCDET_PMIC_BI_EINT;
 610
 611	ret = of_property_read_u32(node, "mediatek,eint-trig-mode",
 612				   &tmp);
 613	if (ret)
 614		tmp = 0;
 615	if (tmp == 0)
 616		priv->caps |= ACCDET_PMIC_GPIO_TRIG_EINT;
 617	else if (tmp == 1)
 618		priv->caps |= ACCDET_PMIC_INVERTER_TRIG_EINT;
 619
 620	ret = of_property_read_u32(node, "mediatek,eint-use-ext-res",
 621				   &priv->data->eint_use_ext_res);
 622	if (ret) {
 623		/* eint use internal resister */
 624		priv->data->eint_use_ext_res = 0x0;
 625	}
 626
 627	ret = of_property_read_u32(node, "mediatek,eint-comp-vth",
 628				   &priv->data->eint_comp_vth);
 629	if (ret)
 630		priv->data->eint_comp_vth = 0x0;
 631
 632	ret = of_property_read_u32(node, "mediatek,key-mode", &tmp);
 633	if (ret)
 634		tmp = 0;
 635	if (tmp == 0) {
 636		int three_key[4];
 637
 638		priv->caps |= ACCDET_THREE_KEY;
 639		ret = of_property_read_u32_array(node,
 640						 "mediatek,three-key-thr",
 641						 three_key,
 642						 ARRAY_SIZE(three_key));
 643		if (!ret)
 644			memcpy(&priv->data->three_key, three_key + 1,
 645			       sizeof(struct three_key_threshold));
 646	} else if (tmp == 1) {
 647		int four_key[5];
 648
 649		priv->caps |= ACCDET_FOUR_KEY;
 650		ret = of_property_read_u32_array(node,
 651						 "mediatek,four-key-thr",
 652						 four_key,
 653						 ARRAY_SIZE(four_key));
 654		if (!ret) {
 655			memcpy(&priv->data->four_key, four_key + 1,
 656			       sizeof(struct four_key_threshold));
 657		} else {
 658			dev_warn(priv->dev,
 659				 "accdet no 4-key-thrsh dts, use efuse\n");
 660		}
 661	} else if (tmp == 2) {
 662		int three_key[4];
 663
 664		priv->caps |= ACCDET_TRI_KEY_CDD;
 665		ret = of_property_read_u32_array(node,
 666						 "mediatek,tri-key-cdd-thr",
 667						 three_key,
 668						 ARRAY_SIZE(three_key));
 669		if (!ret)
 670			memcpy(&priv->data->three_key, three_key + 1,
 671			       sizeof(struct three_key_threshold));
 672	}
 673
 674	of_node_put(node);
 675	dev_warn(priv->dev, "accdet caps=%x\n", priv->caps);
 676
 677	return 0;
 678}
 679
 680static void config_digital_init_by_mode(struct mt6359_accdet *priv)
 681{
 682	/* enable eint cmpmem pwm */
 683	regmap_write(priv->regmap, ACCDET_EINT_CMPMEN_PWM_THRESH_ADDR,
 684		     (priv->data->pwm_deb->eint_pwm_width << 4 |
 685		     priv->data->pwm_deb->eint_pwm_thresh));
 686	/* DA signal stable */
 687	if (priv->caps & ACCDET_PMIC_EINT0) {
 688		regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR,
 689			     ACCDET_EINT0_STABLE_VAL);
 690	} else if (priv->caps & ACCDET_PMIC_EINT1) {
 691		regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR,
 692			     ACCDET_EINT1_STABLE_VAL);
 693	}
 694	/* after receive n+1 number, interrupt issued. */
 695	regmap_update_bits(priv->regmap, ACCDET_EINT_M_PLUG_IN_NUM_ADDR,
 696			   ACCDET_EINT_M_PLUG_IN_NUM_MASK_SFT,
 697			   BIT(ACCDET_EINT_M_PLUG_IN_NUM_SFT));
 698	/* setting HW mode, enable digital fast discharge
 699	 * if use EINT0 & EINT1 detection, please modify
 700	 * ACCDET_HWMODE_EN_ADDR[2:1]
 701	 */
 702	regmap_write(priv->regmap, ACCDET_HWMODE_EN_ADDR, 0x100);
 703
 704	regmap_update_bits(priv->regmap, ACCDET_EINT_M_DETECT_EN_ADDR,
 705			   ACCDET_EINT_M_DETECT_EN_MASK_SFT, 0);
 706
 707	/* enable PWM */
 708	regmap_write(priv->regmap, ACCDET_CMP_PWM_EN_ADDR, 0x67);
 709	/* enable inverter detection */
 710	if (priv->data->eint_detect_mode == 0x1) {
 711		/* disable inverter detection */
 712		if (priv->caps & ACCDET_PMIC_EINT0) {
 713			regmap_update_bits(priv->regmap,
 714					   ACCDET_EINT0_INVERTER_SW_EN_ADDR,
 715					   ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT,
 716					   0);
 717		} else if (priv->caps & ACCDET_PMIC_EINT1) {
 718			regmap_update_bits(priv->regmap,
 719					   ACCDET_EINT1_INVERTER_SW_EN_ADDR,
 720					   ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT,
 721					   0);
 722		}
 723	} else {
 724		if (priv->caps & ACCDET_PMIC_EINT0) {
 725			regmap_update_bits(priv->regmap,
 726					   ACCDET_EINT0_INVERTER_SW_EN_ADDR,
 727					   ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT,
 728					   BIT(ACCDET_EINT0_INVERTER_SW_EN_SFT));
 729		} else if (priv->caps & ACCDET_PMIC_EINT1) {
 730			regmap_update_bits(priv->regmap,
 731					   ACCDET_EINT1_INVERTER_SW_EN_ADDR,
 732					   ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT,
 733					   BIT(ACCDET_EINT1_INVERTER_SW_EN_SFT));
 734		}
 735	}
 736}
 737
 738static void config_eint_init_by_mode(struct mt6359_accdet *priv)
 739{
 740	unsigned int val = 0;
 741
 742	if (priv->caps & ACCDET_PMIC_EINT0) {
 743		regmap_update_bits(priv->regmap, RG_EINT0EN_ADDR,
 744				   RG_EINT0EN_MASK_SFT, BIT(RG_EINT0EN_SFT));
 745	} else if (priv->caps & ACCDET_PMIC_EINT1) {
 746		regmap_update_bits(priv->regmap, RG_EINT1EN_ADDR,
 747				   RG_EINT1EN_MASK_SFT, BIT(RG_EINT1EN_SFT));
 748	}
 749	/* ESD switches on */
 750	regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
 751			   1 << 8, 1 << 8);
 752	/* before playback, set NCP pull low before nagative voltage */
 753	regmap_update_bits(priv->regmap, RG_NCP_PDDIS_EN_ADDR,
 754			   RG_NCP_PDDIS_EN_MASK_SFT, BIT(RG_NCP_PDDIS_EN_SFT));
 755
 756	if (priv->data->eint_detect_mode == 0x1 ||
 757	    priv->data->eint_detect_mode == 0x2 ||
 758	    priv->data->eint_detect_mode == 0x3) {
 759		if (priv->data->eint_use_ext_res == 0x1) {
 760			if (priv->caps & ACCDET_PMIC_EINT0) {
 761				regmap_update_bits(priv->regmap,
 762						   RG_EINT0CONFIGACCDET_ADDR,
 763						   RG_EINT0CONFIGACCDET_MASK_SFT,
 764						   0);
 765			} else if (priv->caps & ACCDET_PMIC_EINT1) {
 766				regmap_update_bits(priv->regmap,
 767						   RG_EINT1CONFIGACCDET_ADDR,
 768						   RG_EINT1CONFIGACCDET_MASK_SFT,
 769						   0);
 770			}
 771		} else {
 772			if (priv->caps & ACCDET_PMIC_EINT0) {
 773				regmap_update_bits(priv->regmap,
 774						   RG_EINT0CONFIGACCDET_ADDR,
 775						   RG_EINT0CONFIGACCDET_MASK_SFT,
 776						   BIT(RG_EINT0CONFIGACCDET_SFT));
 777			} else if (priv->caps & ACCDET_PMIC_EINT1) {
 778				regmap_update_bits(priv->regmap,
 779						   RG_EINT1CONFIGACCDET_ADDR,
 780						   RG_EINT1CONFIGACCDET_MASK_SFT,
 781						   BIT(RG_EINT1CONFIGACCDET_SFT));
 782			}
 783		}
 784	}
 785
 786	if (priv->data->eint_detect_mode != 0x1) {
 787		/* current detect set 0.25uA */
 788		regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
 789				   0x3 << RG_ACCDETSPARE_SFT,
 790				   0x3 << RG_ACCDETSPARE_SFT);
 791	}
 792	regmap_write(priv->regmap, RG_EINTCOMPVTH_ADDR,
 793		     val | priv->data->eint_comp_vth << RG_EINTCOMPVTH_SFT);
 794}
 795
 796static void mt6359_accdet_init(struct mt6359_accdet *priv)
 797{
 798	unsigned int reg = 0;
 799
 800	regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
 801			   ACCDET_SEQ_INIT_MASK_SFT, BIT(ACCDET_SEQ_INIT_SFT));
 802	mdelay(2);
 803	regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
 804			   ACCDET_SEQ_INIT_MASK_SFT, 0);
 805	mdelay(1);
 806	/* init the debounce time (debounce/32768)sec */
 807	accdet_set_debounce(priv, accdet_state000,
 808			    priv->data->pwm_deb->debounce0);
 809	accdet_set_debounce(priv, accdet_state001,
 810			    priv->data->pwm_deb->debounce1);
 811	accdet_set_debounce(priv, accdet_state011,
 812			    priv->data->pwm_deb->debounce3);
 813	accdet_set_debounce(priv, accdet_auxadc,
 814			    priv->data->pwm_deb->debounce4);
 815
 816	accdet_set_debounce(priv, eint_state000,
 817			    priv->data->pwm_deb->eint_debounce0);
 818	accdet_set_debounce(priv, eint_state001,
 819			    priv->data->pwm_deb->eint_debounce1);
 820	accdet_set_debounce(priv, eint_state011,
 821			    priv->data->pwm_deb->eint_debounce3);
 822	accdet_set_debounce(priv, eint_inverter_state000,
 823			    priv->data->pwm_deb->eint_inverter_debounce);
 824
 825	regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR,
 826			   RG_ACCDET_RST_MASK_SFT, BIT(RG_ACCDET_RST_SFT));
 827	regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR,
 828			   RG_ACCDET_RST_MASK_SFT, 0);
 829
 830	/* clear high micbias1 voltage setting */
 831	regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
 832			   0x3 << RG_AUDMICBIAS1HVEN_SFT, 0);
 833	regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
 834			   0x7 << RG_AUDMICBIAS1VREF_SFT, 0);
 835
 836	/* init pwm frequency, duty & rise/falling delay */
 837	regmap_write(priv->regmap, ACCDET_PWM_WIDTH_ADDR,
 838		     REGISTER_VAL(priv->data->pwm_deb->pwm_width));
 839	regmap_write(priv->regmap, ACCDET_PWM_THRESH_ADDR,
 840		     REGISTER_VAL(priv->data->pwm_deb->pwm_thresh));
 841	regmap_write(priv->regmap, ACCDET_RISE_DELAY_ADDR,
 842		     (priv->data->pwm_deb->fall_delay << 15 |
 843		      priv->data->pwm_deb->rise_delay));
 844
 845	regmap_read(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, &reg);
 846	if (priv->data->mic_vol <= 7) {
 847		/* micbias1 <= 2.7V */
 848		regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
 849			     reg | (priv->data->mic_vol << RG_AUDMICBIAS1VREF_SFT) |
 850			     RG_AUDMICBIAS1LOWPEN_MASK_SFT);
 851	} else if (priv->data->mic_vol == 8) {
 852		/* micbias1 = 2.8v */
 853		regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
 854			     reg | (3 << RG_AUDMICBIAS1HVEN_SFT) |
 855			     RG_AUDMICBIAS1LOWPEN_MASK_SFT);
 856	} else if (priv->data->mic_vol == 9) {
 857		/* micbias1 = 2.85v */
 858		regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
 859			     reg | (1 << RG_AUDMICBIAS1HVEN_SFT) |
 860			     RG_AUDMICBIAS1LOWPEN_MASK_SFT);
 861	}
 862	/* mic mode setting */
 863	regmap_read(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR, &reg);
 864	if (priv->data->mic_mode == HEADSET_MODE_1) {
 865		/* ACC mode*/
 866		regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
 867			     reg | RG_ACCDET_MODE_ANA11_MODE1);
 868		/* enable analog fast discharge */
 869		regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
 870				   RG_ANALOGFDEN_MASK_SFT,
 871				   BIT(RG_ANALOGFDEN_SFT));
 872		regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
 873				   0x3 << 11, 0x3 << 11);
 874	} else if (priv->data->mic_mode == HEADSET_MODE_2) {
 875		/* DCC mode Low cost mode without internal bias */
 876		regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
 877			     reg | RG_ACCDET_MODE_ANA11_MODE2);
 878		/* enable analog fast discharge */
 879		regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
 880				   0x3 << RG_ANALOGFDEN_SFT,
 881				   0x3 << RG_ANALOGFDEN_SFT);
 882	} else if (priv->data->mic_mode == HEADSET_MODE_6) {
 883		/* DCC mode Low cost mode with internal bias,
 884		 * bit8 = 1 to use internal bias
 885		 */
 886		regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
 887			     reg | RG_ACCDET_MODE_ANA11_MODE6);
 888		regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
 889				   RG_AUDMICBIAS1DCSW1PEN_MASK_SFT,
 890				   BIT(RG_AUDMICBIAS1DCSW1PEN_SFT));
 891		/* enable analog fast discharge */
 892		regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
 893				   0x3 << RG_ANALOGFDEN_SFT,
 894				   0x3 << RG_ANALOGFDEN_SFT);
 895	}
 896
 897	if (priv->caps & ACCDET_PMIC_EINT_IRQ) {
 898		config_eint_init_by_mode(priv);
 899		config_digital_init_by_mode(priv);
 900	}
 901}
 902
 903int mt6359_accdet_enable_jack_detect(struct snd_soc_component *component,
 904				     struct snd_soc_jack *jack)
 905{
 906	struct mt6359_accdet *priv =
 907		snd_soc_component_get_drvdata(component);
 908
 909	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
 910	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEDOWN);
 911	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
 912	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
 913
 914	priv->jack = jack;
 915
 916	mt6359_accdet_jack_report(priv);
 917
 918	return 0;
 919}
 920EXPORT_SYMBOL_GPL(mt6359_accdet_enable_jack_detect);
 921
 922static int mt6359_accdet_probe(struct platform_device *pdev)
 923{
 924	struct mt6359_accdet *priv;
 925	struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent);
 926	int ret;
 927
 928	dev_dbg(&pdev->dev, "%s(), dev name %s\n",
 929		__func__, dev_name(&pdev->dev));
 930
 931	priv = devm_kzalloc(&pdev->dev, sizeof(struct mt6359_accdet),
 932			    GFP_KERNEL);
 933	if (!priv)
 934		return -ENOMEM;
 935
 936	priv->data = devm_kzalloc(&pdev->dev, sizeof(struct dts_data),
 937				  GFP_KERNEL);
 938	if (!priv->data)
 939		return -ENOMEM;
 940
 941	priv->data->pwm_deb = devm_kzalloc(&pdev->dev,
 942					   sizeof(struct pwm_deb_settings),
 943					   GFP_KERNEL);
 944	if (!priv->data->pwm_deb)
 945		return -ENOMEM;
 946
 947	priv->regmap = mt6397->regmap;
 948	if (IS_ERR(priv->regmap)) {
 949		ret = PTR_ERR(priv->regmap);
 950		dev_err(&pdev->dev, "Failed to allocate register map: %d\n",
 951			ret);
 952		return ret;
 953	}
 954	priv->dev = &pdev->dev;
 955
 956	ret = mt6359_accdet_parse_dt(priv);
 957	if (ret) {
 958		dev_err(&pdev->dev, "Failed to parse dts\n");
 959		return ret;
 960	}
 961	mutex_init(&priv->res_lock);
 962
 963	priv->accdet_irq = platform_get_irq(pdev, 0);
 964	if (priv->accdet_irq >= 0) {
 965		ret = devm_request_threaded_irq(&pdev->dev, priv->accdet_irq,
 966						NULL, mt6359_accdet_irq,
 967						IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
 968						"ACCDET_IRQ", priv);
 969		if (ret) {
 970			dev_err(&pdev->dev,
 971				"Failed to request IRQ: (%d)\n", ret);
 972			return ret;
 973		}
 974	}
 975
 976	if (priv->caps & ACCDET_PMIC_EINT0) {
 977		priv->accdet_eint0 = platform_get_irq(pdev, 1);
 978		if (priv->accdet_eint0 >= 0) {
 979			ret = devm_request_threaded_irq(&pdev->dev,
 980							priv->accdet_eint0,
 981							NULL, mt6359_accdet_irq,
 982							IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
 983							"ACCDET_EINT0", priv);
 984			if (ret) {
 985				dev_err(&pdev->dev,
 986					"Failed to request eint0 IRQ (%d)\n",
 987					ret);
 988				return ret;
 989			}
 990		}
 991	} else if (priv->caps & ACCDET_PMIC_EINT1) {
 992		priv->accdet_eint1 = platform_get_irq(pdev, 2);
 993		if (priv->accdet_eint1 >= 0) {
 994			ret = devm_request_threaded_irq(&pdev->dev,
 995							priv->accdet_eint1,
 996							NULL, mt6359_accdet_irq,
 997							IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
 998							"ACCDET_EINT1", priv);
 999			if (ret) {
1000				dev_err(&pdev->dev,
1001					"Failed to request eint1 IRQ (%d)\n",
1002					ret);
1003				return ret;
1004			}
1005		}
1006	}
1007
1008	priv->accdet_workqueue = create_singlethread_workqueue("accdet");
1009	INIT_WORK(&priv->accdet_work, mt6359_accdet_work);
1010	if (!priv->accdet_workqueue) {
1011		dev_err(&pdev->dev, "Failed to create accdet workqueue\n");
1012		ret = -1;
1013		goto err_accdet_wq;
1014	}
1015
1016	priv->jd_workqueue = create_singlethread_workqueue("mt6359_accdet_jd");
1017	INIT_WORK(&priv->jd_work, mt6359_accdet_jd_work);
1018	if (!priv->jd_workqueue) {
1019		dev_err(&pdev->dev, "Failed to create jack detect workqueue\n");
1020		ret = -1;
1021		goto err_eint_wq;
1022	}
1023
1024	platform_set_drvdata(pdev, priv);
1025	ret = devm_snd_soc_register_component(&pdev->dev,
1026					      &mt6359_accdet_soc_driver,
1027					      NULL, 0);
1028	if (ret) {
1029		dev_err(&pdev->dev, "Failed to register component\n");
1030		return ret;
1031	}
1032
1033	priv->jd_sts = M_PLUG_OUT;
1034	priv->jack_type = 0;
1035	priv->btn_type = 0;
1036	priv->accdet_status = 0x3;
1037	mt6359_accdet_init(priv);
1038
1039	mt6359_accdet_jack_report(priv);
1040
1041	return 0;
1042
1043err_eint_wq:
1044	destroy_workqueue(priv->accdet_workqueue);
1045err_accdet_wq:
1046	dev_err(&pdev->dev, "%s error. now exit.!\n", __func__);
1047	return ret;
1048}
1049
1050static struct platform_driver mt6359_accdet_driver = {
1051	.driver = {
1052		.name = "pmic-codec-accdet",
1053	},
1054	.probe = mt6359_accdet_probe,
1055};
1056
1057module_platform_driver(mt6359_accdet_driver)
1058
1059/* Module information */
1060MODULE_DESCRIPTION("MT6359 ALSA SoC codec jack driver");
1061MODULE_AUTHOR("Argus Lin <argus.lin@mediatek.com>");
1062MODULE_LICENSE("GPL v2");