Unverified Commit bb79f2a6 authored by Ranjani Sridharan's avatar Ranjani Sridharan Committed by Mark Brown
Browse files

ASoC: SOF: Use input/output pin consistently



Currently we use input/output and sink/source pins interchangeably.
Remove the references to sink/source pins and replace with input/output
pins everywhere for consistency and clarity.

Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarRander Wang <rander.wang@intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20230313124856.8140-3-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 3f738e4a
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -88,14 +88,14 @@
#define SOF_TKN_COMP_CPC			406
#define SOF_TKN_COMP_IS_PAGES			409
#define SOF_TKN_COMP_NUM_AUDIO_FORMATS		410
#define SOF_TKN_COMP_NUM_SINK_PINS		411
#define SOF_TKN_COMP_NUM_SOURCE_PINS		412
#define SOF_TKN_COMP_NUM_INPUT_PINS		411
#define SOF_TKN_COMP_NUM_OUTPUT_PINS		412
/*
 * The token for sink/source pin binding, it specifies the widget
 * name that the sink/source pin is connected from/to.
 * The token for input/output pin binding, it specifies the widget
 * name that the input/output pin is connected from/to.
 */
#define SOF_TKN_COMP_SINK_PIN_BINDING_WNAME	413
#define SOF_TKN_COMP_SRC_PIN_BINDING_WNAME	414
#define SOF_TKN_COMP_INPUT_PIN_BINDING_WNAME	413
#define SOF_TKN_COMP_OUTPUT_PIN_BINDING_WNAME	414


