diff options
author | Gary Zhang <b13634@freescale.com> | 2011-12-21 10:48:52 +0800 |
---|---|---|
committer | Jason Liu <r64343@freescale.com> | 2012-01-09 21:12:12 +0800 |
commit | 6f787bce83e588be2c472c76224a1a6a2d041fc8 (patch) | |
tree | a04d5c68e1fb74ef0879e4bb26c50b4c6eb30b4b /sound | |
parent | 4298f78c83cf0a7f7e2b640641c02431dfa9beac (diff) |
ENGR00170453 SSI: close ssi_clk when idle
close ssi_clk when ssi is idle.
Signed-off-by: Gary Zhang <b13634@freescale.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/imx/imx-ssi.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c index 89640dc90c41..c7e82490245a 100644 --- a/sound/soc/imx/imx-ssi.c +++ b/sound/soc/imx/imx-ssi.c @@ -359,6 +359,31 @@ static int imx_ssi_trigger(struct snd_pcm_substream *substream, int cmd, return 0; } +static int imx_ssi_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *cpu_dai) +{ + struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai); + + if (cpu_dai->playback_active || cpu_dai->capture_active) + return 0; + + clk_enable(ssi->clk); + + return 0; +} + +static void imx_ssi_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *cpu_dai) +{ + struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai); + + /* shutdown SSI if neither Tx or Rx is active */ + if (cpu_dai->playback_active || cpu_dai->capture_active) + return; + + clk_disable(ssi->clk); +} + static struct snd_soc_dai_ops imx_ssi_pcm_dai_ops = { .hw_params = imx_ssi_hw_params, .set_fmt = imx_ssi_set_dai_fmt, @@ -366,6 +391,8 @@ static struct snd_soc_dai_ops imx_ssi_pcm_dai_ops = { .set_sysclk = imx_ssi_set_dai_sysclk, .set_tdm_slot = imx_ssi_set_dai_tdm_slot, .trigger = imx_ssi_trigger, + .startup = imx_ssi_startup, + .shutdown = imx_ssi_shutdown, }; int snd_imx_pcm_mmap(struct snd_pcm_substream *substream, @@ -470,8 +497,25 @@ static int imx_ssi_dai_probe(struct snd_soc_dai *dai) return 0; } +#ifdef CONFIG_PM +static int imx_ssi_dai_suspend(struct snd_soc_dai *dai) +{ + return 0; +} + +static int imx_ssi_dai_resume(struct snd_soc_dai *dai) +{ + return 0; +} +#else +#define imx_ssi_suspend NULL +#define imx_ssi_resume NULL +#endif + static struct snd_soc_dai_driver imx_ssi_dai = { .probe = imx_ssi_dai_probe, + .suspend = imx_ssi_dai_suspend, + .resume = imx_ssi_dai_resume, .playback = { .channels_min = 1, .channels_max = 2, |