Skip to content

Commit

Permalink
soundwire: intel: refine runtime pm for SDW_INTEL_CLK_STOP_BUS_RESET
Browse files Browse the repository at this point in the history
There is a exception condition for CLK_STOP_BUS_RESET
case if there is another master is working. In this case,
all the masters are powered on for they are in the same
power domain. And master can preserve its context for
clock stop0, so there is no need to clear slave status and
reset bus.

Signed-off-by: Rander Wang <rander.wang@intel.com>
  • Loading branch information
RanderWang committed Dec 11, 2019
1 parent 2dce0b8 commit 7802643
Showing 1 changed file with 17 additions and 3 deletions.
20 changes: 17 additions & 3 deletions drivers/soundwire/intel.c
Original file line number Diff line number Diff line change
Expand Up @@ -1695,6 +1695,8 @@ static int intel_resume_runtime(struct device *dev)
struct sdw_cdns *cdns = dev_get_drvdata(dev);
struct sdw_intel *sdw = cdns_to_intel(cdns);
u32 clock_stop_quirks;
bool clock_stop0;
int status;
int ret;

if (cdns->bus.prop.hw_disabled) {
Expand Down Expand Up @@ -1739,20 +1741,32 @@ static int intel_resume_runtime(struct device *dev)
return ret;
}

/*
* There is a exception condition for CLK_STOP_BUS_RESET
* case if there is another master is working. In this case,
* all the masters are powered on for they are in the same
* power domain. And master can preserve its context for
* clock stop0, so there is no need to clear slave status and
* reset bus.
*/
clock_stop0 = sdw_cdns_is_clock_stop(&sdw->cdns);

/*
* make sure all Slaves are tagged as UNATTACHED and
* provide reason for reinitialization
*/
sdw_clear_slave_status(&sdw->cdns.bus,
SDW_UNATTACH_REQUEST_MASTER_RESET);
if (!clock_stop0) {
status = SDW_UNATTACH_REQUEST_MASTER_RESET;
sdw_clear_slave_status(&sdw->cdns.bus, status);
}

ret = sdw_cdns_enable_interrupt(cdns, true);
if (ret < 0) {
dev_err(dev, "cannot enable interrupts during resume\n");
return ret;
}

ret = sdw_cdns_clock_restart(cdns, true);
ret = sdw_cdns_clock_restart(cdns, !clock_stop0);
if (ret < 0) {
dev_err(dev, "unable to restart clock during resume\n");
return ret;
Expand Down

0 comments on commit 7802643

Please sign in to comment.