diff options
Diffstat (limited to 'sound/soc/sh/fsi.c')
| -rw-r--r-- | sound/soc/sh/fsi.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 507e709f2807..4c2404b1b862 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c | |||
| @@ -132,6 +132,8 @@ struct fsi_priv { | |||
| 132 | struct fsi_stream playback; | 132 | struct fsi_stream playback; |
| 133 | struct fsi_stream capture; | 133 | struct fsi_stream capture; |
| 134 | 134 | ||
| 135 | long rate; | ||
| 136 | |||
| 135 | u32 mst_ctrl; | 137 | u32 mst_ctrl; |
| 136 | }; | 138 | }; |
| 137 | 139 | ||
| @@ -854,10 +856,17 @@ static void fsi_dai_shutdown(struct snd_pcm_substream *substream, | |||
| 854 | { | 856 | { |
| 855 | struct fsi_priv *fsi = fsi_get_priv(substream); | 857 | struct fsi_priv *fsi = fsi_get_priv(substream); |
| 856 | int is_play = fsi_is_play(substream); | 858 | int is_play = fsi_is_play(substream); |
| 859 | struct fsi_master *master = fsi_get_master(fsi); | ||
| 860 | int (*set_rate)(struct device *dev, int is_porta, int rate, int enable); | ||
| 857 | 861 | ||
| 858 | fsi_irq_disable(fsi, is_play); | 862 | fsi_irq_disable(fsi, is_play); |
| 859 | fsi_clk_ctrl(fsi, 0); | 863 | fsi_clk_ctrl(fsi, 0); |
| 860 | 864 | ||
| 865 | set_rate = master->info->set_rate; | ||
| 866 | if (set_rate && fsi->rate) | ||
| 867 | set_rate(dai->dev, fsi_is_port_a(fsi), fsi->rate, 0); | ||
| 868 | fsi->rate = 0; | ||
| 869 | |||
| 861 | pm_runtime_put_sync(dai->dev); | 870 | pm_runtime_put_sync(dai->dev); |
| 862 | } | 871 | } |
| 863 | 872 | ||
| @@ -891,20 +900,20 @@ static int fsi_dai_hw_params(struct snd_pcm_substream *substream, | |||
| 891 | { | 900 | { |
| 892 | struct fsi_priv *fsi = fsi_get_priv(substream); | 901 | struct fsi_priv *fsi = fsi_get_priv(substream); |
| 893 | struct fsi_master *master = fsi_get_master(fsi); | 902 | struct fsi_master *master = fsi_get_master(fsi); |
| 894 | int (*set_rate)(int is_porta, int rate) = master->info->set_rate; | 903 | int (*set_rate)(struct device *dev, int is_porta, int rate, int enable); |
| 895 | int fsi_ver = master->core->ver; | 904 | int fsi_ver = master->core->ver; |
| 896 | int is_play = fsi_is_play(substream); | 905 | long rate = params_rate(params); |
| 897 | int ret; | 906 | int ret; |
| 898 | 907 | ||
| 899 | /* if slave mode, set_rate is not needed */ | 908 | set_rate = master->info->set_rate; |
| 900 | if (!fsi_is_master_mode(fsi, is_play)) | 909 | if (!set_rate) |
| 901 | return 0; | 910 | return 0; |
| 902 | 911 | ||
| 903 | /* it is error if no set_rate */ | 912 | ret = set_rate(dai->dev, fsi_is_port_a(fsi), rate, 1); |
| 904 | if (!set_rate) | 913 | if (ret < 0) /* error */ |
| 905 | return -EIO; | 914 | return ret; |
| 906 | 915 | ||
| 907 | ret = set_rate(fsi_is_port_a(fsi), params_rate(params)); | 916 | fsi->rate = rate; |
| 908 | if (ret > 0) { | 917 | if (ret > 0) { |
| 909 | u32 data = 0; | 918 | u32 data = 0; |
| 910 | 919 | ||
