lkml.org 
[lkml]   [2019]   [Nov]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 06/19] soundwire: intel: Add basic power management support
    Date
    Implement suspend/resume capabilities (not runtime_pm for now)
    The resume part is essentially a full-blown re-enumeration.

    When S0ix is supported, we will select clock stop mode when the ACPI
    target state is S0, and tear down the link for S3.

    Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    ---
    drivers/soundwire/intel.c | 75 +++++++++++++++++++++++++++++++++++++++
    1 file changed, 75 insertions(+)

    diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
    index fe3a8b3b2c04..aeef0c0fc443 100644
    --- a/drivers/soundwire/intel.c
    +++ b/drivers/soundwire/intel.c
    @@ -1253,10 +1253,85 @@ static int intel_master_remove(struct sdw_master_device *md)
    return 0;
    }

    +/*
    + * PM calls
    + */
    +
    +#ifdef CONFIG_PM
    +
    +static int intel_suspend(struct device *dev)
    +{
    + struct sdw_cdns *cdns = dev_get_drvdata(dev);
    + struct sdw_intel *sdw = cdns_to_intel(cdns);
    + int ret;
    +
    + if (cdns->bus.prop.hw_disabled) {
    + dev_dbg(dev, "SoundWire master %d is disabled, ignoring\n",
    + cdns->bus.link_id);
    + return 0;
    + }
    +
    + ret = sdw_cdns_enable_interrupt(cdns, false);
    + if (ret < 0) {
    + dev_err(dev, "cannot disable interrupts on suspend\n");
    + return ret;
    + }
    +
    + ret = intel_link_power_down(sdw);
    + if (ret) {
    + dev_err(dev, "Link power down failed: %d", ret);
    + return ret;
    + }
    +
    + intel_shim_wake(sdw, false);
    +
    + return 0;
    +}
    +
    +static int intel_resume(struct device *dev)
    +{
    + struct sdw_cdns *cdns = dev_get_drvdata(dev);
    + struct sdw_intel *sdw = cdns_to_intel(cdns);
    + int ret;
    +
    + if (cdns->bus.prop.hw_disabled) {
    + dev_dbg(dev, "SoundWire master %d is disabled, ignoring\n",
    + cdns->bus.link_id);
    + return 0;
    + }
    +
    + ret = intel_init(sdw);
    + if (ret) {
    + dev_err(dev, "%s failed: %d", __func__, ret);
    + return ret;
    + }
    +
    + ret = sdw_cdns_enable_interrupt(cdns, true);
    + if (ret < 0) {
    + dev_err(dev, "cannot enable interrupts during resume\n");
    + return ret;
    + }
    +
    + ret = sdw_cdns_exit_reset(cdns);
    + if (ret < 0) {
    + dev_err(dev, "unable to exit bus reset sequence during resume\n");
    + return ret;
    + }
    +
    + return ret;
    +}
    +
    +#endif
    +
    +static const struct dev_pm_ops intel_pm = {
    + SET_SYSTEM_SLEEP_PM_OPS(intel_suspend, intel_resume)
    +};
    +
    struct sdw_md_driver intel_sdw_driver = {
    .driver = {
    .name = "intel-sdw",
    .owner = THIS_MODULE,
    + .pm = &intel_pm,
    },
    .probe = intel_master_probe,
    .startup = intel_master_startup,
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-11-06 20:23    [W:5.302 / U:0.264 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site