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>
This commit is contained in:
Kuninori Morimoto 2015-10-26 08:42:09 +00:00 committed by Mark Brown
parent 2daf71ad8d
commit e10369d88c

View File

@ -105,6 +105,16 @@ int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
return use_busif; 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, static void rsnd_ssi_status_check(struct rsnd_mod *mod,
u32 bit) u32 bit)
{ {
@ -114,7 +124,7 @@ static void rsnd_ssi_status_check(struct rsnd_mod *mod,
int i; int i;
for (i = 0; i < 1024; i++) { for (i = 0; i < 1024; i++) {
status = rsnd_mod_read(mod, SSISR); status = rsnd_ssi_status_get(mod);
if (status & bit) if (status & bit)
return; return;
@ -245,7 +255,7 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
rsnd_mod_write(mod, SSIWSR, CONT); rsnd_mod_write(mod, SSIWSR, CONT);
/* clear error status */ /* clear error status */
rsnd_mod_write(mod, SSISR, 0); rsnd_ssi_status_clear(mod);
ssi->usrcnt++; ssi->usrcnt++;
@ -406,17 +416,20 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
return 0; 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); struct rsnd_mod *mod = rsnd_mod_get(ssi);
u32 status = rsnd_ssi_status_get(mod);
/* under/over flow error */ /* under/over flow error */
if (status & (UIRQ | OIRQ)) { if (status & (UIRQ | OIRQ)) {
ssi->err++; ssi->err++;
/* clear error status */ /* 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, 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_irq_disable(mod);
rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR)); rsnd_ssi_record_error(ssi);
rsnd_ssi_hw_stop(io, 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)) if (!rsnd_io_is_working(io))
goto rsnd_ssi_interrupt_out; goto rsnd_ssi_interrupt_out;
status = rsnd_mod_read(mod, SSISR); status = rsnd_ssi_record_error(ssi);
/* PIO only */ /* PIO only */
if (!is_dma && (status & DIRQ)) { 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_start(mod, io, priv);
} }
rsnd_ssi_record_error(ssi, status);
if (ssi->err > 1024) { if (ssi->err > 1024) {
rsnd_ssi_irq_disable(mod); rsnd_ssi_irq_disable(mod);