Lines Matching defs:priv

58 static void accdet_set_debounce(struct mt6359_accdet *priv, int state,
60 static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv);
61 static void config_digital_init_by_mode(struct mt6359_accdet *priv);
62 static void config_eint_init_by_mode(struct mt6359_accdet *priv);
63 static inline void mt6359_accdet_init(struct mt6359_accdet *priv);
64 static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv);
65 static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv);
66 static void mt6359_accdet_jack_report(struct mt6359_accdet *priv);
67 static void recover_eint_analog_setting(struct mt6359_accdet *priv);
68 static void recover_eint_digital_setting(struct mt6359_accdet *priv);
69 static void recover_eint_setting(struct mt6359_accdet *priv);
71 static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv)
73 if (priv->data->eint_detect_mode == 0x3 ||
74 priv->data->eint_detect_mode == 0x4) {
76 regmap_update_bits(priv->regmap,
79 if (priv->data->eint_detect_mode == 0x4) {
80 if (priv->caps & ACCDET_PMIC_EINT0) {
82 regmap_update_bits(priv->regmap,
86 } else if (priv->caps & ACCDET_PMIC_EINT1) {
88 regmap_update_bits(priv->regmap,
93 if (priv->data->eint_use_ext_res == 0x3 ||
94 priv->data->eint_use_ext_res == 0x4) {
96 regmap_update_bits(priv->regmap,
105 static unsigned int adjust_eint_digital_setting(struct mt6359_accdet *priv)
107 if (priv->caps & ACCDET_PMIC_EINT0) {
109 regmap_update_bits(priv->regmap,
112 } else if (priv->caps & ACCDET_PMIC_EINT1) {
114 regmap_update_bits(priv->regmap,
119 if (priv->data->eint_detect_mode == 0x4) {
120 if (priv->caps & ACCDET_PMIC_EINT0) {
122 regmap_update_bits(priv->regmap,
125 } else if (priv->caps & ACCDET_PMIC_EINT1) {
127 regmap_update_bits(priv->regmap,
135 static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv)
137 if (priv->jd_sts == M_PLUG_IN) {
139 adjust_eint_digital_setting(priv);
141 adjust_eint_analog_setting(priv);
142 } else if (priv->jd_sts == M_PLUG_OUT) {
144 accdet_set_debounce(priv, eint_state000,
145 priv->data->pwm_deb->eint_debounce0);
147 dev_dbg(priv->dev, "should not be here %s()\n", __func__);
153 static void recover_eint_analog_setting(struct mt6359_accdet *priv)
155 if (priv->data->eint_detect_mode == 0x3 ||
156 priv->data->eint_detect_mode == 0x4) {
158 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
161 if (priv->data->eint_detect_mode == 0x4) {
162 if (priv->caps & ACCDET_PMIC_EINT0) {
164 regmap_update_bits(priv->regmap,
167 } else if (priv->caps & ACCDET_PMIC_EINT1) {
169 regmap_update_bits(priv->regmap,
173 regmap_update_bits(priv->regmap, RG_EINT0HIRENB_ADDR,
178 static void recover_eint_digital_setting(struct mt6359_accdet *priv)
180 if (priv->caps & ACCDET_PMIC_EINT0) {
181 regmap_update_bits(priv->regmap,
184 } else if (priv->caps & ACCDET_PMIC_EINT1) {
185 regmap_update_bits(priv->regmap,
189 if (priv->data->eint_detect_mode == 0x4) {
191 if (priv->caps & ACCDET_PMIC_EINT0) {
193 regmap_update_bits(priv->regmap,
197 } else if (priv->caps & ACCDET_PMIC_EINT1) {
199 regmap_update_bits(priv->regmap,
206 if (priv->data->eint_detect_mode != 0x1) {
207 if (priv->caps & ACCDET_PMIC_EINT0) {
209 regmap_update_bits(priv->regmap,
213 } else if (priv->caps & ACCDET_PMIC_EINT1) {
215 regmap_update_bits(priv->regmap,
223 static void recover_eint_setting(struct mt6359_accdet *priv)
225 if (priv->jd_sts == M_PLUG_OUT) {
226 recover_eint_analog_setting(priv);
227 recover_eint_digital_setting(priv);
231 static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv)
236 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
239 ret = regmap_read_poll_timeout(priv->regmap,
246 dev_warn(priv->dev, "%s(), ret %d\n", __func__, ret);
248 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
250 regmap_update_bits(priv->regmap, RG_INT_STATUS_ACCDET_ADDR,
255 accdet_set_debounce(priv, accdet_state000,
256 priv->data->pwm_deb->debounce0);
257 accdet_set_debounce(priv, accdet_state001,
258 priv->data->pwm_deb->debounce1);
259 accdet_set_debounce(priv, accdet_state011,
260 priv->data->pwm_deb->debounce3);
262 priv->jack_type = 0;
263 priv->btn_type = 0;
264 priv->accdet_status = 0x3;
265 mt6359_accdet_jack_report(priv);
268 static void accdet_set_debounce(struct mt6359_accdet *priv, int state,
273 regmap_write(priv->regmap, ACCDET_DEBOUNCE0_ADDR, debounce);
276 regmap_write(priv->regmap, ACCDET_DEBOUNCE1_ADDR, debounce);
279 regmap_write(priv->regmap, ACCDET_DEBOUNCE2_ADDR, debounce);
282 regmap_write(priv->regmap, ACCDET_DEBOUNCE3_ADDR, debounce);
285 regmap_write(priv->regmap,
289 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE0_ADDR,
294 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE1_ADDR,
299 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE2_ADDR,
304 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE3_ADDR,
309 regmap_write(priv->regmap, ACCDET_EINT_INVERTER_DEBOUNCE_ADDR,
313 dev_warn(priv->dev, "Error: %s error state (%d)\n", __func__,
319 static void mt6359_accdet_jack_report(struct mt6359_accdet *priv)
323 if (!priv->jack)
326 report = priv->jack_type | priv->btn_type;
327 snd_soc_jack_report(priv->jack, report, MT6359_ACCDET_JACK_MASK);
330 static unsigned int check_button(struct mt6359_accdet *priv, unsigned int v)
332 if (priv->caps & ACCDET_FOUR_KEY) {
333 if (v < priv->data->four_key.down &&
334 v >= priv->data->four_key.up)
335 priv->btn_type = SND_JACK_BTN_1;
336 if (v < priv->data->four_key.up &&
337 v >= priv->data->four_key.voice)
338 priv->btn_type = SND_JACK_BTN_2;
339 if (v < priv->data->four_key.voice &&
340 v >= priv->data->four_key.mid)
341 priv->btn_type = SND_JACK_BTN_3;
342 if (v < priv->data->four_key.mid)
343 priv->btn_type = SND_JACK_BTN_0;
345 if (v < priv->data->three_key.down &&
346 v >= priv->data->three_key.up)
347 priv->btn_type = SND_JACK_BTN_1;
348 if (v < priv->data->three_key.up &&
349 v >= priv->data->three_key.mid)
350 priv->btn_type = SND_JACK_BTN_2;
351 if (v < priv->data->three_key.mid)
352 priv->btn_type = SND_JACK_BTN_0;
357 static void is_key_pressed(struct mt6359_accdet *priv, bool pressed)
359 priv->btn_type = priv->jack_type & ~MT6359_ACCDET_BTN_MASK;
362 check_button(priv, priv->cali_voltage);
365 static inline void check_jack_btn_type(struct mt6359_accdet *priv)
369 regmap_read(priv->regmap, ACCDET_MEM_IN_ADDR, &val);
371 priv->accdet_status =
374 switch (priv->accdet_status) {
376 if (priv->jack_type == SND_JACK_HEADSET)
377 is_key_pressed(priv, true);
379 priv->jack_type = SND_JACK_HEADPHONE;
382 if (priv->jack_type == SND_JACK_HEADSET) {
383 is_key_pressed(priv, false);
385 priv->jack_type = SND_JACK_HEADSET;
386 accdet_set_debounce(priv, eint_state011, 0x1);
391 priv->jack_type = 0;
398 struct mt6359_accdet *priv =
401 mutex_lock(&priv->res_lock);
402 priv->pre_accdet_status = priv->accdet_status;
403 check_jack_btn_type(priv);
405 if (priv->jack_plugged &&
406 priv->pre_accdet_status != priv->accdet_status)
407 mt6359_accdet_jack_report(priv);
408 mutex_unlock(&priv->res_lock);
416 struct mt6359_accdet *priv =
419 mutex_lock(&priv->res_lock);
420 if (priv->jd_sts == M_PLUG_IN) {
421 priv->jack_plugged = true;
424 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
427 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
429 ret = regmap_read_poll_timeout(priv->regmap,
436 dev_err(priv->dev, "%s(), ret %d\n", __func__, ret);
439 regmap_update_bits(priv->regmap, ACCDET_SW_EN_ADDR,
441 } else if (priv->jd_sts == M_PLUG_OUT) {
442 priv->jack_plugged = false;
444 accdet_set_debounce(priv, accdet_state011,
445 priv->data->pwm_deb->debounce3);
446 regmap_update_bits(priv->regmap, ACCDET_SW_EN_ADDR,
448 mt6359_accdet_recover_jd_setting(priv);
451 if (priv->caps & ACCDET_PMIC_EINT_IRQ)
452 recover_eint_setting(priv);
453 mutex_unlock(&priv->res_lock);
458 struct mt6359_accdet *priv = data;
462 mutex_lock(&priv->res_lock);
463 regmap_read(priv->regmap, ACCDET_IRQ_ADDR, &irq_val);
466 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
469 ret = regmap_read_poll_timeout(priv->regmap,
476 dev_err(priv->dev, "%s(), ret %d\n", __func__, ret);
477 mutex_unlock(&priv->res_lock);
480 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
482 regmap_update_bits(priv->regmap, RG_INT_STATUS_ACCDET_ADDR,
486 queue_work(priv->accdet_workqueue, &priv->accdet_work);
489 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
492 ret = regmap_read_poll_timeout(priv->regmap,
499 dev_err(priv->dev, "%s(), ret %d\n", __func__,
501 mutex_unlock(&priv->res_lock);
504 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
506 regmap_update_bits(priv->regmap,
512 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
515 ret = regmap_read_poll_timeout(priv->regmap,
522 dev_err(priv->dev, "%s(), ret %d\n", __func__,
524 mutex_unlock(&priv->res_lock);
527 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR,
529 regmap_update_bits(priv->regmap,
535 regmap_read(priv->regmap, ACCDET_EINT0_MEM_IN_ADDR, &val);
536 priv->jd_sts = ((val >> ACCDET_EINT0_MEM_IN_SFT) &
539 mt6359_accdet_jd_setting(priv);
541 queue_work(priv->jd_workqueue, &priv->jd_work);
543 mutex_unlock(&priv->res_lock);
548 static int mt6359_accdet_parse_dt(struct mt6359_accdet *priv)
551 struct device *dev = priv->dev;
561 &priv->data->mic_vol);
563 priv->data->mic_vol = 8;
566 &priv->data->plugout_deb);
568 priv->data->plugout_deb = 1;
571 &priv->data->mic_mode);
573 priv->data->mic_mode = 2;
579 memcpy(priv->data->pwm_deb, pwm_deb, sizeof(pwm_deb));
582 &priv->data->eint_pol);
584 priv->data->eint_pol = 8;
590 priv->caps |= ACCDET_PMIC_EINT_IRQ;
592 priv->caps |= ACCDET_AP_GPIO_EINT;
595 &priv->data->eint_detect_mode);
598 priv->data->eint_detect_mode = 0x4;
605 priv->caps |= ACCDET_PMIC_EINT0;
607 priv->caps |= ACCDET_PMIC_EINT1;
609 priv->caps |= ACCDET_PMIC_BI_EINT;
616 priv->caps |= ACCDET_PMIC_GPIO_TRIG_EINT;
618 priv->caps |= ACCDET_PMIC_INVERTER_TRIG_EINT;
621 &priv->data->eint_use_ext_res);
624 priv->data->eint_use_ext_res = 0x0;
628 &priv->data->eint_comp_vth);
630 priv->data->eint_comp_vth = 0x0;
638 priv->caps |= ACCDET_THREE_KEY;
644 memcpy(&priv->data->three_key, three_key + 1,
649 priv->caps |= ACCDET_FOUR_KEY;
655 memcpy(&priv->data->four_key, four_key + 1,
658 dev_warn(priv->dev,
664 priv->caps |= ACCDET_TRI_KEY_CDD;
670 memcpy(&priv->data->three_key, three_key + 1,
675 dev_warn(priv->dev, "accdet caps=%x\n", priv->caps);
680 static void config_digital_init_by_mode(struct mt6359_accdet *priv)
683 regmap_write(priv->regmap, ACCDET_EINT_CMPMEN_PWM_THRESH_ADDR,
684 (priv->data->pwm_deb->eint_pwm_width << 4 |
685 priv->data->pwm_deb->eint_pwm_thresh));
687 if (priv->caps & ACCDET_PMIC_EINT0) {
688 regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR,
690 } else if (priv->caps & ACCDET_PMIC_EINT1) {
691 regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR,
695 regmap_update_bits(priv->regmap, ACCDET_EINT_M_PLUG_IN_NUM_ADDR,
702 regmap_write(priv->regmap, ACCDET_HWMODE_EN_ADDR, 0x100);
704 regmap_update_bits(priv->regmap, ACCDET_EINT_M_DETECT_EN_ADDR,
708 regmap_write(priv->regmap, ACCDET_CMP_PWM_EN_ADDR, 0x67);
710 if (priv->data->eint_detect_mode == 0x1) {
712 if (priv->caps & ACCDET_PMIC_EINT0) {
713 regmap_update_bits(priv->regmap,
717 } else if (priv->caps & ACCDET_PMIC_EINT1) {
718 regmap_update_bits(priv->regmap,
724 if (priv->caps & ACCDET_PMIC_EINT0) {
725 regmap_update_bits(priv->regmap,
729 } else if (priv->caps & ACCDET_PMIC_EINT1) {
730 regmap_update_bits(priv->regmap,
738 static void config_eint_init_by_mode(struct mt6359_accdet *priv)
742 if (priv->caps & ACCDET_PMIC_EINT0) {
743 regmap_update_bits(priv->regmap, RG_EINT0EN_ADDR,
745 } else if (priv->caps & ACCDET_PMIC_EINT1) {
746 regmap_update_bits(priv->regmap, RG_EINT1EN_ADDR,
750 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
753 regmap_update_bits(priv->regmap, RG_NCP_PDDIS_EN_ADDR,
756 if (priv->data->eint_detect_mode == 0x1 ||
757 priv->data->eint_detect_mode == 0x2 ||
758 priv->data->eint_detect_mode == 0x3) {
759 if (priv->data->eint_use_ext_res == 0x1) {
760 if (priv->caps & ACCDET_PMIC_EINT0) {
761 regmap_update_bits(priv->regmap,
765 } else if (priv->caps & ACCDET_PMIC_EINT1) {
766 regmap_update_bits(priv->regmap,
772 if (priv->caps & ACCDET_PMIC_EINT0) {
773 regmap_update_bits(priv->regmap,
777 } else if (priv->caps & ACCDET_PMIC_EINT1) {
778 regmap_update_bits(priv->regmap,
786 if (priv->data->eint_detect_mode != 0x1) {
788 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
792 regmap_write(priv->regmap, RG_EINTCOMPVTH_ADDR,
793 val | priv->data->eint_comp_vth << RG_EINTCOMPVTH_SFT);
796 static void mt6359_accdet_init(struct mt6359_accdet *priv)
800 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
803 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR,
807 accdet_set_debounce(priv, accdet_state000,
808 priv->data->pwm_deb->debounce0);
809 accdet_set_debounce(priv, accdet_state001,
810 priv->data->pwm_deb->debounce1);
811 accdet_set_debounce(priv, accdet_state011,
812 priv->data->pwm_deb->debounce3);
813 accdet_set_debounce(priv, accdet_auxadc,
814 priv->data->pwm_deb->debounce4);
816 accdet_set_debounce(priv, eint_state000,
817 priv->data->pwm_deb->eint_debounce0);
818 accdet_set_debounce(priv, eint_state001,
819 priv->data->pwm_deb->eint_debounce1);
820 accdet_set_debounce(priv, eint_state011,
821 priv->data->pwm_deb->eint_debounce3);
822 accdet_set_debounce(priv, eint_inverter_state000,
823 priv->data->pwm_deb->eint_inverter_debounce);
825 regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR,
827 regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR,
831 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
833 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
837 regmap_write(priv->regmap, ACCDET_PWM_WIDTH_ADDR,
838 REGISTER_VAL(priv->data->pwm_deb->pwm_width));
839 regmap_write(priv->regmap, ACCDET_PWM_THRESH_ADDR,
840 REGISTER_VAL(priv->data->pwm_deb->pwm_thresh));
841 regmap_write(priv->regmap, ACCDET_RISE_DELAY_ADDR,
842 (priv->data->pwm_deb->fall_delay << 15 |
843 priv->data->pwm_deb->rise_delay));
845 regmap_read(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, &reg);
846 if (priv->data->mic_vol <= 7) {
848 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
849 reg | (priv->data->mic_vol << RG_AUDMICBIAS1VREF_SFT) |
851 } else if (priv->data->mic_vol == 8) {
853 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
856 } else if (priv->data->mic_vol == 9) {
858 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
863 regmap_read(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR, &reg);
864 if (priv->data->mic_mode == HEADSET_MODE_1) {
866 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
869 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
872 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR,
874 } else if (priv->data->mic_mode == HEADSET_MODE_2) {
876 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
879 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
882 } else if (priv->data->mic_mode == HEADSET_MODE_6) {
886 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR,
888 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR,
892 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR,
897 if (priv->caps & ACCDET_PMIC_EINT_IRQ) {
898 config_eint_init_by_mode(priv);
899 config_digital_init_by_mode(priv);
906 struct mt6359_accdet *priv =
914 priv->jack = jack;
916 mt6359_accdet_jack_report(priv);
924 struct mt6359_accdet *priv;
931 priv = devm_kzalloc(&pdev->dev, sizeof(struct mt6359_accdet),
933 if (!priv)
936 priv->data = devm_kzalloc(&pdev->dev, sizeof(struct dts_data),
938 if (!priv->data)
941 priv->data->pwm_deb = devm_kzalloc(&pdev->dev,
944 if (!priv->data->pwm_deb)
947 priv->regmap = mt6397->regmap;
948 if (IS_ERR(priv->regmap)) {
949 ret = PTR_ERR(priv->regmap);
954 priv->dev = &pdev->dev;
956 ret = mt6359_accdet_parse_dt(priv);
961 mutex_init(&priv->res_lock);
963 priv->accdet_irq = platform_get_irq(pdev, 0);
964 if (priv->accdet_irq >= 0) {
965 ret = devm_request_threaded_irq(&pdev->dev, priv->accdet_irq,
968 "ACCDET_IRQ", priv);
976 if (priv->caps & ACCDET_PMIC_EINT0) {
977 priv->accdet_eint0 = platform_get_irq(pdev, 1);
978 if (priv->accdet_eint0 >= 0) {
980 priv->accdet_eint0,
983 "ACCDET_EINT0", priv);
991 } else if (priv->caps & ACCDET_PMIC_EINT1) {
992 priv->accdet_eint1 = platform_get_irq(pdev, 2);
993 if (priv->accdet_eint1 >= 0) {
995 priv->accdet_eint1,
998 "ACCDET_EINT1", priv);
1008 priv->accdet_workqueue = create_singlethread_workqueue("accdet");
1009 INIT_WORK(&priv->accdet_work, mt6359_accdet_work);
1010 if (!priv->accdet_workqueue) {
1016 priv->jd_workqueue = create_singlethread_workqueue("mt6359_accdet_jd");
1017 INIT_WORK(&priv->jd_work, mt6359_accdet_jd_work);
1018 if (!priv->jd_workqueue) {
1024 platform_set_drvdata(pdev, priv);
1033 priv->jd_sts = M_PLUG_OUT;
1034 priv->jack_type = 0;
1035 priv->btn_type = 0;
1036 priv->accdet_status = 0x3;
1037 mt6359_accdet_init(priv);
1039 mt6359_accdet_jack_report(priv);
1044 destroy_workqueue(priv->accdet_workqueue);