Unverified Commit f2d161e5 authored by Mark Brown's avatar Mark Brown
Browse files

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
parents 96dd187c 8d83282e
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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,
+52 −45
Original line number Diff line number Diff line
@@ -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);
+56 −39
Original line number Diff line number Diff line
@@ -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 @@ int audio_graph2_parse_of(struct simple_util_priv *priv, struct device *dev,
	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);

Loading