soundwire: intel: introduce helper for link synchronization
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Thu, 16 Jul 2020 15:09:42 +0000 (23:09 +0800)
committerVinod Koul <vkoul@kernel.org>
Tue, 21 Jul 2020 10:35:40 +0000 (16:05 +0530)
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.bossart@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20200716150947.22119-5-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/intel.c

index 6a74560..0a4fc7f 100644 (file)
@@ -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);