lkml.org 
[lkml]   [2019]   [Oct]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 7/7] ASoC: amd: Added ACP3x system resume and runtime pm ops
    Date
    When system wide suspend happens, ACP will be powered off
    and when system resumes,for audio usecase to continue,
    all the runtime configuration data needs to be programmed again.
    Added resume pm call back to ACP pm ops and
    also Added runtime PM operations for ACP3x PCM platform device.
    Device will enter into D3 state when there is no activity
    on audio I2S lines.

    Signed-off-by: Ravulapati Vishnu vardhan rao <Vishnuvardhanrao.Ravulapati@amd.com>
    ---
    sound/soc/amd/raven/pci-acp3x.c | 48 ++++++++++++++++++++++++++++++++++++++++-
    1 file changed, 47 insertions(+), 1 deletion(-)

    diff --git a/sound/soc/amd/raven/pci-acp3x.c b/sound/soc/amd/raven/pci-acp3x.c
    index b74ecf6..192a7b9 100644
    --- a/sound/soc/amd/raven/pci-acp3x.c
    +++ b/sound/soc/amd/raven/pci-acp3x.c
    @@ -9,6 +9,9 @@
    #include <linux/io.h>
    #include <linux/platform_device.h>
    #include <linux/interrupt.h>
    +#include <linux/pm_runtime.h>
    +#include <linux/delay.h>
    +#include <sound/pcm.h>

    #include "acp3x.h"

    @@ -262,6 +265,11 @@ static int snd_acp3x_probe(struct pci_dev *pci,
    }
    break;
    }
    + pm_runtime_set_autosuspend_delay(&pci->dev, 10000);
    + pm_runtime_use_autosuspend(&pci->dev);
    + pm_runtime_set_active(&pci->dev);
    + pm_runtime_put_noidle(&pci->dev);
    + pm_runtime_enable(&pci->dev);
    return 0;

    unmap_mmio:
    @@ -282,6 +290,39 @@ static int snd_acp3x_probe(struct pci_dev *pci,
    return ret;
    }

    +static int snd_acp3x_suspend(struct device *dev)
    +{
    + int status;
    + struct acp3x_dev_data *adata = dev_get_drvdata(dev);
    +
    + status = acp3x_deinit(adata->acp3x_base);
    + if (status)
    + dev_err(dev, "ACP de-init failed\n");
    + else
    + dev_info(dev, "ACP de-initialized\n");
    +
    + return 0;
    +}
    +static int snd_acp3x_resume(struct device *dev)
    +{
    + int status;
    + struct acp3x_dev_data *adata = dev_get_drvdata(dev);
    +
    + status = acp3x_init(adata->acp3x_base);
    + if (status) {
    + dev_err(dev, "ACP init failed\n");
    + return status;
    + }
    +
    + return 0;
    +}
    +
    +static const struct dev_pm_ops acp3x_pm = {
    + .runtime_suspend = snd_acp3x_suspend,
    + .runtime_resume = snd_acp3x_resume,
    + .resume = snd_acp3x_resume,
    +};
    +
    static void snd_acp3x_remove(struct pci_dev *pci)
    {
    int i;
    @@ -297,7 +338,9 @@ static void snd_acp3x_remove(struct pci_dev *pci)
    else
    dev_info(&pci->dev, "ACP de-initialized\n");
    iounmap(adata->acp3x_base);
    -
    + pm_runtime_disable(&pci->dev);
    + pm_runtime_get_noresume(&pci->dev);
    + pci_disable_msi(pci);
    pci_disable_msi(pci);
    pci_release_regions(pci);
    pci_disable_device(pci);
    @@ -316,6 +359,9 @@ static struct pci_driver acp3x_driver = {
    .id_table = snd_acp3x_ids,
    .probe = snd_acp3x_probe,
    .remove = snd_acp3x_remove,
    + .driver = {
    + .pm = &acp3x_pm,
    + }
    };

    module_pci_driver(acp3x_driver);
    --
    2.7.4
    \
     
     \ /
      Last update: 2019-10-18 12:20    [W:2.913 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site