Lines Matching +full:stream +full:- +full:match +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0
3 // soc-component.c
5 // Copyright 2009-2011 Wolfson Microelectronics PLC.
25 case -EPROBE_DEFER: in _soc_component_ret()
26 case -ENOTSUPP: in _soc_component_ret()
29 dev_err(component->dev, in _soc_component_ret()
31 func, component->name, ret); in _soc_component_ret()
41 #define soc_component_mark_push(component, substream, tgt) ((component)->mark_##tgt = substream)
42 #define soc_component_mark_pop(component, substream, tgt) ((component)->mark_##tgt = NULL)
43 #define soc_component_mark_match(component, substream, tgt) ((component)->mark_##tgt == substream)
48 component->init = (aux) ? aux->init : NULL; in snd_soc_component_set_aux()
55 if (component->init) in snd_soc_component_init()
56 ret = component->init(component); in snd_soc_component_init()
62 * snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
67 * @dir: new clock direction - input/output.
75 int ret = -ENOTSUPP; in snd_soc_component_set_sysclk()
77 if (component->driver->set_sysclk) in snd_soc_component_set_sysclk()
78 ret = component->driver->set_sysclk(component, clk_id, source, in snd_soc_component_set_sysclk()
86 * snd_soc_component_set_pll - configure component PLL.
99 int ret = -EINVAL; in snd_soc_component_set_pll()
101 if (component->driver->set_pll) in snd_soc_component_set_pll()
102 ret = component->driver->set_pll(component, pll_id, source, in snd_soc_component_set_pll()
112 if (component->driver->seq_notifier) in snd_soc_component_seq_notifier()
113 component->driver->seq_notifier(component, type, subseq); in snd_soc_component_seq_notifier()
121 if (component->driver->stream_event) in snd_soc_component_stream_event()
122 ret = component->driver->stream_event(component, event); in snd_soc_component_stream_event()
132 if (component->driver->set_bias_level) in snd_soc_component_set_bias_level()
133 ret = component->driver->set_bias_level(component, level); in snd_soc_component_set_bias_level()
148 if (!component->name_prefix) { in soc_component_pin()
153 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin); in soc_component_pin()
155 ret = -ENOMEM; in soc_component_pin()
230 * snd_soc_component_set_jack - configure component jack.
240 int ret = -ENOTSUPP; in snd_soc_component_set_jack()
242 if (component->driver->set_jack) in snd_soc_component_set_jack()
243 ret = component->driver->set_jack(component, jack, data); in snd_soc_component_set_jack()
255 if (component->driver->module_get_upon_open == !!upon_open && in snd_soc_component_module_get()
256 !try_module_get(component->dev->driver->owner)) in snd_soc_component_module_get()
257 ret = -ENODEV; in snd_soc_component_module_get()
273 if (component->driver->module_get_upon_open == !!upon_open) in snd_soc_component_module_put()
274 module_put(component->dev->driver->owner); in snd_soc_component_module_put()
285 if (component->driver->open) in snd_soc_component_open()
286 ret = component->driver->open(component, substream); in snd_soc_component_open()
304 if (component->driver->close) in snd_soc_component_close()
305 ret = component->driver->close(component, substream); in snd_soc_component_close()
315 if (component->driver->suspend) in snd_soc_component_suspend()
316 component->driver->suspend(component); in snd_soc_component_suspend()
317 component->suspended = 1; in snd_soc_component_suspend()
322 if (component->driver->resume) in snd_soc_component_resume()
323 component->driver->resume(component); in snd_soc_component_resume()
324 component->suspended = 0; in snd_soc_component_resume()
329 return component->suspended; in snd_soc_component_is_suspended()
336 if (component->driver->probe) in snd_soc_component_probe()
337 ret = component->driver->probe(component); in snd_soc_component_probe()
344 if (component->driver->remove) in snd_soc_component_remove()
345 component->driver->remove(component); in snd_soc_component_remove()
351 int ret = -ENOTSUPP; in snd_soc_component_of_xlate_dai_id()
353 if (component->driver->of_xlate_dai_id) in snd_soc_component_of_xlate_dai_id()
354 ret = component->driver->of_xlate_dai_id(component, ep); in snd_soc_component_of_xlate_dai_id()
363 if (component->driver->of_xlate_dai_name) in snd_soc_component_of_xlate_dai_name()
364 return component->driver->of_xlate_dai_name(component, in snd_soc_component_of_xlate_dai_name()
369 * first may not match and we don't want spam the log with this. in snd_soc_component_of_xlate_dai_name()
371 return -ENOTSUPP; in snd_soc_component_of_xlate_dai_name()
376 int val_bytes = regmap_get_val_bytes(component->regmap); in snd_soc_component_setup_regmap()
378 /* Errors are legitimate for non-integer byte multiples */ in snd_soc_component_setup_regmap()
380 component->val_bytes = val_bytes; in snd_soc_component_setup_regmap()
386 * snd_soc_component_init_regmap() - Initialize regmap instance for the
399 component->regmap = regmap; in snd_soc_component_init_regmap()
405 * snd_soc_component_exit_regmap() - De-initialize regmap instance for the
407 * @component: The component for which to de-initialize the regmap instance
417 regmap_exit(component->regmap); in snd_soc_component_exit_regmap()
418 component->regmap = NULL; in snd_soc_component_exit_regmap()
431 if (component->regmap) in soc_component_read_no_lock()
432 ret = regmap_read(component->regmap, reg, &val); in soc_component_read_no_lock()
433 else if (component->driver->read) { in soc_component_read_no_lock()
435 val = component->driver->read(component, reg); in soc_component_read_no_lock()
438 ret = -EIO; in soc_component_read_no_lock()
447 * snd_soc_component_read() - Read register value
458 mutex_lock(&component->io_mutex); in snd_soc_component_read()
460 mutex_unlock(&component->io_mutex); in snd_soc_component_read()
470 int ret = -EIO; in soc_component_write_no_lock()
472 if (component->regmap) in soc_component_write_no_lock()
473 ret = regmap_write(component->regmap, reg, val); in soc_component_write_no_lock()
474 else if (component->driver->write) in soc_component_write_no_lock()
475 ret = component->driver->write(component, reg, val); in soc_component_write_no_lock()
481 * snd_soc_component_write() - Write register value
493 mutex_lock(&component->io_mutex); in snd_soc_component_write()
495 mutex_unlock(&component->io_mutex); in snd_soc_component_write()
503 unsigned int mask, unsigned int val, bool *change) in snd_soc_component_update_bits_legacy() argument
508 mutex_lock(&component->io_mutex); in snd_soc_component_update_bits_legacy()
512 new = (old & ~mask) | (val & mask); in snd_soc_component_update_bits_legacy()
517 mutex_unlock(&component->io_mutex); in snd_soc_component_update_bits_legacy()
523 * snd_soc_component_update_bits() - Perform read/modify/write cycle
526 * @mask: Mask that specifies which bits to update
527 * @val: New value for the bits specified by mask
534 unsigned int reg, unsigned int mask, unsigned int val) in snd_soc_component_update_bits() argument
539 if (component->regmap) in snd_soc_component_update_bits()
540 ret = regmap_update_bits_check(component->regmap, reg, mask, in snd_soc_component_update_bits()
544 mask, val, &change); in snd_soc_component_update_bits()
553 * snd_soc_component_update_bits_async() - Perform asynchronous
557 * @mask: Mask that specifies which bits to update
558 * @val: New value for the bits specified by mask
570 unsigned int reg, unsigned int mask, unsigned int val) in snd_soc_component_update_bits_async() argument
575 if (component->regmap) in snd_soc_component_update_bits_async()
576 ret = regmap_update_bits_check_async(component->regmap, reg, in snd_soc_component_update_bits_async()
577 mask, val, &change); in snd_soc_component_update_bits_async()
580 mask, val, &change); in snd_soc_component_update_bits_async()
589 * snd_soc_component_async_complete() - Ensure asynchronous I/O has completed
597 if (component->regmap) in snd_soc_component_async_complete()
598 regmap_async_complete(component->regmap); in snd_soc_component_async_complete()
603 * snd_soc_component_test_bits - Test register for change
606 * @mask: Mask that specifies which bits to test
615 unsigned int reg, unsigned int mask, unsigned int value) in snd_soc_component_test_bits() argument
620 new = (old & ~mask) | value; in snd_soc_component_test_bits()
633 if (component->driver->pointer) in snd_soc_pcm_component_pointer()
634 return component->driver->pointer(component, substream); in snd_soc_pcm_component_pointer()
648 if (component->driver->ioctl) in snd_soc_pcm_component_ioctl()
651 component->driver->ioctl(component, in snd_soc_pcm_component_ioctl()
664 if (component->driver->sync_stop) { in snd_soc_pcm_component_sync_stop()
665 ret = component->driver->sync_stop(component, in snd_soc_pcm_component_sync_stop()
685 if (component->driver->copy_user) in snd_soc_pcm_component_copy_user()
688 component->driver->copy_user( in snd_soc_pcm_component_copy_user()
692 return -EINVAL; in snd_soc_pcm_component_copy_user()
705 if (component->driver->page) { in snd_soc_pcm_component_page()
706 page = component->driver->page(component, in snd_soc_pcm_component_page()
725 if (component->driver->mmap) in snd_soc_pcm_component_mmap()
728 component->driver->mmap(component, in snd_soc_pcm_component_mmap()
731 return -EINVAL; in snd_soc_pcm_component_mmap()
741 if (component->driver->pcm_construct) { in snd_soc_pcm_component_new()
742 ret = component->driver->pcm_construct(component, rtd); in snd_soc_pcm_component_new()
756 if (!rtd->pcm) in snd_soc_pcm_component_free()
760 if (component->driver->pcm_destruct) in snd_soc_pcm_component_free()
761 component->driver->pcm_destruct(component, rtd->pcm); in snd_soc_pcm_component_free()
771 if (component->driver->prepare) { in snd_soc_pcm_component_prepare()
772 ret = component->driver->prepare(component, substream); in snd_soc_pcm_component_prepare()
790 if (component->driver->hw_params) { in snd_soc_pcm_component_hw_params()
791 ret = component->driver->hw_params(component, in snd_soc_pcm_component_hw_params()
815 if (component->driver->hw_free) { in snd_soc_pcm_component_hw_free()
816 ret = component->driver->hw_free(component, substream); in snd_soc_pcm_component_hw_free()
831 if (component->driver->trigger) { in snd_soc_pcm_component_trigger()
832 ret = component->driver->trigger(component, substream, cmd); in snd_soc_pcm_component_trigger()
842 void *stream) in snd_soc_pcm_component_pm_runtime_get() argument
848 ret = pm_runtime_get_sync(component->dev); in snd_soc_pcm_component_pm_runtime_get()
849 if (ret < 0 && ret != -EACCES) { in snd_soc_pcm_component_pm_runtime_get()
850 pm_runtime_put_noidle(component->dev); in snd_soc_pcm_component_pm_runtime_get()
853 /* mark stream if succeeded */ in snd_soc_pcm_component_pm_runtime_get()
854 soc_component_mark_push(component, stream, pm); in snd_soc_pcm_component_pm_runtime_get()
861 void *stream, int rollback) in snd_soc_pcm_component_pm_runtime_put() argument
867 if (rollback && !soc_component_mark_match(component, stream, pm)) in snd_soc_pcm_component_pm_runtime_put()
870 pm_runtime_mark_last_busy(component->dev); in snd_soc_pcm_component_pm_runtime_put()
871 pm_runtime_put_autosuspend(component->dev); in snd_soc_pcm_component_pm_runtime_put()
873 /* remove marked stream */ in snd_soc_pcm_component_pm_runtime_put()
874 soc_component_mark_pop(component, stream, pm); in snd_soc_pcm_component_pm_runtime_put()