mt6359-accdet.c 32 KB

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