diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2011-05-23 07:46:26 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-05-24 06:42:07 -0400 |
commit | 23ca853392aebdaa56c8138746deb2002e03d827 (patch) | |
tree | cf96fd848d987e8150e5988959a3eb296b420c41 /sound/soc/sh | |
parent | cda828cafe9df9a8b0687f1b8a17be2cd9cf1950 (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.c | 43 |
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 | */ |
690 | static void fsi_fifo_init(struct fsi_priv *fsi, | 690 | static 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 | ||
884 | static int fsi_dai_startup(struct snd_pcm_substream *substream, | 884 | static 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 | ||
932 | static 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 | |||
942 | static 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 | |||
933 | static void fsi_dai_shutdown(struct snd_pcm_substream *substream, | 951 | static 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 | ||
946 | static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd, | 961 | static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd, |