#define simple_priv_to_link(priv, i) ((priv)->snd_card.dai_link + i)
#define simple_priv_to_props(priv, i) ((priv)->dai_props + i)
++++ +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];
++++ + int ret;
++++ +
++++ + ret = clk_prepare_enable(dai_props->cpu_dai.clk);
++++ + if (ret)
++++ + return ret;
++++ +
++++ + ret = clk_prepare_enable(dai_props->codec_dai.clk);
++++ + if (ret)
++++ + clk_disable_unprepare(dai_props->cpu_dai.clk);
++++ +
++++ + return ret;
++++ +}
++++ +
++++ +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];
++++ +
++++ + clk_disable_unprepare(dai_props->cpu_dai.clk);
++++ +
++++ + clk_disable_unprepare(dai_props->codec_dai.clk);
++++ +}
++++ +
static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
}
static struct snd_soc_ops asoc_simple_card_ops = {
++++ + .startup = asoc_simple_card_startup,
++++ + .shutdown = asoc_simple_card_shutdown,
.hw_params = asoc_simple_card_hw_params,
};
}
dai->sysclk = clk_get_rate(clk);
++++ + dai->clk = clk;
} else if (!of_property_read_u32(np, "system-clock-frequency", &val)) {
dai->sysclk = val;
} else {
}
/* Decrease the reference count of the device nodes */
-----static int asoc_simple_card_unref(struct platform_device *pdev)
+++++static int asoc_simple_card_unref(struct snd_soc_card *card)
{
----- struct snd_soc_card *card = platform_get_drvdata(pdev);
struct snd_soc_dai_link *dai_link;
int num_links;
return ret;
err:
----- asoc_simple_card_unref(pdev);
+++++ asoc_simple_card_unref(&priv->snd_card);
return ret;
}
snd_soc_jack_free_gpios(&simple_card_mic_jack, 1,
&simple_card_mic_jack_gpio);
----- return asoc_simple_card_unref(pdev);
+++++ return asoc_simple_card_unref(card);
}
static const struct of_device_id asoc_simple_of_match[] = {
return ret;
}
----- if (clock->xck)
----- clk_enable(clock->xck);
----- if (clock->ick)
----- clk_enable(clock->ick);
----- if (clock->div)
----- clk_enable(clock->div);
+++++ clk_enable(clock->xck);
+++++ clk_enable(clock->ick);
+++++ clk_enable(clock->div);
clock->count++;
}
#define PREALLOC_BUFFER (32 * 1024)
#define PREALLOC_BUFFER_MAX (32 * 1024)
--- --static void fsi_pcm_free(struct snd_pcm *pcm)
--- --{
--- -- snd_pcm_lib_preallocate_free_for_all(pcm);
--- --}
--- --
static int fsi_pcm_new(struct snd_soc_pcm_runtime *rtd)
{
return snd_pcm_lib_preallocate_pages_for_all(
static struct snd_soc_platform_driver fsi_soc_platform = {
.ops = &fsi_pcm_ops,
.pcm_new = fsi_pcm_new,
--- -- .pcm_free = fsi_pcm_free,
};
static const struct snd_soc_component_driver fsi_soc_component = {