|
@@ -2649,7 +2649,7 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- bclk_rate = params_rate(params) * 2;
|
|
|
+ bclk_rate = params_rate(params) * 4;
|
|
|
switch (params_format(params)) {
|
|
|
case SNDRV_PCM_FORMAT_S16_LE:
|
|
|
bclk_rate *= 16;
|
|
@@ -3253,10 +3253,13 @@ static void wm8994_mic_work(struct work_struct *work)
|
|
|
int ret;
|
|
|
int report;
|
|
|
|
|
|
+ pm_runtime_get_sync(dev);
|
|
|
+
|
|
|
ret = regmap_read(regmap, WM8994_INTERRUPT_RAW_STATUS_2, ®);
|
|
|
if (ret < 0) {
|
|
|
dev_err(dev, "Failed to read microphone status: %d\n",
|
|
|
ret);
|
|
|
+ pm_runtime_put(dev);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -3299,6 +3302,8 @@ static void wm8994_mic_work(struct work_struct *work)
|
|
|
|
|
|
snd_soc_jack_report(priv->micdet[1].jack, report,
|
|
|
SND_JACK_HEADSET | SND_JACK_BTN_0);
|
|
|
+
|
|
|
+ pm_runtime_put(dev);
|
|
|
}
|
|
|
|
|
|
static irqreturn_t wm8994_mic_irq(int irq, void *data)
|
|
@@ -3421,12 +3426,15 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data)
|
|
|
int reg;
|
|
|
bool present;
|
|
|
|
|
|
+ pm_runtime_get_sync(codec->dev);
|
|
|
+
|
|
|
mutex_lock(&wm8994->accdet_lock);
|
|
|
|
|
|
reg = snd_soc_read(codec, WM1811_JACKDET_CTRL);
|
|
|
if (reg < 0) {
|
|
|
dev_err(codec->dev, "Failed to read jack status: %d\n", reg);
|
|
|
mutex_unlock(&wm8994->accdet_lock);
|
|
|
+ pm_runtime_put(codec->dev);
|
|
|
return IRQ_NONE;
|
|
|
}
|
|
|
|
|
@@ -3491,6 +3499,7 @@ static irqreturn_t wm1811_jackdet_irq(int irq, void *data)
|
|
|
SND_JACK_MECHANICAL | SND_JACK_HEADSET |
|
|
|
wm8994->btn_mask);
|
|
|
|
|
|
+ pm_runtime_put(codec->dev);
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
@@ -3602,6 +3611,8 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
|
|
|
if (!(snd_soc_read(codec, WM8958_MIC_DETECT_1) & WM8958_MICD_ENA))
|
|
|
return IRQ_HANDLED;
|
|
|
|
|
|
+ pm_runtime_get_sync(codec->dev);
|
|
|
+
|
|
|
/* We may occasionally read a detection without an impedence
|
|
|
* range being provided - if that happens loop again.
|
|
|
*/
|
|
@@ -3612,6 +3623,7 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
|
|
|
dev_err(codec->dev,
|
|
|
"Failed to read mic detect status: %d\n",
|
|
|
reg);
|
|
|
+ pm_runtime_put(codec->dev);
|
|
|
return IRQ_NONE;
|
|
|
}
|
|
|
|
|
@@ -3639,6 +3651,7 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
|
|
|
dev_warn(codec->dev, "Accessory detection with no callback\n");
|
|
|
|
|
|
out:
|
|
|
+ pm_runtime_put(codec->dev);
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|