summaryrefslogtreecommitdiffstats
path: root/sound/soc/sh/rcar/ssi.c
diff options
context:
space:
mode:
authorKuninori Morimoto2015-10-26 09:42:09 +0100
committerMark Brown2015-11-16 11:09:29 +0100
commite10369d88c16456b0ff3ae31b4e30a3d2795a243 (patch)
tree4c5db473955e56adb4e8522c7fb7a24be68a79f4 /sound/soc/sh/rcar/ssi.c
parentASoC: rsnd: avoid pointless loop in rsnd_mod_interrupt() (diff)
downloadkernel-qcow2-linux-e10369d88c16456b0ff3ae31b4e30a3d2795a243.tar.gz
kernel-qcow2-linux-e10369d88c16456b0ff3ae31b4e30a3d2795a243.tar.xz
kernel-qcow2-linux-e10369d88c16456b0ff3ae31b4e30a3d2795a243.zip
ASoC: rsnd: use common rsnd_ssi_status_xxx()
Current ssi.c driver has random access to SSISR register. Let's use common rsnd_ssi_status_xxx() function Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/sh/rcar/ssi.c')
-rw-r--r--sound/soc/sh/rcar/ssi.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 86e51ce66b10..ad5539def58f 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -105,6 +105,16 @@ int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
return use_busif;
}
+static void rsnd_ssi_status_clear(struct rsnd_mod *mod)
+{
+ rsnd_mod_write(mod, SSISR, 0);
+}
+
+static u32 rsnd_ssi_status_get(struct rsnd_mod *mod)
+{
+ return rsnd_mod_read(mod, SSISR);
+}
+
static void rsnd_ssi_status_check(struct rsnd_mod *mod,
u32 bit)
{
@@ -114,7 +124,7 @@ static void rsnd_ssi_status_check(struct rsnd_mod *mod,
int i;
for (i = 0; i < 1024; i++) {
- status = rsnd_mod_read(mod, SSISR);
+ status = rsnd_ssi_status_get(mod);
if (status & bit)
return;
@@ -245,7 +255,7 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
rsnd_mod_write(mod, SSIWSR, CONT);
/* clear error status */
- rsnd_mod_write(mod, SSISR, 0);
+ rsnd_ssi_status_clear(mod);
ssi->usrcnt++;
@@ -406,17 +416,20 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
return 0;
}
-static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status)
+static u32 rsnd_ssi_record_error(struct rsnd_ssi *ssi)
{
struct rsnd_mod *mod = rsnd_mod_get(ssi);
+ u32 status = rsnd_ssi_status_get(mod);
/* under/over flow error */
if (status & (UIRQ | OIRQ)) {
ssi->err++;
/* clear error status */
- rsnd_mod_write(mod, SSISR, 0);
+ rsnd_ssi_status_clear(mod);
}
+
+ return status;
}
static int rsnd_ssi_start(struct rsnd_mod *mod,
@@ -442,7 +455,7 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod,
rsnd_ssi_irq_disable(mod);
- rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR));
+ rsnd_ssi_record_error(ssi);
rsnd_ssi_hw_stop(io, ssi);
@@ -467,7 +480,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
if (!rsnd_io_is_working(io))
goto rsnd_ssi_interrupt_out;
- status = rsnd_mod_read(mod, SSISR);
+ status = rsnd_ssi_record_error(ssi);
/* PIO only */
if (!is_dma && (status & DIRQ)) {
@@ -500,8 +513,6 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
rsnd_ssi_start(mod, io, priv);
}
- rsnd_ssi_record_error(ssi, status);
-
if (ssi->err > 1024) {
rsnd_ssi_irq_disable(mod);