aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/sh
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2011-05-23 07:46:26 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-05-24 06:42:07 -0400
commit23ca853392aebdaa56c8138746deb2002e03d827 (patch)
treecf96fd848d987e8150e5988959a3eb296b420c41 /sound/soc/sh
parentcda828cafe9df9a8b0687f1b8a17be2cd9cf1950 (diff)
ASoC: sh: fsi: add fsi_hw_startup/shutdown
This patch is preparation of cleanup suspend/resume patch. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Acked-by: Liam Girdwood <lrg@ti.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/sh')
-rw-r--r--sound/soc/sh/fsi.c43
1 files changed, 29 insertions, 14 deletions
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c
index 507c02b1c809..d2f17cefa92f 100644
--- a/sound/soc/sh/fsi.c
+++ b/sound/soc/sh/fsi.c
@@ -689,7 +689,7 @@ static void __fsi_port_clk_ctrl(struct fsi_priv *fsi, int is_play, int enable)
689 */ 689 */
690static void fsi_fifo_init(struct fsi_priv *fsi, 690static void fsi_fifo_init(struct fsi_priv *fsi,
691 int is_play, 691 int is_play,
692 struct snd_soc_dai *dai) 692 struct device *dev)
693{ 693{
694 struct fsi_master *master = fsi_get_master(fsi); 694 struct fsi_master *master = fsi_get_master(fsi);
695 struct fsi_stream *io = fsi_get_stream(fsi, is_play); 695 struct fsi_stream *io = fsi_get_stream(fsi, is_play);
@@ -701,7 +701,7 @@ static void fsi_fifo_init(struct fsi_priv *fsi,
701 shift >>= fsi_get_port_shift(fsi, is_play); 701 shift >>= fsi_get_port_shift(fsi, is_play);
702 shift &= FIFO_SZ_MASK; 702 shift &= FIFO_SZ_MASK;
703 frame_capa = 256 << shift; 703 frame_capa = 256 << shift;
704 dev_dbg(dai->dev, "fifo = %d words\n", frame_capa); 704 dev_dbg(dev, "fifo = %d words\n", frame_capa);
705 705
706 /* 706 /*
707 * The maximum number of sample data varies depending 707 * The maximum number of sample data varies depending
@@ -724,7 +724,7 @@ static void fsi_fifo_init(struct fsi_priv *fsi,
724 */ 724 */
725 for (i = 1; i < fsi->chan_num; i <<= 1) 725 for (i = 1; i < fsi->chan_num; i <<= 1)
726 frame_capa >>= 1; 726 frame_capa >>= 1;
727 dev_dbg(dai->dev, "%d channel %d store\n", 727 dev_dbg(dev, "%d channel %d store\n",
728 fsi->chan_num, frame_capa); 728 fsi->chan_num, frame_capa);
729 729
730 io->fifo_sample_capa = fsi_frame2sample(fsi, frame_capa); 730 io->fifo_sample_capa = fsi_frame2sample(fsi, frame_capa);
@@ -881,15 +881,14 @@ static irqreturn_t fsi_interrupt(int irq, void *data)
881 * dai ops 881 * dai ops
882 */ 882 */
883 883
884static int fsi_dai_startup(struct snd_pcm_substream *substream, 884static int fsi_hw_startup(struct fsi_priv *fsi,
885 struct snd_soc_dai *dai) 885 int is_play,
886 struct device *dev)
886{ 887{
887 struct fsi_priv *fsi = fsi_get_priv(substream);
888 u32 flags = fsi_get_info_flags(fsi); 888 u32 flags = fsi_get_info_flags(fsi);
889 u32 data = 0; 889 u32 data = 0;
890 int is_play = fsi_is_play(substream);
891 890
892 pm_runtime_get_sync(dai->dev); 891 pm_runtime_get_sync(dev);
893 892
894 /* clock setting */ 893 /* clock setting */
895 if (fsi_is_clk_master(fsi)) 894 if (fsi_is_clk_master(fsi))
@@ -925,22 +924,38 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream,
925 fsi_irq_clear_status(fsi); 924 fsi_irq_clear_status(fsi);
926 925
927 /* fifo init */ 926 /* fifo init */
928 fsi_fifo_init(fsi, is_play, dai); 927 fsi_fifo_init(fsi, is_play, dev);
929 928
930 return 0; 929 return 0;
931} 930}
932 931
932static void fsi_hw_shutdown(struct fsi_priv *fsi,
933 int is_play,
934 struct device *dev)
935{
936 if (fsi_is_clk_master(fsi))
937 fsi_set_master_clk(dev, fsi, fsi->rate, 0);
938
939 pm_runtime_put_sync(dev);
940}
941
942static int fsi_dai_startup(struct snd_pcm_substream *substream,
943 struct snd_soc_dai *dai)
944{
945 struct fsi_priv *fsi = fsi_get_priv(substream);
946 int is_play = fsi_is_play(substream);
947
948 return fsi_hw_startup(fsi, is_play, dai->dev);
949}
950
933static void fsi_dai_shutdown(struct snd_pcm_substream *substream, 951static void fsi_dai_shutdown(struct snd_pcm_substream *substream,
934 struct snd_soc_dai *dai) 952 struct snd_soc_dai *dai)
935{ 953{
936 struct fsi_priv *fsi = fsi_get_priv(substream); 954 struct fsi_priv *fsi = fsi_get_priv(substream);
955 int is_play = fsi_is_play(substream);
937 956
938 if (fsi_is_clk_master(fsi)) 957 fsi_hw_shutdown(fsi, is_play, dai->dev);
939 fsi_set_master_clk(dai->dev, fsi, fsi->rate, 0);
940
941 fsi->rate = 0; 958 fsi->rate = 0;
942
943 pm_runtime_put_sync(dai->dev);
944} 959}
945 960
946static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd, 961static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd,