[alsa-devel] [PATCH 1/4] ASoC: wm8962: Hold a runtime PM reference while handling interrupts
From: Mark Brown broonie@linaro.org
If the device is runtime suspended then we can't interact with it as it may have been powered off and the register map will be in cache only mode.
Signed-off-by: Mark Brown broonie@linaro.org --- sound/soc/codecs/wm8962.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 97db3b45b411..aa7ae76d5e28 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c @@ -3003,6 +3003,12 @@ static irqreturn_t wm8962_irq(int irq, void *data) unsigned int active; int reg, ret;
+ ret = pm_runtime_get_sync(dev); + if (ret < 0) { + dev_err(dev, "Failed to resume: %d\n", ret); + return ret; + } + ret = regmap_read(wm8962->regmap, WM8962_INTERRUPT_STATUS_2_MASK, &mask); if (ret != 0) { @@ -3019,8 +3025,10 @@ static irqreturn_t wm8962_irq(int irq, void *data)
active &= ~mask;
- if (!active) + if (!active) { + pm_runtime_put(dev); return IRQ_NONE; + }
/* Acknowledge the interrupts */ ret = regmap_write(wm8962->regmap, WM8962_INTERRUPT_STATUS_2, active); @@ -3070,6 +3078,8 @@ static irqreturn_t wm8962_irq(int irq, void *data) msecs_to_jiffies(250)); }
+ pm_runtime_put(dev); + return IRQ_HANDLED; }
From: Mark Brown broonie@linaro.org
Signed-off-by: Mark Brown broonie@linaro.org --- sound/soc/codecs/wm8962.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index aa7ae76d5e28..8eccf7afe9db 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c @@ -2886,7 +2886,11 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
try_wait_for_completion(&wm8962->fll_lock);
- pm_runtime_get_sync(codec->dev); + ret = pm_runtime_get_sync(codec->dev); + if (ret < 0) { + dev_err(codec->dev, "Failed to resume device: %d\n", ret); + return ret; + }
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, WM8962_FLL_FRAC | WM8962_FLL_REFCLK_SRC_MASK |
From: Mark Brown broonie@linaro.org
Don't record the FLL as having started and leave the hardware disabled ensuring we are in a better state if this does happen to be a transient error and making debugging easier.
Signed-off-by: Mark Brown broonie@linaro.org --- sound/soc/codecs/wm8962.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 8eccf7afe9db..55bf3f493dab 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c @@ -2898,8 +2898,6 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
dev_dbg(codec->dev, "FLL configured for %dHz->%dHz\n", Fref, Fout);
- ret = 0; - /* This should be a massive overestimate but go even * higher if we'll error out */ @@ -2913,14 +2911,17 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
if (timeout == 0 && wm8962->irq) { dev_err(codec->dev, "FLL lock timed out"); - ret = -ETIMEDOUT; + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, + WM8962_FLL_ENA, 0); + pm_runtime_put(codec->dev); + return -ETIMEDOUT; }
wm8962->fll_fref = Fref; wm8962->fll_fout = Fout; wm8962->fll_src = source;
- return ret; + return 0; }
static int wm8962_mute(struct snd_soc_dai *dai, int mute)
From: Mark Brown broonie@linaro.org
This is better practice.
Signed-off-by: Mark Brown broonie@linaro.org --- sound/soc/codecs/wm8962.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 55bf3f493dab..1663b6b6eb35 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c @@ -2884,7 +2884,7 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source, snd_soc_write(codec, WM8962_FLL_CONTROL_7, fll_div.lambda); snd_soc_write(codec, WM8962_FLL_CONTROL_8, fll_div.n);
- try_wait_for_completion(&wm8962->fll_lock); + reinit_completion(&wm8962->fll_lock);
ret = pm_runtime_get_sync(codec->dev); if (ret < 0) {
On Fri, Jan 31, 2014 at 03:29:58PM +0000, Mark Brown wrote:
From: Mark Brown broonie@linaro.org
If the device is runtime suspended then we can't interact with it as it may have been powered off and the register map will be in cache only mode.
Signed-off-by: Mark Brown broonie@linaro.org
All look fine to me.
Acked-by: Charles Keepax ckeepax@opensource.wolfsonmicro.com
Thanks, Charles
At Fri, 31 Jan 2014 15:29:58 +0000, Mark Brown wrote:
From: Mark Brown broonie@linaro.org
If the device is runtime suspended then we can't interact with it as it may have been powered off and the register map will be in cache only mode.
Signed-off-by: Mark Brown broonie@linaro.org
sound/soc/codecs/wm8962.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 97db3b45b411..aa7ae76d5e28 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c @@ -3003,6 +3003,12 @@ static irqreturn_t wm8962_irq(int irq, void *data) unsigned int active; int reg, ret;
- ret = pm_runtime_get_sync(dev);
- if (ret < 0) {
dev_err(dev, "Failed to resume: %d\n", ret);
return ret;
Shouldn't here return IRQ_XXX?
Takashi
- }
- ret = regmap_read(wm8962->regmap, WM8962_INTERRUPT_STATUS_2_MASK, &mask); if (ret != 0) {
@@ -3019,8 +3025,10 @@ static irqreturn_t wm8962_irq(int irq, void *data)
active &= ~mask;
- if (!active)
if (!active) {
pm_runtime_put(dev);
return IRQ_NONE;
}
/* Acknowledge the interrupts */ ret = regmap_write(wm8962->regmap, WM8962_INTERRUPT_STATUS_2, active);
@@ -3070,6 +3078,8 @@ static irqreturn_t wm8962_irq(int irq, void *data) msecs_to_jiffies(250)); }
- pm_runtime_put(dev);
- return IRQ_HANDLED;
}
-- 1.9.rc1
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
participants (3)
-
Charles Keepax
-
Mark Brown
-
Takashi Iwai