Skip to content

Commit 473b2b3

Browse files
ujfalusiranj063
authored andcommitted
ASoC: SOF: Intel: ptl: Add support for mic privacy
Implement the three callbacks that is needed to enable support for reporting the mic privacy change via soundwire. In PTL the mic privacy reporting is supported via soundwire and DMIC and the soundwire is owned by the host, it's interrupt is routed there. To enable the interrupt, the sublink mask needs to be passed to the multilink layer, the check_mic_privacy_irq/process_mic_privacy callbacks needs to be implemented to check and report the mic privacy change. Signed-off-by: Peter Ujfalusi <[email protected]>
1 parent 54e7d2e commit 473b2b3

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

sound/soc/sof/intel/ptl.c

+56-2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,62 @@
1818
#include "lnl.h"
1919
#include "ptl.h"
2020

21-
int sof_ptl_set_ops(struct snd_sof_dev *sdev, struct snd_sof_dsp_ops *dsp_ops)
21+
static bool sof_ptl_check_mic_privacy_irq(struct snd_sof_dev *sdev, bool alt,
22+
int elid)
23+
{
24+
if (alt != 1 || elid != AZX_REG_ML_LEPTR_ID_SDW)
25+
return false;
26+
27+
return hdac_bus_eml_is_mic_privacy_changed(sof_to_bus(sdev), alt, elid);
28+
}
29+
30+
static void sof_ptl_process_mic_privacy(struct snd_sof_dev *sdev, bool alt,
31+
int elid)
32+
{
33+
bool state;
34+
35+
if (alt != 1 || elid != AZX_REG_ML_LEPTR_ID_SDW)
36+
return;
37+
38+
state = hdac_bus_eml_get_mic_privacy_state(sof_to_bus(sdev), alt, elid);
39+
40+
sof_ipc4_mic_privacy_state_change(sdev, state);
41+
}
42+
43+
static void sof_ptl_set_mic_privacy(struct snd_sof_dev *sdev,
44+
struct sof_ipc4_intel_mic_privacy_cap *caps)
2245
{
23-
return sof_lnl_set_ops(sdev, dsp_ops);
46+
u32 micpvcp;
47+
48+
if (!caps || !caps->capabilities_length)
49+
return;
50+
51+
micpvcp = caps->capabilities[0];
52+
53+
/* No need to set the mic privacy if it is not enabled or forced */
54+
if (!(micpvcp & PTL_MICPVCP_DDZE_ENABLED) ||
55+
micpvcp & PTL_MICPVCP_DDZE_FORCED)
56+
return;
57+
58+
hdac_bus_eml_set_mic_privacy_mask(sof_to_bus(sdev), true,
59+
AZX_REG_ML_LEPTR_ID_SDW,
60+
PTL_MICPVCP_GET_SDW_MASK(micpvcp));
2461
}
62+
63+
int sof_ptl_set_ops(struct snd_sof_dev *sdev, struct snd_sof_dsp_ops *dsp_ops)
64+
{
65+
struct sof_ipc4_fw_data *ipc4_data;
66+
int ret;
67+
68+
ret = sof_lnl_set_ops(sdev, dsp_ops);
69+
if (ret)
70+
return ret;
71+
72+
ipc4_data = sdev->private;
73+
ipc4_data->intel_configure_mic_privacy = sof_ptl_set_mic_privacy;
74+
75+
return 0;
76+
};
2577
EXPORT_SYMBOL_NS(sof_ptl_set_ops, "SND_SOC_SOF_INTEL_PTL");
2678

2779
const struct sof_intel_dsp_desc ptl_chip_info = {
@@ -41,6 +93,8 @@ const struct sof_intel_dsp_desc ptl_chip_info = {
4193
.check_sdw_irq = lnl_dsp_check_sdw_irq,
4294
.check_sdw_wakeen_irq = lnl_sdw_check_wakeen_irq,
4395
.check_ipc_irq = mtl_dsp_check_ipc_irq,
96+
.check_mic_privacy_irq = sof_ptl_check_mic_privacy_irq,
97+
.process_mic_privacy = sof_ptl_process_mic_privacy,
4498
.cl_init = mtl_dsp_cl_init,
4599
.power_down_dsp = mtl_power_down_dsp,
46100
.disable_interrupts = lnl_dsp_disable_interrupts,

sound/soc/sof/intel/ptl.h

+5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
#ifndef __SOF_INTEL_PTL_H
1010
#define __SOF_INTEL_PTL_H
1111

12+
#define PTL_MICPVCP_DDZE_FORCED BIT(16)
13+
#define PTL_MICPVCP_DDZE_ENABLED BIT(17)
14+
#define PTL_MICPVCP_DDZLS_SDW GENMASK(26, 20)
15+
#define PTL_MICPVCP_GET_SDW_MASK(x) (((x) & PTL_MICPVCP_DDZLS_SDW) >> 20)
16+
1217
int sof_ptl_set_ops(struct snd_sof_dev *sdev, struct snd_sof_dsp_ops *dsp_ops);
1318

1419
#endif /* __SOF_INTEL_PTL_H */

0 commit comments

Comments
 (0)