Commit 7181b1d4 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Vinod Koul
Browse files

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: default avatarPierre-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: default avatarVinod Koul <vkoul@kernel.org>
parent ae478d6e
Loading
Loading
Loading
Loading
+29 −6
Original line number Diff line number Diff line
@@ -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]);

		}
	}