/* SSP */
+24 −24
Original line number Diff line number Diff line
@@ -1698,17 +1698,17 @@ static int sof_ipc4_get_queue_id(struct snd_sof_widget *src_widget,
	u32 num_pins;
	int i;

	if (pin_type == SOF_PIN_TYPE_SOURCE) {
	if (pin_type == SOF_PIN_TYPE_OUTPUT) {
		current_swidget = src_widget;
		pin_binding = src_widget->src_pin_binding;
		queue_ida = &src_widget->src_queue_ida;
		num_pins = src_widget->num_source_pins;
		pin_binding = src_widget->output_pin_binding;
		queue_ida = &src_widget->output_queue_ida;
		num_pins = src_widget->num_output_pins;
		buddy_name = sink_widget->widget->name;
	} else {
		current_swidget = sink_widget;
		pin_binding = sink_widget->sink_pin_binding;
		queue_ida = &sink_widget->sink_queue_ida;
		num_pins = sink_widget->num_sink_pins;
		pin_binding = sink_widget->input_pin_binding;
		queue_ida = &sink_widget->input_queue_ida;
		num_pins = sink_widget->num_input_pins;
		buddy_name = src_widget->widget->name;
	}

@@ -1716,12 +1716,12 @@ static int sof_ipc4_get_queue_id(struct snd_sof_widget *src_widget,

	if (num_pins < 1) {
		dev_err(scomp->dev, "invalid %s num_pins: %d for queue allocation for %s\n",
			(pin_type == SOF_PIN_TYPE_SOURCE ? "source" : "sink"),
			(pin_type == SOF_PIN_TYPE_OUTPUT ? "output" : "input"),
			num_pins, current_swidget->widget->name);
		return -EINVAL;
	}

	/* If there is only one sink/source pin, queue id must be 0 */
	/* If there is only one input/output pin, queue id must be 0 */
	if (num_pins == 1)
		return 0;

@@ -1736,7 +1736,7 @@ static int sof_ipc4_get_queue_id(struct snd_sof_widget *src_widget,
		 * mixed use pin binding array and ida for queue ID allocation.
		 */
		dev_err(scomp->dev, "no %s queue id found from pin binding array for %s\n",
			(pin_type == SOF_PIN_TYPE_SOURCE ? "source" : "sink"),
			(pin_type == SOF_PIN_TYPE_OUTPUT ? "output" : "input"),
			current_swidget->widget->name);
		return -EINVAL;
	}
@@ -1752,14 +1752,14 @@ static void sof_ipc4_put_queue_id(struct snd_sof_widget *swidget, int queue_id,
	char **pin_binding;
	int num_pins;

	if (pin_type == SOF_PIN_TYPE_SOURCE) {
		pin_binding = swidget->src_pin_binding;
		queue_ida = &swidget->src_queue_ida;
		num_pins = swidget->num_source_pins;
	if (pin_type == SOF_PIN_TYPE_OUTPUT) {
		pin_binding = swidget->output_pin_binding;
		queue_ida = &swidget->output_queue_ida;
		num_pins = swidget->num_output_pins;
	} else {
		pin_binding = swidget->sink_pin_binding;
		queue_ida = &swidget->sink_queue_ida;
		num_pins = swidget->num_sink_pins;
		pin_binding = swidget->input_pin_binding;
		queue_ida = &swidget->input_queue_ida;
		num_pins = swidget->num_input_pins;
	}

	/* Nothing to free if queue ID is not allocated with ida. */
@@ -1829,7 +1829,7 @@ static int sof_ipc4_route_setup(struct snd_sof_dev *sdev, struct snd_sof_route *
	int ret;

	sroute->src_queue_id = sof_ipc4_get_queue_id(src_widget, sink_widget,
						     SOF_PIN_TYPE_SOURCE);
						     SOF_PIN_TYPE_OUTPUT);
	if (sroute->src_queue_id < 0) {
		dev_err(sdev->dev, "failed to get queue ID for source widget: %s\n",
			src_widget->widget->name);
@@ -1837,12 +1837,12 @@ static int sof_ipc4_route_setup(struct snd_sof_dev *sdev, struct snd_sof_route *
	}

	sroute->dst_queue_id = sof_ipc4_get_queue_id(src_widget, sink_widget,
						     SOF_PIN_TYPE_SINK);
						     SOF_PIN_TYPE_INPUT);
	if (sroute->dst_queue_id < 0) {
		dev_err(sdev->dev, "failed to get queue ID for sink widget: %s\n",
			sink_widget->widget->name);
		sof_ipc4_put_queue_id(src_widget, sroute->src_queue_id,
				      SOF_PIN_TYPE_SOURCE);
				      SOF_PIN_TYPE_OUTPUT);
		return sroute->dst_queue_id;
	}

@@ -1886,8 +1886,8 @@ static int sof_ipc4_route_setup(struct snd_sof_dev *sdev, struct snd_sof_route *
	return ret;

out:
	sof_ipc4_put_queue_id(src_widget, sroute->src_queue_id, SOF_PIN_TYPE_SOURCE);
	sof_ipc4_put_queue_id(sink_widget, sroute->dst_queue_id, SOF_PIN_TYPE_SINK);
	sof_ipc4_put_queue_id(src_widget, sroute->src_queue_id, SOF_PIN_TYPE_OUTPUT);
	sof_ipc4_put_queue_id(sink_widget, sroute->dst_queue_id, SOF_PIN_TYPE_INPUT);
	return ret;
}

@@ -1932,8 +1932,8 @@ static int sof_ipc4_route_free(struct snd_sof_dev *sdev, struct snd_sof_route *s
			src_widget->widget->name, sroute->src_queue_id,
			sink_widget->widget->name, sroute->dst_queue_id);
out:
	sof_ipc4_put_queue_id(sink_widget, sroute->dst_queue_id, SOF_PIN_TYPE_SINK);
	sof_ipc4_put_queue_id(src_widget, sroute->src_queue_id, SOF_PIN_TYPE_SOURCE);
	sof_ipc4_put_queue_id(sink_widget, sroute->dst_queue_id, SOF_PIN_TYPE_INPUT);
	sof_ipc4_put_queue_id(src_widget, sroute->src_queue_id, SOF_PIN_TYPE_OUTPUT);

	return ret;
}
+16 −16
Original line number Diff line number Diff line
@@ -30,9 +30,9 @@
 */
#define SOF_WIDGET_MAX_NUM_PINS	8

/* The type of a widget pin is either sink or source */
#define SOF_PIN_TYPE_SINK	0
#define SOF_PIN_TYPE_SOURCE	1
/* Widget pin type */
#define SOF_PIN_TYPE_INPUT	0
#define SOF_PIN_TYPE_OUTPUT	1

/* max number of FE PCMs before BEs */
#define SOF_BE_PCM_BASE		16
@@ -433,31 +433,31 @@ struct snd_sof_widget {
	struct snd_sof_tuple *tuples;

	/*
	 * The allowed range for num_sink/source_pins is [0, SOF_WIDGET_MAX_NUM_PINS].
	 * Widgets may have zero sink or source pins, for example the tone widget has
	 * zero sink pins.
	 * The allowed range for num_input/output_pins is [0, SOF_WIDGET_MAX_NUM_PINS].
	 * Widgets may have zero input or output pins, for example the tone widget has
	 * zero input pins.
	 */
	u32 num_sink_pins;
	u32 num_source_pins;
	u32 num_input_pins;
	u32 num_output_pins;

	/*
	 * The sink/source pin binding array, it takes the form of
	 * The input/output pin binding array, it takes the form of
	 * [widget_name_connected_to_pin0, widget_name_connected_to_pin1, ...],
	 * with the index as the queue ID.
	 *
	 * The array is used for special pin binding. Note that even if there
	 * is only one sink/source pin requires special pin binding, pin binding
	 * should be defined for all sink/source pins in topology, for pin(s) that
	 * is only one input/output pin requires special pin binding, pin binding
	 * should be defined for all input/output pins in topology, for pin(s) that
	 * are not used, give the value "NotConnected".
	 *
	 * If pin binding is not defined in topology, nothing to parse in the kernel,
	 * sink_pin_binding and src_pin_binding shall be NULL.
	 * input_pin_binding and output_pin_binding shall be NULL.
	 */
	char **sink_pin_binding;
	char **src_pin_binding;
	char **input_pin_binding;
	char **output_pin_binding;

	struct ida src_queue_ida;
	struct ida sink_queue_ida;
	struct ida output_queue_ida;
	struct ida input_queue_ida;

	void *private;		/* core does not touch this */
};
+40 −40
Original line number Diff line number Diff line
@@ -416,19 +416,19 @@ static const struct sof_topology_token led_tokens[] = {
};

static const struct sof_topology_token comp_pin_tokens[] = {
	{SOF_TKN_COMP_NUM_SINK_PINS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
		offsetof(struct snd_sof_widget, num_sink_pins)},
	{SOF_TKN_COMP_NUM_SOURCE_PINS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
		offsetof(struct snd_sof_widget, num_source_pins)},
	{SOF_TKN_COMP_NUM_INPUT_PINS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
		offsetof(struct snd_sof_widget, num_input_pins)},
	{SOF_TKN_COMP_NUM_OUTPUT_PINS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
		offsetof(struct snd_sof_widget, num_output_pins)},
};

static const struct sof_topology_token comp_sink_pin_binding_tokens[] = {
	{SOF_TKN_COMP_SINK_PIN_BINDING_WNAME, SND_SOC_TPLG_TUPLE_TYPE_STRING,
static const struct sof_topology_token comp_input_pin_binding_tokens[] = {
	{SOF_TKN_COMP_INPUT_PIN_BINDING_WNAME, SND_SOC_TPLG_TUPLE_TYPE_STRING,
		get_token_string, 0},
};

static const struct sof_topology_token comp_src_pin_binding_tokens[] = {
	{SOF_TKN_COMP_SRC_PIN_BINDING_WNAME, SND_SOC_TPLG_TUPLE_TYPE_STRING,
static const struct sof_topology_token comp_output_pin_binding_tokens[] = {
	{SOF_TKN_COMP_OUTPUT_PIN_BINDING_WNAME, SND_SOC_TPLG_TUPLE_TYPE_STRING,
		get_token_string, 0},
};

@@ -1286,12 +1286,12 @@ static void sof_free_pin_binding(struct snd_sof_widget *swidget,
	u32 num_pins;
	int i;

	if (pin_type == SOF_PIN_TYPE_SINK) {
		pin_binding = swidget->sink_pin_binding;
		num_pins = swidget->num_sink_pins;
	if (pin_type == SOF_PIN_TYPE_INPUT) {
		pin_binding = swidget->input_pin_binding;
		num_pins = swidget->num_input_pins;
	} else {
		pin_binding = swidget->src_pin_binding;
		num_pins = swidget->num_source_pins;
		pin_binding = swidget->output_pin_binding;
		num_pins = swidget->num_output_pins;
	}

	if (pin_binding) {
@@ -1313,14 +1313,14 @@ static int sof_parse_pin_binding(struct snd_sof_widget *swidget,
	int ret;
	int i;

	if (pin_type == SOF_PIN_TYPE_SINK) {
		num_pins = swidget->num_sink_pins;
		pin_binding_token = comp_sink_pin_binding_tokens;
		token_count = ARRAY_SIZE(comp_sink_pin_binding_tokens);
	if (pin_type == SOF_PIN_TYPE_INPUT) {
		num_pins = swidget->num_input_pins;
		pin_binding_token = comp_input_pin_binding_tokens;
		token_count = ARRAY_SIZE(comp_input_pin_binding_tokens);
	} else {
		num_pins = swidget->num_source_pins;
		pin_binding_token = comp_src_pin_binding_tokens;
		token_count = ARRAY_SIZE(comp_src_pin_binding_tokens);
		num_pins = swidget->num_output_pins;
		pin_binding_token = comp_output_pin_binding_tokens;
		token_count = ARRAY_SIZE(comp_output_pin_binding_tokens);
	}

	memset(pin_binding, 0, SOF_WIDGET_MAX_NUM_PINS * sizeof(char *));
@@ -1337,10 +1337,10 @@ static int sof_parse_pin_binding(struct snd_sof_widget *swidget,
			ret = -ENOMEM;
			goto err;
		}
		if (pin_type == SOF_PIN_TYPE_SINK)
			swidget->sink_pin_binding = pb;
		if (pin_type == SOF_PIN_TYPE_INPUT)
			swidget->input_pin_binding = pb;
		else
			swidget->src_pin_binding = pb;
			swidget->output_pin_binding = pb;
	}

	return 0;
@@ -1379,8 +1379,8 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
	swidget->private = NULL;
	mutex_init(&swidget->setup_mutex);

	ida_init(&swidget->src_queue_ida);
	ida_init(&swidget->sink_queue_ida);
	ida_init(&swidget->output_queue_ida);
	ida_init(&swidget->input_queue_ida);

	ret = sof_parse_tokens(scomp, swidget, comp_pin_tokens,
			       ARRAY_SIZE(comp_pin_tokens), priv->array,
@@ -1391,29 +1391,29 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
		goto widget_free;
	}

	if (swidget->num_sink_pins > SOF_WIDGET_MAX_NUM_PINS ||
	    swidget->num_source_pins > SOF_WIDGET_MAX_NUM_PINS) {
		dev_err(scomp->dev, "invalid pins for %s: [sink: %d, src: %d]\n",
			swidget->widget->name, swidget->num_sink_pins, swidget->num_source_pins);
	if (swidget->num_input_pins > SOF_WIDGET_MAX_NUM_PINS ||
	    swidget->num_output_pins > SOF_WIDGET_MAX_NUM_PINS) {
		dev_err(scomp->dev, "invalid pins for %s: [input: %d, output: %d]\n",
			swidget->widget->name, swidget->num_input_pins, swidget->num_output_pins);
		ret = -EINVAL;
		goto widget_free;
	}

	if (swidget->num_sink_pins > 1) {
		ret = sof_parse_pin_binding(swidget, priv, SOF_PIN_TYPE_SINK);
	if (swidget->num_input_pins > 1) {
		ret = sof_parse_pin_binding(swidget, priv, SOF_PIN_TYPE_INPUT);
		/* on parsing error, pin binding is not allocated, nothing to free. */
		if (ret < 0) {
			dev_err(scomp->dev, "failed to parse sink pin binding for %s\n",
			dev_err(scomp->dev, "failed to parse input pin binding for %s\n",
				w->name);
			goto widget_free;
		}
	}

	if (swidget->num_source_pins > 1) {
		ret = sof_parse_pin_binding(swidget, priv, SOF_PIN_TYPE_SOURCE);
	if (swidget->num_output_pins > 1) {
		ret = sof_parse_pin_binding(swidget, priv, SOF_PIN_TYPE_OUTPUT);
		/* on parsing error, pin binding is not allocated, nothing to free. */
		if (ret < 0) {
			dev_err(scomp->dev, "failed to parse source pin binding for %s\n",
			dev_err(scomp->dev, "failed to parse output pin binding for %s\n",
				w->name);
			goto widget_free;
		}
@@ -1422,7 +1422,7 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
	dev_dbg(scomp->dev,
		"tplg: widget %d (%s) is ready [type: %d, pipe: %d, pins: %d / %d, stream: %s]\n",
		swidget->comp_id, w->name, swidget->id, index,
		swidget->num_sink_pins, swidget->num_source_pins,
		swidget->num_input_pins, swidget->num_output_pins,
		strnlen(w->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0 ? w->sname : "none");

	widget_ops = tplg_ops ? tplg_ops->widget : NULL;
@@ -1643,11 +1643,11 @@ static int sof_widget_unload(struct snd_soc_component *scomp,
	if (widget_ops && widget_ops[swidget->id].ipc_free)
		widget_ops[swidget->id].ipc_free(swidget);

	ida_destroy(&swidget->src_queue_ida);
	ida_destroy(&swidget->sink_queue_ida);
	ida_destroy(&swidget->output_queue_ida);
	ida_destroy(&swidget->input_queue_ida);

	sof_free_pin_binding(swidget, SOF_PIN_TYPE_SINK);
	sof_free_pin_binding(swidget, SOF_PIN_TYPE_SOURCE);
	sof_free_pin_binding(swidget, SOF_PIN_TYPE_INPUT);
	sof_free_pin_binding(swidget, SOF_PIN_TYPE_OUTPUT);

	kfree(swidget->tuples);