forked from Minki/linux
soundwire: cadence_master: handle multiple status reports per Slave
When a Slave reports multiple status in the sticky bits, find the latest configuration from the mirror of the PING frame status and update the status directly. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://lore.kernel.org/r/20200110215731.30747-6-pierre-louis.bossart@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
ae478d6e19
commit
7181b1d41d
@ -676,13 +676,36 @@ static int cdns_update_slave_status(struct sdw_cdns *cdns,
|
||||
|
||||
/* first check if Slave reported multiple status */
|
||||
if (set_status > 1) {
|
||||
u32 val;
|
||||
|
||||
dev_warn_ratelimited(cdns->dev,
|
||||
"Slave reported multiple Status: %d\n",
|
||||
mask);
|
||||
/*
|
||||
* TODO: we need to reread the status here by
|
||||
* issuing a PING cmd
|
||||
*/
|
||||
"Slave %d reported multiple Status: %d\n",
|
||||
i, mask);
|
||||
|
||||
/* check latest status extracted from PING commands */
|
||||
val = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
|
||||
val >>= (i * 2);
|
||||
|
||||
switch (val & 0x3) {
|
||||
case 0:
|
||||
status[i] = SDW_SLAVE_UNATTACHED;
|
||||
break;
|
||||
case 1:
|
||||
status[i] = SDW_SLAVE_ATTACHED;
|
||||
break;
|
||||
case 2:
|
||||
status[i] = SDW_SLAVE_ALERT;
|
||||
break;
|
||||
case 3:
|
||||
default:
|
||||
status[i] = SDW_SLAVE_RESERVED;
|
||||
break;
|
||||
}
|
||||
|
||||
dev_warn_ratelimited(cdns->dev,
|
||||
"Slave %d status updated to %d\n",
|
||||
i, status[i]);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user