diff mbox series

ASoC: sun4i-i2s: don't try to start up or shut down DAI if it's active

Message ID 20181012153254.10844-1-anarsoul@gmail.com (mailing list archive)
State New, archived
Headers show
Series ASoC: sun4i-i2s: don't try to start up or shut down DAI if it's active | expand

Commit Message

Vasily Khoruzhick Oct. 12, 2018, 3:32 p.m. UTC
Otherwise we may end up with shutting down I2S if shutdown() was
called for capture substream, but playback is still running.

Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
---
 sound/soc/sunxi/sun4i-i2s.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Mark Brown Oct. 12, 2018, 4:09 p.m. UTC | #1
On Fri, Oct 12, 2018 at 08:32:54AM -0700, Vasily Khoruzhick wrote:
> Otherwise we may end up with shutting down I2S if shutdown() was
> called for capture substream, but playback is still running.

Would it be cleaner and more robust to use runtime PM?  I'm wondering
what happens if some of the configuration stuff turns out to also need
some of the clocks for example.
Vasily Khoruzhick Oct. 12, 2018, 4:28 p.m. UTC | #2
On Friday, October 12, 2018 9:09:05 AM PDT Mark Brown wrote:
> On Fri, Oct 12, 2018 at 08:32:54AM -0700, Vasily Khoruzhick wrote:
> > Otherwise we may end up with shutting down I2S if shutdown() was
> > called for capture substream, but playback is still running.
> 
> Would it be cleaner and more robust to use runtime PM?  I'm wondering
> what happens if some of the configuration stuff turns out to also need
> some of the clocks for example.

I guess. I'm not sure why this code was put into startup and shutdown 
callbacks in first place.

Maybe Marcus or Maxime know?

As for configuration - only bus clock is necessary for configuration and it's 
already enabled in runtime_resume() callback.
Mark Brown Oct. 12, 2018, 4:45 p.m. UTC | #3
On Fri, Oct 12, 2018 at 09:28:56AM -0700, Vasily Khoruzhick wrote:
> On Friday, October 12, 2018 9:09:05 AM PDT Mark Brown wrote:
> > On Fri, Oct 12, 2018 at 08:32:54AM -0700, Vasily Khoruzhick wrote:
> > > Otherwise we may end up with shutting down I2S if shutdown() was
> > > called for capture substream, but playback is still running.

> > Would it be cleaner and more robust to use runtime PM?  I'm wondering
> > what happens if some of the configuration stuff turns out to also need
> > some of the clocks for example.

> I guess. I'm not sure why this code was put into startup and shutdown 
> callbacks in first place.

> Maybe Marcus or Maxime know?

> As for configuration - only bus clock is necessary for configuration and it's 
> already enabled in runtime_resume() callback.

Probably these really are only needed when audio is active so it's
saving that little bit of power in which case your fix looks good to me
but I'll leave a chance for the people with system specific knowledge to
review.
Maxime Ripard Oct. 15, 2018, 8:11 a.m. UTC | #4
On Fri, Oct 12, 2018 at 09:28:56AM -0700, Vasily Khoruzhick wrote:
> On Friday, October 12, 2018 9:09:05 AM PDT Mark Brown wrote:
> > On Fri, Oct 12, 2018 at 08:32:54AM -0700, Vasily Khoruzhick wrote:
> > > Otherwise we may end up with shutting down I2S if shutdown() was
> > > called for capture substream, but playback is still running.
> > 
> > Would it be cleaner and more robust to use runtime PM?  I'm wondering
> > what happens if some of the configuration stuff turns out to also need
> > some of the clocks for example.
> 
> I guess. I'm not sure why this code was put into startup and shutdown 
> callbacks in first place.
> 
> Maybe Marcus or Maxime know?

I can't really come up with a good explanation, so I guess there's
none :)

> As for configuration - only bus clock is necessary for configuration
> and it's already enabled in runtime_resume() callback.

Not really. Or at least, on the A64, yes, but shutting down the bus
clock on older SoCs will reset the controller. I'd just put the enable
bit on the runtime_pm hook.

Maxime
Vasily Khoruzhick Oct. 15, 2018, 3:13 p.m. UTC | #5
On Monday, October 15, 2018 1:11:51 AM PDT Maxime Ripard wrote:
> On Fri, Oct 12, 2018 at 09:28:56AM -0700, Vasily Khoruzhick wrote:
> > On Friday, October 12, 2018 9:09:05 AM PDT Mark Brown wrote:
> > > On Fri, Oct 12, 2018 at 08:32:54AM -0700, Vasily Khoruzhick wrote:
> > > > Otherwise we may end up with shutting down I2S if shutdown() was
> > > > called for capture substream, but playback is still running.
> > > 
> > > Would it be cleaner and more robust to use runtime PM?  I'm wondering
> > > what happens if some of the configuration stuff turns out to also need
> > > some of the clocks for example.
> > 
> > I guess. I'm not sure why this code was put into startup and shutdown
> > callbacks in first place.
> > 
> > Maybe Marcus or Maxime know?
> 
> I can't really come up with a good explanation, so I guess there's
> none :)
> 
> > As for configuration - only bus clock is necessary for configuration
> > and it's already enabled in runtime_resume() callback.
> 
> Not really. Or at least, on the A64, yes, but shutting down the bus
> clock on older SoCs will reset the controller. I'd just put the enable
> bit on the runtime_pm hook.

OK, will do.

> Maxime
diff mbox series

Patch

diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
index a9ea329dc046..787b67c4f845 100644
--- a/sound/soc/sunxi/sun4i-i2s.c
+++ b/sound/soc/sunxi/sun4i-i2s.c
@@ -649,6 +649,9 @@  static int sun4i_i2s_startup(struct snd_pcm_substream *substream,
 {
 	struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai);
 
+	if (dai->active)
+		return 0;
+
 	/* Enable the whole hardware block */
 	regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
 			   SUN4I_I2S_CTRL_GL_EN, SUN4I_I2S_CTRL_GL_EN);
@@ -667,6 +670,9 @@  static void sun4i_i2s_shutdown(struct snd_pcm_substream *substream,
 {
 	struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai);
 
+	if (dai->active)
+		return;
+
 	clk_disable_unprepare(i2s->mod_clk);
 
 	/* Disable our output lines */