Lines Matching refs:info

137 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info);
139 static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info, in arizona_extcon_hp_clamp() argument
142 struct arizona *arizona = info->arizona; in arizona_extcon_hp_clamp()
205 static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode) in arizona_extcon_set_mode() argument
207 struct arizona *arizona = info->arizona; in arizona_extcon_set_mode()
209 mode %= info->micd_num_modes; in arizona_extcon_set_mode()
213 info->micd_modes[mode].gpio); in arizona_extcon_set_mode()
216 info->micd_modes[mode].bias << in arizona_extcon_set_mode()
219 ARIZONA_ACCDET_SRC, info->micd_modes[mode].src); in arizona_extcon_set_mode()
221 info->micd_mode = mode; in arizona_extcon_set_mode()
226 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info *info) in arizona_extcon_get_micbias() argument
228 switch (info->micd_modes[0].bias) { in arizona_extcon_get_micbias()
240 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info) in arizona_extcon_pulse_micbias() argument
242 struct arizona *arizona = info->arizona; in arizona_extcon_pulse_micbias()
243 const char *widget = arizona_extcon_get_micbias(info); in arizona_extcon_pulse_micbias()
264 static void arizona_start_mic(struct arizona_extcon_info *info) in arizona_start_mic() argument
266 struct arizona *arizona = info->arizona; in arizona_start_mic()
271 pm_runtime_get(info->dev); in arizona_start_mic()
273 if (info->detecting) { in arizona_start_mic()
274 ret = regulator_allow_bypass(info->micvdd, false); in arizona_start_mic()
282 ret = regulator_enable(info->micvdd); in arizona_start_mic()
288 if (info->micd_reva) { in arizona_start_mic()
298 arizona_extcon_pulse_micbias(info); in arizona_start_mic()
304 regulator_disable(info->micvdd); in arizona_start_mic()
305 pm_runtime_put_autosuspend(info->dev); in arizona_start_mic()
309 static void arizona_stop_mic(struct arizona_extcon_info *info) in arizona_stop_mic() argument
311 struct arizona *arizona = info->arizona; in arizona_stop_mic()
312 const char *widget = arizona_extcon_get_micbias(info); in arizona_stop_mic()
329 if (info->micd_reva) { in arizona_stop_mic()
335 ret = regulator_allow_bypass(info->micvdd, true); in arizona_stop_mic()
342 regulator_disable(info->micvdd); in arizona_stop_mic()
343 pm_runtime_mark_last_busy(info->dev); in arizona_stop_mic()
344 pm_runtime_put_autosuspend(info->dev); in arizona_stop_mic()
370 static int arizona_hpdet_read(struct arizona_extcon_info *info) in arizona_hpdet_read() argument
372 struct arizona *arizona = info->arizona; in arizona_hpdet_read()
383 switch (info->hpdet_ip) { in arizona_hpdet_read()
444 info->hpdet_ip); in arizona_hpdet_read()
487 static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading, in arizona_hpdet_do_id() argument
490 struct arizona *arizona = info->arizona; in arizona_hpdet_do_id()
498 info->hpdet_res[info->num_hpdet_res++] = *reading; in arizona_hpdet_do_id()
501 if (id_gpio && info->num_hpdet_res == 1) { in arizona_hpdet_do_id()
509 info->micd_modes[0].src); in arizona_hpdet_do_id()
521 info->hpdet_res[0], info->hpdet_res[1]); in arizona_hpdet_do_id()
524 *reading = info->hpdet_res[0]; in arizona_hpdet_do_id()
527 if (*reading >= ARIZONA_HPDET_MAX && !info->hpdet_retried) { in arizona_hpdet_do_id()
529 info->num_hpdet_res = 0; in arizona_hpdet_do_id()
530 info->hpdet_retried = true; in arizona_hpdet_do_id()
531 arizona_start_hpdet_acc_id(info); in arizona_hpdet_do_id()
532 pm_runtime_put(info->dev); in arizona_hpdet_do_id()
539 if (!id_gpio || info->hpdet_res[1] > 50) { in arizona_hpdet_do_id()
542 info->detecting = true; in arizona_hpdet_do_id()
551 info->micd_modes[0].src); in arizona_hpdet_do_id()
559 struct arizona_extcon_info *info = data; in arizona_hpdet_irq() local
560 struct arizona *arizona = info->arizona; in arizona_hpdet_irq()
566 mutex_lock(&info->lock); in arizona_hpdet_irq()
569 if (!info->hpdet_active) { in arizona_hpdet_irq()
571 mutex_unlock(&info->lock); in arizona_hpdet_irq()
576 ret = extcon_get_cable_state_(info->edev, ARIZONA_CABLE_MECHANICAL); in arizona_hpdet_irq()
586 ret = arizona_hpdet_read(info); in arizona_hpdet_irq()
599 ret = arizona_hpdet_do_id(info, &reading, &mic); in arizona_hpdet_irq()
611 ret = extcon_set_cable_state_(info->edev, report, true); in arizona_hpdet_irq()
623 arizona_extcon_hp_clamp(info, false); in arizona_hpdet_irq()
634 if (mic || info->mic) in arizona_hpdet_irq()
635 arizona_start_mic(info); in arizona_hpdet_irq()
637 if (info->hpdet_active) { in arizona_hpdet_irq()
638 pm_runtime_put_autosuspend(info->dev); in arizona_hpdet_irq()
639 info->hpdet_active = false; in arizona_hpdet_irq()
642 info->hpdet_done = true; in arizona_hpdet_irq()
645 mutex_unlock(&info->lock); in arizona_hpdet_irq()
650 static void arizona_identify_headphone(struct arizona_extcon_info *info) in arizona_identify_headphone() argument
652 struct arizona *arizona = info->arizona; in arizona_identify_headphone()
655 if (info->hpdet_done) in arizona_identify_headphone()
661 pm_runtime_get(info->dev); in arizona_identify_headphone()
663 info->hpdet_active = true; in arizona_identify_headphone()
665 if (info->mic) in arizona_identify_headphone()
666 arizona_stop_mic(info); in arizona_identify_headphone()
668 arizona_extcon_hp_clamp(info, true); in arizona_identify_headphone()
694 ret = extcon_set_cable_state_(info->edev, in arizona_identify_headphone()
699 if (info->mic) in arizona_identify_headphone()
700 arizona_start_mic(info); in arizona_identify_headphone()
702 info->hpdet_active = false; in arizona_identify_headphone()
705 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info) in arizona_start_hpdet_acc_id() argument
707 struct arizona *arizona = info->arizona; in arizona_start_hpdet_acc_id()
715 pm_runtime_get_sync(info->dev); in arizona_start_hpdet_acc_id()
717 info->hpdet_active = true; in arizona_start_hpdet_acc_id()
719 arizona_extcon_hp_clamp(info, true); in arizona_start_hpdet_acc_id()
724 info->micd_modes[0].src | in arizona_start_hpdet_acc_id()
742 arizona_hpdet_do_id(info, &hp_reading, &mic); in arizona_start_hpdet_acc_id()
752 ret = extcon_set_cable_state_(info->edev, in arizona_start_hpdet_acc_id()
757 info->hpdet_active = false; in arizona_start_hpdet_acc_id()
762 struct arizona_extcon_info *info = container_of(work, in arizona_micd_timeout_work() local
766 mutex_lock(&info->lock); in arizona_micd_timeout_work()
768 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n"); in arizona_micd_timeout_work()
769 arizona_identify_headphone(info); in arizona_micd_timeout_work()
771 info->detecting = false; in arizona_micd_timeout_work()
773 arizona_stop_mic(info); in arizona_micd_timeout_work()
775 mutex_unlock(&info->lock); in arizona_micd_timeout_work()
780 struct arizona_extcon_info *info = container_of(work, in arizona_micd_detect() local
783 struct arizona *arizona = info->arizona; in arizona_micd_detect()
787 cancel_delayed_work_sync(&info->micd_timeout_work); in arizona_micd_detect()
789 mutex_lock(&info->lock); in arizona_micd_detect()
792 ret = extcon_get_cable_state_(info->edev, ARIZONA_CABLE_MECHANICAL); in arizona_micd_detect()
796 mutex_unlock(&info->lock); in arizona_micd_detect()
800 mutex_unlock(&info->lock); in arizona_micd_detect()
809 mutex_unlock(&info->lock); in arizona_micd_detect()
818 mutex_unlock(&info->lock); in arizona_micd_detect()
825 mutex_unlock(&info->lock); in arizona_micd_detect()
832 info->detecting = false; in arizona_micd_detect()
837 if (info->detecting && (val & ARIZONA_MICD_LVL_8)) { in arizona_micd_detect()
838 arizona_identify_headphone(info); in arizona_micd_detect()
840 ret = extcon_set_cable_state_(info->edev, in arizona_micd_detect()
848 ret = regulator_allow_bypass(info->micvdd, true); in arizona_micd_detect()
854 info->mic = true; in arizona_micd_detect()
855 info->detecting = false; in arizona_micd_detect()
865 if (info->detecting && (val & MICD_LVL_1_TO_7)) { in arizona_micd_detect()
866 if (info->jack_flips >= info->micd_num_modes * 10) { in arizona_micd_detect()
868 arizona_identify_headphone(info); in arizona_micd_detect()
870 info->detecting = false; in arizona_micd_detect()
872 arizona_stop_mic(info); in arizona_micd_detect()
874 info->micd_mode++; in arizona_micd_detect()
875 if (info->micd_mode == info->micd_num_modes) in arizona_micd_detect()
876 info->micd_mode = 0; in arizona_micd_detect()
877 arizona_extcon_set_mode(info, info->micd_mode); in arizona_micd_detect()
879 info->jack_flips++; in arizona_micd_detect()
890 if (info->mic) { in arizona_micd_detect()
896 for (i = 0; i < info->num_micd_ranges; i++) in arizona_micd_detect()
897 input_report_key(info->input, in arizona_micd_detect()
898 info->micd_ranges[i].key, 0); in arizona_micd_detect()
901 WARN_ON(ffs(lvl) - 1 >= info->num_micd_ranges); in arizona_micd_detect()
902 if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) { in arizona_micd_detect()
903 key = info->micd_ranges[ffs(lvl) - 1].key; in arizona_micd_detect()
904 input_report_key(info->input, key, 1); in arizona_micd_detect()
905 input_sync(info->input); in arizona_micd_detect()
908 } else if (info->detecting) { in arizona_micd_detect()
910 info->detecting = false; in arizona_micd_detect()
911 arizona_stop_mic(info); in arizona_micd_detect()
913 arizona_identify_headphone(info); in arizona_micd_detect()
920 for (i = 0; i < info->num_micd_ranges; i++) in arizona_micd_detect()
921 input_report_key(info->input, in arizona_micd_detect()
922 info->micd_ranges[i].key, 0); in arizona_micd_detect()
923 input_sync(info->input); in arizona_micd_detect()
924 arizona_extcon_pulse_micbias(info); in arizona_micd_detect()
928 if (info->detecting) in arizona_micd_detect()
930 &info->micd_timeout_work, in arizona_micd_detect()
931 msecs_to_jiffies(info->micd_timeout)); in arizona_micd_detect()
933 pm_runtime_mark_last_busy(info->dev); in arizona_micd_detect()
934 mutex_unlock(&info->lock); in arizona_micd_detect()
939 struct arizona_extcon_info *info = data; in arizona_micdet() local
940 struct arizona *arizona = info->arizona; in arizona_micdet()
943 cancel_delayed_work_sync(&info->micd_detect_work); in arizona_micdet()
944 cancel_delayed_work_sync(&info->micd_timeout_work); in arizona_micdet()
946 mutex_lock(&info->lock); in arizona_micdet()
947 if (!info->detecting) in arizona_micdet()
949 mutex_unlock(&info->lock); in arizona_micdet()
953 &info->micd_detect_work, in arizona_micdet()
956 arizona_micd_detect(&info->micd_detect_work.work); in arizona_micdet()
963 struct arizona_extcon_info *info = container_of(work, in arizona_hpdet_work() local
967 mutex_lock(&info->lock); in arizona_hpdet_work()
968 arizona_start_hpdet_acc_id(info); in arizona_hpdet_work()
969 mutex_unlock(&info->lock); in arizona_hpdet_work()
974 struct arizona_extcon_info *info = data; in arizona_jackdet() local
975 struct arizona *arizona = info->arizona; in arizona_jackdet()
980 cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work); in arizona_jackdet()
981 cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work); in arizona_jackdet()
983 pm_runtime_get_sync(info->dev); in arizona_jackdet()
985 mutex_lock(&info->lock); in arizona_jackdet()
1005 mutex_unlock(&info->lock); in arizona_jackdet()
1006 pm_runtime_put_autosuspend(info->dev); in arizona_jackdet()
1011 if (val == info->last_jackdet) { in arizona_jackdet()
1015 &info->hpdet_work, in arizona_jackdet()
1019 int micd_timeout = info->micd_timeout; in arizona_jackdet()
1022 &info->micd_timeout_work, in arizona_jackdet()
1028 info->last_jackdet = val; in arizona_jackdet()
1030 if (info->last_jackdet == present) { in arizona_jackdet()
1032 ret = extcon_set_cable_state_(info->edev, in arizona_jackdet()
1040 info->detecting = true; in arizona_jackdet()
1041 info->mic = false; in arizona_jackdet()
1042 info->jack_flips = 0; in arizona_jackdet()
1044 arizona_start_mic(info); in arizona_jackdet()
1047 &info->hpdet_work, in arizona_jackdet()
1057 arizona_stop_mic(info); in arizona_jackdet()
1059 info->num_hpdet_res = 0; in arizona_jackdet()
1060 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++) in arizona_jackdet()
1061 info->hpdet_res[i] = 0; in arizona_jackdet()
1062 info->mic = false; in arizona_jackdet()
1063 info->hpdet_done = false; in arizona_jackdet()
1064 info->hpdet_retried = false; in arizona_jackdet()
1066 for (i = 0; i < info->num_micd_ranges; i++) in arizona_jackdet()
1067 input_report_key(info->input, in arizona_jackdet()
1068 info->micd_ranges[i].key, 0); in arizona_jackdet()
1069 input_sync(info->input); in arizona_jackdet()
1071 ret = extcon_update_state(info->edev, 0xffffffff, 0); in arizona_jackdet()
1083 info->micd_timeout = arizona->pdata.micd_timeout; in arizona_jackdet()
1085 info->micd_timeout = DEFAULT_MICD_TIMEOUT; in arizona_jackdet()
1095 mutex_unlock(&info->lock); in arizona_jackdet()
1097 pm_runtime_mark_last_busy(info->dev); in arizona_jackdet()
1098 pm_runtime_put_autosuspend(info->dev); in arizona_jackdet()
1127 struct arizona_extcon_info *info; in arizona_extcon_probe() local
1136 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in arizona_extcon_probe()
1137 if (!info) in arizona_extcon_probe()
1140 info->micvdd = devm_regulator_get(&pdev->dev, "MICVDD"); in arizona_extcon_probe()
1141 if (IS_ERR(info->micvdd)) { in arizona_extcon_probe()
1142 ret = PTR_ERR(info->micvdd); in arizona_extcon_probe()
1147 mutex_init(&info->lock); in arizona_extcon_probe()
1148 info->arizona = arizona; in arizona_extcon_probe()
1149 info->dev = &pdev->dev; in arizona_extcon_probe()
1150 info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS); in arizona_extcon_probe()
1151 INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work); in arizona_extcon_probe()
1152 INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect); in arizona_extcon_probe()
1153 INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work); in arizona_extcon_probe()
1154 platform_set_drvdata(pdev, info); in arizona_extcon_probe()
1160 info->micd_reva = true; in arizona_extcon_probe()
1163 info->micd_clamp = true; in arizona_extcon_probe()
1164 info->hpdet_ip = 1; in arizona_extcon_probe()
1174 info->micd_clamp = true; in arizona_extcon_probe()
1175 info->hpdet_ip = 2; in arizona_extcon_probe()
1183 info->edev = devm_extcon_dev_allocate(&pdev->dev, arizona_cable); in arizona_extcon_probe()
1184 if (IS_ERR(info->edev)) { in arizona_extcon_probe()
1188 info->edev->name = "Headset Jack"; in arizona_extcon_probe()
1190 ret = devm_extcon_dev_register(&pdev->dev, info->edev); in arizona_extcon_probe()
1197 info->input = devm_input_allocate_device(&pdev->dev); in arizona_extcon_probe()
1198 if (!info->input) { in arizona_extcon_probe()
1204 info->input->name = "Headset"; in arizona_extcon_probe()
1205 info->input->phys = "arizona/extcon"; in arizona_extcon_probe()
1208 info->micd_modes = pdata->micd_configs; in arizona_extcon_probe()
1209 info->micd_num_modes = pdata->num_micd_configs; in arizona_extcon_probe()
1211 info->micd_modes = micd_default_modes; in arizona_extcon_probe()
1212 info->micd_num_modes = ARRAY_SIZE(micd_default_modes); in arizona_extcon_probe()
1216 if (info->micd_modes[0].gpio) in arizona_extcon_probe()
1265 info->micd_ranges = pdata->micd_ranges; in arizona_extcon_probe()
1266 info->num_micd_ranges = pdata->num_micd_ranges; in arizona_extcon_probe()
1268 info->micd_ranges = micd_default_ranges; in arizona_extcon_probe()
1269 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges); in arizona_extcon_probe()
1277 if (info->num_micd_ranges > 1) { in arizona_extcon_probe()
1278 for (i = 1; i < info->num_micd_ranges; i++) { in arizona_extcon_probe()
1279 if (info->micd_ranges[i - 1].max > in arizona_extcon_probe()
1280 info->micd_ranges[i].max) { in arizona_extcon_probe()
1294 for (i = 0; i < info->num_micd_ranges; i++) { in arizona_extcon_probe()
1296 if (arizona_micd_levels[j] >= info->micd_ranges[i].max) in arizona_extcon_probe()
1301 info->micd_ranges[i].max); in arizona_extcon_probe()
1310 input_set_capability(info->input, EV_KEY, in arizona_extcon_probe()
1311 info->micd_ranges[i].key); in arizona_extcon_probe()
1326 if (info->micd_clamp) { in arizona_extcon_probe()
1357 arizona_extcon_set_mode(info, 0); in arizona_extcon_probe()
1372 "JACKDET rise", arizona_jackdet, info); in arizona_extcon_probe()
1387 "JACKDET fall", arizona_jackdet, info); in arizona_extcon_probe()
1401 "MICDET", arizona_micdet, info); in arizona_extcon_probe()
1408 "HPDET", arizona_hpdet_irq, info); in arizona_extcon_probe()
1420 ret = regulator_allow_bypass(info->micvdd, true); in arizona_extcon_probe()
1427 ret = input_register_device(info->input); in arizona_extcon_probe()
1436 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info); in arizona_extcon_probe()
1438 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info); in arizona_extcon_probe()
1442 arizona_free_irq(arizona, jack_irq_fall, info); in arizona_extcon_probe()
1446 arizona_free_irq(arizona, jack_irq_rise, info); in arizona_extcon_probe()
1455 struct arizona_extcon_info *info = platform_get_drvdata(pdev); in arizona_extcon_remove() local
1456 struct arizona *arizona = info->arizona; in arizona_extcon_remove()
1475 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info); in arizona_extcon_remove()
1476 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info); in arizona_extcon_remove()
1477 arizona_free_irq(arizona, jack_irq_rise, info); in arizona_extcon_remove()
1478 arizona_free_irq(arizona, jack_irq_fall, info); in arizona_extcon_remove()
1479 cancel_delayed_work_sync(&info->hpdet_work); in arizona_extcon_remove()