| From 0c73351f2adf235407319946da8d174509ccdaa1 Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Wed, 26 Oct 2016 04:29:21 +0000 |
| Subject: [PATCH 074/299] 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> |
| (cherry picked from commit 814efe3ed72d1cad926e21b8d0869a1ea74bb9dd) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| sound/soc/sh/rcar/gen.c | 8 ++++++++ |
| sound/soc/sh/rcar/rsnd.h | 8 ++++++++ |
| sound/soc/sh/rcar/ssiu.c | 20 ++++++++++++++++++++ |
| 3 files changed, 36 insertions(+) |
| |
| --- 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_p |
| 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), |
| --- a/sound/soc/sh/rcar/rsnd.h |
| +++ b/sound/soc/sh/rcar/rsnd.h |
| @@ -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, |
| --- 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_mo |
| 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 |
| */ |