ASoC: SOF: Intel: add abstraction for SoundWire wake-ups
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Mon, 7 Aug 2023 21:09:55 +0000 (16:09 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 7 Aug 2023 22:09:45 +0000 (23:09 +0100)
The existing code cannot work for LunarLake, let's add a layer of
abstraction.

No functional change in this patch.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Link: https://lore.kernel.org/r/20230807210959.506849-17-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/cnl.c
sound/soc/sof/intel/hda.c
sound/soc/sof/intel/hda.h
sound/soc/sof/intel/icl.c
sound/soc/sof/intel/mtl.c
sound/soc/sof/intel/shim.h
sound/soc/sof/intel/tgl.c

index a95222e53ecf30a3a344a7a76771835d0b42485e..c6fbf42852620d836671d7c9eed002bdb4b51321 100644 (file)
@@ -466,6 +466,7 @@ const struct sof_intel_dsp_desc cnl_chip_info = {
        .read_sdw_lcount =  hda_sdw_check_lcount_common,
        .enable_sdw_irq = hda_common_enable_sdw_irq,
        .check_sdw_irq  = hda_common_check_sdw_irq,
+       .check_sdw_wakeen_irq = hda_sdw_check_wakeen_irq_common,
        .check_ipc_irq  = hda_dsp_check_ipc_irq,
        .cl_init = cl_dsp_init,
        .power_down_dsp = hda_power_down_dsp,
@@ -501,6 +502,7 @@ const struct sof_intel_dsp_desc jsl_chip_info = {
        .read_sdw_lcount =  hda_sdw_check_lcount_common,
        .enable_sdw_irq = hda_common_enable_sdw_irq,
        .check_sdw_irq  = hda_common_check_sdw_irq,
+       .check_sdw_wakeen_irq = hda_sdw_check_wakeen_irq_common,
        .check_ipc_irq  = hda_dsp_check_ipc_irq,
        .cl_init = cl_dsp_init,
        .power_down_dsp = hda_power_down_dsp,
index 67b2e00baf4e86e66d6ffb07b21a03d7bc08e511..5c1e6ad2b7f2e3cf8f95689ec35fa633f1eb5392 100644 (file)
@@ -399,14 +399,10 @@ static irqreturn_t hda_dsp_sdw_thread(int irq, void *context)
        return sdw_intel_thread(irq, context);
 }
 
-static bool hda_sdw_check_wakeen_irq(struct snd_sof_dev *sdev)
+bool hda_sdw_check_wakeen_irq_common(struct snd_sof_dev *sdev)
 {
-       u32 interface_mask = hda_get_interface_mask(sdev);
        struct sof_intel_hda_dev *hdev;
 
-       if (!(interface_mask & BIT(SOF_DAI_INTEL_ALH)))
-               return false;
-
        hdev = sdev->pdata->hw_pdata;
        if (hdev->sdw &&
            snd_sof_dsp_read(sdev, HDA_DSP_BAR,
@@ -416,6 +412,20 @@ static bool hda_sdw_check_wakeen_irq(struct snd_sof_dev *sdev)
        return false;
 }
 
+static bool hda_sdw_check_wakeen_irq(struct snd_sof_dev *sdev)
+{
+       u32 interface_mask = hda_get_interface_mask(sdev);
+       const struct sof_intel_dsp_desc *chip;
+
+       if (!(interface_mask & BIT(SOF_DAI_INTEL_ALH)))
+               return false;
+
+       if (chip && chip->check_sdw_wakeen_irq)
+               return chip->check_sdw_wakeen_irq(sdev);
+
+       return false;
+}
+
 void hda_sdw_process_wakeen(struct snd_sof_dev *sdev)
 {
        u32 interface_mask = hda_get_interface_mask(sdev);
index 4f60b722e5d52f80847c8f1c6d2421c09d602d34..f19510e8ce876ef3ad7be4aac6f8c4fddb7251da 100644 (file)
@@ -785,6 +785,7 @@ int hda_sdw_check_lcount_ext(struct snd_sof_dev *sdev);
 int hda_sdw_startup(struct snd_sof_dev *sdev);
 void hda_common_enable_sdw_irq(struct snd_sof_dev *sdev, bool enable);
 void hda_sdw_int_enable(struct snd_sof_dev *sdev, bool enable);
+bool hda_sdw_check_wakeen_irq_common(struct snd_sof_dev *sdev);
 void hda_sdw_process_wakeen(struct snd_sof_dev *sdev);
 bool hda_common_check_sdw_irq(struct snd_sof_dev *sdev);
 
@@ -813,6 +814,11 @@ static inline void hda_sdw_int_enable(struct snd_sof_dev *sdev, bool enable)
 {
 }
 
+static inline bool hda_sdw_check_wakeen_irq_common(struct snd_sof_dev *sdev)
+{
+       return false;
+}
+
 static inline void hda_sdw_process_wakeen(struct snd_sof_dev *sdev)
 {
 }
index 0f249efc6a5a28de4d2ed2dcce980ed907becab3..7ac10167a90d77c2f7863c9a02f3fa51772fd36f 100644 (file)
@@ -188,6 +188,7 @@ const struct sof_intel_dsp_desc icl_chip_info = {
        .read_sdw_lcount =  hda_sdw_check_lcount_common,
        .enable_sdw_irq = hda_common_enable_sdw_irq,
        .check_sdw_irq  = hda_common_check_sdw_irq,
+       .check_sdw_wakeen_irq = hda_sdw_check_wakeen_irq_common,
        .check_ipc_irq  = hda_dsp_check_ipc_irq,
        .cl_init = cl_dsp_init,
        .power_down_dsp = hda_power_down_dsp,
index be3155f9894469dac1f04977623d24512cbb3500..b84ca58da9d5da72d4158dabd51564f046630fe7 100644 (file)
@@ -735,6 +735,7 @@ const struct sof_intel_dsp_desc mtl_chip_info = {
        .read_sdw_lcount =  hda_sdw_check_lcount_common,
        .enable_sdw_irq = mtl_enable_sdw_irq,
        .check_sdw_irq = mtl_dsp_check_sdw_irq,
+       .check_sdw_wakeen_irq = hda_sdw_check_wakeen_irq_common,
        .check_ipc_irq = mtl_dsp_check_ipc_irq,
        .cl_init = mtl_dsp_cl_init,
        .power_down_dsp = mtl_power_down_dsp,
index 207df48e27cf92dc088dfc9bc953dff9b3f4d648..9515d753c816e1fd09eb93d9a9f9c6bd72a9ec65 100644 (file)
@@ -189,6 +189,7 @@ struct sof_intel_dsp_desc {
        int (*read_sdw_lcount)(struct snd_sof_dev *sdev);
        void (*enable_sdw_irq)(struct snd_sof_dev *sdev, bool enable);
        bool (*check_sdw_irq)(struct snd_sof_dev *sdev);
+       bool (*check_sdw_wakeen_irq)(struct snd_sof_dev *sdev);
        bool (*check_ipc_irq)(struct snd_sof_dev *sdev);
        int (*power_down_dsp)(struct snd_sof_dev *sdev);
        int (*disable_interrupts)(struct snd_sof_dev *sdev);
index 8e2b07e1612b7693422ac9a87bc6fbc796ce2f85..bb9f20253c996da3a746da7ddcb7e7c8006a0283 100644 (file)
@@ -147,6 +147,7 @@ const struct sof_intel_dsp_desc tgl_chip_info = {
        .read_sdw_lcount =  hda_sdw_check_lcount_common,
        .enable_sdw_irq = hda_common_enable_sdw_irq,
        .check_sdw_irq  = hda_common_check_sdw_irq,
+       .check_sdw_wakeen_irq = hda_sdw_check_wakeen_irq_common,
        .check_ipc_irq  = hda_dsp_check_ipc_irq,
        .cl_init = cl_dsp_init,
        .power_down_dsp = hda_power_down_dsp,
@@ -175,6 +176,7 @@ const struct sof_intel_dsp_desc tglh_chip_info = {
        .read_sdw_lcount =  hda_sdw_check_lcount_common,
        .enable_sdw_irq = hda_common_enable_sdw_irq,
        .check_sdw_irq  = hda_common_check_sdw_irq,
+       .check_sdw_wakeen_irq = hda_sdw_check_wakeen_irq_common,
        .check_ipc_irq  = hda_dsp_check_ipc_irq,
        .cl_init = cl_dsp_init,
        .power_down_dsp = hda_power_down_dsp,
@@ -203,6 +205,7 @@ const struct sof_intel_dsp_desc ehl_chip_info = {
        .read_sdw_lcount =  hda_sdw_check_lcount_common,
        .enable_sdw_irq = hda_common_enable_sdw_irq,
        .check_sdw_irq  = hda_common_check_sdw_irq,
+       .check_sdw_wakeen_irq = hda_sdw_check_wakeen_irq_common,
        .check_ipc_irq  = hda_dsp_check_ipc_irq,
        .cl_init = cl_dsp_init,
        .power_down_dsp = hda_power_down_dsp,
@@ -231,6 +234,7 @@ const struct sof_intel_dsp_desc adls_chip_info = {
        .read_sdw_lcount =  hda_sdw_check_lcount_common,
        .enable_sdw_irq = hda_common_enable_sdw_irq,
        .check_sdw_irq  = hda_common_check_sdw_irq,
+       .check_sdw_wakeen_irq = hda_sdw_check_wakeen_irq_common,
        .check_ipc_irq  = hda_dsp_check_ipc_irq,
        .cl_init = cl_dsp_init,
        .power_down_dsp = hda_power_down_dsp,