Lines Matching refs:info

138 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info);
140 static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info,
143 struct arizona *arizona = info->arizona;
225 static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode)
227 struct arizona *arizona = info->arizona;
229 mode %= info->micd_num_modes;
231 gpiod_set_value_cansleep(info->micd_pol_gpio,
232 info->micd_modes[mode].gpio);
236 info->micd_modes[mode].bias <<
239 ARIZONA_ACCDET_SRC, info->micd_modes[mode].src);
241 info->micd_mode = mode;
246 static const char *arizona_extcon_get_micbias(struct arizona_extcon_info *info)
248 switch (info->micd_modes[0].bias) {
260 static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info)
262 struct arizona *arizona = info->arizona;
263 const char *widget = arizona_extcon_get_micbias(info);
285 static void arizona_start_mic(struct arizona_extcon_info *info)
287 struct arizona *arizona = info->arizona;
293 pm_runtime_get(info->dev);
295 if (info->detecting) {
296 ret = regulator_allow_bypass(info->micvdd, false);
304 ret = regulator_enable(info->micvdd);
310 if (info->micd_reva) {
320 if (info->detecting && arizona->pdata.micd_software_compare)
329 arizona_extcon_pulse_micbias(info);
337 regulator_disable(info->micvdd);
338 pm_runtime_put_autosuspend(info->dev);
342 static void arizona_stop_mic(struct arizona_extcon_info *info)
344 struct arizona *arizona = info->arizona;
345 const char *widget = arizona_extcon_get_micbias(info);
365 if (info->micd_reva) {
375 ret = regulator_allow_bypass(info->micvdd, true);
382 regulator_disable(info->micvdd);
383 pm_runtime_mark_last_busy(info->dev);
384 pm_runtime_put_autosuspend(info->dev);
410 static int arizona_hpdet_read(struct arizona_extcon_info *info)
412 struct arizona *arizona = info->arizona;
423 switch (info->hpdet_ip_version) {
522 info->hpdet_ip_version);
530 static int arizona_hpdet_do_id(struct arizona_extcon_info *info, int *reading,
533 struct arizona *arizona = info->arizona;
543 info->hpdet_res[info->num_hpdet_res++] = *reading;
546 if (id_gpio && info->num_hpdet_res == 1) {
554 info->micd_modes[0].src);
565 info->hpdet_res[0], info->hpdet_res[1]);
568 *reading = info->hpdet_res[0];
571 if (*reading >= ARIZONA_HPDET_MAX && !info->hpdet_retried) {
573 info->num_hpdet_res = 0;
574 info->hpdet_retried = true;
575 arizona_start_hpdet_acc_id(info);
576 pm_runtime_put(info->dev);
583 if (!id_gpio || info->hpdet_res[1] > 50) {
586 info->detecting = true;
593 ARIZONA_ACCDET_SRC, info->micd_modes[0].src);
600 struct arizona_extcon_info *info = data;
601 struct arizona *arizona = info->arizona;
607 mutex_lock(&info->lock);
610 if (!info->hpdet_active) {
612 mutex_unlock(&info->lock);
617 state = extcon_get_state(info->edev, EXTCON_MECHANICAL);
626 ret = arizona_hpdet_read(info);
639 ret = arizona_hpdet_do_id(info, &reading, &mic);
651 ret = extcon_set_state_sync(info->edev, report, true);
663 arizona_extcon_hp_clamp(info, false);
669 if (state && (mic || info->mic))
670 arizona_start_mic(info);
672 if (info->hpdet_active) {
673 pm_runtime_put_autosuspend(info->dev);
674 info->hpdet_active = false;
679 info->hpdet_done = true;
682 mutex_unlock(&info->lock);
687 static void arizona_identify_headphone(struct arizona_extcon_info *info)
689 struct arizona *arizona = info->arizona;
692 if (info->hpdet_done)
698 pm_runtime_get(info->dev);
700 info->hpdet_active = true;
702 arizona_stop_mic(info);
704 arizona_extcon_hp_clamp(info, true);
726 arizona_extcon_hp_clamp(info, false);
727 pm_runtime_put_autosuspend(info->dev);
730 ret = extcon_set_state_sync(info->edev, EXTCON_JACK_HEADPHONE, true);
734 if (info->mic)
735 arizona_start_mic(info);
737 info->hpdet_active = false;
740 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
742 struct arizona *arizona = info->arizona;
750 pm_runtime_get_sync(info->dev);
752 info->hpdet_active = true;
754 arizona_extcon_hp_clamp(info, true);
759 info->micd_modes[0].src |
777 arizona_hpdet_do_id(info, &hp_reading, &mic);
784 ret = extcon_set_state_sync(info->edev, EXTCON_JACK_HEADPHONE, true);
788 info->hpdet_active = false;
793 struct arizona_extcon_info *info = container_of(work,
797 mutex_lock(&info->lock);
799 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
801 info->detecting = false;
803 arizona_identify_headphone(info);
805 mutex_unlock(&info->lock);
808 static int arizona_micd_adc_read(struct arizona_extcon_info *info)
810 struct arizona *arizona = info->arizona;
845 static int arizona_micd_read(struct arizona_extcon_info *info)
847 struct arizona *arizona = info->arizona;
878 struct arizona_extcon_info *info = priv;
879 struct arizona *arizona = info->arizona;
882 if (info->detecting && arizona->pdata.micd_software_compare)
883 ret = arizona_micd_adc_read(info);
885 ret = arizona_micd_read(info);
894 info->mic = false;
895 info->detecting = false;
896 arizona_identify_headphone(info);
902 info->mic = true;
903 info->detecting = false;
905 arizona_identify_headphone(info);
907 ret = extcon_set_state_sync(info->edev,
914 ret = regulator_allow_bypass(info->micvdd, true);
930 if (info->jack_flips >= info->micd_num_modes * 10) {
933 info->detecting = false;
935 arizona_identify_headphone(info);
937 info->micd_mode++;
938 if (info->micd_mode == info->micd_num_modes)
939 info->micd_mode = 0;
940 arizona_extcon_set_mode(info, info->micd_mode);
942 info->jack_flips++;
951 &info->micd_timeout_work,
963 info->detecting = false;
965 arizona_identify_headphone(info);
972 struct arizona_extcon_info *info = priv;
973 struct arizona *arizona = info->arizona;
976 val = arizona_micd_read(info);
985 if (info->mic) {
991 for (i = 0; i < info->num_micd_ranges; i++)
992 input_report_key(info->input,
993 info->micd_ranges[i].key, 0);
995 if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) {
996 key = info->micd_ranges[ffs(lvl) - 1].key;
997 input_report_key(info->input, key, 1);
998 input_sync(info->input);
1008 for (i = 0; i < info->num_micd_ranges; i++)
1009 input_report_key(info->input,
1010 info->micd_ranges[i].key, 0);
1011 input_sync(info->input);
1012 arizona_extcon_pulse_micbias(info);
1020 struct arizona_extcon_info *info = container_of(work,
1023 struct arizona *arizona = info->arizona;
1026 cancel_delayed_work_sync(&info->micd_timeout_work);
1028 mutex_lock(&info->lock);
1031 ret = extcon_get_state(info->edev, EXTCON_MECHANICAL);
1035 mutex_unlock(&info->lock);
1039 mutex_unlock(&info->lock);
1043 if (info->detecting)
1044 arizona_micdet_reading(info);
1046 arizona_button_reading(info);
1048 pm_runtime_mark_last_busy(info->dev);
1049 mutex_unlock(&info->lock);
1054 struct arizona_extcon_info *info = data;
1055 struct arizona *arizona = info->arizona;
1058 cancel_delayed_work_sync(&info->micd_detect_work);
1059 cancel_delayed_work_sync(&info->micd_timeout_work);
1061 mutex_lock(&info->lock);
1062 if (!info->detecting)
1064 mutex_unlock(&info->lock);
1068 &info->micd_detect_work,
1071 arizona_micd_detect(&info->micd_detect_work.work);
1078 struct arizona_extcon_info *info = container_of(work,
1082 mutex_lock(&info->lock);
1083 arizona_start_hpdet_acc_id(info);
1084 mutex_unlock(&info->lock);
1087 static int arizona_hpdet_wait(struct arizona_extcon_info *info)
1089 struct arizona *arizona = info->arizona;
1102 switch (info->hpdet_ip_version) {
1123 struct arizona_extcon_info *info = data;
1124 struct arizona *arizona = info->arizona;
1129 cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
1130 cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);
1132 pm_runtime_get_sync(info->dev);
1134 mutex_lock(&info->lock);
1136 if (info->micd_clamp) {
1151 mutex_unlock(&info->lock);
1152 pm_runtime_put_autosuspend(info->dev);
1157 if (val == info->last_jackdet) {
1161 &info->hpdet_work,
1168 &info->micd_timeout_work,
1174 info->last_jackdet = val;
1176 if (info->last_jackdet == present) {
1178 ret = extcon_set_state_sync(info->edev,
1185 info->detecting = true;
1186 info->mic = false;
1187 info->jack_flips = 0;
1190 arizona_start_mic(info);
1193 &info->hpdet_work,
1197 if (info->micd_clamp || !arizona->pdata.jd_invert)
1205 arizona_stop_mic(info);
1207 info->num_hpdet_res = 0;
1208 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
1209 info->hpdet_res[i] = 0;
1210 info->mic = false;
1211 info->hpdet_done = false;
1212 info->hpdet_retried = false;
1214 for (i = 0; i < info->num_micd_ranges; i++)
1215 input_report_key(info->input,
1216 info->micd_ranges[i].key, 0);
1217 input_sync(info->input);
1220 ret = extcon_set_state_sync(info->edev,
1234 arizona_hpdet_wait(info);
1250 mutex_unlock(&info->lock);
1252 pm_runtime_mark_last_busy(info->dev);
1253 pm_runtime_put_autosuspend(info->dev);
1383 struct arizona_extcon_info *info;
1392 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
1393 if (!info)
1399 info->micvdd = devm_regulator_get(&pdev->dev, "MICVDD");
1400 if (IS_ERR(info->micvdd)) {
1401 ret = PTR_ERR(info->micvdd);
1406 mutex_init(&info->lock);
1407 info->arizona = arizona;
1408 info->dev = &pdev->dev;
1409 info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS);
1410 INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
1411 INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect);
1412 INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
1413 platform_set_drvdata(pdev, info);
1419 info->micd_reva = true;
1422 info->micd_clamp = true;
1423 info->hpdet_ip_version = 1;
1433 info->micd_clamp = true;
1434 info->hpdet_ip_version = 2;
1440 info->micd_clamp = true;
1441 info->hpdet_ip_version = 2;
1447 info->edev = devm_extcon_dev_allocate(&pdev->dev, arizona_cable);
1448 if (IS_ERR(info->edev)) {
1453 ret = devm_extcon_dev_register(&pdev->dev, info->edev);
1460 info->input = devm_input_allocate_device(&pdev->dev);
1461 if (!info->input) {
1467 info->input->name = "Headset";
1468 info->input->phys = "arizona/extcon";
1474 info->micd_modes = pdata->micd_configs;
1475 info->micd_num_modes = pdata->num_micd_configs;
1477 info->micd_modes = micd_default_modes;
1478 info->micd_num_modes = ARRAY_SIZE(micd_default_modes);
1486 if (info->micd_modes[0].gpio)
1499 info->micd_pol_gpio = gpio_to_desc(pdata->micd_pol_gpio);
1501 if (info->micd_modes[0].gpio)
1511 info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
1514 if (IS_ERR(info->micd_pol_gpio)) {
1515 ret = PTR_ERR(info->micd_pol_gpio);
1565 info->micd_ranges = pdata->micd_ranges;
1566 info->num_micd_ranges = pdata->num_micd_ranges;
1568 info->micd_ranges = micd_default_ranges;
1569 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges);
1577 if (info->num_micd_ranges > 1) {
1578 for (i = 1; i < info->num_micd_ranges; i++) {
1579 if (info->micd_ranges[i - 1].max >
1580 info->micd_ranges[i].max) {
1594 for (i = 0; i < info->num_micd_ranges; i++) {
1596 if (arizona_micd_levels[j] >= info->micd_ranges[i].max)
1601 info->micd_ranges[i].max);
1610 input_set_capability(info->input, EV_KEY,
1611 info->micd_ranges[i].key);
1626 if (info->micd_clamp) {
1657 arizona_extcon_set_mode(info, 0);
1663 if (info->micd_clamp) {
1672 "JACKDET rise", arizona_jackdet, info);
1687 "JACKDET fall", arizona_jackdet, info);
1701 "MICDET", arizona_micdet, info);
1708 "HPDET", arizona_hpdet_irq, info);
1720 ret = regulator_allow_bypass(info->micvdd, true);
1725 ret = input_register_device(info->input);
1736 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1738 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1742 arizona_free_irq(arizona, jack_irq_fall, info);
1746 arizona_free_irq(arizona, jack_irq_rise, info);
1751 gpiod_put(info->micd_pol_gpio);
1757 struct arizona_extcon_info *info = platform_get_drvdata(pdev);
1758 struct arizona *arizona = info->arizona;
1763 if (info->micd_clamp) {
1773 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1774 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1775 arizona_free_irq(arizona, jack_irq_rise, info);
1776 arizona_free_irq(arizona, jack_irq_fall, info);
1777 cancel_delayed_work_sync(&info->hpdet_work);
1778 cancel_delayed_work_sync(&info->micd_detect_work);
1779 cancel_delayed_work_sync(&info->micd_timeout_work);
1788 regulator_disable(info->micvdd);
1789 pm_runtime_put(info->dev);
1799 gpiod_put(info->micd_pol_gpio);