Lines Matching refs:info

146 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info);
148 static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info, in arizona_extcon_hp_clamp() argument
151 struct arizona *arizona = info->arizona; in arizona_extcon_hp_clamp()
233 static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode) in arizona_extcon_set_mode() argument
235 struct arizona *arizona = info->arizona; in arizona_extcon_set_mode()
237 mode %= info->micd_num_modes; in arizona_extcon_set_mode()
241 info->micd_modes[mode].gpio); in arizona_extcon_set_mode()
243 gpiod_set_value_cansleep(info->micd_pol_gpio, in arizona_extcon_set_mode()
244 info->micd_modes[mode].gpio); in arizona_extcon_set_mode()
248 info->micd_modes[mode].bias << in arizona_extcon_set_mode()
251 ARIZONA_ACCDET_SRC, info->micd_modes[mode].src); in arizona_extcon_set_mode()
253 info->micd_mode = mode; in arizona_extcon_set_mode()
258 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info *info) in arizona_extcon_get_micbias() argument
260 switch (info->micd_modes[0].bias) { in arizona_extcon_get_micbias()
272 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info) in arizona_extcon_pulse_micbias() argument
274 struct arizona *arizona = info->arizona; in arizona_extcon_pulse_micbias()
275 const char *widget = arizona_extcon_get_micbias(info); in arizona_extcon_pulse_micbias()
296 static void arizona_start_mic(struct arizona_extcon_info *info) in arizona_start_mic() argument
298 struct arizona *arizona = info->arizona; in arizona_start_mic()
304 pm_runtime_get(info->dev); in arizona_start_mic()
306 if (info->detecting) { in arizona_start_mic()
307 ret = regulator_allow_bypass(info->micvdd, false); in arizona_start_mic()
315 ret = regulator_enable(info->micvdd); in arizona_start_mic()
321 if (info->micd_reva) { in arizona_start_mic()
327 if (info->detecting && arizona->pdata.micd_software_compare) in arizona_start_mic()
336 arizona_extcon_pulse_micbias(info); in arizona_start_mic()
342 regulator_disable(info->micvdd); in arizona_start_mic()
343 pm_runtime_put_autosuspend(info->dev); in arizona_start_mic()
347 static void arizona_stop_mic(struct arizona_extcon_info *info) in arizona_stop_mic() argument
349 struct arizona *arizona = info->arizona; in arizona_stop_mic()
350 const char *widget = arizona_extcon_get_micbias(info); in arizona_stop_mic()
367 if (info->micd_reva) { in arizona_stop_mic()
373 ret = regulator_allow_bypass(info->micvdd, true); in arizona_stop_mic()
380 regulator_disable(info->micvdd); in arizona_stop_mic()
381 pm_runtime_mark_last_busy(info->dev); in arizona_stop_mic()
382 pm_runtime_put_autosuspend(info->dev); in arizona_stop_mic()
408 static int arizona_hpdet_read(struct arizona_extcon_info *info) in arizona_hpdet_read() argument
410 struct arizona *arizona = info->arizona; in arizona_hpdet_read()
421 switch (info->hpdet_ip_version) { in arizona_hpdet_read()
520 info->hpdet_ip_version); in arizona_hpdet_read()
528 static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading, in arizona_hpdet_do_id() argument
531 struct arizona *arizona = info->arizona; in arizona_hpdet_do_id()
539 info->hpdet_res[info->num_hpdet_res++] = *reading; in arizona_hpdet_do_id()
542 if (id_gpio && info->num_hpdet_res == 1) { in arizona_hpdet_do_id()
550 info->micd_modes[0].src); in arizona_hpdet_do_id()
562 info->hpdet_res[0], info->hpdet_res[1]); in arizona_hpdet_do_id()
565 *reading = info->hpdet_res[0]; in arizona_hpdet_do_id()
568 if (*reading >= ARIZONA_HPDET_MAX && !info->hpdet_retried) { in arizona_hpdet_do_id()
570 info->num_hpdet_res = 0; in arizona_hpdet_do_id()
571 info->hpdet_retried = true; in arizona_hpdet_do_id()
572 arizona_start_hpdet_acc_id(info); in arizona_hpdet_do_id()
573 pm_runtime_put(info->dev); in arizona_hpdet_do_id()
580 if (!id_gpio || info->hpdet_res[1] > 50) { in arizona_hpdet_do_id()
583 info->detecting = true; in arizona_hpdet_do_id()
592 info->micd_modes[0].src); in arizona_hpdet_do_id()
600 struct arizona_extcon_info *info = data; in arizona_hpdet_irq() local
601 struct arizona *arizona = info->arizona; in arizona_hpdet_irq()
607 mutex_lock(&info->lock); in arizona_hpdet_irq()
610 if (!info->hpdet_active) { in arizona_hpdet_irq()
612 mutex_unlock(&info->lock); in arizona_hpdet_irq()
617 ret = extcon_get_cable_state_(info->edev, EXTCON_MECHANICAL); in arizona_hpdet_irq()
627 ret = arizona_hpdet_read(info); in arizona_hpdet_irq()
640 ret = arizona_hpdet_do_id(info, &reading, &mic); in arizona_hpdet_irq()
652 ret = extcon_set_cable_state_(info->edev, report, true); in arizona_hpdet_irq()
664 arizona_extcon_hp_clamp(info, false); in arizona_hpdet_irq()
675 if (mic || info->mic) in arizona_hpdet_irq()
676 arizona_start_mic(info); in arizona_hpdet_irq()
678 if (info->hpdet_active) { in arizona_hpdet_irq()
679 pm_runtime_put_autosuspend(info->dev); in arizona_hpdet_irq()
680 info->hpdet_active = false; in arizona_hpdet_irq()
683 info->hpdet_done = true; in arizona_hpdet_irq()
686 mutex_unlock(&info->lock); in arizona_hpdet_irq()
691 static void arizona_identify_headphone(struct arizona_extcon_info *info) in arizona_identify_headphone() argument
693 struct arizona *arizona = info->arizona; in arizona_identify_headphone()
696 if (info->hpdet_done) in arizona_identify_headphone()
702 pm_runtime_get(info->dev); in arizona_identify_headphone()
704 info->hpdet_active = true; in arizona_identify_headphone()
706 if (info->mic) in arizona_identify_headphone()
707 arizona_stop_mic(info); in arizona_identify_headphone()
709 arizona_extcon_hp_clamp(info, true); in arizona_identify_headphone()
735 ret = extcon_set_cable_state_(info->edev, EXTCON_JACK_HEADPHONE, true); in arizona_identify_headphone()
739 if (info->mic) in arizona_identify_headphone()
740 arizona_start_mic(info); in arizona_identify_headphone()
742 info->hpdet_active = false; in arizona_identify_headphone()
745 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info) in arizona_start_hpdet_acc_id() argument
747 struct arizona *arizona = info->arizona; in arizona_start_hpdet_acc_id()
755 pm_runtime_get_sync(info->dev); in arizona_start_hpdet_acc_id()
757 info->hpdet_active = true; in arizona_start_hpdet_acc_id()
759 arizona_extcon_hp_clamp(info, true); in arizona_start_hpdet_acc_id()
764 info->micd_modes[0].src | in arizona_start_hpdet_acc_id()
782 arizona_hpdet_do_id(info, &hp_reading, &mic); in arizona_start_hpdet_acc_id()
792 ret = extcon_set_cable_state_(info->edev, EXTCON_JACK_HEADPHONE, true); in arizona_start_hpdet_acc_id()
796 info->hpdet_active = false; in arizona_start_hpdet_acc_id()
801 struct arizona_extcon_info *info = container_of(work, in arizona_micd_timeout_work() local
805 mutex_lock(&info->lock); in arizona_micd_timeout_work()
807 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n"); in arizona_micd_timeout_work()
809 info->detecting = false; in arizona_micd_timeout_work()
811 arizona_identify_headphone(info); in arizona_micd_timeout_work()
813 arizona_stop_mic(info); in arizona_micd_timeout_work()
815 mutex_unlock(&info->lock); in arizona_micd_timeout_work()
820 struct arizona_extcon_info *info = container_of(work, in arizona_micd_detect() local
823 struct arizona *arizona = info->arizona; in arizona_micd_detect()
827 cancel_delayed_work_sync(&info->micd_timeout_work); in arizona_micd_detect()
829 mutex_lock(&info->lock); in arizona_micd_detect()
832 ret = extcon_get_cable_state_(info->edev, EXTCON_MECHANICAL); in arizona_micd_detect()
836 mutex_unlock(&info->lock); in arizona_micd_detect()
840 mutex_unlock(&info->lock); in arizona_micd_detect()
844 if (info->detecting && arizona->pdata.micd_software_compare) { in arizona_micd_detect()
853 mutex_unlock(&info->lock); in arizona_micd_detect()
880 mutex_unlock(&info->lock); in arizona_micd_detect()
889 mutex_unlock(&info->lock); in arizona_micd_detect()
896 mutex_unlock(&info->lock); in arizona_micd_detect()
903 info->mic = false; in arizona_micd_detect()
904 arizona_stop_mic(info); in arizona_micd_detect()
905 info->detecting = false; in arizona_micd_detect()
906 arizona_identify_headphone(info); in arizona_micd_detect()
911 if (info->detecting && (val & ARIZONA_MICD_LVL_8)) { in arizona_micd_detect()
912 info->mic = true; in arizona_micd_detect()
913 info->detecting = false; in arizona_micd_detect()
915 arizona_identify_headphone(info); in arizona_micd_detect()
917 ret = extcon_set_cable_state_(info->edev, in arizona_micd_detect()
924 ret = regulator_allow_bypass(info->micvdd, true); in arizona_micd_detect()
939 if (info->detecting && (val & MICD_LVL_1_TO_7)) { in arizona_micd_detect()
940 if (info->jack_flips >= info->micd_num_modes * 10) { in arizona_micd_detect()
943 info->detecting = false; in arizona_micd_detect()
945 arizona_identify_headphone(info); in arizona_micd_detect()
947 arizona_stop_mic(info); in arizona_micd_detect()
949 info->micd_mode++; in arizona_micd_detect()
950 if (info->micd_mode == info->micd_num_modes) in arizona_micd_detect()
951 info->micd_mode = 0; in arizona_micd_detect()
952 arizona_extcon_set_mode(info, info->micd_mode); in arizona_micd_detect()
954 info->jack_flips++; in arizona_micd_detect()
965 if (info->mic) { in arizona_micd_detect()
971 for (i = 0; i < info->num_micd_ranges; i++) in arizona_micd_detect()
972 input_report_key(info->input, in arizona_micd_detect()
973 info->micd_ranges[i].key, 0); in arizona_micd_detect()
976 WARN_ON(ffs(lvl) - 1 >= info->num_micd_ranges); in arizona_micd_detect()
977 if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) { in arizona_micd_detect()
978 key = info->micd_ranges[ffs(lvl) - 1].key; in arizona_micd_detect()
979 input_report_key(info->input, key, 1); in arizona_micd_detect()
980 input_sync(info->input); in arizona_micd_detect()
983 } else if (info->detecting) { in arizona_micd_detect()
985 info->detecting = false; in arizona_micd_detect()
986 arizona_stop_mic(info); in arizona_micd_detect()
988 arizona_identify_headphone(info); in arizona_micd_detect()
995 for (i = 0; i < info->num_micd_ranges; i++) in arizona_micd_detect()
996 input_report_key(info->input, in arizona_micd_detect()
997 info->micd_ranges[i].key, 0); in arizona_micd_detect()
998 input_sync(info->input); in arizona_micd_detect()
999 arizona_extcon_pulse_micbias(info); in arizona_micd_detect()
1003 if (info->detecting) { in arizona_micd_detect()
1011 &info->micd_timeout_work, in arizona_micd_detect()
1012 msecs_to_jiffies(info->micd_timeout)); in arizona_micd_detect()
1015 pm_runtime_mark_last_busy(info->dev); in arizona_micd_detect()
1016 mutex_unlock(&info->lock); in arizona_micd_detect()
1021 struct arizona_extcon_info *info = data; in arizona_micdet() local
1022 struct arizona *arizona = info->arizona; in arizona_micdet()
1025 cancel_delayed_work_sync(&info->micd_detect_work); in arizona_micdet()
1026 cancel_delayed_work_sync(&info->micd_timeout_work); in arizona_micdet()
1028 mutex_lock(&info->lock); in arizona_micdet()
1029 if (!info->detecting) in arizona_micdet()
1031 mutex_unlock(&info->lock); in arizona_micdet()
1035 &info->micd_detect_work, in arizona_micdet()
1038 arizona_micd_detect(&info->micd_detect_work.work); in arizona_micdet()
1045 struct arizona_extcon_info *info = container_of(work, in arizona_hpdet_work() local
1049 mutex_lock(&info->lock); in arizona_hpdet_work()
1050 arizona_start_hpdet_acc_id(info); in arizona_hpdet_work()
1051 mutex_unlock(&info->lock); in arizona_hpdet_work()
1056 struct arizona_extcon_info *info = data; in arizona_jackdet() local
1057 struct arizona *arizona = info->arizona; in arizona_jackdet()
1062 cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work); in arizona_jackdet()
1063 cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work); in arizona_jackdet()
1065 pm_runtime_get_sync(info->dev); in arizona_jackdet()
1067 mutex_lock(&info->lock); in arizona_jackdet()
1069 if (info->micd_clamp) { in arizona_jackdet()
1084 mutex_unlock(&info->lock); in arizona_jackdet()
1085 pm_runtime_put_autosuspend(info->dev); in arizona_jackdet()
1090 if (val == info->last_jackdet) { in arizona_jackdet()
1094 &info->hpdet_work, in arizona_jackdet()
1098 int micd_timeout = info->micd_timeout; in arizona_jackdet()
1101 &info->micd_timeout_work, in arizona_jackdet()
1107 info->last_jackdet = val; in arizona_jackdet()
1109 if (info->last_jackdet == present) { in arizona_jackdet()
1111 ret = extcon_set_cable_state_(info->edev, in arizona_jackdet()
1119 info->detecting = true; in arizona_jackdet()
1120 info->mic = false; in arizona_jackdet()
1121 info->jack_flips = 0; in arizona_jackdet()
1123 arizona_start_mic(info); in arizona_jackdet()
1126 &info->hpdet_work, in arizona_jackdet()
1130 if (info->micd_clamp || !arizona->pdata.jd_invert) in arizona_jackdet()
1138 arizona_stop_mic(info); in arizona_jackdet()
1140 info->num_hpdet_res = 0; in arizona_jackdet()
1141 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++) in arizona_jackdet()
1142 info->hpdet_res[i] = 0; in arizona_jackdet()
1143 info->mic = false; in arizona_jackdet()
1144 info->hpdet_done = false; in arizona_jackdet()
1145 info->hpdet_retried = false; in arizona_jackdet()
1147 for (i = 0; i < info->num_micd_ranges; i++) in arizona_jackdet()
1148 input_report_key(info->input, in arizona_jackdet()
1149 info->micd_ranges[i].key, 0); in arizona_jackdet()
1150 input_sync(info->input); in arizona_jackdet()
1152 ret = extcon_update_state(info->edev, 0xffffffff, 0); in arizona_jackdet()
1164 info->micd_timeout = arizona->pdata.micd_timeout; in arizona_jackdet()
1166 info->micd_timeout = DEFAULT_MICD_TIMEOUT; in arizona_jackdet()
1176 mutex_unlock(&info->lock); in arizona_jackdet()
1178 pm_runtime_mark_last_busy(info->dev); in arizona_jackdet()
1179 pm_runtime_put_autosuspend(info->dev); in arizona_jackdet()
1246 struct arizona_extcon_info *info; in arizona_extcon_probe() local
1255 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in arizona_extcon_probe()
1256 if (!info) in arizona_extcon_probe()
1262 info->micvdd = devm_regulator_get(&pdev->dev, "MICVDD"); in arizona_extcon_probe()
1263 if (IS_ERR(info->micvdd)) { in arizona_extcon_probe()
1264 ret = PTR_ERR(info->micvdd); in arizona_extcon_probe()
1269 mutex_init(&info->lock); in arizona_extcon_probe()
1270 info->arizona = arizona; in arizona_extcon_probe()
1271 info->dev = &pdev->dev; in arizona_extcon_probe()
1272 info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS); in arizona_extcon_probe()
1273 INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work); in arizona_extcon_probe()
1274 INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect); in arizona_extcon_probe()
1275 INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work); in arizona_extcon_probe()
1276 platform_set_drvdata(pdev, info); in arizona_extcon_probe()
1282 info->micd_reva = true; in arizona_extcon_probe()
1285 info->micd_clamp = true; in arizona_extcon_probe()
1286 info->hpdet_ip_version = 1; in arizona_extcon_probe()
1296 info->micd_clamp = true; in arizona_extcon_probe()
1297 info->hpdet_ip_version = 2; in arizona_extcon_probe()
1303 info->micd_clamp = true; in arizona_extcon_probe()
1304 info->hpdet_ip_version = 2; in arizona_extcon_probe()
1310 info->edev = devm_extcon_dev_allocate(&pdev->dev, arizona_cable); in arizona_extcon_probe()
1311 if (IS_ERR(info->edev)) { in arizona_extcon_probe()
1316 ret = devm_extcon_dev_register(&pdev->dev, info->edev); in arizona_extcon_probe()
1323 info->input = devm_input_allocate_device(&pdev->dev); in arizona_extcon_probe()
1324 if (!info->input) { in arizona_extcon_probe()
1330 info->input->name = "Headset"; in arizona_extcon_probe()
1331 info->input->phys = "arizona/extcon"; in arizona_extcon_probe()
1334 info->micd_modes = pdata->micd_configs; in arizona_extcon_probe()
1335 info->micd_num_modes = pdata->num_micd_configs; in arizona_extcon_probe()
1337 info->micd_modes = micd_default_modes; in arizona_extcon_probe()
1338 info->micd_num_modes = ARRAY_SIZE(micd_default_modes); in arizona_extcon_probe()
1346 if (info->micd_modes[0].gpio) in arizona_extcon_probe()
1361 if (info->micd_modes[0].gpio) in arizona_extcon_probe()
1371 info->micd_pol_gpio = gpiod_get_optional(arizona->dev, in arizona_extcon_probe()
1374 if (IS_ERR(info->micd_pol_gpio)) { in arizona_extcon_probe()
1375 ret = PTR_ERR(info->micd_pol_gpio); in arizona_extcon_probe()
1425 info->micd_ranges = pdata->micd_ranges; in arizona_extcon_probe()
1426 info->num_micd_ranges = pdata->num_micd_ranges; in arizona_extcon_probe()
1428 info->micd_ranges = micd_default_ranges; in arizona_extcon_probe()
1429 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges); in arizona_extcon_probe()
1437 if (info->num_micd_ranges > 1) { in arizona_extcon_probe()
1438 for (i = 1; i < info->num_micd_ranges; i++) { in arizona_extcon_probe()
1439 if (info->micd_ranges[i - 1].max > in arizona_extcon_probe()
1440 info->micd_ranges[i].max) { in arizona_extcon_probe()
1454 for (i = 0; i < info->num_micd_ranges; i++) { in arizona_extcon_probe()
1456 if (arizona_micd_levels[j] >= info->micd_ranges[i].max) in arizona_extcon_probe()
1461 info->micd_ranges[i].max); in arizona_extcon_probe()
1470 input_set_capability(info->input, EV_KEY, in arizona_extcon_probe()
1471 info->micd_ranges[i].key); in arizona_extcon_probe()
1486 if (info->micd_clamp) { in arizona_extcon_probe()
1517 arizona_extcon_set_mode(info, 0); in arizona_extcon_probe()
1523 if (info->micd_clamp) { in arizona_extcon_probe()
1532 "JACKDET rise", arizona_jackdet, info); in arizona_extcon_probe()
1547 "JACKDET fall", arizona_jackdet, info); in arizona_extcon_probe()
1561 "MICDET", arizona_micdet, info); in arizona_extcon_probe()
1568 "HPDET", arizona_hpdet_irq, info); in arizona_extcon_probe()
1580 ret = regulator_allow_bypass(info->micvdd, true); in arizona_extcon_probe()
1587 ret = input_register_device(info->input); in arizona_extcon_probe()
1596 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info); in arizona_extcon_probe()
1598 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info); in arizona_extcon_probe()
1602 arizona_free_irq(arizona, jack_irq_fall, info); in arizona_extcon_probe()
1606 arizona_free_irq(arizona, jack_irq_rise, info); in arizona_extcon_probe()
1608 gpiod_put(info->micd_pol_gpio); in arizona_extcon_probe()
1616 struct arizona_extcon_info *info = platform_get_drvdata(pdev); in arizona_extcon_remove() local
1617 struct arizona *arizona = info->arizona; in arizona_extcon_remove()
1620 gpiod_put(info->micd_pol_gpio); in arizona_extcon_remove()
1628 if (info->micd_clamp) { in arizona_extcon_remove()
1638 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info); in arizona_extcon_remove()
1639 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info); in arizona_extcon_remove()
1640 arizona_free_irq(arizona, jack_irq_rise, info); in arizona_extcon_remove()
1641 arizona_free_irq(arizona, jack_irq_fall, info); in arizona_extcon_remove()
1642 cancel_delayed_work_sync(&info->hpdet_work); in arizona_extcon_remove()