aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/sh
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2011-01-19 21:46:02 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-01-21 14:01:47 -0500
commit4d805f7b6607f6e547dc22e5d57c201e43d21c05 (patch)
tree41ce090f7f9f3f4cc76e74101a108218da447f62 /sound/soc/sh
parent0d032c19e764ad2f60292f58116f6c2a052a58ab (diff)
ASoC: sh: fsi: Add snd_soc_dai_set_fmt support
This patch add snd_soc_dai_ops :: set_fmt to FSI driver and select master/slave clock mode by snd_soc_dai_set_fmt on fsi-xxx.c instead of platform infomation code. This patch remove fsi_is_master function which is no longer needed. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Acked-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/sh')
-rw-r--r--sound/soc/sh/fsi-ak4642.c13
-rw-r--r--sound/soc/sh/fsi-da7210.c12
-rw-r--r--sound/soc/sh/fsi-hdmi.c11
-rw-r--r--sound/soc/sh/fsi.c54
4 files changed, 61 insertions, 29 deletions
diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c
index a722a4c661ff..ce058c749e6a 100644
--- a/sound/soc/sh/fsi-ak4642.c
+++ b/sound/soc/sh/fsi-ak4642.c
@@ -23,15 +23,20 @@ struct fsi_ak4642_data {
23 23
24static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime *rtd) 24static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime *rtd)
25{ 25{
26 struct snd_soc_dai *dai = rtd->codec_dai; 26 struct snd_soc_dai *codec = rtd->codec_dai;
27 struct snd_soc_dai *cpu = rtd->cpu_dai;
27 int ret; 28 int ret;
28 29
29 ret = snd_soc_dai_set_fmt(dai, SND_SOC_DAIFMT_LEFT_J | 30 ret = snd_soc_dai_set_fmt(codec, SND_SOC_DAIFMT_LEFT_J |
30 SND_SOC_DAIFMT_CBM_CFM); 31 SND_SOC_DAIFMT_CBM_CFM);
31 if (ret < 0) 32 if (ret < 0)
32 return ret; 33 return ret;
33 34
34 ret = snd_soc_dai_set_sysclk(dai, 0, 11289600, 0); 35 ret = snd_soc_dai_set_sysclk(codec, 0, 11289600, 0);
36 if (ret < 0)
37 return ret;
38
39 ret = snd_soc_dai_set_fmt(cpu, SND_SOC_DAIFMT_CBS_CFS);
35 40
36 return ret; 41 return ret;
37} 42}
diff --git a/sound/soc/sh/fsi-da7210.c b/sound/soc/sh/fsi-da7210.c
index e8df9da92f71..9b24ed466ab1 100644
--- a/sound/soc/sh/fsi-da7210.c
+++ b/sound/soc/sh/fsi-da7210.c
@@ -15,11 +15,19 @@
15 15
16static int fsi_da7210_init(struct snd_soc_pcm_runtime *rtd) 16static int fsi_da7210_init(struct snd_soc_pcm_runtime *rtd)
17{ 17{
18 struct snd_soc_dai *dai = rtd->codec_dai; 18 struct snd_soc_dai *codec = rtd->codec_dai;
19 struct snd_soc_dai *cpu = rtd->cpu_dai;
20 int ret;
19 21
20 return snd_soc_dai_set_fmt(dai, 22 ret = snd_soc_dai_set_fmt(codec,
21 SND_SOC_DAIFMT_I2S | 23 SND_SOC_DAIFMT_I2S |
22 SND_SOC_DAIFMT_CBM_CFM); 24 SND_SOC_DAIFMT_CBM_CFM);
25 if (ret < 0)
26 return ret;
27
28 ret = snd_soc_dai_set_fmt(cpu, SND_SOC_DAIFMT_CBS_CFS);
29
30 return ret;
23} 31}
24 32
25static struct snd_soc_dai_link fsi_da7210_dai = { 33static struct snd_soc_dai_link fsi_da7210_dai = {
diff --git a/sound/soc/sh/fsi-hdmi.c b/sound/soc/sh/fsi-hdmi.c
index a52dd8ec71d3..96d8ce3f3211 100644
--- a/sound/soc/sh/fsi-hdmi.c
+++ b/sound/soc/sh/fsi-hdmi.c
@@ -12,6 +12,16 @@
12#include <linux/platform_device.h> 12#include <linux/platform_device.h>
13#include <sound/sh_fsi.h> 13#include <sound/sh_fsi.h>
14 14
15static int fsi_hdmi_dai_init(struct snd_soc_pcm_runtime *rtd)
16{
17 struct snd_soc_dai *cpu = rtd->cpu_dai;
18 int ret;
19
20 ret = snd_soc_dai_set_fmt(cpu, SND_SOC_DAIFMT_CBM_CFM);
21
22 return ret;
23}
24
15static struct snd_soc_dai_link fsi_dai_link = { 25static struct snd_soc_dai_link fsi_dai_link = {
16 .name = "HDMI", 26 .name = "HDMI",
17 .stream_name = "HDMI", 27 .stream_name = "HDMI",
@@ -19,6 +29,7 @@ static struct snd_soc_dai_link fsi_dai_link = {
19 .codec_dai_name = "sh_mobile_hdmi-hifi", 29 .codec_dai_name = "sh_mobile_hdmi-hifi",
20 .platform_name = "sh_fsi2", 30 .platform_name = "sh_fsi2",
21 .codec_name = "sh-mobile-hdmi", 31 .codec_name = "sh-mobile-hdmi",
32 .init = fsi_hdmi_dai_init,
22}; 33};
23 34
24static struct snd_soc_card fsi_soc_card = { 35static struct snd_soc_card fsi_soc_card = {
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c
index 1d0a16e80919..5f39f364effd 100644
--- a/sound/soc/sh/fsi.c
+++ b/sound/soc/sh/fsi.c
@@ -78,6 +78,8 @@
78/* CKG1 */ 78/* CKG1 */
79#define ACKMD_MASK 0x00007000 79#define ACKMD_MASK 0x00007000
80#define BPFMD_MASK 0x00000700 80#define BPFMD_MASK 0x00000700
81#define DIMD (1 << 4)
82#define DOMD (1 << 0)
81 83
82/* A/B MST_CTLR */ 84/* A/B MST_CTLR */
83#define BP (1 << 4) /* Fix the signal of Biphase output */ 85#define BP (1 << 4) /* Fix the signal of Biphase output */
@@ -292,21 +294,6 @@ static inline struct fsi_stream *fsi_get_stream(struct fsi_priv *fsi,
292 return is_play ? &fsi->playback : &fsi->capture; 294 return is_play ? &fsi->playback : &fsi->capture;
293} 295}
294 296
295static int fsi_is_master_mode(struct fsi_priv *fsi, int is_play)
296{
297 u32 mode;
298 u32 flags = fsi_get_info_flags(fsi);
299
300 mode = is_play ? SH_FSI_OUT_SLAVE_MODE : SH_FSI_IN_SLAVE_MODE;
301
302 /* return
303 * 1 : master mode
304 * 0 : slave mode
305 */
306
307 return (mode & flags) != mode;
308}
309
310static u32 fsi_get_port_shift(struct fsi_priv *fsi, int is_play) 297static u32 fsi_get_port_shift(struct fsi_priv *fsi, int is_play)
311{ 298{
312 int is_porta = fsi_is_port_a(fsi); 299 int is_porta = fsi_is_port_a(fsi);
@@ -764,19 +751,11 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream,
764 u32 fmt; 751 u32 fmt;
765 u32 data; 752 u32 data;
766 int is_play = fsi_is_play(substream); 753 int is_play = fsi_is_play(substream);
767 int is_master;
768 754
769 io = fsi_get_stream(fsi, is_play); 755 io = fsi_get_stream(fsi, is_play);
770 756
771 pm_runtime_get_sync(dai->dev); 757 pm_runtime_get_sync(dai->dev);
772 758
773 /* CKG1 */
774 data = is_play ? (1 << 0) : (1 << 4);
775 is_master = fsi_is_master_mode(fsi, is_play);
776 if (is_master)
777 fsi_reg_mask_set(fsi, CKG1, data, data);
778 else
779 fsi_reg_mask_set(fsi, CKG1, data, 0);
780 759
781 /* clock inversion (CKG2) */ 760 /* clock inversion (CKG2) */
782 data = 0; 761 data = 0;
@@ -893,6 +872,34 @@ static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd,
893 return ret; 872 return ret;
894} 873}
895 874
875static int fsi_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
876{
877 struct fsi_priv *fsi = fsi_get_priv_frm_dai(dai);
878 u32 data = 0;
879 int ret;
880
881 pm_runtime_get_sync(dai->dev);
882
883 /* set master/slave audio interface */
884 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
885 case SND_SOC_DAIFMT_CBM_CFM:
886 data = DIMD | DOMD;
887 break;
888 case SND_SOC_DAIFMT_CBS_CFS:
889 break;
890 default:
891 ret = -EINVAL;
892 goto set_fmt_exit;
893 }
894 fsi_reg_mask_set(fsi, CKG1, (DIMD | DOMD), data);
895 ret = 0;
896
897set_fmt_exit:
898 pm_runtime_put_sync(dai->dev);
899
900 return ret;
901}
902
896static int fsi_dai_hw_params(struct snd_pcm_substream *substream, 903static int fsi_dai_hw_params(struct snd_pcm_substream *substream,
897 struct snd_pcm_hw_params *params, 904 struct snd_pcm_hw_params *params,
898 struct snd_soc_dai *dai) 905 struct snd_soc_dai *dai)
@@ -979,6 +986,7 @@ static struct snd_soc_dai_ops fsi_dai_ops = {
979 .startup = fsi_dai_startup, 986 .startup = fsi_dai_startup,
980 .shutdown = fsi_dai_shutdown, 987 .shutdown = fsi_dai_shutdown,
981 .trigger = fsi_dai_trigger, 988 .trigger = fsi_dai_trigger,
989 .set_fmt = fsi_dai_set_fmt,
982 .hw_params = fsi_dai_hw_params, 990 .hw_params = fsi_dai_hw_params,
983}; 991};
984 992