aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/sh/rcar/ssi.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 7db05fdfb656..7ee89da4dd5f 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -403,29 +403,30 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
403 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 403 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
404 struct device *dev = rsnd_priv_to_dev(priv); 404 struct device *dev = rsnd_priv_to_dev(priv);
405 405
406 if (rsnd_ssi_is_parent(mod, io)) 406 if (!ssi->usrcnt) {
407 goto rsnd_ssi_quit_end; 407 dev_err(dev, "%s[%d] usrcnt error\n",
408 rsnd_mod_name(mod), rsnd_mod_id(mod));
409 return -EIO;
410 }
408 411
409 if (ssi->err > 0) 412 if (!rsnd_ssi_is_parent(mod, io)) {
410 dev_warn(dev, "%s[%d] under/over flow err = %d\n", 413 if (ssi->err > 0)
411 rsnd_mod_name(mod), rsnd_mod_id(mod), ssi->err); 414 dev_warn(dev, "%s[%d] under/over flow err = %d\n",
415 rsnd_mod_name(mod), rsnd_mod_id(mod),
416 ssi->err);
412 417
413 ssi->cr_own = 0; 418 ssi->cr_own = 0;
414 ssi->err = 0; 419 ssi->err = 0;
415 420
416 rsnd_ssi_irq_disable(mod); 421 rsnd_ssi_irq_disable(mod);
422 }
417 423
418rsnd_ssi_quit_end:
419 rsnd_ssi_master_clk_stop(ssi, io); 424 rsnd_ssi_master_clk_stop(ssi, io);
420 425
421 rsnd_mod_power_off(mod); 426 rsnd_mod_power_off(mod);
422 427
423 ssi->usrcnt--; 428 ssi->usrcnt--;
424 429
425 if (ssi->usrcnt < 0)
426 dev_err(dev, "%s[%d] usrcnt error\n",
427 rsnd_mod_name(mod), rsnd_mod_id(mod));
428
429 return 0; 430 return 0;
430} 431}
431 432