|
@@ -21,7 +21,7 @@
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/io.h>
|
|
|
-#include <linux/clk.h>
|
|
|
+#include <linux/pm_runtime.h>
|
|
|
|
|
|
#include <sound/core.h>
|
|
|
#include <sound/pcm.h>
|
|
@@ -776,20 +776,17 @@ static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
|
|
|
case SNDRV_PCM_TRIGGER_RESUME:
|
|
|
case SNDRV_PCM_TRIGGER_START:
|
|
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
|
|
- if (!dev->clk_active) {
|
|
|
- clk_enable(dev->clk);
|
|
|
- dev->clk_active = 1;
|
|
|
- }
|
|
|
+ ret = pm_runtime_get_sync(dev->dev);
|
|
|
+ if (IS_ERR_VALUE(ret))
|
|
|
+ dev_err(dev->dev, "pm_runtime_get_sync() failed\n");
|
|
|
davinci_mcasp_start(dev, substream->stream);
|
|
|
break;
|
|
|
|
|
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
|
|
davinci_mcasp_stop(dev, substream->stream);
|
|
|
- if (dev->clk_active) {
|
|
|
- clk_disable(dev->clk);
|
|
|
- dev->clk_active = 0;
|
|
|
- }
|
|
|
-
|
|
|
+ ret = pm_runtime_put_sync(dev->dev);
|
|
|
+ if (IS_ERR_VALUE(ret))
|
|
|
+ dev_err(dev->dev, "pm_runtime_put_sync() failed\n");
|
|
|
break;
|
|
|
|
|
|
case SNDRV_PCM_TRIGGER_STOP:
|
|
@@ -886,12 +883,13 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
|
|
|
pdata = pdev->dev.platform_data;
|
|
|
- dev->clk = clk_get(&pdev->dev, NULL);
|
|
|
- if (IS_ERR(dev->clk))
|
|
|
- return -ENODEV;
|
|
|
+ pm_runtime_enable(&pdev->dev);
|
|
|
|
|
|
- clk_enable(dev->clk);
|
|
|
- dev->clk_active = 1;
|
|
|
+ ret = pm_runtime_get_sync(&pdev->dev);
|
|
|
+ if (IS_ERR_VALUE(ret)) {
|
|
|
+ dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
|
|
|
dev->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
|
|
|
if (!dev->base) {
|
|
@@ -908,6 +906,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
|
|
dev->version = pdata->version;
|
|
|
dev->txnumevt = pdata->txnumevt;
|
|
|
dev->rxnumevt = pdata->rxnumevt;
|
|
|
+ dev->dev = &pdev->dev;
|
|
|
|
|
|
dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
|
|
|
dma_data->asp_chan_q = pdata->asp_chan_q;
|
|
@@ -949,19 +948,18 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
|
|
return 0;
|
|
|
|
|
|
err_release_clk:
|
|
|
- clk_disable(dev->clk);
|
|
|
- clk_put(dev->clk);
|
|
|
+ pm_runtime_put_sync(&pdev->dev);
|
|
|
+ pm_runtime_disable(&pdev->dev);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
static int davinci_mcasp_remove(struct platform_device *pdev)
|
|
|
{
|
|
|
- struct davinci_audio_dev *dev = dev_get_drvdata(&pdev->dev);
|
|
|
|
|
|
snd_soc_unregister_dai(&pdev->dev);
|
|
|
- clk_disable(dev->clk);
|
|
|
- clk_put(dev->clk);
|
|
|
- dev->clk = NULL;
|
|
|
+
|
|
|
+ pm_runtime_put_sync(&pdev->dev);
|
|
|
+ pm_runtime_disable(&pdev->dev);
|
|
|
|
|
|
return 0;
|
|
|
}
|