|
@@ -48,6 +48,8 @@ struct omap_dmic {
|
|
|
struct device *dev;
|
|
|
void __iomem *io_base;
|
|
|
struct clk *fclk;
|
|
|
+ struct pm_qos_request pm_qos_req;
|
|
|
+ int latency;
|
|
|
int fclk_freq;
|
|
|
int out_freq;
|
|
|
int clk_div;
|
|
@@ -124,6 +126,8 @@ static void omap_dmic_dai_shutdown(struct snd_pcm_substream *substream,
|
|
|
|
|
|
mutex_lock(&dmic->mutex);
|
|
|
|
|
|
+ pm_qos_remove_request(&dmic->pm_qos_req);
|
|
|
+
|
|
|
if (!dai->active)
|
|
|
dmic->active = 0;
|
|
|
|
|
@@ -228,6 +232,8 @@ static int omap_dmic_dai_hw_params(struct snd_pcm_substream *substream,
|
|
|
/* packet size is threshold * channels */
|
|
|
dma_data = snd_soc_dai_get_dma_data(dai, substream);
|
|
|
dma_data->maxburst = dmic->threshold * channels;
|
|
|
+ dmic->latency = (OMAP_DMIC_THRES_MAX - dmic->threshold) * USEC_PER_SEC /
|
|
|
+ params_rate(params);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -238,6 +244,9 @@ static int omap_dmic_dai_prepare(struct snd_pcm_substream *substream,
|
|
|
struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai);
|
|
|
u32 ctrl;
|
|
|
|
|
|
+ if (pm_qos_request_active(&dmic->pm_qos_req))
|
|
|
+ pm_qos_update_request(&dmic->pm_qos_req, dmic->latency);
|
|
|
+
|
|
|
/* Configure uplink threshold */
|
|
|
omap_dmic_write(dmic, OMAP_DMIC_FIFO_CTRL_REG, dmic->threshold);
|
|
|
|