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.
19 return snd_soc_ret(component->dev, ret,
20 "at %s() on %s\n", func, component->name);
27 return snd_soc_ret(component->dev, ret,
29 func, component->name, reg);
33 unsigned int mask)
35 if (!mask) {
36 dev_err(component->dev, "ASoC: error field mask is zero for %s\n",
37 component->name);
41 return (ffs(mask) - 1);
48 #define soc_component_mark_push(component, substream, tgt) ((component)->mark_##tgt = substream)
49 #define soc_component_mark_pop(component, tgt) ((component)->mark_##tgt = NULL)
50 #define soc_component_mark_match(component, substream, tgt) ((component)->mark_##tgt == substream)
55 component->init = (aux) ? aux->init : NULL;
62 if (component->init)
63 ret = component->init(component);
69 * snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
74 * @dir: new clock direction - input/output.
82 int ret = -ENOTSUPP;
84 if (component->driver->set_sysclk)
85 ret = component->driver->set_sysclk(component, clk_id, source,
93 * snd_soc_component_set_pll - configure component PLL.
106 int ret = -EINVAL;
108 if (component->driver->set_pll)
109 ret = component->driver->set_pll(component, pll_id, source,
119 if (component->driver->seq_notifier)
120 component->driver->seq_notifier(component, type, subseq);
128 if (component->driver->stream_event)
129 ret = component->driver->stream_event(component, event);
139 if (component->driver->set_bias_level)
140 ret = component->driver->set_bias_level(component, level);
231 if (component->name_prefix)
232 snprintf(buf, size, "%s %s", component->name_prefix, ctl);
244 return snd_soc_card_get_kcontrol(component->card, name);
255 return soc_component_ret(component, -EINVAL);
257 snd_ctl_notify(component->card->snd_card,
258 SNDRV_CTL_EVENT_MASK_VALUE, &kctl->id);
265 * snd_soc_component_set_jack - configure component jack.
275 int ret = -ENOTSUPP;
277 if (component->driver->set_jack)
278 ret = component->driver->set_jack(component, jack, data);
290 * devicetree with the property: jack-type.
295 int ret = -ENOTSUPP;
297 if (component->driver->get_jack_type)
298 ret = component->driver->get_jack_type(component);
309 if (component->driver->module_get_upon_open == !!upon_open &&
310 !try_module_get(component->dev->driver->owner))
311 ret = -ENODEV;
326 if (component->driver->module_get_upon_open == !!upon_open)
327 module_put(component->dev->driver->owner);
338 if (component->driver->open)
339 ret = component->driver->open(component, substream);
357 if (component->driver->close)
358 ret = component->driver->close(component, substream);
368 if (component->driver->suspend)
369 component->driver->suspend(component);
370 component->suspended = 1;
375 if (component->driver->resume)
376 component->driver->resume(component);
377 component->suspended = 0;
382 return component->suspended;
389 if (component->driver->probe)
390 ret = component->driver->probe(component);
397 if (component->driver->remove)
398 component->driver->remove(component);
404 int ret = -ENOTSUPP;
406 if (component->driver->of_xlate_dai_id)
407 ret = component->driver->of_xlate_dai_id(component, ep);
416 if (component->driver->of_xlate_dai_name)
417 return component->driver->of_xlate_dai_name(component,
422 * first may not match and we don't want spam the log with this.
424 return -ENOTSUPP;
429 int val_bytes = regmap_get_val_bytes(component->regmap);
431 /* Errors are legitimate for non-integer byte multiples */
433 component->val_bytes = val_bytes;
439 * snd_soc_component_init_regmap() - Initialize regmap instance for the
452 component->regmap = regmap;
458 * snd_soc_component_exit_regmap() - De-initialize regmap instance for the
460 * @component: The component for which to de-initialize the regmap instance
470 regmap_exit(component->regmap);
471 component->regmap = NULL;
482 if (component->driver->compress_ops &&
483 component->driver->compress_ops->open)
484 ret = component->driver->compress_ops->open(component, cstream);
501 if (component->driver->compress_ops &&
502 component->driver->compress_ops->free)
503 component->driver->compress_ops->free(component, cstream);
512 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
517 if (component->driver->compress_ops &&
518 component->driver->compress_ops->trigger) {
519 ret = component->driver->compress_ops->trigger(
533 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
538 if (component->driver->compress_ops &&
539 component->driver->compress_ops->set_params) {
540 ret = component->driver->compress_ops->set_params(
554 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
559 if (component->driver->compress_ops &&
560 component->driver->compress_ops->get_params) {
561 ret = component->driver->compress_ops->get_params(
574 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
581 if (component->driver->compress_ops &&
582 component->driver->compress_ops->get_caps) {
583 ret = component->driver->compress_ops->get_caps(
598 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
605 if (component->driver->compress_ops &&
606 component->driver->compress_ops->get_codec_caps) {
607 ret = component->driver->compress_ops->get_codec_caps(
621 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
626 if (component->driver->compress_ops &&
627 component->driver->compress_ops->ack) {
628 ret = component->driver->compress_ops->ack(
642 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
647 if (component->driver->compress_ops &&
648 component->driver->compress_ops->pointer) {
649 ret = component->driver->compress_ops->pointer(
662 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
669 if (component->driver->compress_ops &&
670 component->driver->compress_ops->copy) {
671 ret = component->driver->compress_ops->copy(
686 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
691 if (component->driver->compress_ops &&
692 component->driver->compress_ops->set_metadata) {
693 ret = component->driver->compress_ops->set_metadata(
707 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
712 if (component->driver->compress_ops &&
713 component->driver->compress_ops->get_metadata) {
714 ret = component->driver->compress_ops->get_metadata(
731 if (component->regmap)
732 ret = regmap_read(component->regmap, reg, &val);
733 else if (component->driver->read) {
735 val = component->driver->read(component, reg);
738 ret = -EIO;
747 * snd_soc_component_read() - Read register value
758 mutex_lock(&component->io_mutex);
760 mutex_unlock(&component->io_mutex);
770 int ret = -EIO;
772 if (component->regmap)
773 ret = regmap_write(component->regmap, reg, val);
774 else if (component->driver->write)
775 ret = component->driver->write(component, reg, val);
781 * snd_soc_component_write() - Write register value
793 mutex_lock(&component->io_mutex);
795 mutex_unlock(&component->io_mutex);
803 unsigned int mask, unsigned int val, bool *change)
808 mutex_lock(&component->io_mutex);
812 new = (old & ~mask) | (val & mask);
817 mutex_unlock(&component->io_mutex);
823 * snd_soc_component_update_bits() - Perform read/modify/write cycle
826 * @mask: Mask that specifies which bits to update
827 * @val: New value for the bits specified by mask
834 unsigned int reg, unsigned int mask, unsigned int val)
839 if (component->regmap)
840 ret = regmap_update_bits_check(component->regmap, reg, mask,
844 mask, val, &change);
853 * snd_soc_component_update_bits_async() - Perform asynchronous
857 * @mask: Mask that specifies which bits to update
858 * @val: New value for the bits specified by mask
870 unsigned int reg, unsigned int mask, unsigned int val)
875 if (component->regmap)
876 ret = regmap_update_bits_check_async(component->regmap, reg,
877 mask, val, &change);
880 mask, val, &change);
889 * snd_soc_component_read_field() - Read register field value
892 * @mask: mask of the register field
897 unsigned int reg, unsigned int mask)
903 val = (val & mask) >> soc_component_field_shift(component, mask);
910 * snd_soc_component_write_field() - write to register field
913 * @mask: mask of the register field to update
919 unsigned int reg, unsigned int mask,
923 val = (val << soc_component_field_shift(component, mask)) & mask;
925 return snd_soc_component_update_bits(component, reg, mask, val);
930 * snd_soc_component_async_complete() - Ensure asynchronous I/O has completed
938 if (component->regmap)
939 regmap_async_complete(component->regmap);
944 * snd_soc_component_test_bits - Test register for change
947 * @mask: Mask that specifies which bits to test
956 unsigned int reg, unsigned int mask, unsigned int value)
961 new = (old & ~mask) | value;
974 if (component->driver->pointer)
975 return component->driver->pointer(component, substream);
987 if (dai->component == component)
1010 if (!component->driver->delay)
1013 delay = component->driver->delay(component, substream);
1031 if (component->driver->ioctl)
1034 component->driver->ioctl(component,
1047 if (component->driver->sync_stop) {
1048 ret = component->driver->sync_stop(component,
1068 if (component->driver->copy)
1070 component->driver->copy(component, substream,
1073 return -EINVAL;
1086 if (component->driver->page) {
1087 page = component->driver->page(component,
1106 if (component->driver->mmap)
1109 component->driver->mmap(component,
1112 return -EINVAL;
1122 if (component->driver->pcm_construct) {
1123 ret = component->driver->pcm_construct(component, rtd);
1137 if (!rtd->pcm)
1141 if (component->driver->pcm_destruct)
1142 component->driver->pcm_destruct(component, rtd->pcm);
1152 if (component->driver->prepare) {
1153 ret = component->driver->prepare(component, substream);
1170 if (component->driver->hw_params) {
1171 ret = component->driver->hw_params(component,
1194 if (component->driver->hw_free) {
1195 ret = component->driver->hw_free(component, substream);
1211 if (component->driver->trigger)
1212 ret = component->driver->trigger(component, substream, cmd);
1253 void *stream)
1259 int ret = pm_runtime_get_sync(component->dev);
1260 if (ret < 0 && ret != -EACCES) {
1261 pm_runtime_put_noidle(component->dev);
1264 /* mark stream if succeeded */
1265 soc_component_mark_push(component, stream, pm);
1272 void *stream, int rollback)
1278 if (rollback && !soc_component_mark_match(component, stream, pm))
1281 pm_runtime_put_autosuspend(component->dev);
1283 /* remove marked stream */
1296 if (component->driver->ack)
1297 return component->driver->ack(component, substream);