ASoC: and adn use snd_soc_ret()
Merge series from Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>: Each ASoC framwark is using own snd_xxx_ret() function, but we can share these. This patch-set adds new snd_soc_ret() and use it. checkpatch indicates that ENOTSUPP is not a SUSV4 error code, prefer to use EOPNOTSUPP. So this patch-set adds it, but not remove existing ENOTSUPP. Link: https://lore.kernel.org/r/8734gvsg5i.wl-kuninori.morimoto.gx@renesas.com
This commit is contained in:
@@ -142,14 +142,14 @@ int simple_util_parse_daifmt(struct device *dev,
|
||||
struct device_node *codec,
|
||||
char *prefix,
|
||||
unsigned int *retfmt);
|
||||
int simple_util_parse_tdm_width_map(struct device *dev, struct device_node *np,
|
||||
int simple_util_parse_tdm_width_map(struct simple_util_priv *priv, struct device_node *np,
|
||||
struct simple_util_dai *dai);
|
||||
|
||||
__printf(3, 4)
|
||||
int simple_util_set_dailink_name(struct device *dev,
|
||||
int simple_util_set_dailink_name(struct simple_util_priv *priv,
|
||||
struct snd_soc_dai_link *dai_link,
|
||||
const char *fmt, ...);
|
||||
int simple_util_parse_card_name(struct snd_soc_card *card,
|
||||
int simple_util_parse_card_name(struct simple_util_priv *priv,
|
||||
char *prefix);
|
||||
|
||||
int simple_util_parse_clk(struct device *dev,
|
||||
@@ -201,7 +201,7 @@ void simple_util_remove(struct platform_device *pdev);
|
||||
|
||||
int graph_util_card_probe(struct snd_soc_card *card);
|
||||
int graph_util_is_ports0(struct device_node *port);
|
||||
int graph_util_parse_dai(struct device *dev, struct device_node *ep,
|
||||
int graph_util_parse_dai(struct simple_util_priv *priv, struct device_node *ep,
|
||||
struct snd_soc_dai_link_component *dlc, int *is_single_link);
|
||||
|
||||
void graph_util_parse_link_direction(struct device_node *np,
|
||||
|
||||
@@ -539,6 +539,7 @@ int snd_soc_calc_bclk(int fs, int sample_size, int channels, int tdm_slots);
|
||||
int snd_soc_params_to_bclk(const struct snd_pcm_hw_params *parms);
|
||||
int snd_soc_tdm_params_to_bclk(const struct snd_pcm_hw_params *params,
|
||||
int tdm_width, int tdm_slots, int slot_multiple);
|
||||
int snd_soc_ret(const struct device *dev, int ret, const char *fmt, ...);
|
||||
|
||||
/* set runtime hw params */
|
||||
static inline int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
|
||||
|
||||
@@ -183,6 +183,8 @@ static int micfil_set_quality(struct fsl_micfil *micfil)
|
||||
case QUALITY_VLOW2:
|
||||
qsel = MICFIL_QSEL_VLOW2_QUALITY;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2,
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
|
||||
#define DPCM_SELECTABLE 1
|
||||
|
||||
#define graph_ret(priv, ret) _graph_ret(priv, __func__, ret)
|
||||
static inline int _graph_ret(struct simple_util_priv *priv,
|
||||
const char *func, int ret)
|
||||
{
|
||||
return snd_soc_ret(simple_priv_to_dev(priv), ret, "at %s()\n", func);
|
||||
}
|
||||
|
||||
#define ep_to_port(ep) of_get_parent(ep)
|
||||
static struct device_node *port_to_ports(struct device_node *port)
|
||||
{
|
||||
@@ -111,19 +118,17 @@ static int graph_parse_node(struct simple_util_priv *priv,
|
||||
dai = simple_props_to_dai_codec(dai_props, 0);
|
||||
}
|
||||
|
||||
ret = graph_util_parse_dai(dev, ep, dlc, cpu);
|
||||
ret = graph_util_parse_dai(priv, ep, dlc, cpu);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_tdm(ep, dai);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_clk(dev, ep, dai, dlc);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_link_init(struct simple_util_priv *priv,
|
||||
@@ -148,7 +153,7 @@ static int graph_link_init(struct simple_util_priv *priv,
|
||||
ret = simple_util_parse_daifmt(dev, ep_cpu, ep_codec,
|
||||
NULL, &dai_link->dai_fmt);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
graph_util_parse_link_direction(top, &playback_only, &capture_only);
|
||||
graph_util_parse_link_direction(port_cpu, &playback_only, &capture_only);
|
||||
@@ -183,7 +188,9 @@ static int graph_link_init(struct simple_util_priv *priv,
|
||||
if (priv->ops)
|
||||
dai_link->ops = priv->ops;
|
||||
|
||||
return simple_util_set_dailink_name(dev, dai_link, name);
|
||||
ret = simple_util_set_dailink_name(priv, dai_link, name);
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_dai_link_of_dpcm(struct simple_util_priv *priv,
|
||||
@@ -215,7 +222,7 @@ static int graph_dai_link_of_dpcm(struct simple_util_priv *priv,
|
||||
|
||||
ret = graph_parse_node(priv, cpu_ep, li, &is_single_links);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
snprintf(dai_name, sizeof(dai_name),
|
||||
"fe.%pOFP.%s", cpus->of_node, cpus->dai_name);
|
||||
@@ -248,7 +255,7 @@ static int graph_dai_link_of_dpcm(struct simple_util_priv *priv,
|
||||
|
||||
ret = graph_parse_node(priv, codec_ep, li, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
snprintf(dai_name, sizeof(dai_name),
|
||||
"be.%pOFP.%s", codecs->of_node, codecs->dai_name);
|
||||
@@ -267,8 +274,8 @@ static int graph_dai_link_of_dpcm(struct simple_util_priv *priv,
|
||||
ret = graph_link_init(priv, cpu_ep, codec_ep, li, dai_name);
|
||||
|
||||
li->link++;
|
||||
|
||||
return ret;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_dai_link_of(struct simple_util_priv *priv,
|
||||
@@ -288,11 +295,11 @@ static int graph_dai_link_of(struct simple_util_priv *priv,
|
||||
|
||||
ret = graph_parse_node(priv, cpu_ep, li, &is_single_links);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = graph_parse_node(priv, codec_ep, li, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
snprintf(dai_name, sizeof(dai_name),
|
||||
"%s-%s", cpus->dai_name, codecs->dai_name);
|
||||
@@ -302,11 +309,11 @@ static int graph_dai_link_of(struct simple_util_priv *priv,
|
||||
|
||||
ret = graph_link_init(priv, cpu_ep, codec_ep, li, dai_name);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
li->link++;
|
||||
|
||||
return 0;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static inline bool parse_as_dpcm_link(struct simple_util_priv *priv,
|
||||
@@ -383,13 +390,13 @@ static int __graph_for_each_link(struct simple_util_priv *priv,
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
codec_port_old = codec_port;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_for_each_link(struct simple_util_priv *priv,
|
||||
@@ -422,7 +429,7 @@ static int graph_for_each_link(struct simple_util_priv *priv,
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_count_noml(struct simple_util_priv *priv,
|
||||
@@ -431,11 +438,10 @@ static int graph_count_noml(struct simple_util_priv *priv,
|
||||
struct link_info *li)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (li->link >= SNDRV_MAX_LINKS) {
|
||||
dev_err(dev, "too many links\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (li->link >= SNDRV_MAX_LINKS)
|
||||
goto end;
|
||||
|
||||
/*
|
||||
* DON'T REMOVE platforms
|
||||
@@ -450,8 +456,9 @@ static int graph_count_noml(struct simple_util_priv *priv,
|
||||
li->link += 1; /* 1xCPU-Codec */
|
||||
|
||||
dev_dbg(dev, "Count As Normal\n");
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_count_dpcm(struct simple_util_priv *priv,
|
||||
@@ -460,11 +467,10 @@ static int graph_count_dpcm(struct simple_util_priv *priv,
|
||||
struct link_info *li)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (li->link >= SNDRV_MAX_LINKS) {
|
||||
dev_err(dev, "too many links\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (li->link >= SNDRV_MAX_LINKS)
|
||||
goto end;
|
||||
|
||||
if (li->cpu) {
|
||||
/*
|
||||
@@ -483,8 +489,9 @@ static int graph_count_dpcm(struct simple_util_priv *priv,
|
||||
}
|
||||
|
||||
dev_dbg(dev, "Count As DPCM\n");
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_get_dais_count(struct simple_util_priv *priv,
|
||||
@@ -544,40 +551,41 @@ static int graph_get_dais_count(struct simple_util_priv *priv,
|
||||
int audio_graph_parse_of(struct simple_util_priv *priv, struct device *dev)
|
||||
{
|
||||
struct snd_soc_card *card = simple_priv_to_card(priv);
|
||||
int ret;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
struct link_info *li __free(kfree) = kzalloc(sizeof(*li), GFP_KERNEL);
|
||||
if (!li)
|
||||
return -ENOMEM;
|
||||
goto end;
|
||||
|
||||
card->owner = THIS_MODULE;
|
||||
card->dev = dev;
|
||||
|
||||
ret = graph_get_dais_count(priv, li);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (!li->link)
|
||||
return -EINVAL;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_init_priv(priv, li);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(priv->pa_gpio)) {
|
||||
ret = PTR_ERR(priv->pa_gpio);
|
||||
dev_err(dev, "failed to get amplifier gpio: %d\n", ret);
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
ret = simple_util_parse_widgets(card, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_routing(card, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
memset(li, 0, sizeof(*li));
|
||||
ret = graph_for_each_link(priv, li,
|
||||
@@ -586,7 +594,7 @@ int audio_graph_parse_of(struct simple_util_priv *priv, struct device *dev)
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
ret = simple_util_parse_card_name(card, NULL);
|
||||
ret = simple_util_parse_card_name(priv, NULL);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
@@ -599,10 +607,9 @@ int audio_graph_parse_of(struct simple_util_priv *priv, struct device *dev)
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
simple_util_clean_reference(card);
|
||||
|
||||
end:
|
||||
return dev_err_probe(dev, ret, "parse error\n");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(audio_graph_parse_of);
|
||||
|
||||
@@ -234,6 +234,13 @@ enum graph_type {
|
||||
#define GRAPH_NODENAME_DPCM "dpcm"
|
||||
#define GRAPH_NODENAME_C2C "codec2codec"
|
||||
|
||||
#define graph_ret(priv, ret) _graph_ret(priv, __func__, ret)
|
||||
static inline int _graph_ret(struct simple_util_priv *priv,
|
||||
const char *func, int ret)
|
||||
{
|
||||
return snd_soc_ret(simple_priv_to_dev(priv), ret, "at %s()\n", func);
|
||||
}
|
||||
|
||||
#define ep_to_port(ep) of_get_parent(ep)
|
||||
static struct device_node *port_to_ports(struct device_node *port)
|
||||
{
|
||||
@@ -409,21 +416,21 @@ static int __graph_parse_node(struct simple_util_priv *priv,
|
||||
dai = simple_props_to_dai_codec(dai_props, idx);
|
||||
}
|
||||
|
||||
ret = graph_util_parse_dai(dev, ep, dlc, &is_single_links);
|
||||
ret = graph_util_parse_dai(priv, ep, dlc, &is_single_links);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_tdm(ep, dai);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_tdm_width_map(dev, ep, dai);
|
||||
ret = simple_util_parse_tdm_width_map(priv, ep, dai);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_clk(dev, ep, dai, dlc);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
/*
|
||||
* set DAI Name
|
||||
@@ -443,22 +450,22 @@ static int __graph_parse_node(struct simple_util_priv *priv,
|
||||
case GRAPH_NORMAL:
|
||||
/* run is_cpu only. see audio_graph2_link_normal() */
|
||||
if (is_cpu)
|
||||
simple_util_set_dailink_name(dev, dai_link, "%s%s-%s%s",
|
||||
simple_util_set_dailink_name(priv, dai_link, "%s%s-%s%s",
|
||||
cpus->dai_name, cpu_multi,
|
||||
codecs->dai_name, codec_multi);
|
||||
break;
|
||||
case GRAPH_DPCM:
|
||||
if (is_cpu)
|
||||
simple_util_set_dailink_name(dev, dai_link, "fe.%pOFP.%s%s",
|
||||
simple_util_set_dailink_name(priv, dai_link, "fe.%pOFP.%s%s",
|
||||
cpus->of_node, cpus->dai_name, cpu_multi);
|
||||
else
|
||||
simple_util_set_dailink_name(dev, dai_link, "be.%pOFP.%s%s",
|
||||
simple_util_set_dailink_name(priv, dai_link, "be.%pOFP.%s%s",
|
||||
codecs->of_node, codecs->dai_name, codec_multi);
|
||||
break;
|
||||
case GRAPH_C2C:
|
||||
/* run is_cpu only. see audio_graph2_link_c2c() */
|
||||
if (is_cpu)
|
||||
simple_util_set_dailink_name(dev, dai_link, "c2c.%s%s-%s%s",
|
||||
simple_util_set_dailink_name(priv, dai_link, "c2c.%s%s-%s%s",
|
||||
cpus->dai_name, cpu_multi,
|
||||
codecs->dai_name, codec_multi);
|
||||
break;
|
||||
@@ -488,11 +495,12 @@ static int __graph_parse_node(struct simple_util_priv *priv,
|
||||
simple_util_canonicalize_cpu(cpus, is_single_links);
|
||||
simple_util_canonicalize_platform(platforms, cpus);
|
||||
}
|
||||
|
||||
return 0;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_parse_node_multi_nm(struct snd_soc_dai_link *dai_link,
|
||||
static int graph_parse_node_multi_nm(struct simple_util_priv *priv,
|
||||
struct snd_soc_dai_link *dai_link,
|
||||
int *nm_idx, int cpu_idx,
|
||||
struct device_node *mcpu_port)
|
||||
{
|
||||
@@ -534,10 +542,10 @@ static int graph_parse_node_multi_nm(struct snd_soc_dai_link *dai_link,
|
||||
struct device_node *mcodec_port_top __free(device_node) = ep_to_port(mcodec_ep_top);
|
||||
struct device_node *mcodec_ports __free(device_node) = port_to_ports(mcodec_port_top);
|
||||
int nm_max = max(dai_link->num_cpus, dai_link->num_codecs);
|
||||
int ret = 0;
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (cpu_idx > dai_link->num_cpus)
|
||||
return -EINVAL;
|
||||
goto end;
|
||||
|
||||
for_each_of_graph_port_endpoint(mcpu_port, mcpu_ep_n) {
|
||||
int codec_idx = 0;
|
||||
@@ -578,8 +586,8 @@ static int graph_parse_node_multi_nm(struct snd_soc_dai_link *dai_link,
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_parse_node_multi(struct simple_util_priv *priv,
|
||||
@@ -633,7 +641,7 @@ static int graph_parse_node_multi(struct simple_util_priv *priv,
|
||||
|
||||
/* CPU:Codec = N:M */
|
||||
if (is_cpu && dai_link->ch_maps) {
|
||||
ret = graph_parse_node_multi_nm(dai_link, &nm_idx, idx, port);
|
||||
ret = graph_parse_node_multi_nm(priv, dai_link, &nm_idx, idx, port);
|
||||
if (ret < 0)
|
||||
goto multi_err;
|
||||
}
|
||||
@@ -643,7 +651,7 @@ static int graph_parse_node_multi(struct simple_util_priv *priv,
|
||||
ret = -EINVAL;
|
||||
|
||||
multi_err:
|
||||
return ret;
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_parse_node_single(struct simple_util_priv *priv,
|
||||
@@ -651,7 +659,7 @@ static int graph_parse_node_single(struct simple_util_priv *priv,
|
||||
struct device_node *ep,
|
||||
struct link_info *li, int is_cpu)
|
||||
{
|
||||
return __graph_parse_node(priv, gtype, ep, li, is_cpu, 0);
|
||||
return graph_ret(priv, __graph_parse_node(priv, gtype, ep, li, is_cpu, 0));
|
||||
}
|
||||
|
||||
static int graph_parse_node(struct simple_util_priv *priv,
|
||||
@@ -660,11 +668,14 @@ static int graph_parse_node(struct simple_util_priv *priv,
|
||||
struct link_info *li, int is_cpu)
|
||||
{
|
||||
struct device_node *port __free(device_node) = ep_to_port(ep);
|
||||
int ret;
|
||||
|
||||
if (graph_lnk_is_multi(port))
|
||||
return graph_parse_node_multi(priv, gtype, port, li, is_cpu);
|
||||
ret = graph_parse_node_multi(priv, gtype, port, li, is_cpu);
|
||||
else
|
||||
return graph_parse_node_single(priv, gtype, ep, li, is_cpu);
|
||||
ret = graph_parse_node_single(priv, gtype, ep, li, is_cpu);
|
||||
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static void graph_parse_daifmt(struct device_node *node, unsigned int *daifmt)
|
||||
@@ -842,18 +853,19 @@ int audio_graph2_link_normal(struct simple_util_priv *priv,
|
||||
*/
|
||||
ret = graph_parse_node(priv, GRAPH_NORMAL, codec_ep, li, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
/*
|
||||
* call CPU, and set DAI Name
|
||||
*/
|
||||
ret = graph_parse_node(priv, GRAPH_NORMAL, cpu_ep, li, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
graph_link_init(priv, lnk, cpu_ep, codec_ep, li, 1);
|
||||
|
||||
return ret;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(audio_graph2_link_normal);
|
||||
|
||||
@@ -946,7 +958,7 @@ int audio_graph2_link_dpcm(struct simple_util_priv *priv,
|
||||
|
||||
graph_link_init(priv, lnk, cpu_ep, codec_ep, li, is_cpu);
|
||||
|
||||
return ret;
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(audio_graph2_link_dpcm);
|
||||
|
||||
@@ -992,8 +1004,13 @@ int audio_graph2_link_c2c(struct simple_util_priv *priv,
|
||||
struct snd_soc_pcm_stream *c2c_conf;
|
||||
|
||||
c2c_conf = devm_kzalloc(dev, sizeof(*c2c_conf), GFP_KERNEL);
|
||||
if (!c2c_conf)
|
||||
return ret;
|
||||
if (!c2c_conf) {
|
||||
/*
|
||||
* Clang doesn't allow to use "goto end" before calling __free(),
|
||||
* because it bypasses the initialization. Use graph_ret() directly.
|
||||
*/
|
||||
return graph_ret(priv, -ENOMEM);
|
||||
}
|
||||
|
||||
c2c_conf->formats = SNDRV_PCM_FMTBIT_S32_LE; /* update ME */
|
||||
c2c_conf->rates = SNDRV_PCM_RATE_8000_384000;
|
||||
@@ -1019,18 +1036,18 @@ int audio_graph2_link_c2c(struct simple_util_priv *priv,
|
||||
*/
|
||||
ret = graph_parse_node(priv, GRAPH_C2C, codec1_ep, li, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
/*
|
||||
* call CPU, and set DAI Name
|
||||
*/
|
||||
ret = graph_parse_node(priv, GRAPH_C2C, codec0_ep, li, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
graph_link_init(priv, lnk, codec0_ep, codec1_ep, li, 1);
|
||||
|
||||
return ret;
|
||||
end:
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(audio_graph2_link_c2c);
|
||||
|
||||
@@ -1078,7 +1095,7 @@ static int graph_link(struct simple_util_priv *priv,
|
||||
|
||||
li->link++;
|
||||
err:
|
||||
return ret;
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_counter(struct device_node *lnk)
|
||||
@@ -1249,7 +1266,7 @@ static int graph_count(struct simple_util_priv *priv,
|
||||
|
||||
li->link++;
|
||||
err:
|
||||
return ret;
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int graph_for_each_link(struct simple_util_priv *priv,
|
||||
@@ -1266,7 +1283,7 @@ static int graph_for_each_link(struct simple_util_priv *priv,
|
||||
struct device_node *node = dev->of_node;
|
||||
struct device_node *lnk;
|
||||
enum graph_type gtype;
|
||||
int rc, ret;
|
||||
int rc, ret = 0;
|
||||
|
||||
/* loop for all listed CPU port */
|
||||
of_for_each_phandle(&it, rc, node, "links", NULL, 0) {
|
||||
@@ -1276,10 +1293,10 @@ static int graph_for_each_link(struct simple_util_priv *priv,
|
||||
|
||||
ret = func(priv, hooks, gtype, lnk, li);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
|
||||
int audio_graph2_parse_of(struct simple_util_priv *priv, struct device *dev,
|
||||
@@ -1332,7 +1349,7 @@ int audio_graph2_parse_of(struct simple_util_priv *priv, struct device *dev,
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
ret = simple_util_parse_card_name(card, NULL);
|
||||
ret = simple_util_parse_card_name(priv, NULL);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
@@ -1355,7 +1372,7 @@ err:
|
||||
if (ret < 0)
|
||||
dev_err_probe(dev, ret, "parse error\n");
|
||||
|
||||
return ret;
|
||||
return graph_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(audio_graph2_parse_of);
|
||||
|
||||
|
||||
@@ -15,6 +15,13 @@
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/simple_card_utils.h>
|
||||
|
||||
#define simple_ret(priv, ret) _simple_ret(priv, __func__, ret)
|
||||
static inline int _simple_ret(struct simple_util_priv *priv,
|
||||
const char *func, int ret)
|
||||
{
|
||||
return snd_soc_ret(simple_priv_to_dev(priv), ret, "at %s()\n", func);
|
||||
}
|
||||
|
||||
int simple_util_get_sample_fmt(struct simple_util_data *data)
|
||||
{
|
||||
int i;
|
||||
@@ -133,33 +140,42 @@ int simple_util_parse_daifmt(struct device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_util_parse_daifmt);
|
||||
|
||||
int simple_util_parse_tdm_width_map(struct device *dev, struct device_node *np,
|
||||
int simple_util_parse_tdm_width_map(struct simple_util_priv *priv, struct device_node *np,
|
||||
struct simple_util_dai *dai)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
int n, i, ret;
|
||||
u32 *p;
|
||||
|
||||
/*
|
||||
* NOTE
|
||||
*
|
||||
* Clang doesn't allow to use "goto end" before calling __free(),
|
||||
* because it bypasses the initialization. Use simple_ret() directly.
|
||||
*/
|
||||
|
||||
n = of_property_count_elems_of_size(np, "dai-tdm-slot-width-map", sizeof(u32));
|
||||
if (n <= 0)
|
||||
return 0;
|
||||
|
||||
if (n % 3) {
|
||||
dev_err(dev, "Invalid number of cells for dai-tdm-slot-width-map\n");
|
||||
return -EINVAL;
|
||||
return simple_ret(priv, -EINVAL); /* see NOTE */
|
||||
}
|
||||
|
||||
ret = -ENOMEM;
|
||||
dai->tdm_width_map = devm_kcalloc(dev, n, sizeof(*dai->tdm_width_map), GFP_KERNEL);
|
||||
if (!dai->tdm_width_map)
|
||||
return -ENOMEM;
|
||||
return simple_ret(priv, ret); /* see NOTE */
|
||||
|
||||
u32 *array_values __free(kfree) = kcalloc(n, sizeof(*array_values),
|
||||
GFP_KERNEL);
|
||||
u32 *array_values __free(kfree) = kcalloc(n, sizeof(*array_values), GFP_KERNEL);
|
||||
if (!array_values)
|
||||
return -ENOMEM;
|
||||
goto end;
|
||||
|
||||
ret = of_property_read_u32_array(np, "dai-tdm-slot-width-map", array_values, n);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Could not read dai-tdm-slot-width-map: %d\n", ret);
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
p = array_values;
|
||||
@@ -170,15 +186,17 @@ int simple_util_parse_tdm_width_map(struct device *dev, struct device_node *np,
|
||||
}
|
||||
|
||||
dai->n_tdm_widths = i;
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_util_parse_tdm_width_map);
|
||||
|
||||
int simple_util_set_dailink_name(struct device *dev,
|
||||
int simple_util_set_dailink_name(struct simple_util_priv *priv,
|
||||
struct snd_soc_dai_link *dai_link,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
va_list ap;
|
||||
char *name = NULL;
|
||||
int ret = -ENOMEM;
|
||||
@@ -194,13 +212,14 @@ int simple_util_set_dailink_name(struct device *dev,
|
||||
dai_link->stream_name = name;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_util_set_dailink_name);
|
||||
|
||||
int simple_util_parse_card_name(struct snd_soc_card *card,
|
||||
int simple_util_parse_card_name(struct simple_util_priv *priv,
|
||||
char *prefix)
|
||||
{
|
||||
struct snd_soc_card *card = simple_priv_to_card(priv);
|
||||
int ret;
|
||||
|
||||
if (!prefix)
|
||||
@@ -214,13 +233,13 @@ int simple_util_parse_card_name(struct snd_soc_card *card,
|
||||
snprintf(prop, sizeof(prop), "%sname", prefix);
|
||||
ret = snd_soc_of_parse_card_name(card, prop);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!card->name && card->dai_link)
|
||||
card->name = card->dai_link->name;
|
||||
|
||||
return 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_util_parse_card_name);
|
||||
|
||||
@@ -348,7 +367,8 @@ cpu_err:
|
||||
break;
|
||||
simple_clk_disable(dai);
|
||||
}
|
||||
return ret;
|
||||
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_util_startup);
|
||||
|
||||
@@ -379,16 +399,19 @@ void simple_util_shutdown(struct snd_pcm_substream *substream)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_util_shutdown);
|
||||
|
||||
static int simple_set_clk_rate(struct device *dev,
|
||||
struct simple_util_dai *simple_dai,
|
||||
unsigned long rate)
|
||||
static int simple_set_clk_rate(struct simple_util_priv *priv,
|
||||
struct simple_util_dai *simple_dai,
|
||||
unsigned long rate)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (!simple_dai)
|
||||
return 0;
|
||||
|
||||
if (simple_dai->clk_fixed && rate != simple_dai->sysclk) {
|
||||
dev_err(dev, "dai %s invalid clock rate %lu\n", simple_dai->name, rate);
|
||||
return -EINVAL;
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!simple_dai->clk)
|
||||
@@ -397,12 +420,15 @@ static int simple_set_clk_rate(struct device *dev,
|
||||
if (clk_get_rate(simple_dai->clk) == rate)
|
||||
return 0;
|
||||
|
||||
return clk_set_rate(simple_dai->clk, rate);
|
||||
ret = clk_set_rate(simple_dai->clk, rate);
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_set_tdm(struct snd_soc_dai *dai,
|
||||
struct simple_util_dai *simple_dai,
|
||||
struct snd_pcm_hw_params *params)
|
||||
static int simple_set_tdm(struct simple_util_priv *priv,
|
||||
struct snd_soc_dai *dai,
|
||||
struct simple_util_dai *simple_dai,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
int sample_bits = params_width(params);
|
||||
int slot_width, slot_count;
|
||||
@@ -430,12 +456,8 @@ static int simple_set_tdm(struct snd_soc_dai *dai,
|
||||
simple_dai->rx_slot_mask,
|
||||
slot_count,
|
||||
slot_width);
|
||||
if (ret && ret != -ENOTSUPP) {
|
||||
dev_err(dai->dev, "simple-card: set_tdm_slot error: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
int simple_util_hw_params(struct snd_pcm_substream *substream,
|
||||
@@ -457,15 +479,15 @@ int simple_util_hw_params(struct snd_pcm_substream *substream,
|
||||
mclk = params_rate(params) * mclk_fs;
|
||||
|
||||
for_each_prop_dai_codec(props, i, pdai) {
|
||||
ret = simple_set_clk_rate(rtd->dev, pdai, mclk);
|
||||
ret = simple_set_clk_rate(priv, pdai, mclk);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
for_each_prop_dai_cpu(props, i, pdai) {
|
||||
ret = simple_set_clk_rate(rtd->dev, pdai, mclk);
|
||||
ret = simple_set_clk_rate(priv, pdai, mclk);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Ensure sysclk is set on all components in case any
|
||||
@@ -476,39 +498,40 @@ int simple_util_hw_params(struct snd_pcm_substream *substream,
|
||||
ret = snd_soc_component_set_sysclk(component, 0, 0,
|
||||
mclk, SND_SOC_CLOCK_IN);
|
||||
if (ret && ret != -ENOTSUPP)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
for_each_rtd_codec_dais(rtd, i, sdai) {
|
||||
pdai = simple_props_to_dai_codec(props, i);
|
||||
ret = snd_soc_dai_set_sysclk(sdai, 0, mclk, pdai->clk_direction);
|
||||
if (ret && ret != -ENOTSUPP)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
for_each_rtd_cpu_dais(rtd, i, sdai) {
|
||||
pdai = simple_props_to_dai_cpu(props, i);
|
||||
ret = snd_soc_dai_set_sysclk(sdai, 0, mclk, pdai->clk_direction);
|
||||
if (ret && ret != -ENOTSUPP)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
for_each_prop_dai_codec(props, i, pdai) {
|
||||
sdai = snd_soc_rtd_to_codec(rtd, i);
|
||||
ret = simple_set_tdm(sdai, pdai, params);
|
||||
ret = simple_set_tdm(priv, sdai, pdai, params);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
for_each_prop_dai_cpu(props, i, pdai) {
|
||||
sdai = snd_soc_rtd_to_cpu(rtd, i);
|
||||
ret = simple_set_tdm(sdai, pdai, params);
|
||||
ret = simple_set_tdm(priv, sdai, pdai, params);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_util_hw_params);
|
||||
|
||||
@@ -536,7 +559,8 @@ int simple_util_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_util_be_hw_params_fixup);
|
||||
|
||||
static int simple_init_dai(struct snd_soc_dai *dai, struct simple_util_dai *simple_dai)
|
||||
static int simple_init_dai(struct simple_util_priv *priv,
|
||||
struct snd_soc_dai *dai, struct simple_util_dai *simple_dai)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -548,7 +572,7 @@ static int simple_init_dai(struct snd_soc_dai *dai, struct simple_util_dai *simp
|
||||
simple_dai->clk_direction);
|
||||
if (ret && ret != -ENOTSUPP) {
|
||||
dev_err(dai->dev, "simple-card: set_sysclk error\n");
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -560,11 +584,12 @@ static int simple_init_dai(struct snd_soc_dai *dai, struct simple_util_dai *simp
|
||||
simple_dai->slot_width);
|
||||
if (ret && ret != -ENOTSUPP) {
|
||||
dev_err(dai->dev, "simple-card: set_tdm_slot error\n");
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static inline int simple_component_is_codec(struct snd_soc_component *component)
|
||||
@@ -572,7 +597,8 @@ static inline int simple_component_is_codec(struct snd_soc_component *component)
|
||||
return component->driver->endianness;
|
||||
}
|
||||
|
||||
static int simple_init_for_codec2codec(struct snd_soc_pcm_runtime *rtd,
|
||||
static int simple_init_for_codec2codec(struct simple_util_priv *priv,
|
||||
struct snd_soc_pcm_runtime *rtd,
|
||||
struct simple_dai_props *dai_props)
|
||||
{
|
||||
struct snd_soc_dai_link *dai_link = rtd->dai_link;
|
||||
@@ -604,12 +630,13 @@ static int simple_init_for_codec2codec(struct snd_soc_pcm_runtime *rtd,
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(rtd->dev, "simple-card: no valid dai_link params\n");
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
ret = -ENOMEM;
|
||||
c2c_params = devm_kzalloc(rtd->dev, sizeof(*c2c_params), GFP_KERNEL);
|
||||
if (!c2c_params)
|
||||
return -ENOMEM;
|
||||
goto end;
|
||||
|
||||
c2c_params->formats = hw.formats;
|
||||
c2c_params->rates = hw.rates;
|
||||
@@ -621,7 +648,9 @@ static int simple_init_for_codec2codec(struct snd_soc_pcm_runtime *rtd,
|
||||
dai_link->c2c_params = c2c_params;
|
||||
dai_link->num_c2c_params = 1;
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
int simple_util_dai_init(struct snd_soc_pcm_runtime *rtd)
|
||||
@@ -632,21 +661,19 @@ int simple_util_dai_init(struct snd_soc_pcm_runtime *rtd)
|
||||
int i, ret;
|
||||
|
||||
for_each_prop_dai_codec(props, i, dai) {
|
||||
ret = simple_init_dai(snd_soc_rtd_to_codec(rtd, i), dai);
|
||||
ret = simple_init_dai(priv, snd_soc_rtd_to_codec(rtd, i), dai);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
for_each_prop_dai_cpu(props, i, dai) {
|
||||
ret = simple_init_dai(snd_soc_rtd_to_cpu(rtd, i), dai);
|
||||
ret = simple_init_dai(priv, snd_soc_rtd_to_cpu(rtd, i), dai);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
ret = simple_init_for_codec2codec(rtd, props);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
ret = simple_init_for_codec2codec(priv, rtd, props);
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(simple_util_dai_init);
|
||||
|
||||
@@ -831,7 +858,7 @@ int simple_util_init_aux_jacks(struct simple_util_priv *priv, char *prefix)
|
||||
priv->aux_jacks = devm_kcalloc(card->dev, num,
|
||||
sizeof(struct snd_soc_jack), GFP_KERNEL);
|
||||
if (!priv->aux_jacks)
|
||||
return -ENOMEM;
|
||||
return simple_ret(priv, -ENOMEM);
|
||||
|
||||
for_each_card_auxs(card, component) {
|
||||
char id[128];
|
||||
@@ -992,13 +1019,11 @@ int graph_util_card_probe(struct snd_soc_card *card)
|
||||
|
||||
ret = simple_util_init_hp(card, &priv->hp_jack, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_init_mic(card, &priv->mic_jack, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(graph_util_card_probe);
|
||||
|
||||
@@ -1074,9 +1099,10 @@ static int graph_get_dai_id(struct device_node *ep)
|
||||
return id;
|
||||
}
|
||||
|
||||
int graph_util_parse_dai(struct device *dev, struct device_node *ep,
|
||||
int graph_util_parse_dai(struct simple_util_priv *priv, struct device_node *ep,
|
||||
struct snd_soc_dai_link_component *dlc, int *is_single_link)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
struct of_phandle_args args = {};
|
||||
struct snd_soc_dai *dai;
|
||||
int ret;
|
||||
@@ -1092,10 +1118,12 @@ int graph_util_parse_dai(struct device *dev, struct device_node *ep,
|
||||
args.np = ep;
|
||||
dai = snd_soc_get_dai_via_args(&args);
|
||||
if (dai) {
|
||||
ret = -ENOMEM;
|
||||
dlc->of_node = node;
|
||||
dlc->dai_name = snd_soc_dai_name_get(dai);
|
||||
dlc->dai_args = snd_soc_copy_dai_args(dev, &args);
|
||||
if (!dlc->dai_args)
|
||||
return -ENOMEM;
|
||||
goto end;
|
||||
|
||||
goto parse_dai_end;
|
||||
}
|
||||
@@ -1126,13 +1154,14 @@ int graph_util_parse_dai(struct device *dev, struct device_node *ep,
|
||||
*/
|
||||
ret = snd_soc_get_dlc(&args, dlc);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
parse_dai_end:
|
||||
if (is_single_link)
|
||||
*is_single_link = of_graph_get_endpoint_count(node) == 1;
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(graph_util_parse_dai);
|
||||
|
||||
|
||||
@@ -29,7 +29,16 @@ static const struct snd_soc_ops simple_ops = {
|
||||
.hw_params = simple_util_hw_params,
|
||||
};
|
||||
|
||||
static int simple_parse_platform(struct device_node *node, struct snd_soc_dai_link_component *dlc)
|
||||
#define simple_ret(priv, ret) _simple_ret(priv, __func__, ret)
|
||||
static inline int _simple_ret(struct simple_util_priv *priv,
|
||||
const char *func, int ret)
|
||||
{
|
||||
return snd_soc_ret(simple_priv_to_dev(priv), ret, "at %s()\n", func);
|
||||
}
|
||||
|
||||
static int simple_parse_platform(struct simple_util_priv *priv,
|
||||
struct device_node *node,
|
||||
struct snd_soc_dai_link_component *dlc)
|
||||
{
|
||||
struct of_phandle_args args;
|
||||
int ret;
|
||||
@@ -43,7 +52,7 @@ static int simple_parse_platform(struct device_node *node, struct snd_soc_dai_li
|
||||
*/
|
||||
ret = of_parse_phandle_with_args(node, DAI, CELL, 0, &args);
|
||||
if (ret)
|
||||
return ret;
|
||||
return simple_ret(priv, ret);
|
||||
|
||||
/* dai_name is not required and may not exist for plat component */
|
||||
|
||||
@@ -52,11 +61,12 @@ static int simple_parse_platform(struct device_node *node, struct snd_soc_dai_li
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int simple_parse_dai(struct device *dev,
|
||||
static int simple_parse_dai(struct simple_util_priv *priv,
|
||||
struct device_node *node,
|
||||
struct snd_soc_dai_link_component *dlc,
|
||||
int *is_single_link)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
struct of_phandle_args args;
|
||||
struct snd_soc_dai *dai;
|
||||
int ret;
|
||||
@@ -70,17 +80,18 @@ static int simple_parse_dai(struct device *dev,
|
||||
*/
|
||||
ret = of_parse_phandle_with_args(node, DAI, CELL, 0, &args);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
/*
|
||||
* Try to find from DAI args
|
||||
*/
|
||||
dai = snd_soc_get_dai_via_args(&args);
|
||||
if (dai) {
|
||||
ret = -ENOMEM;
|
||||
dlc->dai_name = snd_soc_dai_name_get(dai);
|
||||
dlc->dai_args = snd_soc_copy_dai_args(dev, &args);
|
||||
if (!dlc->dai_args)
|
||||
return -ENOMEM;
|
||||
goto end;
|
||||
|
||||
goto parse_dai_end;
|
||||
}
|
||||
@@ -106,13 +117,14 @@ static int simple_parse_dai(struct device *dev,
|
||||
*/
|
||||
ret = snd_soc_get_dlc(&args, dlc);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
parse_dai_end:
|
||||
if (is_single_link)
|
||||
*is_single_link = !args.args_count;
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static void simple_parse_convert(struct device *dev,
|
||||
@@ -149,19 +161,17 @@ static int simple_parse_node(struct simple_util_priv *priv,
|
||||
dai = simple_props_to_dai_codec(dai_props, 0);
|
||||
}
|
||||
|
||||
ret = simple_parse_dai(dev, np, dlc, cpu);
|
||||
ret = simple_parse_dai(priv, np, dlc, cpu);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_clk(dev, np, dai, dlc);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_tdm(np, dai);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_link_init(struct simple_util_priv *priv,
|
||||
@@ -183,7 +193,7 @@ static int simple_link_init(struct simple_util_priv *priv,
|
||||
ret = simple_util_parse_daifmt(dev, node, codec,
|
||||
prefix, &dai_link->dai_fmt);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
graph_util_parse_link_direction(top, &playback_only, &capture_only);
|
||||
graph_util_parse_link_direction(node, &playback_only, &capture_only);
|
||||
@@ -213,7 +223,9 @@ static int simple_link_init(struct simple_util_priv *priv,
|
||||
dai_link->init = simple_util_dai_init;
|
||||
dai_link->ops = &simple_ops;
|
||||
|
||||
return simple_util_set_dailink_name(dev, dai_link, name);
|
||||
ret = simple_util_set_dailink_name(priv, dai_link, name);
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_dai_link_of_dpcm(struct simple_util_priv *priv,
|
||||
@@ -290,7 +302,7 @@ static int simple_dai_link_of_dpcm(struct simple_util_priv *priv,
|
||||
out_put_node:
|
||||
li->link++;
|
||||
|
||||
return ret;
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_dai_link_of(struct simple_util_priv *priv,
|
||||
@@ -330,7 +342,7 @@ static int simple_dai_link_of(struct simple_util_priv *priv,
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
ret = simple_parse_platform(plat, platforms);
|
||||
ret = simple_parse_platform(priv, plat, platforms);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
@@ -345,7 +357,7 @@ static int simple_dai_link_of(struct simple_util_priv *priv,
|
||||
dai_link_of_err:
|
||||
li->link++;
|
||||
|
||||
return ret;
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int __simple_for_each_link(struct simple_util_priv *priv,
|
||||
@@ -443,10 +455,10 @@ static int __simple_for_each_link(struct simple_util_priv *priv,
|
||||
node = of_get_next_child(top, node);
|
||||
} while (!is_top && node);
|
||||
|
||||
error:
|
||||
error:
|
||||
of_node_put(node);
|
||||
|
||||
return ret;
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_for_each_link(struct simple_util_priv *priv,
|
||||
@@ -479,7 +491,7 @@ static int simple_for_each_link(struct simple_util_priv *priv,
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static void simple_depopulate_aux(void *data)
|
||||
@@ -500,9 +512,11 @@ static int simple_populate_aux(struct simple_util_priv *priv)
|
||||
|
||||
ret = of_platform_populate(node, NULL, NULL, dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
return devm_add_action_or_reset(dev, simple_depopulate_aux, priv);
|
||||
ret = devm_add_action_or_reset(dev, simple_depopulate_aux, priv);
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_parse_of(struct simple_util_priv *priv, struct link_info *li)
|
||||
@@ -512,15 +526,15 @@ static int simple_parse_of(struct simple_util_priv *priv, struct link_info *li)
|
||||
|
||||
ret = simple_util_parse_widgets(card, PREFIX);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_routing(card, PREFIX);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_pin_switches(card, PREFIX);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
/* Single/Muti DAI link(s) & New style of DT node */
|
||||
memset(li, 0, sizeof(*li));
|
||||
@@ -528,19 +542,19 @@ static int simple_parse_of(struct simple_util_priv *priv, struct link_info *li)
|
||||
simple_dai_link_of,
|
||||
simple_dai_link_of_dpcm);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_parse_card_name(card, PREFIX);
|
||||
ret = simple_util_parse_card_name(priv, PREFIX);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_populate_aux(priv);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = snd_soc_of_parse_aux_devs(card, PREFIX "aux-devs");
|
||||
|
||||
return ret;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_count_noml(struct simple_util_priv *priv,
|
||||
@@ -548,12 +562,10 @@ static int simple_count_noml(struct simple_util_priv *priv,
|
||||
struct device_node *codec,
|
||||
struct link_info *li, bool is_top)
|
||||
{
|
||||
if (li->link >= SNDRV_MAX_LINKS) {
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
int ret = -EINVAL;
|
||||
|
||||
dev_err(dev, "too many links\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (li->link >= SNDRV_MAX_LINKS)
|
||||
goto end;
|
||||
|
||||
/*
|
||||
* DON'T REMOVE platforms
|
||||
@@ -575,8 +587,9 @@ static int simple_count_noml(struct simple_util_priv *priv,
|
||||
li->num[li->link].codecs = 1;
|
||||
|
||||
li->link += 1;
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_count_dpcm(struct simple_util_priv *priv,
|
||||
@@ -584,12 +597,10 @@ static int simple_count_dpcm(struct simple_util_priv *priv,
|
||||
struct device_node *codec,
|
||||
struct link_info *li, bool is_top)
|
||||
{
|
||||
if (li->link >= SNDRV_MAX_LINKS) {
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
int ret = -EINVAL;
|
||||
|
||||
dev_err(dev, "too many links\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (li->link >= SNDRV_MAX_LINKS)
|
||||
goto end;
|
||||
|
||||
if (li->cpu) {
|
||||
/*
|
||||
@@ -606,8 +617,9 @@ static int simple_count_dpcm(struct simple_util_priv *priv,
|
||||
|
||||
li->link++; /* dummy-Codec */
|
||||
}
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_get_dais_count(struct simple_util_priv *priv,
|
||||
@@ -683,17 +695,15 @@ static int simple_soc_probe(struct snd_soc_card *card)
|
||||
|
||||
ret = simple_util_init_hp(card, &priv->hp_jack, PREFIX);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_init_mic(card, &priv->mic_jack, PREFIX);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_init_aux_jacks(priv, PREFIX);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
end:
|
||||
return simple_ret(priv, ret);
|
||||
}
|
||||
|
||||
static int simple_probe(struct platform_device *pdev)
|
||||
@@ -715,20 +725,22 @@ static int simple_probe(struct platform_device *pdev)
|
||||
card->probe = simple_soc_probe;
|
||||
card->driver_name = "simple-card";
|
||||
|
||||
ret = -ENOMEM;
|
||||
struct link_info *li __free(kfree) = kzalloc(sizeof(*li), GFP_KERNEL);
|
||||
if (!li)
|
||||
return -ENOMEM;
|
||||
goto end;
|
||||
|
||||
ret = simple_get_dais_count(priv, li);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (!li->link)
|
||||
return -EINVAL;
|
||||
goto end;
|
||||
|
||||
ret = simple_util_init_priv(priv, li);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
if (np && of_device_is_available(np)) {
|
||||
|
||||
@@ -795,8 +807,8 @@ static int simple_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
err:
|
||||
simple_util_clean_reference(card);
|
||||
|
||||
return ret;
|
||||
end:
|
||||
return dev_err_probe(dev, ret, "parse error\n");
|
||||
}
|
||||
|
||||
static const struct of_device_id simple_of_match[] = {
|
||||
|
||||
@@ -330,7 +330,7 @@ static const struct snd_soc_acpi_adr_device rt1316_3_single_adr[] = {
|
||||
|
||||
static const struct snd_soc_acpi_adr_device rt1318_1_single_adr[] = {
|
||||
{
|
||||
.adr = 0x000130025D131801,
|
||||
.adr = 0x000130025D131801ull,
|
||||
.num_endpoints = 1,
|
||||
.endpoints = &single_endpoint,
|
||||
.name_prefix = "rt1318-1"
|
||||
|
||||
@@ -658,25 +658,25 @@ static const struct snd_soc_acpi_endpoint cs35l56_7_fb_endpoints[] = {
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_sdw_eight_1_4_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00003301fa355601,
|
||||
.adr = 0x00003301fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_l_fb_endpoints),
|
||||
.endpoints = cs35l56_l_fb_endpoints,
|
||||
.name_prefix = "AMP1"
|
||||
},
|
||||
{
|
||||
.adr = 0x00003201fa355601,
|
||||
.adr = 0x00003201fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_2_fb_endpoints),
|
||||
.endpoints = cs35l56_2_fb_endpoints,
|
||||
.name_prefix = "AMP2"
|
||||
},
|
||||
{
|
||||
.adr = 0x00003101fa355601,
|
||||
.adr = 0x00003101fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_4_fb_endpoints),
|
||||
.endpoints = cs35l56_4_fb_endpoints,
|
||||
.name_prefix = "AMP3"
|
||||
},
|
||||
{
|
||||
.adr = 0x00003001fa355601,
|
||||
.adr = 0x00003001fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_6_fb_endpoints),
|
||||
.endpoints = cs35l56_6_fb_endpoints,
|
||||
.name_prefix = "AMP4"
|
||||
@@ -685,25 +685,25 @@ static const struct snd_soc_acpi_adr_device cs35l56_sdw_eight_1_4_fb_adr[] = {
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_sdw_eight_5_8_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00013701fa355601,
|
||||
.adr = 0x00013701fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
|
||||
.endpoints = cs35l56_r_fb_endpoints,
|
||||
.name_prefix = "AMP8"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013601fa355601,
|
||||
.adr = 0x00013601fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_3_fb_endpoints),
|
||||
.endpoints = cs35l56_3_fb_endpoints,
|
||||
.name_prefix = "AMP7"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013501fa355601,
|
||||
.adr = 0x00013501fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_5_fb_endpoints),
|
||||
.endpoints = cs35l56_5_fb_endpoints,
|
||||
.name_prefix = "AMP6"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013401fa355601,
|
||||
.adr = 0x00013401fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_7_fb_endpoints),
|
||||
.endpoints = cs35l56_7_fb_endpoints,
|
||||
.name_prefix = "AMP5"
|
||||
|
||||
@@ -451,11 +451,11 @@ static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai,
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
val = I2S_TXCR_TFS_TDM_PCM;
|
||||
tdm_val = TDM_SHIFT_CTRL(0);
|
||||
tdm_val = TDM_SHIFT_CTRL(2);
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
val = I2S_TXCR_TFS_TDM_PCM;
|
||||
tdm_val = TDM_SHIFT_CTRL(2);
|
||||
tdm_val = TDM_SHIFT_CTRL(4);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
|
||||
+2
-12
@@ -15,18 +15,8 @@
|
||||
static inline int _soc_card_ret(struct snd_soc_card *card,
|
||||
const char *func, int ret)
|
||||
{
|
||||
switch (ret) {
|
||||
case -EPROBE_DEFER:
|
||||
case -ENOTSUPP:
|
||||
case 0:
|
||||
break;
|
||||
default:
|
||||
dev_err(card->dev,
|
||||
"ASoC: error at %s on %s: %d\n",
|
||||
func, card->name, ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return snd_soc_ret(card->dev, ret,
|
||||
"at %s() on %s\n", func, card->name);
|
||||
}
|
||||
|
||||
struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
|
||||
|
||||
+12
-24
@@ -13,32 +13,20 @@
|
||||
#include <sound/soc.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#define soc_component_ret(dai, ret) _soc_component_ret(dai, __func__, ret, -1)
|
||||
#define soc_component_ret_reg_rw(dai, ret, reg) _soc_component_ret(dai, __func__, ret, reg)
|
||||
static inline int _soc_component_ret(struct snd_soc_component *component,
|
||||
const char *func, int ret, int reg)
|
||||
#define soc_component_ret(dai, ret) _soc_component_ret(dai, __func__, ret)
|
||||
static inline int _soc_component_ret(struct snd_soc_component *component, const char *func, int ret)
|
||||
{
|
||||
/* Positive/Zero values are not errors */
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
return snd_soc_ret(component->dev, ret,
|
||||
"at %s() on %s\n", func, component->name);
|
||||
}
|
||||
|
||||
/* Negative values might be errors */
|
||||
switch (ret) {
|
||||
case -EPROBE_DEFER:
|
||||
case -ENOTSUPP:
|
||||
break;
|
||||
default:
|
||||
if (reg == -1)
|
||||
dev_err(component->dev,
|
||||
"ASoC: error at %s on %s: %d\n",
|
||||
func, component->name, ret);
|
||||
else
|
||||
dev_err(component->dev,
|
||||
"ASoC: error at %s on %s for register: [0x%08x] %d\n",
|
||||
func, component->name, reg, ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
#define soc_component_ret_reg_rw(dai, ret, reg) _soc_component_ret_reg_rw(dai, __func__, ret, reg)
|
||||
static inline int _soc_component_ret_reg_rw(struct snd_soc_component *component,
|
||||
const char *func, int ret, int reg)
|
||||
{
|
||||
return snd_soc_ret(component->dev, ret,
|
||||
"at %s() on %s for register: [0x%08x]\n",
|
||||
func, component->name, reg);
|
||||
}
|
||||
|
||||
static inline int soc_component_field_shift(struct snd_soc_component *component,
|
||||
|
||||
+2
-16
@@ -14,22 +14,8 @@
|
||||
static inline int _soc_dai_ret(const struct snd_soc_dai *dai,
|
||||
const char *func, int ret)
|
||||
{
|
||||
/* Positive, Zero values are not errors */
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
|
||||
/* Negative values might be errors */
|
||||
switch (ret) {
|
||||
case -EPROBE_DEFER:
|
||||
case -ENOTSUPP:
|
||||
break;
|
||||
default:
|
||||
dev_err(dai->dev,
|
||||
"ASoC: error at %s on %s: %d\n",
|
||||
func, dai->name, ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return snd_soc_ret(dai->dev, ret,
|
||||
"at %s() on %s\n", func, dai->name);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+2
-16
@@ -12,22 +12,8 @@
|
||||
static inline int _soc_link_ret(struct snd_soc_pcm_runtime *rtd,
|
||||
const char *func, int ret)
|
||||
{
|
||||
/* Positive, Zero values are not errors */
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
|
||||
/* Negative values might be errors */
|
||||
switch (ret) {
|
||||
case -EPROBE_DEFER:
|
||||
case -ENOTSUPP:
|
||||
break;
|
||||
default:
|
||||
dev_err(rtd->dev,
|
||||
"ASoC: error at %s on %s: %d\n",
|
||||
func, rtd->dai_link->name, ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return snd_soc_ret(rtd->dev, ret,
|
||||
"at %s() on %s\n", func, rtd->dai_link->name);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+41
-73
@@ -30,22 +30,8 @@
|
||||
static inline int _soc_pcm_ret(struct snd_soc_pcm_runtime *rtd,
|
||||
const char *func, int ret)
|
||||
{
|
||||
/* Positive, Zero values are not errors */
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
|
||||
/* Negative values might be errors */
|
||||
switch (ret) {
|
||||
case -EPROBE_DEFER:
|
||||
case -ENOTSUPP:
|
||||
break;
|
||||
default:
|
||||
dev_err(rtd->dev,
|
||||
"ASoC: error at %s on %s: %d\n",
|
||||
func, rtd->dai_link->name, ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return snd_soc_ret(rtd->dev, ret,
|
||||
"at %s() on %s\n", func, rtd->dai_link->name);
|
||||
}
|
||||
|
||||
/* is the current PCM operation for this FE ? */
|
||||
@@ -252,11 +238,9 @@ static ssize_t dpcm_state_read_file(struct file *file, char __user *user_buf,
|
||||
int stream;
|
||||
char *buf;
|
||||
|
||||
if (fe->dai_link->num_cpus > 1) {
|
||||
dev_err(fe->dev,
|
||||
if (fe->dai_link->num_cpus > 1)
|
||||
return snd_soc_ret(fe->dev, -EINVAL,
|
||||
"%s doesn't support Multi CPU yet\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf = kmalloc(out_count, GFP_KERNEL);
|
||||
if (!buf)
|
||||
@@ -474,12 +458,9 @@ static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream,
|
||||
ret = snd_pcm_hw_constraint_single(substream->runtime, \
|
||||
SNDRV_PCM_HW_PARAM_##NAME,\
|
||||
soc_dai->symmetric_##name); \
|
||||
if (ret < 0) { \
|
||||
dev_err(soc_dai->dev, \
|
||||
"ASoC: Unable to apply %s constraint: %d\n",\
|
||||
#name, ret); \
|
||||
return ret; \
|
||||
} \
|
||||
if (ret < 0) \
|
||||
return snd_soc_ret(soc_dai->dev, ret, \
|
||||
"Unable to apply %s constraint\n", #name); \
|
||||
}
|
||||
|
||||
__soc_pcm_apply_symmetry(rate, RATE);
|
||||
@@ -510,12 +491,11 @@ static int soc_pcm_params_symmetry(struct snd_pcm_substream *substream,
|
||||
for_each_rtd_cpu_dais(rtd, i, cpu_dai) \
|
||||
if (!snd_soc_dai_is_dummy(cpu_dai) && \
|
||||
cpu_dai->symmetric_##xxx && \
|
||||
cpu_dai->symmetric_##xxx != d.symmetric_##xxx) { \
|
||||
dev_err(rtd->dev, "ASoC: unmatched %s symmetry: %s:%d - %s:%d\n", \
|
||||
#xxx, cpu_dai->name, cpu_dai->symmetric_##xxx, \
|
||||
d.name, d.symmetric_##xxx); \
|
||||
return -EINVAL; \
|
||||
}
|
||||
cpu_dai->symmetric_##xxx != d.symmetric_##xxx) \
|
||||
return snd_soc_ret(rtd->dev, -EINVAL, \
|
||||
"unmatched %s symmetry: %s:%d - %s:%d\n", \
|
||||
#xxx, cpu_dai->name, cpu_dai->symmetric_##xxx, \
|
||||
d.name, d.symmetric_##xxx);
|
||||
|
||||
/* reject unmatched parameters when applying symmetry */
|
||||
__soc_pcm_params_symmetry(rate);
|
||||
@@ -860,9 +840,8 @@ static int soc_hw_sanity_check(struct snd_pcm_substream *substream)
|
||||
return 0;
|
||||
|
||||
config_err:
|
||||
dev_err(dev, "ASoC: %s <-> %s No matching %s\n",
|
||||
name_codec, name_cpu, err_msg);
|
||||
return -EINVAL;
|
||||
return snd_soc_ret(dev, -EINVAL,
|
||||
"%s <-> %s No matching %s\n", name_codec, name_cpu, err_msg);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1333,11 +1312,11 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
|
||||
fe_substream = snd_soc_dpcm_get_substream(fe, stream);
|
||||
be_substream = snd_soc_dpcm_get_substream(be, stream);
|
||||
|
||||
if (!fe_substream->pcm->nonatomic && be_substream->pcm->nonatomic) {
|
||||
dev_err(be->dev, "%s: FE is atomic but BE is nonatomic, invalid configuration\n",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!fe_substream->pcm->nonatomic && be_substream->pcm->nonatomic)
|
||||
return snd_soc_ret(be->dev, -EINVAL,
|
||||
"%s: %s is atomic but %s is nonatomic, invalid configuration\n",
|
||||
__func__, fe->dai_link->name, be->dai_link->name);
|
||||
|
||||
if (fe_substream->pcm->nonatomic && !be_substream->pcm->nonatomic) {
|
||||
dev_dbg(be->dev, "FE is nonatomic but BE is not, forcing BE as nonatomic\n");
|
||||
be_substream->pcm->nonatomic = 1;
|
||||
@@ -1507,11 +1486,9 @@ int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
|
||||
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(fe, 0);
|
||||
int paths;
|
||||
|
||||
if (fe->dai_link->num_cpus > 1) {
|
||||
dev_err(fe->dev,
|
||||
if (fe->dai_link->num_cpus > 1)
|
||||
return snd_soc_ret(fe->dev, -EINVAL,
|
||||
"%s doesn't support Multi CPU yet\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* get number of valid DAI paths and their widgets */
|
||||
paths = snd_soc_dapm_dai_get_connected_widgets(cpu_dai, stream, list,
|
||||
@@ -2402,23 +2379,23 @@ static int dpcm_dai_trigger_fe_be(struct snd_pcm_substream *substream,
|
||||
|
||||
ret = soc_pcm_trigger(substream, cmd);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
|
||||
return ret;
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* call trigger on the frontend after the backend. */
|
||||
ret = dpcm_be_dai_trigger(fe, substream->stream, cmd);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto end;
|
||||
|
||||
dev_dbg(fe->dev, "ASoC: post trigger FE %s cmd %d\n",
|
||||
fe->dai_link->name, cmd);
|
||||
|
||||
ret = soc_pcm_trigger(substream, cmd);
|
||||
|
||||
return ret;
|
||||
end:
|
||||
return snd_soc_ret(fe->dev, ret, "trigger FE cmd: %d failed\n", cmd);
|
||||
}
|
||||
|
||||
static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
@@ -2474,11 +2451,8 @@ static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(fe->dev, "ASoC: trigger FE cmd: %d failed: %d\n",
|
||||
cmd, ret);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
@@ -2707,11 +2681,9 @@ static int soc_dpcm_fe_runtime_update(struct snd_soc_pcm_runtime *fe, int new)
|
||||
if (!fe->dai_link->dynamic)
|
||||
return 0;
|
||||
|
||||
if (fe->dai_link->num_cpus > 1) {
|
||||
dev_err(fe->dev,
|
||||
if (fe->dai_link->num_cpus > 1)
|
||||
return snd_soc_ret(fe->dev, -EINVAL,
|
||||
"%s doesn't support Multi CPU yet\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* only check active links */
|
||||
if (!snd_soc_dai_active(snd_soc_rtd_to_cpu(fe, 0)))
|
||||
@@ -2782,7 +2754,8 @@ int snd_soc_dpcm_runtime_update(struct snd_soc_card *card)
|
||||
|
||||
out:
|
||||
snd_soc_dpcm_mutex_unlock(card);
|
||||
return ret;
|
||||
|
||||
return snd_soc_ret(card->dev, ret, "%s() failed\n", __func__);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dpcm_runtime_update);
|
||||
|
||||
@@ -2856,10 +2829,9 @@ static int soc_get_playback_capture(struct snd_soc_pcm_runtime *rtd,
|
||||
int has_capture = 0;
|
||||
int i;
|
||||
|
||||
if (dai_link->dynamic && dai_link->num_cpus > 1) {
|
||||
dev_err(rtd->dev, "DPCM doesn't support Multi CPU for Front-Ends yet\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (dai_link->dynamic && dai_link->num_cpus > 1)
|
||||
return snd_soc_ret(rtd->dev, -EINVAL,
|
||||
"DPCM doesn't support Multi CPU for Front-Ends yet\n");
|
||||
|
||||
/* Adapt stream for codec2codec links */
|
||||
cpu_capture = snd_soc_get_stream_cpu(dai_link, SNDRV_PCM_STREAM_CAPTURE);
|
||||
@@ -2901,12 +2873,9 @@ static int soc_get_playback_capture(struct snd_soc_pcm_runtime *rtd,
|
||||
if (dai_link->capture_only)
|
||||
has_playback = 0;
|
||||
|
||||
if (!has_playback && !has_capture) {
|
||||
dev_err(rtd->dev, "substream %s has no playback, no capture\n",
|
||||
dai_link->stream_name);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!has_playback && !has_capture)
|
||||
return snd_soc_ret(rtd->dev, -EINVAL,
|
||||
"substream %s has no playback, no capture\n", dai_link->stream_name);
|
||||
|
||||
*playback = has_playback;
|
||||
*capture = has_capture;
|
||||
@@ -2946,11 +2915,10 @@ static int soc_create_pcm(struct snd_pcm **pcm,
|
||||
ret = snd_pcm_new(rtd->card->snd_card, new_name, rtd->id, playback,
|
||||
capture, pcm);
|
||||
}
|
||||
if (ret < 0) {
|
||||
dev_err(rtd->card->dev, "ASoC: can't create pcm %s for dailink %s: %d\n",
|
||||
new_name, rtd->dai_link->name, ret);
|
||||
return ret;
|
||||
}
|
||||
if (ret < 0)
|
||||
return snd_soc_ret(rtd->dev, ret,
|
||||
"can't create pcm %s for dailink %s\n", new_name, rtd->dai_link->name);
|
||||
|
||||
dev_dbg(rtd->card->dev, "ASoC: registered pcm #%d %s\n", rtd->id, new_name);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -15,6 +15,33 @@
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/soc.h>
|
||||
|
||||
int snd_soc_ret(const struct device *dev, int ret, const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
|
||||
/* Positive, Zero values are not errors */
|
||||
if (ret >= 0)
|
||||
return ret;
|
||||
|
||||
/* Negative values might be errors */
|
||||
switch (ret) {
|
||||
case -EPROBE_DEFER:
|
||||
case -ENOTSUPP:
|
||||
case -EOPNOTSUPP:
|
||||
break;
|
||||
default:
|
||||
va_start(args, fmt);
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
dev_err(dev, "ASoC error (%d): %pV", ret, &vaf);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_ret);
|
||||
|
||||
int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots)
|
||||
{
|
||||
return sample_size * channels * tdm_slots;
|
||||
|
||||
Reference in New Issue
Block a user