Lines Matching +full:enable +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0+
3 // soc-jack.c -- ALSA SoC jack handling
23 struct snd_soc_jack_gpio *gpios; member
27 * snd_soc_card_jack_new - Create a new jack
47 mutex_init(&jack->mutex); in snd_soc_card_jack_new()
48 jack->card = card; in snd_soc_card_jack_new()
49 INIT_LIST_HEAD(&jack->pins); in snd_soc_card_jack_new()
50 INIT_LIST_HEAD(&jack->jack_zones); in snd_soc_card_jack_new()
51 BLOCKING_INIT_NOTIFIER_HEAD(&jack->notifier); in snd_soc_card_jack_new()
53 ret = snd_jack_new(card->snd_card, id, type, &jack->jack, false, false); in snd_soc_card_jack_new()
65 * snd_soc_jack_report - Report the current status for a jack
83 int enable; in snd_soc_jack_report() local
90 dapm = &jack->card->dapm; in snd_soc_jack_report()
92 mutex_lock(&jack->mutex); in snd_soc_jack_report()
94 jack->status &= ~mask; in snd_soc_jack_report()
95 jack->status |= status & mask; in snd_soc_jack_report()
99 list_for_each_entry(pin, &jack->pins, list) { in snd_soc_jack_report()
100 enable = pin->mask & jack->status; in snd_soc_jack_report()
102 if (pin->invert) in snd_soc_jack_report()
103 enable = !enable; in snd_soc_jack_report()
105 if (enable) in snd_soc_jack_report()
106 snd_soc_dapm_enable_pin(dapm, pin->pin); in snd_soc_jack_report()
108 snd_soc_dapm_disable_pin(dapm, pin->pin); in snd_soc_jack_report()
115 blocking_notifier_call_chain(&jack->notifier, jack->status, jack); in snd_soc_jack_report()
120 snd_jack_report(jack->jack, jack->status); in snd_soc_jack_report()
122 mutex_unlock(&jack->mutex); in snd_soc_jack_report()
127 * snd_soc_jack_add_zones - Associate voltage zones with jack
143 list_add(&(zones[i].list), &jack->jack_zones); in snd_soc_jack_add_zones()
150 * snd_soc_jack_get_type - Based on the mic bias value, this function returns
163 list_for_each_entry(zone, &jack->jack_zones, list) { in snd_soc_jack_get_type()
164 if (micbias_voltage >= zone->min_mv && in snd_soc_jack_get_type()
165 micbias_voltage < zone->max_mv) in snd_soc_jack_get_type()
166 return zone->jack_type; in snd_soc_jack_get_type()
173 * snd_soc_jack_add_pins - Associate DAPM pins with an ASoC jack
190 dev_err(jack->card->dev, "ASoC: No name for pin %d\n", in snd_soc_jack_add_pins()
192 return -EINVAL; in snd_soc_jack_add_pins()
195 dev_err(jack->card->dev, "ASoC: No mask for pin %d" in snd_soc_jack_add_pins()
197 return -EINVAL; in snd_soc_jack_add_pins()
201 list_add(&(pins[i].list), &jack->pins); in snd_soc_jack_add_pins()
202 snd_jack_add_new_kctl(jack->jack, pins[i].pin, pins[i].mask); in snd_soc_jack_add_pins()
216 * snd_soc_jack_notifier_register - Register a notifier for jack status
230 blocking_notifier_chain_register(&jack->notifier, nb); in snd_soc_jack_notifier_register()
235 * snd_soc_jack_notifier_unregister - Unregister a notifier for jack status
245 blocking_notifier_chain_unregister(&jack->notifier, nb); in snd_soc_jack_notifier_unregister()
253 struct snd_soc_jack *jack = gpio->jack; in snd_soc_jack_gpio_detect()
254 int enable; in snd_soc_jack_gpio_detect() local
257 enable = gpiod_get_value_cansleep(gpio->desc); in snd_soc_jack_gpio_detect()
258 if (gpio->invert) in snd_soc_jack_gpio_detect()
259 enable = !enable; in snd_soc_jack_gpio_detect()
261 if (enable) in snd_soc_jack_gpio_detect()
262 report = gpio->report; in snd_soc_jack_gpio_detect()
266 if (gpio->jack_status_check) in snd_soc_jack_gpio_detect()
267 report = gpio->jack_status_check(gpio->data); in snd_soc_jack_gpio_detect()
269 snd_soc_jack_report(jack, report, gpio->report); in snd_soc_jack_gpio_detect()
276 struct device *dev = gpio->jack->card->dev; in gpio_handler()
278 trace_snd_soc_jack_irq(gpio->name); in gpio_handler()
281 pm_wakeup_event(dev, gpio->debounce_time + 50); in gpio_handler()
283 queue_delayed_work(system_power_efficient_wq, &gpio->work, in gpio_handler()
284 msecs_to_jiffies(gpio->debounce_time)); in gpio_handler()
312 queue_delayed_work(system_power_efficient_wq, &gpio->work, 0); in snd_soc_jack_pm_notifier()
320 struct snd_soc_jack_gpio *gpios) in jack_free_gpios() argument
325 gpiod_unexport(gpios[i].desc); in jack_free_gpios()
326 unregister_pm_notifier(&gpios[i].pm_notifier); in jack_free_gpios()
327 free_irq(gpiod_to_irq(gpios[i].desc), &gpios[i]); in jack_free_gpios()
328 cancel_delayed_work_sync(&gpios[i].work); in jack_free_gpios()
329 gpiod_put(gpios[i].desc); in jack_free_gpios()
330 gpios[i].jack = NULL; in jack_free_gpios()
338 jack_free_gpios(tbl->jack, tbl->count, tbl->gpios); in jack_devres_free_gpios()
342 * snd_soc_jack_add_gpios - Associate GPIO pins with an ASoC jack
346 * @gpios: array of gpio pins
352 struct snd_soc_jack_gpio *gpios) in snd_soc_jack_add_gpios() argument
359 return -ENOMEM; in snd_soc_jack_add_gpios()
360 tbl->jack = jack; in snd_soc_jack_add_gpios()
361 tbl->count = count; in snd_soc_jack_add_gpios()
362 tbl->gpios = gpios; in snd_soc_jack_add_gpios()
365 if (!gpios[i].name) { in snd_soc_jack_add_gpios()
366 dev_err(jack->card->dev, in snd_soc_jack_add_gpios()
368 ret = -EINVAL; in snd_soc_jack_add_gpios()
372 if (gpios[i].desc) { in snd_soc_jack_add_gpios()
375 } else if (gpios[i].gpiod_dev) { in snd_soc_jack_add_gpios()
377 gpios[i].desc = gpiod_get_index(gpios[i].gpiod_dev, in snd_soc_jack_add_gpios()
378 gpios[i].name, in snd_soc_jack_add_gpios()
379 gpios[i].idx, GPIOD_IN); in snd_soc_jack_add_gpios()
380 if (IS_ERR(gpios[i].desc)) { in snd_soc_jack_add_gpios()
381 ret = PTR_ERR(gpios[i].desc); in snd_soc_jack_add_gpios()
382 dev_err(gpios[i].gpiod_dev, in snd_soc_jack_add_gpios()
389 if (!gpio_is_valid(gpios[i].gpio)) { in snd_soc_jack_add_gpios()
390 dev_err(jack->card->dev, in snd_soc_jack_add_gpios()
392 gpios[i].gpio); in snd_soc_jack_add_gpios()
393 ret = -EINVAL; in snd_soc_jack_add_gpios()
397 ret = gpio_request_one(gpios[i].gpio, GPIOF_IN, in snd_soc_jack_add_gpios()
398 gpios[i].name); in snd_soc_jack_add_gpios()
402 gpios[i].desc = gpio_to_desc(gpios[i].gpio); in snd_soc_jack_add_gpios()
405 INIT_DELAYED_WORK(&gpios[i].work, gpio_work); in snd_soc_jack_add_gpios()
406 gpios[i].jack = jack; in snd_soc_jack_add_gpios()
408 ret = request_any_context_irq(gpiod_to_irq(gpios[i].desc), in snd_soc_jack_add_gpios()
412 gpios[i].name, in snd_soc_jack_add_gpios()
413 &gpios[i]); in snd_soc_jack_add_gpios()
417 if (gpios[i].wake) { in snd_soc_jack_add_gpios()
418 ret = irq_set_irq_wake(gpiod_to_irq(gpios[i].desc), 1); in snd_soc_jack_add_gpios()
420 dev_err(jack->card->dev, in snd_soc_jack_add_gpios()
429 gpios[i].pm_notifier.notifier_call = snd_soc_jack_pm_notifier; in snd_soc_jack_add_gpios()
430 register_pm_notifier(&gpios[i].pm_notifier); in snd_soc_jack_add_gpios()
433 gpiod_export(gpios[i].desc, false); in snd_soc_jack_add_gpios()
436 schedule_delayed_work(&gpios[i].work, in snd_soc_jack_add_gpios()
437 msecs_to_jiffies(gpios[i].debounce_time)); in snd_soc_jack_add_gpios()
440 devres_add(jack->card->dev, tbl); in snd_soc_jack_add_gpios()
444 gpio_free(gpios[i].gpio); in snd_soc_jack_add_gpios()
446 jack_free_gpios(jack, i, gpios); in snd_soc_jack_add_gpios()
454 * snd_soc_jack_add_gpiods - Associate GPIO descriptor pins with an ASoC jack
459 * @gpios: array of gpio pins
466 int count, struct snd_soc_jack_gpio *gpios) in snd_soc_jack_add_gpiods() argument
471 gpios[i].gpiod_dev = gpiod_dev; in snd_soc_jack_add_gpiods()
473 return snd_soc_jack_add_gpios(jack, count, gpios); in snd_soc_jack_add_gpiods()
478 * snd_soc_jack_free_gpios - Release GPIO pins' resources of an ASoC jack
482 * @gpios: array of gpio pins
487 struct snd_soc_jack_gpio *gpios) in snd_soc_jack_free_gpios() argument
489 jack_free_gpios(jack, count, gpios); in snd_soc_jack_free_gpios()
490 devres_destroy(jack->card->dev, jack_devres_free_gpios, NULL, NULL); in snd_soc_jack_free_gpios()