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

Commit 1a497983 authored by Mengdong Lin's avatar Mengdong Lin Committed by Mark Brown
Browse files

ASoC: Change the PCM runtime array to a list



Currently the number of DAI links is statically defined by the machine
driver at build time using an array. This makes it difficult to shrink/
grow the number of DAI links at runtime in order to reflect any changes
in topology.

We can change the DAI link array in the core to a list so that PCMs and
FE DAI links can be added and deleted at runtime to reflect changes in
use case and DSP topology. The machine driver can still register DAI links
as an array.

As the 1st step, this patch change the PCM runtime array to a list. A new
PCM runtime is added to the list when a DAI link is bound successfully.

Later patches will further implement the DAI link list.

More:
- define snd_soc_new/free_pcm_runtime() to create/free a runtime.
- define soc_add_pcm_runtime() to add a runtime to the rtd list.
- define soc_remove_pcm_runtimes() to clean up the runtime list.

- traverse the rtd list to probe the link components and dais.

- Add a field "num" to PCM runtime struct, used to specify the device
  number when creating the pcm device, and for a soc card to access
  its dai_props array.

- The following 3rd party machine/platform drivers iterate the rtd list
  to check the runtimes:
  sound/soc/intel/atom/sst-mfld-platform-pcm.c
  sound/soc/intel/boards/cht_bsw_rt5645.c
  sound/soc/intel/boards/cht_bsw_rt5672.c
  sound/soc/intel/boards/cht_bsw_max98090_ti.c

Signed-off-by: default avatarMengdong Lin <mengdong.lin@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5015920a
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1106,7 +1106,7 @@ struct snd_soc_card {
	/* CPU <--> Codec DAI links  */
	struct snd_soc_dai_link *dai_link;
	int num_links;
	struct snd_soc_pcm_runtime *rtd;
	struct list_head rtd_list;
	int num_rtd;

	/* optional codec specific configuration */
@@ -1201,6 +1201,9 @@ struct snd_soc_pcm_runtime {
	struct dentry *debugfs_dpcm_root;
	struct dentry *debugfs_dpcm_state;
#endif

	unsigned int num; /* 0-based and monotonic increasing */
	struct list_head list; /* rtd list of the soc card */
};

/* mixer control */
+5 −7
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct simple_card_data *priv =	snd_soc_card_get_drvdata(rtd->card);
	struct simple_dai_props *dai_props =
		&priv->dai_props[rtd - rtd->card->rtd];
		&priv->dai_props[rtd->num];
	int ret;

	ret = clk_prepare_enable(dai_props->cpu_dai.clk);
@@ -64,7 +64,7 @@ static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct simple_card_data *priv =	snd_soc_card_get_drvdata(rtd->card);
	struct simple_dai_props *dai_props =
		&priv->dai_props[rtd - rtd->card->rtd];
		&priv->dai_props[rtd->num];

	clk_disable_unprepare(dai_props->cpu_dai.clk);

@@ -78,8 +78,7 @@ static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream,
	struct snd_soc_dai *codec_dai = rtd->codec_dai;
	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
	struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
	struct simple_dai_props *dai_props =
		&priv->dai_props[rtd - rtd->card->rtd];
	struct simple_dai_props *dai_props = &priv->dai_props[rtd->num];
	unsigned int mclk, mclk_fs = 0;
	int ret = 0;

@@ -174,10 +173,9 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
	struct snd_soc_dai *codec = rtd->codec_dai;
	struct snd_soc_dai *cpu = rtd->cpu_dai;
	struct simple_dai_props *dai_props;
	int num, ret;
	int ret;

	num = rtd - rtd->card->rtd;
	dai_props = &priv->dai_props[num];
	dai_props = &priv->dai_props[rtd->num];
	ret = __asoc_simple_card_dai_init(codec, &dai_props->codec_dai);
	if (ret < 0)
		return ret;
+6 −6
Original line number Diff line number Diff line
@@ -760,15 +760,15 @@ static int sst_platform_remove(struct platform_device *pdev)
static int sst_soc_prepare(struct device *dev)
{
	struct sst_data *drv = dev_get_drvdata(dev);
	int i;
	struct snd_soc_pcm_runtime *rtd;

	/* suspend all pcms first */
	snd_soc_suspend(drv->soc_card->dev);
	snd_soc_poweroff(drv->soc_card->dev);

	/* set the SSPs to idle */
	for (i = 0; i < drv->soc_card->num_rtd; i++) {
		struct snd_soc_dai *dai = drv->soc_card->rtd[i].cpu_dai;
	list_for_each_entry(rtd, &drv->soc_card->rtd_list, list) {
		struct snd_soc_dai *dai = rtd->cpu_dai;

		if (dai->active) {
			send_ssp_cmd(dai, dai->name, 0);
@@ -782,11 +782,11 @@ static int sst_soc_prepare(struct device *dev)
static void sst_soc_complete(struct device *dev)
{
	struct sst_data *drv = dev_get_drvdata(dev);
	int i;
	struct snd_soc_pcm_runtime *rtd;

	/* restart SSPs */
	for (i = 0; i < drv->soc_card->num_rtd; i++) {
		struct snd_soc_dai *dai = drv->soc_card->rtd[i].cpu_dai;
	list_for_each_entry(rtd, &drv->soc_card->rtd_list, list) {
		struct snd_soc_dai *dai = rtd->cpu_dai;

		if (dai->active) {
			sst_handle_vb_timer(dai, true);
+2 −5
Original line number Diff line number Diff line
@@ -41,12 +41,9 @@ struct cht_mc_private {

static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
{
	int i;

	for (i = 0; i < card->num_rtd; i++) {
	struct snd_soc_pcm_runtime *rtd;

		rtd = card->rtd + i;
	list_for_each_entry(rtd, &card->rtd_list, list) {
		if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
			     strlen(CHT_CODEC_DAI)))
			return rtd->codec_dai;
+2 −5
Original line number Diff line number Diff line
@@ -47,12 +47,9 @@ struct cht_mc_private {

static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
{
	int i;

	for (i = 0; i < card->num_rtd; i++) {
	struct snd_soc_pcm_runtime *rtd;

		rtd = card->rtd + i;
	list_for_each_entry(rtd, &card->rtd_list, list) {
		if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
			     strlen(CHT_CODEC_DAI)))
			return rtd->codec_dai;
Loading