aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2016-10-26 00:29:21 -0400
committerMark Brown <broonie@kernel.org>2016-10-26 12:46:17 -0400
commit814efe3ed72d1cad926e21b8d0869a1ea74bb9dd (patch)
treed346715748401a4ced274583ec06b8afaf9aade7
parent42b197e794dbe961cbcebd9e4963252c96cc77f9 (diff)
ASoC: rsnd: clear SSI_SYS_STATUSx every time
Renesas sound SSIU has SSI_SYS_STATUS register whick will be changed if over/under run was occurred. Current rsnd driver is handling over/under run error on SSI/SRC, but doesn't on SSIU. HW guys can't guarantee correct behavior if it already had error bit on status register when it start. Thus, it should be cleared every start timing. This patch do it. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/sh/rcar/gen.c8
-rw-r--r--sound/soc/sh/rcar/rsnd.h8
-rw-r--r--sound/soc/sh/rcar/ssiu.c20
3 files changed, 36 insertions, 0 deletions
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 7d2fdf8dd188..d653cf488f73 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -211,6 +211,14 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv)
211 RSND_GEN_S_REG(SSI_MODE1, 0x804), 211 RSND_GEN_S_REG(SSI_MODE1, 0x804),
212 RSND_GEN_S_REG(SSI_MODE2, 0x808), 212 RSND_GEN_S_REG(SSI_MODE2, 0x808),
213 RSND_GEN_S_REG(SSI_CONTROL, 0x810), 213 RSND_GEN_S_REG(SSI_CONTROL, 0x810),
214 RSND_GEN_S_REG(SSI_SYS_STATUS0, 0x840),
215 RSND_GEN_S_REG(SSI_SYS_STATUS1, 0x844),
216 RSND_GEN_S_REG(SSI_SYS_STATUS2, 0x848),
217 RSND_GEN_S_REG(SSI_SYS_STATUS3, 0x84c),
218 RSND_GEN_S_REG(SSI_SYS_STATUS4, 0x880),
219 RSND_GEN_S_REG(SSI_SYS_STATUS5, 0x884),
220 RSND_GEN_S_REG(SSI_SYS_STATUS6, 0x888),
221 RSND_GEN_S_REG(SSI_SYS_STATUS7, 0x88c),
214 222
215 /* FIXME: it needs SSI_MODE2/3 in the future */ 223 /* FIXME: it needs SSI_MODE2/3 in the future */
216 RSND_GEN_M_REG(SSI_BUSIF_MODE, 0x0, 0x80), 224 RSND_GEN_M_REG(SSI_BUSIF_MODE, 0x0, 0x80),
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 678a9914c96f..d6bb53009123 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -161,6 +161,14 @@ enum rsnd_reg {
161 RSND_REG_SSI_BUSIF_ADINR, 161 RSND_REG_SSI_BUSIF_ADINR,
162 RSND_REG_SSI_BUSIF_DALIGN, 162 RSND_REG_SSI_BUSIF_DALIGN,
163 RSND_REG_SSI_INT_ENABLE, 163 RSND_REG_SSI_INT_ENABLE,
164 RSND_REG_SSI_SYS_STATUS0,
165 RSND_REG_SSI_SYS_STATUS1,
166 RSND_REG_SSI_SYS_STATUS2,
167 RSND_REG_SSI_SYS_STATUS3,
168 RSND_REG_SSI_SYS_STATUS4,
169 RSND_REG_SSI_SYS_STATUS5,
170 RSND_REG_SSI_SYS_STATUS6,
171 RSND_REG_SSI_SYS_STATUS7,
164 172
165 /* SSI */ 173 /* SSI */
166 RSND_REG_SSICR, 174 RSND_REG_SSICR,
diff --git a/sound/soc/sh/rcar/ssiu.c b/sound/soc/sh/rcar/ssiu.c
index 6f9b388ec5a8..4e817c8a18c0 100644
--- a/sound/soc/sh/rcar/ssiu.c
+++ b/sound/soc/sh/rcar/ssiu.c
@@ -33,6 +33,26 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
33 u32 mask1, val1; 33 u32 mask1, val1;
34 u32 mask2, val2; 34 u32 mask2, val2;
35 35
36 /* clear status */
37 switch (id) {
38 case 0:
39 case 1:
40 case 2:
41 case 3:
42 case 4:
43 rsnd_mod_write(mod, SSI_SYS_STATUS0, 0xf << (id * 4));
44 rsnd_mod_write(mod, SSI_SYS_STATUS2, 0xf << (id * 4));
45 rsnd_mod_write(mod, SSI_SYS_STATUS4, 0xf << (id * 4));
46 rsnd_mod_write(mod, SSI_SYS_STATUS6, 0xf << (id * 4));
47 break;
48 case 9:
49 rsnd_mod_write(mod, SSI_SYS_STATUS1, 0xf << 4);
50 rsnd_mod_write(mod, SSI_SYS_STATUS3, 0xf << 4);
51 rsnd_mod_write(mod, SSI_SYS_STATUS5, 0xf << 4);
52 rsnd_mod_write(mod, SSI_SYS_STATUS7, 0xf << 4);
53 break;
54 }
55
36 /* 56 /*
37 * SSI_MODE0 57 * SSI_MODE0
38 */ 58 */