Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit f11c5db7 authored by KaiChieh Chuang's avatar KaiChieh Chuang Committed by Mark Brown
Browse files

ASoC: mediatek: sub dai use list_head



use list_head for sub_dais,
since original sub_dais array is sparsely occupied

Signed-off-by: default avatarKaiChieh Chuang <kaichieh.chuang@mediatek.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 0a94cf34
Loading
Loading
Loading
Loading
+24 −40
Original line number Diff line number Diff line
@@ -15,20 +15,12 @@

int mtk_afe_combine_sub_dai(struct mtk_base_afe *afe)
{
	struct snd_soc_dai_driver *sub_dai_drivers;
	struct mtk_base_afe_dai *dai;
	size_t num_dai_drivers = 0, dai_idx = 0;
	int i;

	if (!afe->sub_dais) {
		dev_err(afe->dev, "%s(), sub_dais == NULL\n", __func__);
		return -EINVAL;
	}

	/* calcualte total dai driver size */
	for (i = 0; i < afe->num_sub_dais; i++) {
		if (afe->sub_dais[i].dai_drivers &&
		    afe->sub_dais[i].num_dai_drivers != 0)
			num_dai_drivers += afe->sub_dais[i].num_dai_drivers;
	list_for_each_entry(dai, &afe->sub_dais, list) {
		num_dai_drivers += dai->num_dai_drivers;
	}

	dev_info(afe->dev, "%s(), num of dai %zd\n", __func__, num_dai_drivers);
@@ -42,19 +34,14 @@ int mtk_afe_combine_sub_dai(struct mtk_base_afe *afe)
	if (!afe->dai_drivers)
		return -ENOMEM;

	for (i = 0; i < afe->num_sub_dais; i++) {
		if (afe->sub_dais[i].dai_drivers &&
		    afe->sub_dais[i].num_dai_drivers != 0) {
			sub_dai_drivers = afe->sub_dais[i].dai_drivers;
	list_for_each_entry(dai, &afe->sub_dais, list) {
		/* dai driver */
		memcpy(&afe->dai_drivers[dai_idx],
			       sub_dai_drivers,
			       afe->sub_dais[i].num_dai_drivers *
		       dai->dai_drivers,
		       dai->num_dai_drivers *
		       sizeof(struct snd_soc_dai_driver));
			dai_idx += afe->sub_dais[i].num_dai_drivers;
		dai_idx += dai->num_dai_drivers;
	}
	}

	return 0;
}
EXPORT_SYMBOL_GPL(mtk_afe_combine_sub_dai);
@@ -62,28 +49,25 @@ EXPORT_SYMBOL_GPL(mtk_afe_combine_sub_dai);
int mtk_afe_add_sub_dai_control(struct snd_soc_component *component)
{
	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
	int i;
	struct mtk_base_afe_dai *dai;

	if (!afe->sub_dais) {
		dev_err(afe->dev, "%s(), sub_dais == NULL\n", __func__);
		return -EINVAL;
	}

	for (i = 0; i < afe->num_sub_dais; i++) {
		if (afe->sub_dais[i].controls)
	list_for_each_entry(dai, &afe->sub_dais, list) {
		if (dai->controls)
			snd_soc_add_component_controls(component,
				afe->sub_dais[i].controls,
				afe->sub_dais[i].num_controls);
						       dai->controls,
						       dai->num_controls);

		if (afe->sub_dais[i].dapm_widgets)
		if (dai->dapm_widgets)
			snd_soc_dapm_new_controls(&component->dapm,
				afe->sub_dais[i].dapm_widgets,
				afe->sub_dais[i].num_dapm_widgets);

		if (afe->sub_dais[i].dapm_routes)
						  dai->dapm_widgets,
						  dai->num_dapm_widgets);
	}
	/* add routes after all widgets are added */
	list_for_each_entry(dai, &afe->sub_dais, list) {
		if (dai->dapm_routes)
			snd_soc_dapm_add_routes(&component->dapm,
				afe->sub_dais[i].dapm_routes,
				afe->sub_dais[i].num_dapm_routes);
						dai->dapm_routes,
						dai->num_dapm_routes);
	}

	snd_soc_dapm_new_widgets(component->dapm.card);
+4 −2
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ struct mtk_base_irq_data {
};

struct device;
struct list_head;
struct mtk_base_afe_memif;
struct mtk_base_afe_irq;
struct mtk_base_afe_dai;
@@ -72,8 +73,7 @@ struct mtk_base_afe {
	struct mtk_base_afe_irq *irqs;
	int irqs_size;

	struct mtk_base_afe_dai *sub_dais;
	int num_sub_dais;
	struct list_head sub_dais;
	struct snd_soc_dai_driver *dai_drivers;
	unsigned int num_dai_drivers;

@@ -110,6 +110,8 @@ struct mtk_base_afe_dai {
	unsigned int num_dapm_widgets;
	const struct snd_soc_dapm_route *dapm_routes;
	unsigned int num_dapm_routes;

	struct list_head list;
};

#endif