mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 21:44:06 +08:00
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:
parent
2daf71ad8d
commit
e10369d88c
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user