Unverified Commit a0db661e authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown
Browse files

ASoC: SOF: hda/shim: Add callbacks to handle mic privacy change for sdw



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: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarLiam Girdwood <liam.r.girdwood@intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://patch.msgid.link/20250307112816.1495-8-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 0978e820
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -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)) {
+2 −0
Original line number Diff line number Diff line
@@ -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);