Lines Matching defs:info
95 static void arizona_start_hpdet_acc_id(struct arizona_priv *info);
97 static void arizona_extcon_hp_clamp(struct arizona_priv *info,
100 struct arizona *arizona = info->arizona;
175 static void arizona_extcon_set_mode(struct arizona_priv *info, int mode)
177 struct arizona *arizona = info->arizona;
179 mode %= info->micd_num_modes;
181 gpiod_set_value_cansleep(info->micd_pol_gpio,
182 info->micd_modes[mode].gpio);
186 info->micd_modes[mode].bias <<
189 ARIZONA_ACCDET_SRC, info->micd_modes[mode].src);
191 info->micd_mode = mode;
196 static const char *arizona_extcon_get_micbias(struct arizona_priv *info)
198 switch (info->micd_modes[0].bias) {
210 static void arizona_extcon_pulse_micbias(struct arizona_priv *info)
212 struct arizona *arizona = info->arizona;
213 const char *widget = arizona_extcon_get_micbias(info);
233 static void arizona_start_mic(struct arizona_priv *info)
235 struct arizona *arizona = info->arizona;
243 if (info->detecting) {
244 ret = regulator_allow_bypass(info->micvdd, false);
249 ret = regulator_enable(info->micvdd);
253 if (info->micd_reva) {
263 if (info->detecting && arizona->pdata.micd_software_compare)
272 arizona_extcon_pulse_micbias(info);
280 regulator_disable(info->micvdd);
285 static void arizona_stop_mic(struct arizona_priv *info)
287 struct arizona *arizona = info->arizona;
288 const char *widget = arizona_extcon_get_micbias(info);
306 if (info->micd_reva) {
316 ret = regulator_allow_bypass(info->micvdd, true);
321 regulator_disable(info->micvdd);
348 static int arizona_hpdet_read(struct arizona_priv *info)
350 struct arizona *arizona = info->arizona;
360 switch (info->hpdet_ip_version) {
452 dev_warn(arizona->dev, "Unknown HPDET IP revision %d\n", info->hpdet_ip_version);
460 static int arizona_hpdet_do_id(struct arizona_priv *info, int *reading,
463 struct arizona *arizona = info->arizona;
473 info->hpdet_res[info->num_hpdet_res++] = *reading;
476 if (id_gpio && info->num_hpdet_res == 1) {
484 info->micd_modes[0].src);
495 info->hpdet_res[0], info->hpdet_res[1]);
498 *reading = info->hpdet_res[0];
501 if (*reading >= ARIZONA_HPDET_MAX && !info->hpdet_retried) {
503 info->num_hpdet_res = 0;
504 info->hpdet_retried = true;
505 arizona_start_hpdet_acc_id(info);
513 if (!id_gpio || info->hpdet_res[1] > 50) {
516 info->detecting = true;
523 ARIZONA_ACCDET_SRC, info->micd_modes[0].src);
530 struct arizona_priv *info = data;
531 struct arizona *arizona = info->arizona;
536 mutex_lock(&info->lock);
539 if (!info->hpdet_active) {
541 mutex_unlock(&info->lock);
546 state = info->jack->status & SND_JACK_MECHANICAL;
552 ret = arizona_hpdet_read(info);
565 ret = arizona_hpdet_do_id(info, &reading, &mic);
577 snd_soc_jack_report(info->jack, report, SND_JACK_LINEOUT | SND_JACK_HEADPHONE);
586 arizona_extcon_hp_clamp(info, false);
592 if (state && (mic || info->mic))
593 arizona_start_mic(info);
595 if (info->hpdet_active) {
597 info->hpdet_active = false;
602 info->hpdet_done = true;
605 mutex_unlock(&info->lock);
610 static void arizona_identify_headphone(struct arizona_priv *info)
612 struct arizona *arizona = info->arizona;
615 if (info->hpdet_done)
623 info->hpdet_active = true;
625 arizona_stop_mic(info);
627 arizona_extcon_hp_clamp(info, true);
648 arizona_extcon_hp_clamp(info, false);
652 snd_soc_jack_report(info->jack, SND_JACK_HEADPHONE,
655 if (info->mic)
656 arizona_start_mic(info);
658 info->hpdet_active = false;
661 static void arizona_start_hpdet_acc_id(struct arizona_priv *info)
663 struct arizona *arizona = info->arizona;
673 info->hpdet_active = true;
675 arizona_extcon_hp_clamp(info, true);
680 info->micd_modes[0].src |
696 arizona_hpdet_do_id(info, &hp_reading, &mic);
703 snd_soc_jack_report(info->jack, SND_JACK_HEADPHONE,
706 info->hpdet_active = false;
711 struct arizona_priv *info = container_of(work,
715 mutex_lock(&info->lock);
717 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
719 info->detecting = false;
721 arizona_identify_headphone(info);
723 mutex_unlock(&info->lock);
726 static int arizona_micd_adc_read(struct arizona_priv *info)
728 struct arizona *arizona = info->arizona;
762 static int arizona_micd_read(struct arizona_priv *info)
764 struct arizona *arizona = info->arizona;
793 struct arizona_priv *info = priv;
794 struct arizona *arizona = info->arizona;
797 if (info->detecting && arizona->pdata.micd_software_compare)
798 ret = arizona_micd_adc_read(info);
800 ret = arizona_micd_read(info);
809 info->mic = false;
810 info->detecting = false;
811 arizona_identify_headphone(info);
817 info->mic = true;
818 info->detecting = false;
820 arizona_identify_headphone(info);
822 snd_soc_jack_report(info->jack, SND_JACK_MICROPHONE, SND_JACK_MICROPHONE);
825 ret = regulator_allow_bypass(info->micvdd, true);
839 if (info->jack_flips >= info->micd_num_modes * 10) {
842 info->detecting = false;
844 arizona_identify_headphone(info);
846 info->micd_mode++;
847 if (info->micd_mode == info->micd_num_modes)
848 info->micd_mode = 0;
849 arizona_extcon_set_mode(info, info->micd_mode);
851 info->jack_flips++;
860 &info->micd_timeout_work,
872 info->detecting = false;
874 arizona_identify_headphone(info);
881 struct arizona_priv *info = priv;
882 struct arizona *arizona = info->arizona;
885 val = arizona_micd_read(info);
894 if (info->mic) {
900 if (lvl && ffs(lvl) - 1 < info->num_micd_ranges) {
902 snd_soc_jack_report(info->jack,
904 info->micd_button_mask);
913 snd_soc_jack_report(info->jack, 0, info->micd_button_mask);
914 arizona_extcon_pulse_micbias(info);
922 struct arizona_priv *info = container_of(work,
925 struct arizona *arizona = info->arizona;
927 cancel_delayed_work_sync(&info->micd_timeout_work);
929 mutex_lock(&info->lock);
932 if (!(info->jack->status & SND_JACK_MECHANICAL)) {
934 mutex_unlock(&info->lock);
938 if (info->detecting)
939 arizona_micdet_reading(info);
941 arizona_button_reading(info);
944 mutex_unlock(&info->lock);
949 struct arizona_priv *info = data;
950 struct arizona *arizona = info->arizona;
953 cancel_delayed_work_sync(&info->micd_detect_work);
954 cancel_delayed_work_sync(&info->micd_timeout_work);
956 mutex_lock(&info->lock);
957 if (!info->detecting)
959 mutex_unlock(&info->lock);
963 &info->micd_detect_work,
966 arizona_micd_detect(&info->micd_detect_work.work);
973 struct arizona_priv *info = container_of(work,
977 mutex_lock(&info->lock);
978 arizona_start_hpdet_acc_id(info);
979 mutex_unlock(&info->lock);
982 static int arizona_hpdet_wait(struct arizona_priv *info)
984 struct arizona *arizona = info->arizona;
996 switch (info->hpdet_ip_version) {
1017 struct arizona_priv *info = data;
1018 struct arizona *arizona = info->arizona;
1023 cancelled_hp = cancel_delayed_work_sync(&info->hpdet_work);
1024 cancelled_mic = cancel_delayed_work_sync(&info->micd_timeout_work);
1028 mutex_lock(&info->lock);
1030 if (info->micd_clamp) {
1044 mutex_unlock(&info->lock);
1050 if (val == info->last_jackdet) {
1054 &info->hpdet_work,
1061 &info->micd_timeout_work,
1067 info->last_jackdet = val;
1069 if (info->last_jackdet == present) {
1071 snd_soc_jack_report(info->jack, SND_JACK_MECHANICAL, SND_JACK_MECHANICAL);
1073 info->detecting = true;
1074 info->mic = false;
1075 info->jack_flips = 0;
1078 arizona_start_mic(info);
1081 &info->hpdet_work,
1085 if (info->micd_clamp || !arizona->pdata.jd_invert)
1093 arizona_stop_mic(info);
1095 info->num_hpdet_res = 0;
1096 for (i = 0; i < ARRAY_SIZE(info->hpdet_res); i++)
1097 info->hpdet_res[i] = 0;
1098 info->mic = false;
1099 info->hpdet_done = false;
1100 info->hpdet_retried = false;
1102 snd_soc_jack_report(info->jack, 0, ARIZONA_JACK_MASK | info->micd_button_mask);
1111 arizona_hpdet_wait(info);
1127 mutex_unlock(&info->lock);
1254 int arizona_jack_codec_dev_probe(struct arizona_priv *info, struct device *dev)
1256 struct arizona *arizona = info->arizona;
1263 info->micvdd = devm_regulator_get(dev, "MICVDD");
1264 if (IS_ERR(info->micvdd))
1265 return dev_err_probe(arizona->dev, PTR_ERR(info->micvdd), "getting MICVDD\n");
1267 mutex_init(&info->lock);
1268 info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS);
1269 INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work);
1270 INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect);
1271 INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work);
1277 info->micd_reva = true;
1280 info->micd_clamp = true;
1281 info->hpdet_ip_version = 1;
1291 info->micd_clamp = true;
1292 info->hpdet_ip_version = 2;
1298 info->micd_clamp = true;
1299 info->hpdet_ip_version = 2;
1309 info->micd_modes = pdata->micd_configs;
1310 info->micd_num_modes = pdata->num_micd_configs;
1312 info->micd_modes = micd_default_modes;
1313 info->micd_num_modes = ARRAY_SIZE(micd_default_modes);
1321 if (info->micd_modes[0].gpio)
1334 info->micd_pol_gpio = gpio_to_desc(pdata->micd_pol_gpio);
1336 if (info->micd_modes[0].gpio)
1346 info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
1349 if (IS_ERR(info->micd_pol_gpio)) {
1350 ret = PTR_ERR(info->micd_pol_gpio);
1363 gpiod_put(info->micd_pol_gpio);
1372 int arizona_jack_codec_dev_remove(struct arizona_priv *info)
1374 gpiod_put(info->micd_pol_gpio);
1379 static int arizona_jack_enable_jack_detect(struct arizona_priv *info,
1382 struct arizona *arizona = info->arizona;
1419 info->micd_ranges = pdata->micd_ranges;
1420 info->num_micd_ranges = pdata->num_micd_ranges;
1422 info->micd_ranges = micd_default_ranges;
1423 info->num_micd_ranges = ARRAY_SIZE(micd_default_ranges);
1432 if (info->num_micd_ranges > 1) {
1433 for (i = 1; i < info->num_micd_ranges; i++) {
1434 if (info->micd_ranges[i - 1].max >
1435 info->micd_ranges[i].max) {
1447 for (i = 0; i < info->num_micd_ranges; i++) {
1449 if (arizona_micd_levels[j] >= info->micd_ranges[i].max)
1454 info->micd_ranges[i].max);
1464 info->micd_button_mask |= SND_JACK_BTN_0 >> i;
1466 info->micd_ranges[i].key);
1481 if (info->micd_clamp) {
1512 arizona_extcon_set_mode(info, 0);
1514 info->jack = jack;
1518 if (info->micd_clamp) {
1527 "JACKDET rise", arizona_jackdet, info);
1540 "JACKDET fall", arizona_jackdet, info);
1553 "MICDET", arizona_micdet, info);
1560 "HPDET", arizona_hpdet_irq, info);
1572 ret = regulator_allow_bypass(info->micvdd, true);
1581 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1585 arizona_free_irq(arizona, jack_irq_fall, info);
1589 arizona_free_irq(arizona, jack_irq_rise, info);
1592 info->jack = NULL;
1596 static int arizona_jack_disable_jack_detect(struct arizona_priv *info)
1598 struct arizona *arizona = info->arizona;
1603 if (!info->jack)
1606 if (info->micd_clamp) {
1616 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1617 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1618 arizona_free_irq(arizona, jack_irq_rise, info);
1619 arizona_free_irq(arizona, jack_irq_fall, info);
1620 cancel_delayed_work_sync(&info->hpdet_work);
1621 cancel_delayed_work_sync(&info->micd_detect_work);
1622 cancel_delayed_work_sync(&info->micd_timeout_work);
1630 regulator_disable(info->micvdd);
1640 info->jack = NULL;
1648 struct arizona_priv *info = snd_soc_component_get_drvdata(component);
1651 return arizona_jack_enable_jack_detect(info, jack);
1653 return arizona_jack_disable_jack_detect(info);