linux/sound/soc/soc-link.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// soc-link.c
   4//
   5// Copyright (C) 2019 Renesas Electronics Corp.
   6// Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
   7//
   8#include <sound/soc.h>
   9#include <sound/soc-link.h>
  10
  11#define soc_link_ret(rtd, ret) _soc_link_ret(rtd, __func__, ret)
  12static inline int _soc_link_ret(struct snd_soc_pcm_runtime *rtd,
  13                                const char *func, int ret)
  14{
  15        /* Positive, Zero values are not errors */
  16        if (ret >= 0)
  17                return ret;
  18
  19        /* Negative values might be errors */
  20        switch (ret) {
  21        case -EPROBE_DEFER:
  22        case -ENOTSUPP:
  23                break;
  24        default:
  25                dev_err(rtd->dev,
  26                        "ASoC: error at %s on %s: %d\n",
  27                        func, rtd->dai_link->name, ret);
  28        }
  29
  30        return ret;
  31}
  32
  33int snd_soc_link_init(struct snd_soc_pcm_runtime *rtd)
  34{
  35        int ret = 0;
  36
  37        if (rtd->dai_link->init)
  38                ret = rtd->dai_link->init(rtd);
  39
  40        return soc_link_ret(rtd, ret);
  41}
  42
  43void snd_soc_link_exit(struct snd_soc_pcm_runtime *rtd)
  44{
  45        if (rtd->dai_link->exit)
  46                rtd->dai_link->exit(rtd);
  47}
  48
  49int snd_soc_link_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
  50                                    struct snd_pcm_hw_params *params)
  51{
  52        int ret = 0;
  53
  54        if (rtd->dai_link->be_hw_params_fixup)
  55                ret = rtd->dai_link->be_hw_params_fixup(rtd, params);
  56
  57        return soc_link_ret(rtd, ret);
  58}
  59
  60int snd_soc_link_startup(struct snd_pcm_substream *substream)
  61{
  62        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
  63        int ret = 0;
  64
  65        if (rtd->dai_link->ops &&
  66            rtd->dai_link->ops->startup)
  67                ret = rtd->dai_link->ops->startup(substream);
  68
  69        return soc_link_ret(rtd, ret);
  70}
  71
  72void snd_soc_link_shutdown(struct snd_pcm_substream *substream)
  73{
  74        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
  75
  76        if (rtd->dai_link->ops &&
  77            rtd->dai_link->ops->shutdown)
  78                rtd->dai_link->ops->shutdown(substream);
  79}
  80
  81int snd_soc_link_prepare(struct snd_pcm_substream *substream)
  82{
  83        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
  84        int ret = 0;
  85
  86        if (rtd->dai_link->ops &&
  87            rtd->dai_link->ops->prepare)
  88                ret = rtd->dai_link->ops->prepare(substream);
  89
  90        return soc_link_ret(rtd, ret);
  91}
  92
  93int snd_soc_link_hw_params(struct snd_pcm_substream *substream,
  94                           struct snd_pcm_hw_params *params)
  95{
  96        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
  97        int ret = 0;
  98
  99        if (rtd->dai_link->ops &&
 100            rtd->dai_link->ops->hw_params)
 101                ret = rtd->dai_link->ops->hw_params(substream, params);
 102
 103        return soc_link_ret(rtd, ret);
 104}
 105
 106void snd_soc_link_hw_free(struct snd_pcm_substream *substream)
 107{
 108        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 109
 110        if (rtd->dai_link->ops &&
 111            rtd->dai_link->ops->hw_free)
 112                rtd->dai_link->ops->hw_free(substream);
 113}
 114
 115int snd_soc_link_trigger(struct snd_pcm_substream *substream, int cmd)
 116{
 117        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 118        int ret = 0;
 119
 120        if (rtd->dai_link->ops &&
 121            rtd->dai_link->ops->trigger)
 122                ret = rtd->dai_link->ops->trigger(substream, cmd);
 123
 124        return soc_link_ret(rtd, ret);
 125}
 126
 127int snd_soc_link_compr_startup(struct snd_compr_stream *cstream)
 128{
 129        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 130        int ret = 0;
 131
 132        if (rtd->dai_link->compr_ops &&
 133            rtd->dai_link->compr_ops->startup)
 134                ret = rtd->dai_link->compr_ops->startup(cstream);
 135
 136        return soc_link_ret(rtd, ret);
 137}
 138EXPORT_SYMBOL_GPL(snd_soc_link_compr_startup);
 139
 140void snd_soc_link_compr_shutdown(struct snd_compr_stream *cstream)
 141{
 142        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 143
 144        if (rtd->dai_link->compr_ops &&
 145            rtd->dai_link->compr_ops->shutdown)
 146                rtd->dai_link->compr_ops->shutdown(cstream);
 147}
 148EXPORT_SYMBOL_GPL(snd_soc_link_compr_shutdown);
 149
 150int snd_soc_link_compr_set_params(struct snd_compr_stream *cstream)
 151{
 152        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 153        int ret = 0;
 154
 155        if (rtd->dai_link->compr_ops &&
 156            rtd->dai_link->compr_ops->set_params)
 157                ret = rtd->dai_link->compr_ops->set_params(cstream);
 158
 159        return soc_link_ret(rtd, ret);
 160}
 161EXPORT_SYMBOL_GPL(snd_soc_link_compr_set_params);
 162