i2c: Make remove callback return void
[sfrench/cifs-2.6.git] / sound / soc / codecs / mt6359-accdet.c
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // mt6359-accdet.c  --  ALSA SoC mt6359 accdet driver
4 //
5 // Copyright (C) 2021 MediaTek Inc.
6 // Author: Argus Lin <argus.lin@mediatek.com>
7 //
8
9 #include <linux/of_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 /* global variable definitions */
35 #define REGISTER_VAL(x) ((x) - 1)
36
37 /* mt6359 accdet capability */
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
58 static struct platform_driver mt6359_accdet_driver;
59 static const struct snd_soc_component_driver mt6359_accdet_soc_driver;
60
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);
74
75 static 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                 /* ESD switches off */
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                         /* 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));
96                 }
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,
101                                            RG_EINT0HIRENB_ADDR,
102                                            RG_EINT0HIRENB_MASK_SFT,
103                                            BIT(RG_EINT0HIRENB_SFT));
104                 }
105         }
106         return 0;
107 }
108
109 static unsigned int adjust_eint_digital_setting(struct mt6359_accdet *priv)
110 {
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);
121         }
122
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);
134                 }
135         }
136         return 0;
137 }
138
139 static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv)
140 {
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);
150         } else {
151                 dev_dbg(priv->dev, "should not be here %s()\n", __func__);
152         }
153
154         return 0;
155 }
156
157 static 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                 /* ESD switches on */
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                         /* 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);
176                 }
177                 regmap_update_bits(priv->regmap, RG_EINT0HIRENB_ADDR,
178                                    RG_EINT0HIRENB_MASK_SFT, 0);
179         }
180 }
181
182 static 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                 /* 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));
207                 }
208         }
209
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));
223                 }
224         }
225 }
226
227 static 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
235 static 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         /* 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));
257
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);
265
266         priv->jack_type = 0;
267         priv->btn_type = 0;
268         priv->accdet_status = 0x3;
269         mt6359_accdet_jack_report(priv);
270 }
271
272 static 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
323 static 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
334 static 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
361 static 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
369 static 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
400 static 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
415 static 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                 /* 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,
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                 /* 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;
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
460 static 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                 /* 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);
544
545                 queue_work(priv->jd_workqueue, &priv->jd_work);
546         }
547         mutex_unlock(&priv->res_lock);
548
549         return IRQ_HANDLED;
550 }
551
552 static 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         /* debounce8(auxadc debounce) is default, needn't get from dts */
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                 /* eint detection mode equals to EINT HW Mode */
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                 /* eint use internal resister */
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         of_node_put(node);
679         dev_warn(priv->dev, "accdet caps=%x\n", priv->caps);
680
681         return 0;
682 }
683
684 static void config_digital_init_by_mode(struct mt6359_accdet *priv)
685 {
686         /* enable eint cmpmem pwm */
687         regmap_write(priv->regmap, ACCDET_EINT_CMPMEN_PWM_THRESH_ADDR,
688                      (priv->data->pwm_deb->eint_pwm_width << 4 |
689                      priv->data->pwm_deb->eint_pwm_thresh));
690         /* DA signal stable */
691         if (priv->caps & ACCDET_PMIC_EINT0) {
692                 regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR,
693                              ACCDET_EINT0_STABLE_VAL);
694         } else if (priv->caps & ACCDET_PMIC_EINT1) {
695                 regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR,
696                              ACCDET_EINT1_STABLE_VAL);
697         }
698         /* after receive n+1 number, interrupt issued. */
699         regmap_update_bits(priv->regmap, ACCDET_EINT_M_PLUG_IN_NUM_ADDR,
700                            ACCDET_EINT_M_PLUG_IN_NUM_MASK_SFT,
701                            BIT(ACCDET_EINT_M_PLUG_IN_NUM_SFT));
702         /* setting HW mode, enable digital fast discharge
703          * if use EINT0 & EINT1 detection, please modify
704          * ACCDET_HWMODE_EN_ADDR[2:1]
705          */
706         regmap_write(priv->regmap, ACCDET_HWMODE_EN_ADDR, 0x100);
707
708         regmap_update_bits(priv->regmap, ACCDET_EINT_M_DETECT_EN_ADDR,
709                            ACCDET_EINT_M_DETECT_EN_MASK_SFT, 0);
710
711         /* enable PWM */
712         regmap_write(priv->regmap, ACCDET_CMP_PWM_EN_ADDR, 0x67);
713         /* enable inverter detection */
714         if (priv->data->eint_detect_mode == 0x1) {
715                 /* disable inverter detection */
716                 if (priv->caps & ACCDET_PMIC_EINT0) {
717                         regmap_update_bits(priv->regmap,
718                                            ACCDET_EINT0_INVERTER_SW_EN_ADDR,
719                                            ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT,
720                                            0);
721                 } else if (priv->caps & ACCDET_PMIC_EINT1) {
722                         regmap_update_bits(priv->regmap,
723                                            ACCDET_EINT1_INVERTER_SW_EN_ADDR,
724                                            ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT,
725                                            0);
726                 }
727         } else {
728                 if (priv->caps & ACCDET_PMIC_EINT0) {
729                         regmap_update_bits(priv->regmap,
730                                            ACCDET_EINT0_INVERTER_SW_EN_ADDR,
731                                            ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT,
732                                            BIT(ACCDET_EINT0_INVERTER_SW_EN_SFT));
733                 } else if (priv->caps & ACCDET_PMIC_EINT1) {
734                         regmap_update_bits(priv->regmap,
735                                            ACCDET_EINT1_INVERTER_SW_EN_ADDR,
736                                            ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT,
737                                            BIT(ACCDET_EINT1_INVERTER_SW_EN_SFT));
738                 }
739         }
740 }
741
742 static void config_eint_init_by_mode(struct mt6359_accdet *priv)
743 {
744         unsigned int val = 0;
745
746         if (priv->caps & ACCDET_PMIC_EINT0) {
747                 regmap_update_bits(priv->regmap, RG_EINT0EN_ADDR,
748                                    RG_EINT0EN_MASK_SFT, BIT(RG_EINT0EN_SFT));
749         } else if (priv->caps & ACCDET_PMIC_EINT1) {
750                 regmap_update_bits(priv->regmap, RG_EINT1EN_ADDR,
751                                    RG_EINT1EN_MASK_SFT, BIT(RG_EINT1EN_SFT));
752         }
753         /* ESD switches on */
754         regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
755                            1 << 8, 1 << 8);
756         /* before playback, set NCP pull low before nagative voltage */
757         regmap_update_bits(priv->regmap, RG_NCP_PDDIS_EN_ADDR,
758                            RG_NCP_PDDIS_EN_MASK_SFT, BIT(RG_NCP_PDDIS_EN_SFT));
759
760         if (priv->data->eint_detect_mode == 0x1 ||
761             priv->data->eint_detect_mode == 0x2 ||
762             priv->data->eint_detect_mode == 0x3) {
763                 if (priv->data->eint_use_ext_res == 0x1) {
764                         if (priv->caps & ACCDET_PMIC_EINT0) {
765                                 regmap_update_bits(priv->regmap,
766                                                    RG_EINT0CONFIGACCDET_ADDR,
767                                                    RG_EINT0CONFIGACCDET_MASK_SFT,
768                                                    0);
769                         } else if (priv->caps & ACCDET_PMIC_EINT1) {
770                                 regmap_update_bits(priv->regmap,
771                                                    RG_EINT1CONFIGACCDET_ADDR,
772                                                    RG_EINT1CONFIGACCDET_MASK_SFT,
773                                                    0);
774                         }
775                 } else {
776                         if (priv->caps & ACCDET_PMIC_EINT0) {
777                                 regmap_update_bits(priv->regmap,
778                                                    RG_EINT0CONFIGACCDET_ADDR,
779                                                    RG_EINT0CONFIGACCDET_MASK_SFT,
780                                                    BIT(RG_EINT0CONFIGACCDET_SFT));
781                         } else if (priv->caps & ACCDET_PMIC_EINT1) {
782                                 regmap_update_bits(priv->regmap,
783                                                    RG_EINT1CONFIGACCDET_ADDR,
784                                                    RG_EINT1CONFIGACCDET_MASK_SFT,
785                                                    BIT(RG_EINT1CONFIGACCDET_SFT));
786                         }
787                 }
788         }
789
790         if (priv->data->eint_detect_mode != 0x1) {
791                 /* current detect set 0.25uA */
792                 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
793                                    0x3 << RG_ACCDETSPARE_SFT,
794                                    0x3 << RG_ACCDETSPARE_SFT);
795         }
796         regmap_write(priv->regmap, RG_EINTCOMPVTH_ADDR,
797                      val | priv->data->eint_comp_vth << RG_EINTCOMPVTH_SFT);
798 }
799
800 static void mt6359_accdet_init(struct mt6359_accdet *priv)
801 {
802         unsigned int reg = 0;
803
804         regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
805                            ACCDET_SEQ_INIT_MASK_SFT, BIT(ACCDET_SEQ_INIT_SFT));
806         mdelay(2);
807         regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
808                            ACCDET_SEQ_INIT_MASK_SFT, 0);
809         mdelay(1);
810         /* init the debounce time (debounce/32768)sec */
811         accdet_set_debounce(priv, accdet_state000,
812                             priv->data->pwm_deb->debounce0);
813         accdet_set_debounce(priv, accdet_state001,
814                             priv->data->pwm_deb->debounce1);
815         accdet_set_debounce(priv, accdet_state011,
816                             priv->data->pwm_deb->debounce3);
817         accdet_set_debounce(priv, accdet_auxadc,
818                             priv->data->pwm_deb->debounce4);
819
820         accdet_set_debounce(priv, eint_state000,
821                             priv->data->pwm_deb->eint_debounce0);
822         accdet_set_debounce(priv, eint_state001,
823                             priv->data->pwm_deb->eint_debounce1);
824         accdet_set_debounce(priv, eint_state011,
825                             priv->data->pwm_deb->eint_debounce3);
826         accdet_set_debounce(priv, eint_inverter_state000,
827                             priv->data->pwm_deb->eint_inverter_debounce);
828
829         regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR,
830                            RG_ACCDET_RST_MASK_SFT, BIT(RG_ACCDET_RST_SFT));
831         regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR,
832                            RG_ACCDET_RST_MASK_SFT, 0);
833
834         /* clear high micbias1 voltage setting */
835         regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
836                            0x3 << RG_AUDMICBIAS1HVEN_SFT, 0);
837         regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
838                            0x7 << RG_AUDMICBIAS1VREF_SFT, 0);
839
840         /* init pwm frequency, duty & rise/falling delay */
841         regmap_write(priv->regmap, ACCDET_PWM_WIDTH_ADDR,
842                      REGISTER_VAL(priv->data->pwm_deb->pwm_width));
843         regmap_write(priv->regmap, ACCDET_PWM_THRESH_ADDR,
844                      REGISTER_VAL(priv->data->pwm_deb->pwm_thresh));
845         regmap_write(priv->regmap, ACCDET_RISE_DELAY_ADDR,
846                      (priv->data->pwm_deb->fall_delay << 15 |
847                       priv->data->pwm_deb->rise_delay));
848
849         regmap_read(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, &reg);
850         if (priv->data->mic_vol <= 7) {
851                 /* micbias1 <= 2.7V */
852                 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
853                              reg | (priv->data->mic_vol << RG_AUDMICBIAS1VREF_SFT) |
854                              RG_AUDMICBIAS1LOWPEN_MASK_SFT);
855         } else if (priv->data->mic_vol == 8) {
856                 /* micbias1 = 2.8v */
857                 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
858                              reg | (3 << RG_AUDMICBIAS1HVEN_SFT) |
859                              RG_AUDMICBIAS1LOWPEN_MASK_SFT);
860         } else if (priv->data->mic_vol == 9) {
861                 /* micbias1 = 2.85v */
862                 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
863                              reg | (1 << RG_AUDMICBIAS1HVEN_SFT) |
864                              RG_AUDMICBIAS1LOWPEN_MASK_SFT);
865         }
866         /* mic mode setting */
867         regmap_read(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR, &reg);
868         if (priv->data->mic_mode == HEADSET_MODE_1) {
869                 /* ACC mode*/
870                 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
871                              reg | RG_ACCDET_MODE_ANA11_MODE1);
872                 /* enable analog fast discharge */
873                 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
874                                    RG_ANALOGFDEN_MASK_SFT,
875                                    BIT(RG_ANALOGFDEN_SFT));
876                 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
877                                    0x3 << 11, 0x3 << 11);
878         } else if (priv->data->mic_mode == HEADSET_MODE_2) {
879                 /* DCC mode Low cost mode without internal bias */
880                 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
881                              reg | RG_ACCDET_MODE_ANA11_MODE2);
882                 /* enable analog fast discharge */
883                 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
884                                    0x3 << RG_ANALOGFDEN_SFT,
885                                    0x3 << RG_ANALOGFDEN_SFT);
886         } else if (priv->data->mic_mode == HEADSET_MODE_6) {
887                 /* DCC mode Low cost mode with internal bias,
888                  * bit8 = 1 to use internal bias
889                  */
890                 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
891                              reg | RG_ACCDET_MODE_ANA11_MODE6);
892                 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
893                                    RG_AUDMICBIAS1DCSW1PEN_MASK_SFT,
894                                    BIT(RG_AUDMICBIAS1DCSW1PEN_SFT));
895                 /* enable analog fast discharge */
896                 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
897                                    0x3 << RG_ANALOGFDEN_SFT,
898                                    0x3 << RG_ANALOGFDEN_SFT);
899         }
900
901         if (priv->caps & ACCDET_PMIC_EINT_IRQ) {
902                 config_eint_init_by_mode(priv);
903                 config_digital_init_by_mode(priv);
904         }
905 }
906
907 int mt6359_accdet_enable_jack_detect(struct snd_soc_component *component,
908                                      struct snd_soc_jack *jack)
909 {
910         struct mt6359_accdet *priv =
911                 snd_soc_component_get_drvdata(component);
912
913         snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
914         snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEDOWN);
915         snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
916         snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
917
918         priv->jack = jack;
919
920         mt6359_accdet_jack_report(priv);
921
922         return 0;
923 }
924 EXPORT_SYMBOL_GPL(mt6359_accdet_enable_jack_detect);
925
926 static int mt6359_accdet_probe(struct platform_device *pdev)
927 {
928         struct mt6359_accdet *priv;
929         struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent);
930         int ret;
931
932         dev_dbg(&pdev->dev, "%s(), dev name %s\n",
933                 __func__, dev_name(&pdev->dev));
934
935         priv = devm_kzalloc(&pdev->dev, sizeof(struct mt6359_accdet),
936                             GFP_KERNEL);
937         if (!priv)
938                 return -ENOMEM;
939
940         priv->data = devm_kzalloc(&pdev->dev, sizeof(struct dts_data),
941                                   GFP_KERNEL);
942         if (!priv->data)
943                 return -ENOMEM;
944
945         priv->data->pwm_deb = devm_kzalloc(&pdev->dev,
946                                            sizeof(struct pwm_deb_settings),
947                                            GFP_KERNEL);
948         if (!priv->data->pwm_deb)
949                 return -ENOMEM;
950
951         priv->regmap = mt6397->regmap;
952         if (IS_ERR(priv->regmap)) {
953                 ret = PTR_ERR(priv->regmap);
954                 dev_err(&pdev->dev, "Failed to allocate register map: %d\n",
955                         ret);
956                 return ret;
957         }
958         priv->dev = &pdev->dev;
959
960         ret = mt6359_accdet_parse_dt(priv);
961         if (ret) {
962                 dev_err(&pdev->dev, "Failed to parse dts\n");
963                 return ret;
964         }
965         mutex_init(&priv->res_lock);
966
967         priv->accdet_irq = platform_get_irq(pdev, 0);
968         if (priv->accdet_irq) {
969                 ret = devm_request_threaded_irq(&pdev->dev, priv->accdet_irq,
970                                                 NULL, mt6359_accdet_irq,
971                                                 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
972                                                 "ACCDET_IRQ", priv);
973                 if (ret) {
974                         dev_err(&pdev->dev,
975                                 "Failed to request IRQ: (%d)\n", ret);
976                         return ret;
977                 }
978         }
979
980         if (priv->caps & ACCDET_PMIC_EINT0) {
981                 priv->accdet_eint0 = platform_get_irq(pdev, 1);
982                 if (priv->accdet_eint0) {
983                         ret = devm_request_threaded_irq(&pdev->dev,
984                                                         priv->accdet_eint0,
985                                                         NULL, mt6359_accdet_irq,
986                                                         IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
987                                                         "ACCDET_EINT0", priv);
988                         if (ret) {
989                                 dev_err(&pdev->dev,
990                                         "Failed to request eint0 IRQ (%d)\n",
991                                         ret);
992                                 return ret;
993                         }
994                 }
995         } else if (priv->caps & ACCDET_PMIC_EINT1) {
996                 priv->accdet_eint1 = platform_get_irq(pdev, 2);
997                 if (priv->accdet_eint1) {
998                         ret = devm_request_threaded_irq(&pdev->dev,
999                                                         priv->accdet_eint1,
1000                                                         NULL, mt6359_accdet_irq,
1001                                                         IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
1002                                                         "ACCDET_EINT1", priv);
1003                         if (ret) {
1004                                 dev_err(&pdev->dev,
1005                                         "Failed to request eint1 IRQ (%d)\n",
1006                                         ret);
1007                                 return ret;
1008                         }
1009                 }
1010         }
1011
1012         priv->accdet_workqueue = create_singlethread_workqueue("accdet");
1013         INIT_WORK(&priv->accdet_work, mt6359_accdet_work);
1014         if (!priv->accdet_workqueue) {
1015                 dev_err(&pdev->dev, "Failed to create accdet workqueue\n");
1016                 ret = -1;
1017                 goto err_accdet_wq;
1018         }
1019
1020         priv->jd_workqueue = create_singlethread_workqueue("mt6359_accdet_jd");
1021         INIT_WORK(&priv->jd_work, mt6359_accdet_jd_work);
1022         if (!priv->jd_workqueue) {
1023                 dev_err(&pdev->dev, "Failed to create jack detect workqueue\n");
1024                 ret = -1;
1025                 goto err_eint_wq;
1026         }
1027
1028         platform_set_drvdata(pdev, priv);
1029         ret = devm_snd_soc_register_component(&pdev->dev,
1030                                               &mt6359_accdet_soc_driver,
1031                                               NULL, 0);
1032         if (ret) {
1033                 dev_err(&pdev->dev, "Failed to register component\n");
1034                 return ret;
1035         }
1036
1037         priv->jd_sts = M_PLUG_OUT;
1038         priv->jack_type = 0;
1039         priv->btn_type = 0;
1040         priv->accdet_status = 0x3;
1041         mt6359_accdet_init(priv);
1042
1043         mt6359_accdet_jack_report(priv);
1044
1045         return 0;
1046
1047 err_eint_wq:
1048         destroy_workqueue(priv->accdet_workqueue);
1049 err_accdet_wq:
1050         dev_err(&pdev->dev, "%s error. now exit.!\n", __func__);
1051         return ret;
1052 }
1053
1054 static struct platform_driver mt6359_accdet_driver = {
1055         .driver = {
1056                 .name = "pmic-codec-accdet",
1057         },
1058         .probe = mt6359_accdet_probe,
1059 };
1060
1061 module_platform_driver(mt6359_accdet_driver)
1062
1063 /* Module information */
1064 MODULE_DESCRIPTION("MT6359 ALSA SoC codec jack driver");
1065 MODULE_AUTHOR("Argus Lin <argus.lin@mediatek.com>");
1066 MODULE_LICENSE("GPL v2");