1 // SPDX-License-Identifier: GPL-2.0
3 // mt6359-accdet.c -- ALSA SoC mt6359 accdet driver
5 // Copyright (C) 2021 MediaTek Inc.
6 // Author: Argus Lin <argus.lin@mediatek.com>
9 #include <linux/of_gpio.h>
11 #include <linux/of_irq.h>
12 #include <linux/of_device.h>
13 #include <linux/of_address.h>
14 #include <linux/input.h>
15 #include <linux/kthread.h>
17 #include <linux/sched/clock.h>
18 #include <linux/workqueue.h>
19 #include <linux/timer.h>
20 #include <linux/delay.h>
21 #include <linux/module.h>
22 #include <linux/platform_device.h>
23 #include <linux/init.h>
24 #include <linux/irqdomain.h>
25 #include <linux/irq.h>
26 #include <linux/regmap.h>
27 #include <sound/soc.h>
28 #include <sound/jack.h>
29 #include <linux/mfd/mt6397/core.h>
31 #include "mt6359-accdet.h"
34 /* global variable definitions */
35 #define REGISTER_VAL(x) ((x) - 1)
37 /* mt6359 accdet capability */
38 #define ACCDET_PMIC_EINT_IRQ BIT(0)
39 #define ACCDET_AP_GPIO_EINT BIT(1)
41 #define ACCDET_PMIC_EINT0 BIT(2)
42 #define ACCDET_PMIC_EINT1 BIT(3)
43 #define ACCDET_PMIC_BI_EINT BIT(4)
45 #define ACCDET_PMIC_GPIO_TRIG_EINT BIT(5)
46 #define ACCDET_PMIC_INVERTER_TRIG_EINT BIT(6)
47 #define ACCDET_PMIC_RSV_EINT BIT(7)
49 #define ACCDET_THREE_KEY BIT(8)
50 #define ACCDET_FOUR_KEY BIT(9)
51 #define ACCDET_TRI_KEY_CDD BIT(10)
52 #define ACCDET_RSV_KEY BIT(11)
54 #define ACCDET_ANALOG_FASTDISCHARGE BIT(12)
55 #define ACCDET_DIGITAL_FASTDISCHARGE BIT(13)
56 #define ACCDET_AD_FASTDISCHRAGE BIT(14)
58 static struct platform_driver mt6359_accdet_driver;
59 static const struct snd_soc_component_driver mt6359_accdet_soc_driver;
61 /* local function declaration */
62 static void accdet_set_debounce(struct mt6359_accdet *priv, int state,
63 unsigned int debounce);
64 static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv);
65 static void config_digital_init_by_mode(struct mt6359_accdet *priv);
66 static void config_eint_init_by_mode(struct mt6359_accdet *priv);
67 static inline void mt6359_accdet_init(struct mt6359_accdet *priv);
68 static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv);
69 static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv);
70 static void mt6359_accdet_jack_report(struct mt6359_accdet *priv);
71 static void recover_eint_analog_setting(struct mt6359_accdet *priv);
72 static void recover_eint_digital_setting(struct mt6359_accdet *priv);
73 static void recover_eint_setting(struct mt6359_accdet *priv);
75 static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv)
77 if (priv->data->eint_detect_mode == 0x3 ||
78 priv->data->eint_detect_mode == 0x4) {
79 /* ESD switches off */
80 regmap_update_bits(priv->regmap,
81 RG_ACCDETSPARE_ADDR, 1 << 8, 0);
83 if (priv->data->eint_detect_mode == 0x4) {
84 if (priv->caps & ACCDET_PMIC_EINT0) {
85 /* enable RG_EINT0CONFIGACCDET */
86 regmap_update_bits(priv->regmap,
87 RG_EINT0CONFIGACCDET_ADDR,
88 RG_EINT0CONFIGACCDET_MASK_SFT,
89 BIT(RG_EINT0CONFIGACCDET_SFT));
90 } else if (priv->caps & ACCDET_PMIC_EINT1) {
91 /* enable RG_EINT1CONFIGACCDET */
92 regmap_update_bits(priv->regmap,
93 RG_EINT1CONFIGACCDET_ADDR,
94 RG_EINT1CONFIGACCDET_MASK_SFT,
95 BIT(RG_EINT1CONFIGACCDET_SFT));
97 if (priv->data->eint_use_ext_res == 0x3 ||
98 priv->data->eint_use_ext_res == 0x4) {
99 /*select 500k, use internal resistor */
100 regmap_update_bits(priv->regmap,
102 RG_EINT0HIRENB_MASK_SFT,
103 BIT(RG_EINT0HIRENB_SFT));
109 static unsigned int adjust_eint_digital_setting(struct mt6359_accdet *priv)
111 if (priv->caps & ACCDET_PMIC_EINT0) {
112 /* disable inverter */
113 regmap_update_bits(priv->regmap,
114 ACCDET_EINT0_INVERTER_SW_EN_ADDR,
115 ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT, 0);
116 } else if (priv->caps & ACCDET_PMIC_EINT1) {
117 /* disable inverter */
118 regmap_update_bits(priv->regmap,
119 ACCDET_EINT1_INVERTER_SW_EN_ADDR,
120 ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT, 0);
123 if (priv->data->eint_detect_mode == 0x4) {
124 if (priv->caps & ACCDET_PMIC_EINT0) {
125 /* set DA stable signal */
126 regmap_update_bits(priv->regmap,
127 ACCDET_DA_STABLE_ADDR,
128 ACCDET_EINT0_CEN_STABLE_MASK_SFT, 0);
129 } else if (priv->caps & ACCDET_PMIC_EINT1) {
130 /* set DA stable signal */
131 regmap_update_bits(priv->regmap,
132 ACCDET_DA_STABLE_ADDR,
133 ACCDET_EINT1_CEN_STABLE_MASK_SFT, 0);
139 static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv)
141 if (priv->jd_sts == M_PLUG_IN) {
142 /* adjust digital setting */
143 adjust_eint_digital_setting(priv);
144 /* adjust analog setting */
145 adjust_eint_analog_setting(priv);
146 } else if (priv->jd_sts == M_PLUG_OUT) {
147 /* set debounce to 1ms */
148 accdet_set_debounce(priv, eint_state000,
149 priv->data->pwm_deb->eint_debounce0);
151 dev_dbg(priv->dev, "should not be here %s()\n", __func__);
157 static void recover_eint_analog_setting(struct mt6359_accdet *priv)
159 if (priv->data->eint_detect_mode == 0x3 ||
160 priv->data->eint_detect_mode == 0x4) {
161 /* ESD switches on */
162 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
165 if (priv->data->eint_detect_mode == 0x4) {
166 if (priv->caps & ACCDET_PMIC_EINT0) {
167 /* disable RG_EINT0CONFIGACCDET */
168 regmap_update_bits(priv->regmap,
169 RG_EINT0CONFIGACCDET_ADDR,
170 RG_EINT0CONFIGACCDET_MASK_SFT, 0);
171 } else if (priv->caps & ACCDET_PMIC_EINT1) {
172 /* disable RG_EINT1CONFIGACCDET */
173 regmap_update_bits(priv->regmap,
174 RG_EINT1CONFIGACCDET_ADDR,
175 RG_EINT1CONFIGACCDET_MASK_SFT, 0);
177 regmap_update_bits(priv->regmap, RG_EINT0HIRENB_ADDR,
178 RG_EINT0HIRENB_MASK_SFT, 0);
182 static void recover_eint_digital_setting(struct mt6359_accdet *priv)
184 if (priv->caps & ACCDET_PMIC_EINT0) {
185 regmap_update_bits(priv->regmap,
186 ACCDET_EINT0_M_SW_EN_ADDR,
187 ACCDET_EINT0_M_SW_EN_MASK_SFT, 0);
188 } else if (priv->caps & ACCDET_PMIC_EINT1) {
189 regmap_update_bits(priv->regmap,
190 ACCDET_EINT1_M_SW_EN_ADDR,
191 ACCDET_EINT1_M_SW_EN_MASK_SFT, 0);
193 if (priv->data->eint_detect_mode == 0x4) {
194 /* enable eint0cen */
195 if (priv->caps & ACCDET_PMIC_EINT0) {
196 /* enable eint0cen */
197 regmap_update_bits(priv->regmap,
198 ACCDET_DA_STABLE_ADDR,
199 ACCDET_EINT0_CEN_STABLE_MASK_SFT,
200 BIT(ACCDET_EINT0_CEN_STABLE_SFT));
201 } else if (priv->caps & ACCDET_PMIC_EINT1) {
202 /* enable eint1cen */
203 regmap_update_bits(priv->regmap,
204 ACCDET_DA_STABLE_ADDR,
205 ACCDET_EINT1_CEN_STABLE_MASK_SFT,
206 BIT(ACCDET_EINT1_CEN_STABLE_SFT));
210 if (priv->data->eint_detect_mode != 0x1) {
211 if (priv->caps & ACCDET_PMIC_EINT0) {
212 /* enable inverter */
213 regmap_update_bits(priv->regmap,
214 ACCDET_EINT0_INVERTER_SW_EN_ADDR,
215 ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT,
216 BIT(ACCDET_EINT0_INVERTER_SW_EN_SFT));
217 } else if (priv->caps & ACCDET_PMIC_EINT1) {
218 /* enable inverter */
219 regmap_update_bits(priv->regmap,
220 ACCDET_EINT1_INVERTER_SW_EN_ADDR,
221 ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT,
222 BIT(ACCDET_EINT1_INVERTER_SW_EN_SFT));
227 static void recover_eint_setting(struct mt6359_accdet *priv)
229 if (priv->jd_sts == M_PLUG_OUT) {
230 recover_eint_analog_setting(priv);
231 recover_eint_digital_setting(priv);
235 static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv)
238 unsigned int value = 0;
240 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
241 ACCDET_IRQ_CLR_MASK_SFT, BIT(ACCDET_IRQ_CLR_SFT));
242 usleep_range(200, 300);
243 ret = regmap_read_poll_timeout(priv->regmap,
246 (value & ACCDET_IRQ_MASK_SFT) == 0,
250 dev_warn(priv->dev, "%s(), ret %d\n", __func__, ret);
251 /* clear accdet int, modify for fix interrupt trigger twice error */
252 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
253 ACCDET_IRQ_CLR_MASK_SFT, 0);
254 regmap_update_bits(priv->regmap, RG_INT_STATUS_ACCDET_ADDR,
255 RG_INT_STATUS_ACCDET_MASK_SFT,
256 BIT(RG_INT_STATUS_ACCDET_SFT));
258 /* recover accdet debounce0,3 */
259 accdet_set_debounce(priv, accdet_state000,
260 priv->data->pwm_deb->debounce0);
261 accdet_set_debounce(priv, accdet_state001,
262 priv->data->pwm_deb->debounce1);
263 accdet_set_debounce(priv, accdet_state011,
264 priv->data->pwm_deb->debounce3);
268 priv->accdet_status = 0x3;
269 mt6359_accdet_jack_report(priv);
272 static void accdet_set_debounce(struct mt6359_accdet *priv, int state,
273 unsigned int debounce)
276 case accdet_state000:
277 regmap_write(priv->regmap, ACCDET_DEBOUNCE0_ADDR, debounce);
279 case accdet_state001:
280 regmap_write(priv->regmap, ACCDET_DEBOUNCE1_ADDR, debounce);
282 case accdet_state010:
283 regmap_write(priv->regmap, ACCDET_DEBOUNCE2_ADDR, debounce);
285 case accdet_state011:
286 regmap_write(priv->regmap, ACCDET_DEBOUNCE3_ADDR, debounce);
289 regmap_write(priv->regmap,
290 ACCDET_CONNECT_AUXADC_TIME_DIG_ADDR, debounce);
293 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE0_ADDR,
294 0xF << ACCDET_EINT_DEBOUNCE0_SFT,
295 debounce << ACCDET_EINT_DEBOUNCE0_SFT);
298 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE1_ADDR,
299 0xF << ACCDET_EINT_DEBOUNCE1_SFT,
300 debounce << ACCDET_EINT_DEBOUNCE1_SFT);
303 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE2_ADDR,
304 0xF << ACCDET_EINT_DEBOUNCE2_SFT,
305 debounce << ACCDET_EINT_DEBOUNCE2_SFT);
308 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE3_ADDR,
309 0xF << ACCDET_EINT_DEBOUNCE3_SFT,
310 debounce << ACCDET_EINT_DEBOUNCE3_SFT);
312 case eint_inverter_state000:
313 regmap_write(priv->regmap, ACCDET_EINT_INVERTER_DEBOUNCE_ADDR,
317 dev_warn(priv->dev, "Error: %s error state (%d)\n", __func__,
323 static void mt6359_accdet_jack_report(struct mt6359_accdet *priv)
330 report = priv->jack_type | priv->btn_type;
331 snd_soc_jack_report(priv->jack, report, MT6359_ACCDET_JACK_MASK);
334 static unsigned int check_button(struct mt6359_accdet *priv, unsigned int v)
336 if (priv->caps & ACCDET_FOUR_KEY) {
337 if (v < priv->data->four_key.down &&
338 v >= priv->data->four_key.up)
339 priv->btn_type = SND_JACK_BTN_1;
340 if (v < priv->data->four_key.up &&
341 v >= priv->data->four_key.voice)
342 priv->btn_type = SND_JACK_BTN_2;
343 if (v < priv->data->four_key.voice &&
344 v >= priv->data->four_key.mid)
345 priv->btn_type = SND_JACK_BTN_3;
346 if (v < priv->data->four_key.mid)
347 priv->btn_type = SND_JACK_BTN_0;
349 if (v < priv->data->three_key.down &&
350 v >= priv->data->three_key.up)
351 priv->btn_type = SND_JACK_BTN_1;
352 if (v < priv->data->three_key.up &&
353 v >= priv->data->three_key.mid)
354 priv->btn_type = SND_JACK_BTN_2;
355 if (v < priv->data->three_key.mid)
356 priv->btn_type = SND_JACK_BTN_0;
361 static void is_key_pressed(struct mt6359_accdet *priv, bool pressed)
363 priv->btn_type = priv->jack_type & ~MT6359_ACCDET_BTN_MASK;
366 check_button(priv, priv->cali_voltage);
369 static inline void check_jack_btn_type(struct mt6359_accdet *priv)
371 unsigned int val = 0;
373 regmap_read(priv->regmap, ACCDET_MEM_IN_ADDR, &val);
375 priv->accdet_status =
376 (val >> ACCDET_STATE_MEM_IN_OFFSET) & ACCDET_STATE_AB_MASK;
378 switch (priv->accdet_status) {
380 if (priv->jack_type == SND_JACK_HEADSET)
381 is_key_pressed(priv, true);
383 priv->jack_type = SND_JACK_HEADPHONE;
386 if (priv->jack_type == SND_JACK_HEADSET) {
387 is_key_pressed(priv, false);
389 priv->jack_type = SND_JACK_HEADSET;
390 accdet_set_debounce(priv, eint_state011, 0x1);
400 static void mt6359_accdet_work(struct work_struct *work)
402 struct mt6359_accdet *priv =
403 container_of(work, struct mt6359_accdet, accdet_work);
405 mutex_lock(&priv->res_lock);
406 priv->pre_accdet_status = priv->accdet_status;
407 check_jack_btn_type(priv);
409 if (priv->jack_plugged &&
410 priv->pre_accdet_status != priv->accdet_status)
411 mt6359_accdet_jack_report(priv);
412 mutex_unlock(&priv->res_lock);
415 static void mt6359_accdet_jd_work(struct work_struct *work)
418 unsigned int value = 0;
420 struct mt6359_accdet *priv =
421 container_of(work, struct mt6359_accdet, jd_work);
423 mutex_lock(&priv->res_lock);
424 if (priv->jd_sts == M_PLUG_IN) {
425 priv->jack_plugged = true;
427 /* set and clear initial bit every eint interrupt */
428 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
429 ACCDET_SEQ_INIT_MASK_SFT,
430 BIT(ACCDET_SEQ_INIT_SFT));
431 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
432 ACCDET_SEQ_INIT_MASK_SFT, 0);
433 ret = regmap_read_poll_timeout(priv->regmap,
434 ACCDET_SEQ_INIT_ADDR,
436 (value & ACCDET_SEQ_INIT_MASK_SFT) == 0,
440 dev_err(priv->dev, "%s(), ret %d\n", __func__, ret);
442 /* enable ACCDET unit */
443 regmap_update_bits(priv->regmap, ACCDET_SW_EN_ADDR,
444 ACCDET_SW_EN_MASK_SFT, BIT(ACCDET_SW_EN_SFT));
445 } else if (priv->jd_sts == M_PLUG_OUT) {
446 priv->jack_plugged = false;
448 accdet_set_debounce(priv, accdet_state011,
449 priv->data->pwm_deb->debounce3);
450 regmap_update_bits(priv->regmap, ACCDET_SW_EN_ADDR,
451 ACCDET_SW_EN_MASK_SFT, 0);
452 mt6359_accdet_recover_jd_setting(priv);
455 if (priv->caps & ACCDET_PMIC_EINT_IRQ)
456 recover_eint_setting(priv);
457 mutex_unlock(&priv->res_lock);
460 static irqreturn_t mt6359_accdet_irq(int irq, void *data)
462 struct mt6359_accdet *priv = data;
463 unsigned int irq_val = 0, val = 0, value = 0;
466 mutex_lock(&priv->res_lock);
467 regmap_read(priv->regmap, ACCDET_IRQ_ADDR, &irq_val);
469 if (irq_val & ACCDET_IRQ_MASK_SFT) {
470 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
471 ACCDET_IRQ_CLR_MASK_SFT,
472 BIT(ACCDET_IRQ_CLR_SFT));
473 ret = regmap_read_poll_timeout(priv->regmap,
476 (value & ACCDET_IRQ_MASK_SFT) == 0,
480 dev_err(priv->dev, "%s(), ret %d\n", __func__, ret);
481 mutex_unlock(&priv->res_lock);
484 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
485 ACCDET_IRQ_CLR_MASK_SFT, 0);
486 regmap_update_bits(priv->regmap, RG_INT_STATUS_ACCDET_ADDR,
487 RG_INT_STATUS_ACCDET_MASK_SFT,
488 BIT(RG_INT_STATUS_ACCDET_SFT));
490 queue_work(priv->accdet_workqueue, &priv->accdet_work);
492 if (irq_val & ACCDET_EINT0_IRQ_MASK_SFT) {
493 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
494 ACCDET_EINT0_IRQ_CLR_MASK_SFT,
495 BIT(ACCDET_EINT0_IRQ_CLR_SFT));
496 ret = regmap_read_poll_timeout(priv->regmap,
499 (value & ACCDET_EINT0_IRQ_MASK_SFT) == 0,
503 dev_err(priv->dev, "%s(), ret %d\n", __func__,
505 mutex_unlock(&priv->res_lock);
508 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
509 ACCDET_EINT0_IRQ_CLR_MASK_SFT, 0);
510 regmap_update_bits(priv->regmap,
511 RG_INT_STATUS_ACCDET_ADDR,
512 RG_INT_STATUS_ACCDET_EINT0_MASK_SFT,
513 BIT(RG_INT_STATUS_ACCDET_EINT0_SFT));
515 if (irq_val & ACCDET_EINT1_IRQ_MASK_SFT) {
516 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
517 ACCDET_EINT1_IRQ_CLR_MASK_SFT,
518 BIT(ACCDET_EINT1_IRQ_CLR_SFT));
519 ret = regmap_read_poll_timeout(priv->regmap,
522 (value & ACCDET_EINT1_IRQ_MASK_SFT) == 0,
526 dev_err(priv->dev, "%s(), ret %d\n", __func__,
528 mutex_unlock(&priv->res_lock);
531 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
532 ACCDET_EINT1_IRQ_CLR_MASK_SFT, 0);
533 regmap_update_bits(priv->regmap,
534 RG_INT_STATUS_ACCDET_ADDR,
535 RG_INT_STATUS_ACCDET_EINT1_MASK_SFT,
536 BIT(RG_INT_STATUS_ACCDET_EINT1_SFT));
538 /* get jack detection status */
539 regmap_read(priv->regmap, ACCDET_EINT0_MEM_IN_ADDR, &val);
540 priv->jd_sts = ((val >> ACCDET_EINT0_MEM_IN_SFT) &
541 ACCDET_EINT0_MEM_IN_MASK);
542 /* adjust eint digital/analog setting */
543 mt6359_accdet_jd_setting(priv);
545 queue_work(priv->jd_workqueue, &priv->jd_work);
547 mutex_unlock(&priv->res_lock);
552 static int mt6359_accdet_parse_dt(struct mt6359_accdet *priv)
555 struct device *dev = priv->dev;
556 struct device_node *node = NULL;
557 int pwm_deb[15] = {0};
558 unsigned int tmp = 0;
560 node = of_get_child_by_name(dev->parent->of_node, "accdet");
564 ret = of_property_read_u32(node, "mediatek,mic-vol",
565 &priv->data->mic_vol);
567 priv->data->mic_vol = 8;
569 ret = of_property_read_u32(node, "mediatek,plugout-debounce",
570 &priv->data->plugout_deb);
572 priv->data->plugout_deb = 1;
574 ret = of_property_read_u32(node, "mediatek,mic-mode",
575 &priv->data->mic_mode);
577 priv->data->mic_mode = 2;
579 ret = of_property_read_u32_array(node, "mediatek,pwm-deb-setting",
580 pwm_deb, ARRAY_SIZE(pwm_deb));
581 /* debounce8(auxadc debounce) is default, needn't get from dts */
583 memcpy(priv->data->pwm_deb, pwm_deb, sizeof(pwm_deb));
585 ret = of_property_read_u32(node, "mediatek,eint-level-pol",
586 &priv->data->eint_pol);
588 priv->data->eint_pol = 8;
590 ret = of_property_read_u32(node, "mediatek,eint-use-ap", &tmp);
594 priv->caps |= ACCDET_PMIC_EINT_IRQ;
596 priv->caps |= ACCDET_AP_GPIO_EINT;
598 ret = of_property_read_u32(node, "mediatek,eint-detect-mode",
599 &priv->data->eint_detect_mode);
601 /* eint detection mode equals to EINT HW Mode */
602 priv->data->eint_detect_mode = 0x4;
605 ret = of_property_read_u32(node, "mediatek,eint-num", &tmp);
609 priv->caps |= ACCDET_PMIC_EINT0;
611 priv->caps |= ACCDET_PMIC_EINT1;
613 priv->caps |= ACCDET_PMIC_BI_EINT;
615 ret = of_property_read_u32(node, "mediatek,eint-trig-mode",
620 priv->caps |= ACCDET_PMIC_GPIO_TRIG_EINT;
622 priv->caps |= ACCDET_PMIC_INVERTER_TRIG_EINT;
624 ret = of_property_read_u32(node, "mediatek,eint-use-ext-res",
625 &priv->data->eint_use_ext_res);
627 /* eint use internal resister */
628 priv->data->eint_use_ext_res = 0x0;
631 ret = of_property_read_u32(node, "mediatek,eint-comp-vth",
632 &priv->data->eint_comp_vth);
634 priv->data->eint_comp_vth = 0x0;
636 ret = of_property_read_u32(node, "mediatek,key-mode", &tmp);
642 priv->caps |= ACCDET_THREE_KEY;
643 ret = of_property_read_u32_array(node,
644 "mediatek,three-key-thr",
646 ARRAY_SIZE(three_key));
648 memcpy(&priv->data->three_key, three_key + 1,
649 sizeof(struct three_key_threshold));
650 } else if (tmp == 1) {
653 priv->caps |= ACCDET_FOUR_KEY;
654 ret = of_property_read_u32_array(node,
655 "mediatek,four-key-thr",
657 ARRAY_SIZE(four_key));
659 memcpy(&priv->data->four_key, four_key + 1,
660 sizeof(struct four_key_threshold));
663 "accdet no 4-key-thrsh dts, use efuse\n");
665 } else if (tmp == 2) {
668 priv->caps |= ACCDET_TRI_KEY_CDD;
669 ret = of_property_read_u32_array(node,
670 "mediatek,tri-key-cdd-thr",
672 ARRAY_SIZE(three_key));
674 memcpy(&priv->data->three_key, three_key + 1,
675 sizeof(struct three_key_threshold));
678 dev_warn(priv->dev, "accdet caps=%x\n", priv->caps);
683 static void config_digital_init_by_mode(struct mt6359_accdet *priv)
685 /* enable eint cmpmem pwm */
686 regmap_write(priv->regmap, ACCDET_EINT_CMPMEN_PWM_THRESH_ADDR,
687 (priv->data->pwm_deb->eint_pwm_width << 4 |
688 priv->data->pwm_deb->eint_pwm_thresh));
689 /* DA signal stable */
690 if (priv->caps & ACCDET_PMIC_EINT0) {
691 regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR,
692 ACCDET_EINT0_STABLE_VAL);
693 } else if (priv->caps & ACCDET_PMIC_EINT1) {
694 regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR,
695 ACCDET_EINT1_STABLE_VAL);
697 /* after receive n+1 number, interrupt issued. */
698 regmap_update_bits(priv->regmap, ACCDET_EINT_M_PLUG_IN_NUM_ADDR,
699 ACCDET_EINT_M_PLUG_IN_NUM_MASK_SFT,
700 BIT(ACCDET_EINT_M_PLUG_IN_NUM_SFT));
701 /* setting HW mode, enable digital fast discharge
702 * if use EINT0 & EINT1 detection, please modify
703 * ACCDET_HWMODE_EN_ADDR[2:1]
705 regmap_write(priv->regmap, ACCDET_HWMODE_EN_ADDR, 0x100);
707 regmap_update_bits(priv->regmap, ACCDET_EINT_M_DETECT_EN_ADDR,
708 ACCDET_EINT_M_DETECT_EN_MASK_SFT, 0);
711 regmap_write(priv->regmap, ACCDET_CMP_PWM_EN_ADDR, 0x67);
712 /* enable inverter detection */
713 if (priv->data->eint_detect_mode == 0x1) {
714 /* disable inverter detection */
715 if (priv->caps & ACCDET_PMIC_EINT0) {
716 regmap_update_bits(priv->regmap,
717 ACCDET_EINT0_INVERTER_SW_EN_ADDR,
718 ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT,
720 } else if (priv->caps & ACCDET_PMIC_EINT1) {
721 regmap_update_bits(priv->regmap,
722 ACCDET_EINT1_INVERTER_SW_EN_ADDR,
723 ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT,
727 if (priv->caps & ACCDET_PMIC_EINT0) {
728 regmap_update_bits(priv->regmap,
729 ACCDET_EINT0_INVERTER_SW_EN_ADDR,
730 ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT,
731 BIT(ACCDET_EINT0_INVERTER_SW_EN_SFT));
732 } else if (priv->caps & ACCDET_PMIC_EINT1) {
733 regmap_update_bits(priv->regmap,
734 ACCDET_EINT1_INVERTER_SW_EN_ADDR,
735 ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT,
736 BIT(ACCDET_EINT1_INVERTER_SW_EN_SFT));
741 static void config_eint_init_by_mode(struct mt6359_accdet *priv)
743 unsigned int val = 0;
745 if (priv->caps & ACCDET_PMIC_EINT0) {
746 regmap_update_bits(priv->regmap, RG_EINT0EN_ADDR,
747 RG_EINT0EN_MASK_SFT, BIT(RG_EINT0EN_SFT));
748 } else if (priv->caps & ACCDET_PMIC_EINT1) {
749 regmap_update_bits(priv->regmap, RG_EINT1EN_ADDR,
750 RG_EINT1EN_MASK_SFT, BIT(RG_EINT1EN_SFT));
752 /* ESD switches on */
753 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
755 /* before playback, set NCP pull low before nagative voltage */
756 regmap_update_bits(priv->regmap, RG_NCP_PDDIS_EN_ADDR,
757 RG_NCP_PDDIS_EN_MASK_SFT, BIT(RG_NCP_PDDIS_EN_SFT));
759 if (priv->data->eint_detect_mode == 0x1 ||
760 priv->data->eint_detect_mode == 0x2 ||
761 priv->data->eint_detect_mode == 0x3) {
762 if (priv->data->eint_use_ext_res == 0x1) {
763 if (priv->caps & ACCDET_PMIC_EINT0) {
764 regmap_update_bits(priv->regmap,
765 RG_EINT0CONFIGACCDET_ADDR,
766 RG_EINT0CONFIGACCDET_MASK_SFT,
768 } else if (priv->caps & ACCDET_PMIC_EINT1) {
769 regmap_update_bits(priv->regmap,
770 RG_EINT1CONFIGACCDET_ADDR,
771 RG_EINT1CONFIGACCDET_MASK_SFT,
775 if (priv->caps & ACCDET_PMIC_EINT0) {
776 regmap_update_bits(priv->regmap,
777 RG_EINT0CONFIGACCDET_ADDR,
778 RG_EINT0CONFIGACCDET_MASK_SFT,
779 BIT(RG_EINT0CONFIGACCDET_SFT));
780 } else if (priv->caps & ACCDET_PMIC_EINT1) {
781 regmap_update_bits(priv->regmap,
782 RG_EINT1CONFIGACCDET_ADDR,
783 RG_EINT1CONFIGACCDET_MASK_SFT,
784 BIT(RG_EINT1CONFIGACCDET_SFT));
789 if (priv->data->eint_detect_mode != 0x1) {
790 /* current detect set 0.25uA */
791 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
792 0x3 << RG_ACCDETSPARE_SFT,
793 0x3 << RG_ACCDETSPARE_SFT);
795 regmap_write(priv->regmap, RG_EINTCOMPVTH_ADDR,
796 val | priv->data->eint_comp_vth << RG_EINTCOMPVTH_SFT);
799 static void mt6359_accdet_init(struct mt6359_accdet *priv)
801 unsigned int reg = 0;
803 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
804 ACCDET_SEQ_INIT_MASK_SFT, BIT(ACCDET_SEQ_INIT_SFT));
806 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
807 ACCDET_SEQ_INIT_MASK_SFT, 0);
809 /* init the debounce time (debounce/32768)sec */
810 accdet_set_debounce(priv, accdet_state000,
811 priv->data->pwm_deb->debounce0);
812 accdet_set_debounce(priv, accdet_state001,
813 priv->data->pwm_deb->debounce1);
814 accdet_set_debounce(priv, accdet_state011,
815 priv->data->pwm_deb->debounce3);
816 accdet_set_debounce(priv, accdet_auxadc,
817 priv->data->pwm_deb->debounce4);
819 accdet_set_debounce(priv, eint_state000,
820 priv->data->pwm_deb->eint_debounce0);
821 accdet_set_debounce(priv, eint_state001,
822 priv->data->pwm_deb->eint_debounce1);
823 accdet_set_debounce(priv, eint_state011,
824 priv->data->pwm_deb->eint_debounce3);
825 accdet_set_debounce(priv, eint_inverter_state000,
826 priv->data->pwm_deb->eint_inverter_debounce);
828 regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR,
829 RG_ACCDET_RST_MASK_SFT, BIT(RG_ACCDET_RST_SFT));
830 regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR,
831 RG_ACCDET_RST_MASK_SFT, 0);
833 /* clear high micbias1 voltage setting */
834 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
835 0x3 << RG_AUDMICBIAS1HVEN_SFT, 0);
836 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
837 0x7 << RG_AUDMICBIAS1VREF_SFT, 0);
839 /* init pwm frequency, duty & rise/falling delay */
840 regmap_write(priv->regmap, ACCDET_PWM_WIDTH_ADDR,
841 REGISTER_VAL(priv->data->pwm_deb->pwm_width));
842 regmap_write(priv->regmap, ACCDET_PWM_THRESH_ADDR,
843 REGISTER_VAL(priv->data->pwm_deb->pwm_thresh));
844 regmap_write(priv->regmap, ACCDET_RISE_DELAY_ADDR,
845 (priv->data->pwm_deb->fall_delay << 15 |
846 priv->data->pwm_deb->rise_delay));
848 regmap_read(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, ®);
849 if (priv->data->mic_vol <= 7) {
850 /* micbias1 <= 2.7V */
851 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
852 reg | (priv->data->mic_vol << RG_AUDMICBIAS1VREF_SFT) |
853 RG_AUDMICBIAS1LOWPEN_MASK_SFT);
854 } else if (priv->data->mic_vol == 8) {
855 /* micbias1 = 2.8v */
856 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
857 reg | (3 << RG_AUDMICBIAS1HVEN_SFT) |
858 RG_AUDMICBIAS1LOWPEN_MASK_SFT);
859 } else if (priv->data->mic_vol == 9) {
860 /* micbias1 = 2.85v */
861 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
862 reg | (1 << RG_AUDMICBIAS1HVEN_SFT) |
863 RG_AUDMICBIAS1LOWPEN_MASK_SFT);
865 /* mic mode setting */
866 regmap_read(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR, ®);
867 if (priv->data->mic_mode == HEADSET_MODE_1) {
869 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
870 reg | RG_ACCDET_MODE_ANA11_MODE1);
871 /* enable analog fast discharge */
872 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
873 RG_ANALOGFDEN_MASK_SFT,
874 BIT(RG_ANALOGFDEN_SFT));
875 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
876 0x3 << 11, 0x3 << 11);
877 } else if (priv->data->mic_mode == HEADSET_MODE_2) {
878 /* DCC mode Low cost mode without internal bias */
879 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
880 reg | RG_ACCDET_MODE_ANA11_MODE2);
881 /* enable analog fast discharge */
882 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
883 0x3 << RG_ANALOGFDEN_SFT,
884 0x3 << RG_ANALOGFDEN_SFT);
885 } else if (priv->data->mic_mode == HEADSET_MODE_6) {
886 /* DCC mode Low cost mode with internal bias,
887 * bit8 = 1 to use internal bias
889 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
890 reg | RG_ACCDET_MODE_ANA11_MODE6);
891 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
892 RG_AUDMICBIAS1DCSW1PEN_MASK_SFT,
893 BIT(RG_AUDMICBIAS1DCSW1PEN_SFT));
894 /* enable analog fast discharge */
895 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
896 0x3 << RG_ANALOGFDEN_SFT,
897 0x3 << RG_ANALOGFDEN_SFT);
900 if (priv->caps & ACCDET_PMIC_EINT_IRQ) {
901 config_eint_init_by_mode(priv);
902 config_digital_init_by_mode(priv);
906 int mt6359_accdet_enable_jack_detect(struct snd_soc_component *component,
907 struct snd_soc_jack *jack)
909 struct mt6359_accdet *priv =
910 snd_soc_component_get_drvdata(component);
912 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
913 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEDOWN);
914 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
915 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
919 mt6359_accdet_jack_report(priv);
923 EXPORT_SYMBOL_GPL(mt6359_accdet_enable_jack_detect);
925 static int mt6359_accdet_probe(struct platform_device *pdev)
927 struct mt6359_accdet *priv;
928 struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent);
931 dev_dbg(&pdev->dev, "%s(), dev name %s\n",
932 __func__, dev_name(&pdev->dev));
934 priv = devm_kzalloc(&pdev->dev, sizeof(struct mt6359_accdet),
939 priv->data = devm_kzalloc(&pdev->dev, sizeof(struct dts_data),
944 priv->data->pwm_deb = devm_kzalloc(&pdev->dev,
945 sizeof(struct pwm_deb_settings),
947 if (!priv->data->pwm_deb)
950 priv->regmap = mt6397->regmap;
951 if (IS_ERR(priv->regmap)) {
952 ret = PTR_ERR(priv->regmap);
953 dev_err(&pdev->dev, "Failed to allocate register map: %d\n",
957 priv->dev = &pdev->dev;
959 ret = mt6359_accdet_parse_dt(priv);
961 dev_err(&pdev->dev, "Failed to parse dts\n");
964 mutex_init(&priv->res_lock);
966 priv->accdet_irq = platform_get_irq(pdev, 0);
967 if (priv->accdet_irq) {
968 ret = devm_request_threaded_irq(&pdev->dev, priv->accdet_irq,
969 NULL, mt6359_accdet_irq,
970 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
974 "Failed to request IRQ: (%d)\n", ret);
979 if (priv->caps & ACCDET_PMIC_EINT0) {
980 priv->accdet_eint0 = platform_get_irq(pdev, 1);
981 if (priv->accdet_eint0) {
982 ret = devm_request_threaded_irq(&pdev->dev,
984 NULL, mt6359_accdet_irq,
985 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
986 "ACCDET_EINT0", priv);
989 "Failed to request eint0 IRQ (%d)\n",
994 } else if (priv->caps & ACCDET_PMIC_EINT1) {
995 priv->accdet_eint1 = platform_get_irq(pdev, 2);
996 if (priv->accdet_eint1) {
997 ret = devm_request_threaded_irq(&pdev->dev,
999 NULL, mt6359_accdet_irq,
1000 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
1001 "ACCDET_EINT1", priv);
1004 "Failed to request eint1 IRQ (%d)\n",
1011 priv->accdet_workqueue = create_singlethread_workqueue("accdet");
1012 INIT_WORK(&priv->accdet_work, mt6359_accdet_work);
1013 if (!priv->accdet_workqueue) {
1014 dev_err(&pdev->dev, "Failed to create accdet workqueue\n");
1019 priv->jd_workqueue = create_singlethread_workqueue("mt6359_accdet_jd");
1020 INIT_WORK(&priv->jd_work, mt6359_accdet_jd_work);
1021 if (!priv->jd_workqueue) {
1022 dev_err(&pdev->dev, "Failed to create jack detect workqueue\n");
1027 platform_set_drvdata(pdev, priv);
1028 ret = devm_snd_soc_register_component(&pdev->dev,
1029 &mt6359_accdet_soc_driver,
1032 dev_err(&pdev->dev, "Failed to register component\n");
1036 priv->jd_sts = M_PLUG_OUT;
1037 priv->jack_type = 0;
1039 priv->accdet_status = 0x3;
1040 mt6359_accdet_init(priv);
1042 mt6359_accdet_jack_report(priv);
1047 destroy_workqueue(priv->accdet_workqueue);
1049 dev_err(&pdev->dev, "%s error. now exit.!\n", __func__);
1053 static struct platform_driver mt6359_accdet_driver = {
1055 .name = "pmic-codec-accdet",
1057 .probe = mt6359_accdet_probe,
1060 module_platform_driver(mt6359_accdet_driver)
1062 /* Module information */
1063 MODULE_DESCRIPTION("MT6359 ALSA SoC codec jack driver");
1064 MODULE_AUTHOR("Argus Lin <argus.lin@mediatek.com>");
1065 MODULE_LICENSE("GPL v2");