]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
soundwire: intel_ace2x: enable wake support
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Mon, 15 May 2023 07:10:33 +0000 (15:10 +0800)
committerVinod Koul <vkoul@kernel.org>
Sat, 27 May 2023 10:36:46 +0000 (16:06 +0530)
The WAKEEN and WAKESTS registers were moved to the per-link SHIM_VS
area.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20230515071042.2038-18-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/intel_ace2x.c

index 2e33e8a00b55376044a0bd8dafe25352b994f811..fe950b3ea3bc22f10c8be09df0a799011e3d96e2 100644 (file)
@@ -31,6 +31,41 @@ static void intel_shim_vs_init(struct sdw_intel *sdw)
        usleep_range(10, 15);
 }
 
+static int intel_shim_check_wake(struct sdw_intel *sdw)
+{
+       void __iomem *shim_vs;
+       u16 wake_sts;
+
+       shim_vs = sdw->link_res->shim_vs;
+       wake_sts = intel_readw(shim_vs, SDW_SHIM2_INTEL_VS_WAKESTS);
+
+       return wake_sts & SDW_SHIM2_INTEL_VS_WAKEEN_PWS;
+}
+
+static void intel_shim_wake(struct sdw_intel *sdw, bool wake_enable)
+{
+       void __iomem *shim_vs = sdw->link_res->shim_vs;
+       u16 wake_en;
+       u16 wake_sts;
+
+       wake_en = intel_readw(shim_vs, SDW_SHIM2_INTEL_VS_WAKEEN);
+
+       if (wake_enable) {
+               /* Enable the wakeup */
+               wake_en |= SDW_SHIM2_INTEL_VS_WAKEEN_PWE;
+               intel_writew(shim_vs, SDW_SHIM2_INTEL_VS_WAKEEN, wake_en);
+       } else {
+               /* Disable the wake up interrupt */
+               wake_en &= ~SDW_SHIM2_INTEL_VS_WAKEEN_PWE;
+               intel_writew(shim_vs, SDW_SHIM2_INTEL_VS_WAKEEN, wake_en);
+
+               /* Clear wake status (W1C) */
+               wake_sts = intel_readw(shim_vs, SDW_SHIM2_INTEL_VS_WAKESTS);
+               wake_sts |= SDW_SHIM2_INTEL_VS_WAKEEN_PWS;
+               intel_writew(shim_vs, SDW_SHIM2_INTEL_VS_WAKESTS, wake_sts);
+       }
+}
+
 static int intel_link_power_up(struct sdw_intel *sdw)
 {
        struct sdw_bus *bus = &sdw->cdns.bus;
@@ -325,6 +360,9 @@ const struct sdw_intel_hw_ops sdw_intel_lnl_hw_ops = {
        .link_power_up = intel_link_power_up,
        .link_power_down = intel_link_power_down,
 
+       .shim_check_wake = intel_shim_check_wake,
+       .shim_wake = intel_shim_wake,
+
        .sync_arm = intel_sync_arm,
        .sync_go_unlocked = intel_sync_go_unlocked,
        .sync_go = intel_sync_go,