1
2
3
4
5
6
7
8
9#include <linux/of_gpio.h>
10#include <linux/of.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>
16#include <linux/io.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>
30
31#include "mt6359-accdet.h"
32#include "mt6359.h"
33
34
35#define REGISTER_VAL(x) ((x) - 1)
36
37
38#define ACCDET_PMIC_EINT_IRQ BIT(0)
39#define ACCDET_AP_GPIO_EINT BIT(1)
40
41#define ACCDET_PMIC_EINT0 BIT(2)
42#define ACCDET_PMIC_EINT1 BIT(3)
43#define ACCDET_PMIC_BI_EINT BIT(4)
44
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)
48
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)
53
54#define ACCDET_ANALOG_FASTDISCHARGE BIT(12)
55#define ACCDET_DIGITAL_FASTDISCHARGE BIT(13)
56#define ACCDET_AD_FASTDISCHRAGE BIT(14)
57
58static struct platform_driver mt6359_accdet_driver;
59static const struct snd_soc_component_driver mt6359_accdet_soc_driver;
60
61
62static void accdet_set_debounce(struct mt6359_accdet *priv, int state,
63 unsigned int debounce);
64static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv);
65static void config_digital_init_by_mode(struct mt6359_accdet *priv);
66static void config_eint_init_by_mode(struct mt6359_accdet *priv);
67static inline void mt6359_accdet_init(struct mt6359_accdet *priv);
68static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv);
69static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv);
70static void mt6359_accdet_jack_report(struct mt6359_accdet *priv);
71static void recover_eint_analog_setting(struct mt6359_accdet *priv);
72static void recover_eint_digital_setting(struct mt6359_accdet *priv);
73static void recover_eint_setting(struct mt6359_accdet *priv);
74
75static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv)
76{
77 if (priv->data->eint_detect_mode == 0x3 ||
78 priv->data->eint_detect_mode == 0x4) {
79
80 regmap_update_bits(priv->regmap,
81 RG_ACCDETSPARE_ADDR, 1 << 8, 0);
82 }
83 if (priv->data->eint_detect_mode == 0x4) {
84 if (priv->caps & ACCDET_PMIC_EINT0) {
85
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
92 regmap_update_bits(priv->regmap,
93 RG_EINT1CONFIGACCDET_ADDR,
94 RG_EINT1CONFIGACCDET_MASK_SFT,
95 BIT(RG_EINT1CONFIGACCDET_SFT));
96 }
97 if (priv->data->eint_use_ext_res == 0x3 ||
98 priv->data->eint_use_ext_res == 0x4) {
99
100 regmap_update_bits(priv->regmap,
101 RG_EINT0HIRENB_ADDR,
102 RG_EINT0HIRENB_MASK_SFT,
103 BIT(RG_EINT0HIRENB_SFT));
104 }
105 }
106 return 0;
107}
108
109static unsigned int adjust_eint_digital_setting(struct mt6359_accdet *priv)
110{
111 if (priv->caps & ACCDET_PMIC_EINT0) {
112
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
118 regmap_update_bits(priv->regmap,
119 ACCDET_EINT1_INVERTER_SW_EN_ADDR,
120 ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT, 0);
121 }
122
123 if (priv->data->eint_detect_mode == 0x4) {
124 if (priv->caps & ACCDET_PMIC_EINT0) {
125
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
131 regmap_update_bits(priv->regmap,
132 ACCDET_DA_STABLE_ADDR,
133 ACCDET_EINT1_CEN_STABLE_MASK_SFT, 0);
134 }
135 }
136 return 0;
137}
138
139static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv)
140{
141 if (priv->jd_sts == M_PLUG_IN) {
142
143 adjust_eint_digital_setting(priv);
144
145 adjust_eint_analog_setting(priv);
146 } else if (priv->jd_sts == M_PLUG_OUT) {
147
148 accdet_set_debounce(priv, eint_state000,
149 priv->data->pwm_deb->eint_debounce0);
150 } else {
151 dev_dbg(priv->dev, "should not be here %s()\n", __func__);
152 }
153
154 return 0;
155}
156
157static void recover_eint_analog_setting(struct mt6359_accdet *priv)
158{
159 if (priv->data->eint_detect_mode == 0x3 ||
160 priv->data->eint_detect_mode == 0x4) {
161
162 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
163 1 << 8, 1 << 8);
164 }
165 if (priv->data->eint_detect_mode == 0x4) {
166 if (priv->caps & ACCDET_PMIC_EINT0) {
167
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
173 regmap_update_bits(priv->regmap,
174 RG_EINT1CONFIGACCDET_ADDR,
175 RG_EINT1CONFIGACCDET_MASK_SFT, 0);
176 }
177 regmap_update_bits(priv->regmap, RG_EINT0HIRENB_ADDR,
178 RG_EINT0HIRENB_MASK_SFT, 0);
179 }
180}
181
182static void recover_eint_digital_setting(struct mt6359_accdet *priv)
183{
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);
192 }
193 if (priv->data->eint_detect_mode == 0x4) {
194
195 if (priv->caps & ACCDET_PMIC_EINT0) {
196
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
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));
207 }
208 }
209
210 if (priv->data->eint_detect_mode != 0x1) {
211 if (priv->caps & ACCDET_PMIC_EINT0) {
212
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
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));
223 }
224 }
225}
226
227static void recover_eint_setting(struct mt6359_accdet *priv)
228{
229 if (priv->jd_sts == M_PLUG_OUT) {
230 recover_eint_analog_setting(priv);
231 recover_eint_digital_setting(priv);
232 }
233}
234
235static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv)
236{
237 int ret;
238 unsigned int value = 0;
239
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,
244 ACCDET_IRQ_ADDR,
245 value,
246 (value & ACCDET_IRQ_MASK_SFT) == 0,
247 0,
248 1000);
249 if (ret)
250 dev_warn(priv->dev, "%s(), ret %d\n", __func__, ret);
251
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));
257
258
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);
265
266 priv->jack_type = 0;
267 priv->btn_type = 0;
268 priv->accdet_status = 0x3;
269 mt6359_accdet_jack_report(priv);
270}
271
272static void accdet_set_debounce(struct mt6359_accdet *priv, int state,
273 unsigned int debounce)
274{
275 switch (state) {
276 case accdet_state000:
277 regmap_write(priv->regmap, ACCDET_DEBOUNCE0_ADDR, debounce);
278 break;
279 case accdet_state001:
280 regmap_write(priv->regmap, ACCDET_DEBOUNCE1_ADDR, debounce);
281 break;
282 case accdet_state010:
283 regmap_write(priv->regmap, ACCDET_DEBOUNCE2_ADDR, debounce);
284 break;
285 case accdet_state011:
286 regmap_write(priv->regmap, ACCDET_DEBOUNCE3_ADDR, debounce);
287 break;
288 case accdet_auxadc:
289 regmap_write(priv->regmap,
290 ACCDET_CONNECT_AUXADC_TIME_DIG_ADDR, debounce);
291 break;
292 case eint_state000:
293 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE0_ADDR,
294 0xF << ACCDET_EINT_DEBOUNCE0_SFT,
295 debounce << ACCDET_EINT_DEBOUNCE0_SFT);
296 break;
297 case eint_state001:
298 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE1_ADDR,
299 0xF << ACCDET_EINT_DEBOUNCE1_SFT,
300 debounce << ACCDET_EINT_DEBOUNCE1_SFT);
301 break;
302 case eint_state010:
303 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE2_ADDR,
304 0xF << ACCDET_EINT_DEBOUNCE2_SFT,
305 debounce << ACCDET_EINT_DEBOUNCE2_SFT);
306 break;
307 case eint_state011:
308 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE3_ADDR,
309 0xF << ACCDET_EINT_DEBOUNCE3_SFT,
310 debounce << ACCDET_EINT_DEBOUNCE3_SFT);
311 break;
312 case eint_inverter_state000:
313 regmap_write(priv->regmap, ACCDET_EINT_INVERTER_DEBOUNCE_ADDR,
314 debounce);
315 break;
316 default:
317 dev_warn(priv->dev, "Error: %s error state (%d)\n", __func__,
318 state);
319 break;
320 }
321}
322
323static void mt6359_accdet_jack_report(struct mt6359_accdet *priv)
324{
325 int report = 0;
326
327 if (!priv->jack)
328 return;
329
330 report = priv->jack_type | priv->btn_type;
331 snd_soc_jack_report(priv->jack, report, MT6359_ACCDET_JACK_MASK);
332}
333
334static unsigned int check_button(struct mt6359_accdet *priv, unsigned int v)
335{
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;
348 } else {
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;
357 }
358 return 0;
359}
360
361static void is_key_pressed(struct mt6359_accdet *priv, bool pressed)
362{
363 priv->btn_type = priv->jack_type & ~MT6359_ACCDET_BTN_MASK;
364
365 if (pressed)
366 check_button(priv, priv->cali_voltage);
367}
368
369static inline void check_jack_btn_type(struct mt6359_accdet *priv)
370{
371 unsigned int val = 0;
372
373 regmap_read(priv->regmap, ACCDET_MEM_IN_ADDR, &val);
374
375 priv->accdet_status =
376 (val >> ACCDET_STATE_MEM_IN_OFFSET) & ACCDET_STATE_AB_MASK;
377
378 switch (priv->accdet_status) {
379 case 0:
380 if (priv->jack_type == SND_JACK_HEADSET)
381 is_key_pressed(priv, true);
382 else
383 priv->jack_type = SND_JACK_HEADPHONE;
384 break;
385 case 1:
386 if (priv->jack_type == SND_JACK_HEADSET) {
387 is_key_pressed(priv, false);
388 } else {
389 priv->jack_type = SND_JACK_HEADSET;
390 accdet_set_debounce(priv, eint_state011, 0x1);
391 }
392 break;
393 case 3:
394 default:
395 priv->jack_type = 0;
396 break;
397 }
398}
399
400static void mt6359_accdet_work(struct work_struct *work)
401{
402 struct mt6359_accdet *priv =
403 container_of(work, struct mt6359_accdet, accdet_work);
404
405 mutex_lock(&priv->res_lock);
406 priv->pre_accdet_status = priv->accdet_status;
407 check_jack_btn_type(priv);
408
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);
413}
414
415static void mt6359_accdet_jd_work(struct work_struct *work)
416{
417 int ret;
418 unsigned int value = 0;
419
420 struct mt6359_accdet *priv =
421 container_of(work, struct mt6359_accdet, jd_work);
422
423 mutex_lock(&priv->res_lock);
424 if (priv->jd_sts == M_PLUG_IN) {
425 priv->jack_plugged = true;
426
427
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,
435 value,
436 (value & ACCDET_SEQ_INIT_MASK_SFT) == 0,
437 0,
438 1000);
439 if (ret)
440 dev_err(priv->dev, "%s(), ret %d\n", __func__, ret);
441
442
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;
447
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);
453 }
454
455 if (priv->caps & ACCDET_PMIC_EINT_IRQ)
456 recover_eint_setting(priv);
457 mutex_unlock(&priv->res_lock);
458}
459
460static irqreturn_t mt6359_accdet_irq(int irq, void *data)
461{
462 struct mt6359_accdet *priv = data;
463 unsigned int irq_val = 0, val = 0, value = 0;
464 int ret;
465
466 mutex_lock(&priv->res_lock);
467 regmap_read(priv->regmap, ACCDET_IRQ_ADDR, &irq_val);
468
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,
474 ACCDET_IRQ_ADDR,
475 value,
476 (value & ACCDET_IRQ_MASK_SFT) == 0,
477 0,
478 1000);
479 if (ret) {
480 dev_err(priv->dev, "%s(), ret %d\n", __func__, ret);
481 mutex_unlock(&priv->res_lock);
482 return IRQ_NONE;
483 }
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));
489
490 queue_work(priv->accdet_workqueue, &priv->accdet_work);
491 } else {
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,
497 ACCDET_IRQ_ADDR,
498 value,
499 (value & ACCDET_EINT0_IRQ_MASK_SFT) == 0,
500 0,
501 1000);
502 if (ret) {
503 dev_err(priv->dev, "%s(), ret %d\n", __func__,
504 ret);
505 mutex_unlock(&priv->res_lock);
506 return IRQ_NONE;
507 }
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));
514 }
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,
520 ACCDET_IRQ_ADDR,
521 value,
522 (value & ACCDET_EINT1_IRQ_MASK_SFT) == 0,
523 0,
524 1000);
525 if (ret) {
526 dev_err(priv->dev, "%s(), ret %d\n", __func__,
527 ret);
528 mutex_unlock(&priv->res_lock);
529 return IRQ_NONE;
530 }
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));
537 }
538
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
543 mt6359_accdet_jd_setting(priv);
544
545 queue_work(priv->jd_workqueue, &priv->jd_work);
546 }
547 mutex_unlock(&priv->res_lock);
548
549 return IRQ_HANDLED;
550}
551
552static int mt6359_accdet_parse_dt(struct mt6359_accdet *priv)
553{
554 int ret;
555 struct device *dev = priv->dev;
556 struct device_node *node = NULL;
557 int pwm_deb[15] = {0};
558 unsigned int tmp = 0;
559
560 node = of_get_child_by_name(dev->parent->of_node, "accdet");
561 if (!node)
562 return -EINVAL;
563
564 ret = of_property_read_u32(node, "mediatek,mic-vol",
565 &priv->data->mic_vol);
566 if (ret)
567 priv->data->mic_vol = 8;
568
569 ret = of_property_read_u32(node, "mediatek,plugout-debounce",
570 &priv->data->plugout_deb);
571 if (ret)
572 priv->data->plugout_deb = 1;
573
574 ret = of_property_read_u32(node, "mediatek,mic-mode",
575 &priv->data->mic_mode);
576 if (ret)
577 priv->data->mic_mode = 2;
578
579 ret = of_property_read_u32_array(node, "mediatek,pwm-deb-setting",
580 pwm_deb, ARRAY_SIZE(pwm_deb));
581
582 if (!ret)
583 memcpy(priv->data->pwm_deb, pwm_deb, sizeof(pwm_deb));
584
585 ret = of_property_read_u32(node, "mediatek,eint-level-pol",
586 &priv->data->eint_pol);
587 if (ret)
588 priv->data->eint_pol = 8;
589
590 ret = of_property_read_u32(node, "mediatek,eint-use-ap", &tmp);
591 if (ret)
592 tmp = 0;
593 if (tmp == 0)
594 priv->caps |= ACCDET_PMIC_EINT_IRQ;
595 else if (tmp == 1)
596 priv->caps |= ACCDET_AP_GPIO_EINT;
597
598 ret = of_property_read_u32(node, "mediatek,eint-detect-mode",
599 &priv->data->eint_detect_mode);
600 if (ret) {
601
602 priv->data->eint_detect_mode = 0x4;
603 }
604
605 ret = of_property_read_u32(node, "mediatek,eint-num", &tmp);
606 if (ret)
607 tmp = 0;
608 if (tmp == 0)
609 priv->caps |= ACCDET_PMIC_EINT0;
610 else if (tmp == 1)
611 priv->caps |= ACCDET_PMIC_EINT1;
612 else if (tmp == 2)
613 priv->caps |= ACCDET_PMIC_BI_EINT;
614
615 ret = of_property_read_u32(node, "mediatek,eint-trig-mode",
616 &tmp);
617 if (ret)
618 tmp = 0;
619 if (tmp == 0)
620 priv->caps |= ACCDET_PMIC_GPIO_TRIG_EINT;
621 else if (tmp == 1)
622 priv->caps |= ACCDET_PMIC_INVERTER_TRIG_EINT;
623
624 ret = of_property_read_u32(node, "mediatek,eint-use-ext-res",
625 &priv->data->eint_use_ext_res);
626 if (ret) {
627
628 priv->data->eint_use_ext_res = 0x0;
629 }
630
631 ret = of_property_read_u32(node, "mediatek,eint-comp-vth",
632 &priv->data->eint_comp_vth);
633 if (ret)
634 priv->data->eint_comp_vth = 0x0;
635
636 ret = of_property_read_u32(node, "mediatek,key-mode", &tmp);
637 if (ret)
638 tmp = 0;
639 if (tmp == 0) {
640 int three_key[4];
641
642 priv->caps |= ACCDET_THREE_KEY;
643 ret = of_property_read_u32_array(node,
644 "mediatek,three-key-thr",
645 three_key,
646 ARRAY_SIZE(three_key));
647 if (!ret)
648 memcpy(&priv->data->three_key, three_key + 1,
649 sizeof(struct three_key_threshold));
650 } else if (tmp == 1) {
651 int four_key[5];
652
653 priv->caps |= ACCDET_FOUR_KEY;
654 ret = of_property_read_u32_array(node,
655 "mediatek,four-key-thr",
656 four_key,
657 ARRAY_SIZE(four_key));
658 if (!ret) {
659 memcpy(&priv->data->four_key, four_key + 1,
660 sizeof(struct four_key_threshold));
661 } else {
662 dev_warn(priv->dev,
663 "accdet no 4-key-thrsh dts, use efuse\n");
664 }
665 } else if (tmp == 2) {
666 int three_key[4];
667
668 priv->caps |= ACCDET_TRI_KEY_CDD;
669 ret = of_property_read_u32_array(node,
670 "mediatek,tri-key-cdd-thr",
671 three_key,
672 ARRAY_SIZE(three_key));
673 if (!ret)
674 memcpy(&priv->data->three_key, three_key + 1,
675 sizeof(struct three_key_threshold));
676 }
677
678 dev_warn(priv->dev, "accdet caps=%x\n", priv->caps);
679
680 return 0;
681}
682
683static void config_digital_init_by_mode(struct mt6359_accdet *priv)
684{
685
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
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);
696 }
697
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
702
703
704
705 regmap_write(priv->regmap, ACCDET_HWMODE_EN_ADDR, 0x100);
706
707 regmap_update_bits(priv->regmap, ACCDET_EINT_M_DETECT_EN_ADDR,
708 ACCDET_EINT_M_DETECT_EN_MASK_SFT, 0);
709
710
711 regmap_write(priv->regmap, ACCDET_CMP_PWM_EN_ADDR, 0x67);
712
713 if (priv->data->eint_detect_mode == 0x1) {
714
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,
719 0);
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,
724 0);
725 }
726 } else {
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));
737 }
738 }
739}
740
741static void config_eint_init_by_mode(struct mt6359_accdet *priv)
742{
743 unsigned int val = 0;
744
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));
751 }
752
753 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
754 1 << 8, 1 << 8);
755
756 regmap_update_bits(priv->regmap, RG_NCP_PDDIS_EN_ADDR,
757 RG_NCP_PDDIS_EN_MASK_SFT, BIT(RG_NCP_PDDIS_EN_SFT));
758
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,
767 0);
768 } else if (priv->caps & ACCDET_PMIC_EINT1) {
769 regmap_update_bits(priv->regmap,
770 RG_EINT1CONFIGACCDET_ADDR,
771 RG_EINT1CONFIGACCDET_MASK_SFT,
772 0);
773 }
774 } else {
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));
785 }
786 }
787 }
788
789 if (priv->data->eint_detect_mode != 0x1) {
790
791 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
792 0x3 << RG_ACCDETSPARE_SFT,
793 0x3 << RG_ACCDETSPARE_SFT);
794 }
795 regmap_write(priv->regmap, RG_EINTCOMPVTH_ADDR,
796 val | priv->data->eint_comp_vth << RG_EINTCOMPVTH_SFT);
797}
798
799static void mt6359_accdet_init(struct mt6359_accdet *priv)
800{
801 unsigned int reg = 0;
802
803 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
804 ACCDET_SEQ_INIT_MASK_SFT, BIT(ACCDET_SEQ_INIT_SFT));
805 mdelay(2);
806 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
807 ACCDET_SEQ_INIT_MASK_SFT, 0);
808 mdelay(1);
809
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);
818
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);
827
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);
832
833
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);
838
839
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));
847
848 regmap_read(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, ®);
849 if (priv->data->mic_vol <= 7) {
850
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
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
861 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
862 reg | (1 << RG_AUDMICBIAS1HVEN_SFT) |
863 RG_AUDMICBIAS1LOWPEN_MASK_SFT);
864 }
865
866 regmap_read(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR, ®);
867 if (priv->data->mic_mode == HEADSET_MODE_1) {
868
869 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
870 reg | RG_ACCDET_MODE_ANA11_MODE1);
871
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
879 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
880 reg | RG_ACCDET_MODE_ANA11_MODE2);
881
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
887
888
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
895 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
896 0x3 << RG_ANALOGFDEN_SFT,
897 0x3 << RG_ANALOGFDEN_SFT);
898 }
899
900 if (priv->caps & ACCDET_PMIC_EINT_IRQ) {
901 config_eint_init_by_mode(priv);
902 config_digital_init_by_mode(priv);
903 }
904}
905
906int mt6359_accdet_enable_jack_detect(struct snd_soc_component *component,
907 struct snd_soc_jack *jack)
908{
909 struct mt6359_accdet *priv =
910 snd_soc_component_get_drvdata(component);
911
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);
916
917 priv->jack = jack;
918
919 mt6359_accdet_jack_report(priv);
920
921 return 0;
922}
923EXPORT_SYMBOL_GPL(mt6359_accdet_enable_jack_detect);
924
925static int mt6359_accdet_probe(struct platform_device *pdev)
926{
927 struct mt6359_accdet *priv;
928 struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent);
929 int ret;
930
931 dev_dbg(&pdev->dev, "%s(), dev name %s\n",
932 __func__, dev_name(&pdev->dev));
933
934 priv = devm_kzalloc(&pdev->dev, sizeof(struct mt6359_accdet),
935 GFP_KERNEL);
936 if (!priv)
937 return -ENOMEM;
938
939 priv->data = devm_kzalloc(&pdev->dev, sizeof(struct dts_data),
940 GFP_KERNEL);
941 if (!priv->data)
942 return -ENOMEM;
943
944 priv->data->pwm_deb = devm_kzalloc(&pdev->dev,
945 sizeof(struct pwm_deb_settings),
946 GFP_KERNEL);
947 if (!priv->data->pwm_deb)
948 return -ENOMEM;
949
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",
954 ret);
955 return ret;
956 }
957 priv->dev = &pdev->dev;
958
959 ret = mt6359_accdet_parse_dt(priv);
960 if (ret) {
961 dev_err(&pdev->dev, "Failed to parse dts\n");
962 return ret;
963 }
964 mutex_init(&priv->res_lock);
965
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,
971 "ACCDET_IRQ", priv);
972 if (ret) {
973 dev_err(&pdev->dev,
974 "Failed to request IRQ: (%d)\n", ret);
975 return ret;
976 }
977 }
978
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,
983 priv->accdet_eint0,
984 NULL, mt6359_accdet_irq,
985 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
986 "ACCDET_EINT0", priv);
987 if (ret) {
988 dev_err(&pdev->dev,
989 "Failed to request eint0 IRQ (%d)\n",
990 ret);
991 return ret;
992 }
993 }
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,
998 priv->accdet_eint1,
999 NULL, mt6359_accdet_irq,
1000 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
1001 "ACCDET_EINT1", priv);
1002 if (ret) {
1003 dev_err(&pdev->dev,
1004 "Failed to request eint1 IRQ (%d)\n",
1005 ret);
1006 return ret;
1007 }
1008 }
1009 }
1010
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");
1015 ret = -1;
1016 goto err_accdet_wq;
1017 }
1018
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");
1023 ret = -1;
1024 goto err_eint_wq;
1025 }
1026
1027 platform_set_drvdata(pdev, priv);
1028 ret = devm_snd_soc_register_component(&pdev->dev,
1029 &mt6359_accdet_soc_driver,
1030 NULL, 0);
1031 if (ret) {
1032 dev_err(&pdev->dev, "Failed to register component\n");
1033 return ret;
1034 }
1035
1036 priv->jd_sts = M_PLUG_OUT;
1037 priv->jack_type = 0;
1038 priv->btn_type = 0;
1039 priv->accdet_status = 0x3;
1040 mt6359_accdet_init(priv);
1041
1042 mt6359_accdet_jack_report(priv);
1043
1044 return 0;
1045
1046err_eint_wq:
1047 destroy_workqueue(priv->accdet_workqueue);
1048err_accdet_wq:
1049 dev_err(&pdev->dev, "%s error. now exit.!\n", __func__);
1050 return ret;
1051}
1052
1053static struct platform_driver mt6359_accdet_driver = {
1054 .driver = {
1055 .name = "pmic-codec-accdet",
1056 },
1057 .probe = mt6359_accdet_probe,
1058};
1059
1060module_platform_driver(mt6359_accdet_driver)
1061
1062
1063MODULE_DESCRIPTION("MT6359 ALSA SoC codec jack driver");
1064MODULE_AUTHOR("Argus Lin <argus.lin@mediatek.com>");
1065MODULE_LICENSE("GPL v2");
1066