diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2015-10-26 08:42:09 +0000 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-11-16 10:09:29 +0000 |
commit | e10369d88c16456b0ff3ae31b4e30a3d2795a243 (patch) | |
tree | 4c5db473955e56adb4e8522c7fb7a24be68a79f4 /sound/soc/sh/rcar/ssi.c | |
parent | 2daf71ad8da6cb57f919c9c876ee7e42530371df (diff) | |
download | op-kernel-dev-e10369d88c16456b0ff3ae31b4e30a3d2795a243.zip op-kernel-dev-e10369d88c16456b0ff3ae31b4e30a3d2795a243.tar.gz |
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.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 86e51ce..ad5539d 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); |