ASoC: rsnd: clear SSI_SYS_STATUSx every time
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 26 Oct 2016 04:29:21 +0000 (04:29 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 26 Oct 2016 16:46:17 +0000 (17:46 +0100)
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>
sound/soc/sh/rcar/gen.c
sound/soc/sh/rcar/rsnd.h
sound/soc/sh/rcar/ssiu.c

index 7d2fdf8dd1882f7188b4e2a33e7e771dfbe064dc..d653cf488f7368a8c93d9078d4a222cb46c05f37 100644 (file)
@@ -211,6 +211,14 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv)
                RSND_GEN_S_REG(SSI_MODE1,       0x804),
                RSND_GEN_S_REG(SSI_MODE2,       0x808),
                RSND_GEN_S_REG(SSI_CONTROL,     0x810),
+               RSND_GEN_S_REG(SSI_SYS_STATUS0, 0x840),
+               RSND_GEN_S_REG(SSI_SYS_STATUS1, 0x844),
+               RSND_GEN_S_REG(SSI_SYS_STATUS2, 0x848),
+               RSND_GEN_S_REG(SSI_SYS_STATUS3, 0x84c),
+               RSND_GEN_S_REG(SSI_SYS_STATUS4, 0x880),
+               RSND_GEN_S_REG(SSI_SYS_STATUS5, 0x884),
+               RSND_GEN_S_REG(SSI_SYS_STATUS6, 0x888),
+               RSND_GEN_S_REG(SSI_SYS_STATUS7, 0x88c),
 
                /* FIXME: it needs SSI_MODE2/3 in the future */
                RSND_GEN_M_REG(SSI_BUSIF_MODE,  0x0,    0x80),
index 678a9914c96fce9a54b8350c9003950f38f5ac5a..d6bb53009123afc8622e9691ff99ffdb8f502af4 100644 (file)
@@ -161,6 +161,14 @@ enum rsnd_reg {
        RSND_REG_SSI_BUSIF_ADINR,
        RSND_REG_SSI_BUSIF_DALIGN,
        RSND_REG_SSI_INT_ENABLE,
+       RSND_REG_SSI_SYS_STATUS0,
+       RSND_REG_SSI_SYS_STATUS1,
+       RSND_REG_SSI_SYS_STATUS2,
+       RSND_REG_SSI_SYS_STATUS3,
+       RSND_REG_SSI_SYS_STATUS4,
+       RSND_REG_SSI_SYS_STATUS5,
+       RSND_REG_SSI_SYS_STATUS6,
+       RSND_REG_SSI_SYS_STATUS7,
 
        /* SSI */
        RSND_REG_SSICR,
index 6f9b388ec5a8f0c2095a2a88e33d725244706b2e..4e817c8a18c0bbe899374028ae56ef0754042d59 100644 (file)
@@ -33,6 +33,26 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
        u32 mask1, val1;
        u32 mask2, val2;
 
+       /* clear status */
+       switch (id) {
+       case 0:
+       case 1:
+       case 2:
+       case 3:
+       case 4:
+               rsnd_mod_write(mod, SSI_SYS_STATUS0, 0xf << (id * 4));
+               rsnd_mod_write(mod, SSI_SYS_STATUS2, 0xf << (id * 4));
+               rsnd_mod_write(mod, SSI_SYS_STATUS4, 0xf << (id * 4));
+               rsnd_mod_write(mod, SSI_SYS_STATUS6, 0xf << (id * 4));
+               break;
+       case 9:
+               rsnd_mod_write(mod, SSI_SYS_STATUS1, 0xf << 4);
+               rsnd_mod_write(mod, SSI_SYS_STATUS3, 0xf << 4);
+               rsnd_mod_write(mod, SSI_SYS_STATUS5, 0xf << 4);
+               rsnd_mod_write(mod, SSI_SYS_STATUS7, 0xf << 4);
+               break;
+       }
+
        /*
         * SSI_MODE0
         */