Unverified Commit 75136503 authored by Bard Liao's avatar Bard Liao Committed by Mark Brown
Browse files

ASoC: intel: sof_sdw: add .exit callback function



We may allocate some resources in sof_sdw_codec_info .init function.
Adding a corresponding .exit function can help to release these resources.

Signed-off-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20200820134542.8682-1-yung-chuan.liao@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b5074755
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -1032,12 +1032,43 @@ static int mc_probe(struct platform_device *pdev)
	return ret;
}

static int mc_remove(struct platform_device *pdev)
{
	struct snd_soc_card *card = platform_get_drvdata(pdev);
	struct snd_soc_dai_link *link;
	int ret;
	int i, j;

	for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) {
		if (!codec_info_list[i].exit)
			continue;
		/*
		 * We don't need to call .exit function if there is no matched
		 * dai link found.
		 */
		for_each_card_prelinks(card, j, link) {
			if (!strcmp(link->codecs[0].dai_name,
				    codec_info_list[i].dai_name)) {
				ret = codec_info_list[i].exit(&pdev->dev, link);
				if (ret)
					dev_warn(&pdev->dev,
						 "codec exit failed %d\n",
						 ret);
				break;
			}
		}
	}

	return 0;
}

static struct platform_driver sof_sdw_driver = {
	.driver = {
		.name = "sof_sdw",
		.pm = &snd_soc_pm_ops,
	},
	.probe = mc_probe,
	.remove = mc_remove,
};

module_platform_driver(sof_sdw_driver);
+1 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ struct sof_sdw_codec_info {
		     struct sof_sdw_codec_info *info,
		     bool playback);

	int (*exit)(struct device *dev, struct snd_soc_dai_link *dai_link);
	bool late_probe;
	int (*codec_card_late_probe)(struct snd_soc_card *card);
};