]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: SOF: hda/shim: Add callbacks to handle mic privacy change for sdw
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Fri, 7 Mar 2025 11:28:15 +0000 (13:28 +0200)
committerMark Brown <broonie@kernel.org>
Sat, 8 Mar 2025 16:06:42 +0000 (16:06 +0000)
Add generic callback definitions for checking the mic privacy interrupt and
status.
Implement wrappers for mic privacy reported via the Soundwire interrupt and
its vendor specific SHIM registers.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://patch.msgid.link/20250307112816.1495-8-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda.c
sound/soc/sof/intel/shim.h

index a1ccd95da8bb732cc5cc752669e4ac6aca09da99..6b1ada5664764fbcc45136a1b6852296a0a89194 100644 (file)
@@ -352,6 +352,27 @@ void hda_sdw_process_wakeen_common(struct snd_sof_dev *sdev)
 }
 EXPORT_SYMBOL_NS(hda_sdw_process_wakeen_common, "SND_SOC_SOF_INTEL_HDA_GENERIC");
 
+static bool hda_dsp_sdw_check_mic_privacy_irq(struct snd_sof_dev *sdev)
+{
+       const struct sof_intel_dsp_desc *chip;
+
+       chip = get_chip_info(sdev->pdata);
+       if (chip && chip->check_mic_privacy_irq)
+               return chip->check_mic_privacy_irq(sdev, true,
+                                                  AZX_REG_ML_LEPTR_ID_SDW);
+
+       return false;
+}
+
+static void hda_dsp_sdw_process_mic_privacy(struct snd_sof_dev *sdev)
+{
+       const struct sof_intel_dsp_desc *chip;
+
+       chip = get_chip_info(sdev->pdata);
+       if (chip && chip->process_mic_privacy)
+               chip->process_mic_privacy(sdev, true, AZX_REG_ML_LEPTR_ID_SDW);
+}
+
 #else /* IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE) */
 static inline int hda_sdw_acpi_scan(struct snd_sof_dev *sdev)
 {
@@ -383,6 +404,13 @@ static inline bool hda_sdw_check_wakeen_irq(struct snd_sof_dev *sdev)
        return false;
 }
 
+static inline bool hda_dsp_sdw_check_mic_privacy_irq(struct snd_sof_dev *sdev)
+{
+       return false;
+}
+
+static inline void hda_dsp_sdw_process_mic_privacy(struct snd_sof_dev *sdev) { }
+
 #endif /* IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE) */
 
 /* pre fw run operations */
@@ -678,7 +706,13 @@ static irqreturn_t hda_dsp_interrupt_thread(int irq, void *context)
 
        if (hda_dsp_check_sdw_irq(sdev)) {
                trace_sof_intel_hda_irq(sdev, "sdw");
+
                hda_dsp_sdw_thread(irq, hdev->sdw);
+
+               if (hda_dsp_sdw_check_mic_privacy_irq(sdev)) {
+                       trace_sof_intel_hda_irq(sdev, "mic privacy");
+                       hda_dsp_sdw_process_mic_privacy(sdev);
+               }
        }
 
        if (hda_sdw_check_wakeen_irq(sdev)) {
index 8709b750a11e2f46b7f47a9caf697a61a7bcc092..d4372f0bff7e75ae76ec90935ef4b6ae52b5dda3 100644 (file)
@@ -193,6 +193,8 @@ struct sof_intel_dsp_desc {
        bool (*check_sdw_wakeen_irq)(struct snd_sof_dev *sdev);
        void (*sdw_process_wakeen)(struct snd_sof_dev *sdev);
        bool (*check_ipc_irq)(struct snd_sof_dev *sdev);
+       bool (*check_mic_privacy_irq)(struct snd_sof_dev *sdev, bool alt, int elid);
+       void (*process_mic_privacy)(struct snd_sof_dev *sdev, bool alt, int elid);
        int (*power_down_dsp)(struct snd_sof_dev *sdev);
        int (*disable_interrupts)(struct snd_sof_dev *sdev);
        int (*cl_init)(struct snd_sof_dev *sdev, int stream_tag, bool imr_boot);