soundwire: cadence_master: make clock stop exit configurable on init
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tue, 22 Oct 2019 23:54:48 +0000 (18:54 -0500)
committerVinod Koul <vkoul@kernel.org>
Thu, 24 Oct 2019 11:52:01 +0000 (17:22 +0530)
The use of clock stop is not a requirement, the IP can e.g. be
completely power gated and not detect any wakes while in s2idle/deep
sleep.

For now clock-stop is not supported anyways so the control parameter
is always false. This will be revisited when we add clock stop.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20191022235448.17586-6-pierre-louis.bossart@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/cadence_master.c
drivers/soundwire/cadence_master.h
drivers/soundwire/intel.c

index d2c44bfff53afc795f5435161b99cd778ab57d05..fed21e2b22774de380d464499ae349b20dbd690e 100644 (file)
@@ -979,7 +979,7 @@ static u32 cdns_set_initial_frame_shape(int n_rows, int n_cols)
  * sdw_cdns_init() - Cadence initialization
  * @cdns: Cadence instance
  */
-int sdw_cdns_init(struct sdw_cdns *cdns)
+int sdw_cdns_init(struct sdw_cdns *cdns, bool clock_stop_exit)
 {
        struct sdw_bus *bus = &cdns->bus;
        struct sdw_master_prop *prop = &bus->prop;
@@ -987,12 +987,13 @@ int sdw_cdns_init(struct sdw_cdns *cdns)
        int divider;
        int ret;
 
-       /* Exit clock stop */
-       ret = cdns_clear_bit(cdns, CDNS_MCP_CONTROL,
-                            CDNS_MCP_CONTROL_CLK_STOP_CLR);
-       if (ret < 0) {
-               dev_err(cdns->dev, "Couldn't exit from clock stop\n");
-               return ret;
+       if (clock_stop_exit) {
+               ret = cdns_clear_bit(cdns, CDNS_MCP_CONTROL,
+                                    CDNS_MCP_CONTROL_CLK_STOP_CLR);
+               if (ret < 0) {
+                       dev_err(cdns->dev, "Couldn't exit from clock stop\n");
+                       return ret;
+               }
        }
 
        /* Set clock divider */
index a106aea6fe5373ae9914a8a3b3ed80b1003b5c5e..001457cbe5ad2ef97eded48d204395a8cf600f46 100644 (file)
@@ -138,7 +138,7 @@ extern struct sdw_master_ops sdw_cdns_master_ops;
 irqreturn_t sdw_cdns_irq(int irq, void *dev_id);
 irqreturn_t sdw_cdns_thread(int irq, void *dev_id);
 
-int sdw_cdns_init(struct sdw_cdns *cdns);
+int sdw_cdns_init(struct sdw_cdns *cdns, bool clock_stop_exit);
 int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
                      struct sdw_cdns_stream_config config);
 int sdw_cdns_exit_reset(struct sdw_cdns *cdns);
index 8d32d8eaff1c057b72ec6a5d0f553663a47e3a94..3a6bbf0ff04ec91cfe248e3528e27997385269da 100644 (file)
@@ -903,7 +903,7 @@ static int intel_init(struct sdw_intel *sdw)
        intel_link_power_up(sdw);
        intel_shim_init(sdw);
 
-       return sdw_cdns_init(&sdw->cdns);
+       return sdw_cdns_init(&sdw->cdns, false);
 }
 
 /*