From: Pierre-Louis Bossart <pierre-louis.boss...@linux.intel.com>

After arming the synchronization, the SYNCGO field controls the
hardware-based synchronization between links.

Move the programming and wait for clear of SYNCGO to dedicated helper.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.boss...@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.l...@linux.intel.com>
---
 drivers/soundwire/intel.c | 34 ++++++++++++++++++++++++++--------
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 6a745602c9cc..0a4fc7f65743 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -512,6 +512,31 @@ static void intel_shim_sync_arm(struct sdw_intel *sdw)
        mutex_unlock(sdw->link_res->shim_lock);
 }
 
+static int intel_shim_sync_go_unlocked(struct sdw_intel *sdw)
+{
+       void __iomem *shim = sdw->link_res->shim;
+       u32 sync_reg;
+       int ret;
+
+       /* Read SYNC register */
+       sync_reg = intel_readl(shim, SDW_SHIM_SYNC);
+
+       /*
+        * Set SyncGO bit to synchronously trigger a bank switch for
+        * all the masters. A write to SYNCGO bit clears CMDSYNC bit for all
+        * the Masters.
+        */
+       sync_reg |= SDW_SHIM_SYNC_SYNCGO;
+
+       ret = intel_clear_bit(shim, SDW_SHIM_SYNC, sync_reg,
+                             SDW_SHIM_SYNC_SYNCGO);
+
+       if (ret < 0)
+               dev_err(sdw->cdns.dev, "SyncGO clear failed: %d\n", ret);
+
+       return ret;
+}
+
 /*
  * PDI routines
  */
@@ -763,15 +788,8 @@ static int intel_post_bank_switch(struct sdw_bus *bus)
                ret = 0;
                goto unlock;
        }
-       /*
-        * Set SyncGO bit to synchronously trigger a bank switch for
-        * all the masters. A write to SYNCGO bit clears CMDSYNC bit for all
-        * the Masters.
-        */
-       sync_reg |= SDW_SHIM_SYNC_SYNCGO;
 
-       ret = intel_clear_bit(shim, SDW_SHIM_SYNC, sync_reg,
-                             SDW_SHIM_SYNC_SYNCGO);
+       ret = intel_shim_sync_go_unlocked(sdw);
 unlock:
        mutex_unlock(sdw->link_res->shim_lock);
 
-- 
2.17.1

Reply via email to