mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2025-04-19 20:58:31 +09:00
sound fixes for 6.15-rc1
A collection of device-specific fixes that have been gathered since the previous PR. - A few more HD-audio quirks and fixups - A series of Qualcomm AudioReach fixes - Various small fixes for ASoC rt5665, WSA, SOF and Cirrus. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmfvn3YOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9k0BAAwaFh4x8FS3xwgJXDzu/vXaZhFqHRqf6M/JrQ cZsUQDy6Zo11xnHDezyjqTWQxHJhgdigorcOhkNGs3GBkg8VqPdFW8xw7czn44pf 4k8Z5wg3yLsw+ZGOanX3bawqwwm6DrAQoU7tNyefuwpKtLQwz3HYytsy1vygXsth E4XigOFuNJCnITFmR5VQdLMz99GEFsF6mixPC5h2s68849O+nibWjFJPt6o3Lolk 6/L4mbAxIuxxR5OvcI672shu8NmDBb6g4QoXBSJN0SnCZrXmuYTIFAdUhCzFYxNO y/naPiMzsHCwRv6rjgkkmUFIywMBSoDiz9IUxAQ2gA1VyJdEyGI+X1n78r8sLWpF rXvTgpNIDWMQ+KR0nt7LyT2CjmI6aa78LN4BStCkfeiCNVNuth94+9gmQ2yXhHmx Beslfd8bpBPRRrnqJFsso1s5LzItT9LnVIPd6DZ64/WtMit7QNG8dmXuzVuJurYh Ezx0tjTPHt5zxMh55TPYh++Ja8uxe4l3SUx5UnMtVLp25aXjx/w8hHXqsESqjlFD U/eNtYyY/dZseBChjAQrFnViEh/aXisAZElXORd33DInDVl81OhxQyDD19O9/HtQ +qEhgGi6xxh6n0VRPNwVJK2O1v+8Bt2Ssh6g6XACWsof1AjRdjWQu5i58JkD+MhQ 0twlWLA= =fyLx -----END PGP SIGNATURE----- Merge tag 'sound-fix-6.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of device-specific fixes that have been gathered since the previous pull: - A few more HD-audio quirks and fixups - A series of Qualcomm AudioReach fixes - Various small fixes for ASoC rt5665, WSA, SOF and Cirrus" * tag 'sound-fix-6.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda/realtek: Fix built-in mic on another ASUS VivoBook model ALSA: hda/realtek - Support mute led function for HP platform ASoC: imx-card: Add NULL check in imx_card_probe() ASoC: codecs: rt5665: Fix some error handling paths in rt5665_probe() ASoC: q6apm-dai: make use of q6apm_get_hw_pointer ASoC: qdsp6: q6apm-dai: fix capture pipeline overruns. ASoC: qdsp6: q6apm-dai: set 10 ms period and buffer alignment. ASoC: q6apm: add q6apm_get_hw_pointer helper ASoC: q6apm-dai: schedule all available frames to avoid dsp under-runs ASoC: SOF: hda/ptl: Move mic privacy change notification sending to a work ALSA/hda: intel-sdw-acpi: Remove (explicitly) unused header ALSA: hda/realtek: Enable Mute LED on HP OMEN 16 Laptop xd000xx ALSA: hda/tas2781: Upgrade calibratd-data writing code to support Alpha and Beta dsp firmware ASoC: qdsp6: q6asm-dai: fix q6asm_dai_compr_set_params error path ALSA: hda/realtek: Fix built-in mic breakage on ASUS VivoBook X515JA ASoC: sma1307: Fix error handling in sma1307_setting_loaded() ASoC: codecs: wsa884x: Correct VI sense channel mask ASoC: codecs: wsa883x: Correct VI sense channel mask firmware: cs_dsp: Ensure cs_dsp_load[_coeff]() returns 0 on success
This commit is contained in:
commit
3551e679c3
@ -1631,6 +1631,7 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
|
||||
|
||||
cs_dsp_debugfs_save_wmfwname(dsp, file);
|
||||
|
||||
ret = 0;
|
||||
out_fw:
|
||||
cs_dsp_buf_free(&buf_list);
|
||||
|
||||
@ -2338,6 +2339,7 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
|
||||
|
||||
cs_dsp_debugfs_save_binname(dsp, file);
|
||||
|
||||
ret = 0;
|
||||
out_fw:
|
||||
cs_dsp_buf_free(&buf_list);
|
||||
|
||||
|
@ -11,8 +11,8 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/fwnode.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/soundwire/sdw_intel.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
|
@ -4743,6 +4743,22 @@ static void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
|
||||
}
|
||||
}
|
||||
|
||||
static void alc245_fixup_hp_mute_led_v1_coefbit(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix,
|
||||
int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
||||
spec->mute_led_polarity = 0;
|
||||
spec->mute_led_coef.idx = 0x0b;
|
||||
spec->mute_led_coef.mask = 1 << 3;
|
||||
spec->mute_led_coef.on = 1 << 3;
|
||||
spec->mute_led_coef.off = 0;
|
||||
snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
|
||||
}
|
||||
}
|
||||
|
||||
/* turn on/off mic-mute LED per capture hook by coef bit */
|
||||
static int coef_micmute_led_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness brightness)
|
||||
@ -7574,6 +7590,24 @@ static void alc245_fixup_hp_spectre_x360_16_aa0xxx(struct hda_codec *codec,
|
||||
alc245_fixup_hp_gpio_led(codec, fix, action);
|
||||
}
|
||||
|
||||
static void alc245_fixup_hp_zbook_firefly_g12a(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
static const hda_nid_t conn[] = { 0x02 };
|
||||
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
spec->gen.auto_mute_via_amp = 1;
|
||||
snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
|
||||
break;
|
||||
}
|
||||
|
||||
cs35l41_fixup_i2c_two(codec, fix, action);
|
||||
alc245_fixup_hp_mute_led_coefbit(codec, fix, action);
|
||||
alc285_fixup_hp_coef_micmute_led(codec, fix, action);
|
||||
}
|
||||
|
||||
/*
|
||||
* ALC287 PCM hooks
|
||||
*/
|
||||
@ -7911,6 +7945,7 @@ enum {
|
||||
ALC245_FIXUP_TAS2781_SPI_2,
|
||||
ALC287_FIXUP_YOGA7_14ARB7_I2C,
|
||||
ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
|
||||
ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT,
|
||||
ALC245_FIXUP_HP_X360_MUTE_LEDS,
|
||||
ALC287_FIXUP_THINKPAD_I2S_SPK,
|
||||
ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD,
|
||||
@ -7921,6 +7956,7 @@ enum {
|
||||
ALC256_FIXUP_HEADPHONE_AMP_VOL,
|
||||
ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX,
|
||||
ALC245_FIXUP_HP_SPECTRE_X360_16_AA0XXX,
|
||||
ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A,
|
||||
ALC285_FIXUP_ASUS_GA403U,
|
||||
ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC,
|
||||
ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1,
|
||||
@ -10164,6 +10200,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc245_fixup_hp_mute_led_coefbit,
|
||||
},
|
||||
[ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc245_fixup_hp_mute_led_v1_coefbit,
|
||||
},
|
||||
[ALC245_FIXUP_HP_X360_MUTE_LEDS] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc245_fixup_hp_mute_led_coefbit,
|
||||
@ -10212,6 +10252,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc245_fixup_hp_spectre_x360_16_aa0xxx,
|
||||
},
|
||||
[ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc245_fixup_hp_zbook_firefly_g12a,
|
||||
},
|
||||
[ALC285_FIXUP_ASUS_GA403U] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc285_fixup_asus_ga403u,
|
||||
@ -10658,6 +10702,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bcd, "HP Omen 16-xd0xxx", ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bdd, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bde, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bdf, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
@ -10751,15 +10796,15 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8e11, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e12, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e13, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e14, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e15, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e16, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e17, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e18, "HP ZBook Firefly 14 G12A", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e19, "HP ZBook Firefly 14 G12A", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e1a, "HP ZBook Firefly 14 G12A", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e1b, "HP EliteBook G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e1c, "HP EliteBook G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e14, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e15, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e16, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e17, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e18, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e19, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e1a, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e1b, "HP EliteBook G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e1c, "HP EliteBook G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e2c, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e36, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e37, "HP 16 Piston OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
@ -10804,6 +10849,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601VV/VU/VJ/VQ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G614JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS G513PI/PU/PV", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x14f2, "ASUS VivoBook X515JA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1503, "ASUS G733PY/PZ/PZV/PYV", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
|
||||
SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA/XJ/XQ/XU/XV/XI", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
@ -10843,6 +10889,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c63, "ASUS GU605M", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c80, "ASUS VivoBook TP401", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JU/JV/JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JY/JZ/JI/JG", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
||||
|
@ -558,28 +558,38 @@ static int tas2563_save_calibration(struct tasdevice_priv *tas_priv)
|
||||
|
||||
static void tas2781_apply_calib(struct tasdevice_priv *tas_priv)
|
||||
{
|
||||
static const unsigned char page_array[CALIB_MAX] = {
|
||||
0x17, 0x18, 0x18, 0x13, 0x18,
|
||||
struct calidata *cali_data = &tas_priv->cali_data;
|
||||
struct cali_reg *r = &cali_data->cali_reg_array;
|
||||
unsigned int cali_reg[CALIB_MAX] = {
|
||||
TASDEVICE_REG(0, 0x17, 0x74),
|
||||
TASDEVICE_REG(0, 0x18, 0x0c),
|
||||
TASDEVICE_REG(0, 0x18, 0x14),
|
||||
TASDEVICE_REG(0, 0x13, 0x70),
|
||||
TASDEVICE_REG(0, 0x18, 0x7c),
|
||||
};
|
||||
static const unsigned char rgno_array[CALIB_MAX] = {
|
||||
0x74, 0x0c, 0x14, 0x70, 0x7c,
|
||||
};
|
||||
int offset = 0;
|
||||
int i, j, rc;
|
||||
int oft = 0;
|
||||
__be32 data;
|
||||
|
||||
if (tas_priv->dspbin_typ != TASDEV_BASIC) {
|
||||
cali_reg[0] = r->r0_reg;
|
||||
cali_reg[1] = r->invr0_reg;
|
||||
cali_reg[2] = r->r0_low_reg;
|
||||
cali_reg[3] = r->pow_reg;
|
||||
cali_reg[4] = r->tlimit_reg;
|
||||
}
|
||||
|
||||
for (i = 0; i < tas_priv->ndev; i++) {
|
||||
for (j = 0; j < CALIB_MAX; j++) {
|
||||
data = cpu_to_be32(
|
||||
*(uint32_t *)&tas_priv->cali_data.data[offset]);
|
||||
*(uint32_t *)&tas_priv->cali_data.data[oft]);
|
||||
rc = tasdevice_dev_bulk_write(tas_priv, i,
|
||||
TASDEVICE_REG(0, page_array[j], rgno_array[j]),
|
||||
(unsigned char *)&data, 4);
|
||||
cali_reg[j], (unsigned char *)&data, 4);
|
||||
if (rc < 0)
|
||||
dev_err(tas_priv->dev,
|
||||
"chn %d calib %d bulk_wr err = %d\n",
|
||||
i, j, rc);
|
||||
offset += 4;
|
||||
oft += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -31,9 +31,7 @@
|
||||
#include "rl6231.h"
|
||||
#include "rt5665.h"
|
||||
|
||||
#define RT5665_NUM_SUPPLIES 3
|
||||
|
||||
static const char *rt5665_supply_names[RT5665_NUM_SUPPLIES] = {
|
||||
static const char * const rt5665_supply_names[] = {
|
||||
"AVDD",
|
||||
"MICVDD",
|
||||
"VBAT",
|
||||
@ -46,7 +44,6 @@ struct rt5665_priv {
|
||||
struct gpio_desc *gpiod_ldo1_en;
|
||||
struct gpio_desc *gpiod_reset;
|
||||
struct snd_soc_jack *hs_jack;
|
||||
struct regulator_bulk_data supplies[RT5665_NUM_SUPPLIES];
|
||||
struct delayed_work jack_detect_work;
|
||||
struct delayed_work calibrate_work;
|
||||
struct delayed_work jd_check_work;
|
||||
@ -4471,8 +4468,6 @@ static void rt5665_remove(struct snd_soc_component *component)
|
||||
struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
regmap_write(rt5665->regmap, RT5665_RESET, 0);
|
||||
|
||||
regulator_bulk_disable(ARRAY_SIZE(rt5665->supplies), rt5665->supplies);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
@ -4758,7 +4753,7 @@ static int rt5665_i2c_probe(struct i2c_client *i2c)
|
||||
{
|
||||
struct rt5665_platform_data *pdata = dev_get_platdata(&i2c->dev);
|
||||
struct rt5665_priv *rt5665;
|
||||
int i, ret;
|
||||
int ret;
|
||||
unsigned int val;
|
||||
|
||||
rt5665 = devm_kzalloc(&i2c->dev, sizeof(struct rt5665_priv),
|
||||
@ -4774,24 +4769,13 @@ static int rt5665_i2c_probe(struct i2c_client *i2c)
|
||||
else
|
||||
rt5665_parse_dt(rt5665, &i2c->dev);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(rt5665->supplies); i++)
|
||||
rt5665->supplies[i].supply = rt5665_supply_names[i];
|
||||
|
||||
ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(rt5665->supplies),
|
||||
rt5665->supplies);
|
||||
ret = devm_regulator_bulk_get_enable(&i2c->dev, ARRAY_SIZE(rt5665_supply_names),
|
||||
rt5665_supply_names);
|
||||
if (ret != 0) {
|
||||
dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regulator_bulk_enable(ARRAY_SIZE(rt5665->supplies),
|
||||
rt5665->supplies);
|
||||
if (ret != 0) {
|
||||
dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
rt5665->gpiod_ldo1_en = devm_gpiod_get_optional(&i2c->dev,
|
||||
"realtek,ldo1-en",
|
||||
GPIOD_OUT_HIGH);
|
||||
|
@ -1705,7 +1705,7 @@ static void sma1307_check_fault_worker(struct work_struct *work)
|
||||
static void sma1307_setting_loaded(struct sma1307_priv *sma1307, const char *file)
|
||||
{
|
||||
const struct firmware *fw;
|
||||
int *data, size, offset, num_mode;
|
||||
int size, offset, num_mode;
|
||||
int ret;
|
||||
|
||||
ret = request_firmware(&fw, file, sma1307->dev);
|
||||
@ -1722,7 +1722,7 @@ static void sma1307_setting_loaded(struct sma1307_priv *sma1307, const char *fil
|
||||
return;
|
||||
}
|
||||
|
||||
data = kzalloc(fw->size, GFP_KERNEL);
|
||||
int *data __free(kfree) = kzalloc(fw->size, GFP_KERNEL);
|
||||
if (!data) {
|
||||
release_firmware(fw);
|
||||
sma1307->set.status = false;
|
||||
@ -1742,7 +1742,6 @@ static void sma1307_setting_loaded(struct sma1307_priv *sma1307, const char *fil
|
||||
sma1307->set.header_size,
|
||||
GFP_KERNEL);
|
||||
if (!sma1307->set.header) {
|
||||
kfree(data);
|
||||
sma1307->set.status = false;
|
||||
return;
|
||||
}
|
||||
@ -1763,8 +1762,6 @@ static void sma1307_setting_loaded(struct sma1307_priv *sma1307, const char *fil
|
||||
= devm_kzalloc(sma1307->dev,
|
||||
sma1307->set.def_size * sizeof(int), GFP_KERNEL);
|
||||
if (!sma1307->set.def) {
|
||||
kfree(data);
|
||||
kfree(sma1307->set.header);
|
||||
sma1307->set.status = false;
|
||||
return;
|
||||
}
|
||||
@ -1782,9 +1779,6 @@ static void sma1307_setting_loaded(struct sma1307_priv *sma1307, const char *fil
|
||||
sma1307->set.mode_size * 2 * sizeof(int),
|
||||
GFP_KERNEL);
|
||||
if (!sma1307->set.mode_set[i]) {
|
||||
kfree(data);
|
||||
kfree(sma1307->set.header);
|
||||
kfree(sma1307->set.def);
|
||||
for (int j = 0; j < i; j++)
|
||||
kfree(sma1307->set.mode_set[j]);
|
||||
sma1307->set.status = false;
|
||||
@ -1799,7 +1793,6 @@ static void sma1307_setting_loaded(struct sma1307_priv *sma1307, const char *fil
|
||||
}
|
||||
}
|
||||
|
||||
kfree(data);
|
||||
sma1307->set.status = true;
|
||||
|
||||
}
|
||||
|
@ -568,7 +568,7 @@ static const struct sdw_port_config wsa883x_pconfig[WSA883X_MAX_SWR_PORTS] = {
|
||||
},
|
||||
[WSA883X_PORT_VISENSE] = {
|
||||
.num = WSA883X_PORT_VISENSE + 1,
|
||||
.ch_mask = 0x3,
|
||||
.ch_mask = 0x1,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -891,7 +891,7 @@ static const struct sdw_port_config wsa884x_pconfig[WSA884X_MAX_SWR_PORTS] = {
|
||||
},
|
||||
[WSA884X_PORT_VISENSE] = {
|
||||
.num = WSA884X_PORT_VISENSE + 1,
|
||||
.ch_mask = 0x3,
|
||||
.ch_mask = 0x1,
|
||||
},
|
||||
[WSA884X_PORT_CPS] = {
|
||||
.num = WSA884X_PORT_CPS + 1,
|
||||
|
@ -772,6 +772,8 @@ static int imx_card_probe(struct platform_device *pdev)
|
||||
data->dapm_routes[i].sink =
|
||||
devm_kasprintf(&pdev->dev, GFP_KERNEL, "%d %s",
|
||||
i + 1, "Playback");
|
||||
if (!data->dapm_routes[i].sink)
|
||||
return -ENOMEM;
|
||||
data->dapm_routes[i].source = "CPU-Playback";
|
||||
}
|
||||
}
|
||||
@ -789,6 +791,8 @@ static int imx_card_probe(struct platform_device *pdev)
|
||||
data->dapm_routes[i].source =
|
||||
devm_kasprintf(&pdev->dev, GFP_KERNEL, "%d %s",
|
||||
i + 1, "Capture");
|
||||
if (!data->dapm_routes[i].source)
|
||||
return -ENOMEM;
|
||||
data->dapm_routes[i].sink = "CPU-Capture";
|
||||
}
|
||||
}
|
||||
|
@ -24,8 +24,8 @@
|
||||
#define PLAYBACK_MIN_PERIOD_SIZE 128
|
||||
#define CAPTURE_MIN_NUM_PERIODS 2
|
||||
#define CAPTURE_MAX_NUM_PERIODS 8
|
||||
#define CAPTURE_MAX_PERIOD_SIZE 4096
|
||||
#define CAPTURE_MIN_PERIOD_SIZE 320
|
||||
#define CAPTURE_MAX_PERIOD_SIZE 65536
|
||||
#define CAPTURE_MIN_PERIOD_SIZE 6144
|
||||
#define BUFFER_BYTES_MAX (PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_SIZE)
|
||||
#define BUFFER_BYTES_MIN (PLAYBACK_MIN_NUM_PERIODS * PLAYBACK_MIN_PERIOD_SIZE)
|
||||
#define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024)
|
||||
@ -64,12 +64,12 @@ struct q6apm_dai_rtd {
|
||||
phys_addr_t phys;
|
||||
unsigned int pcm_size;
|
||||
unsigned int pcm_count;
|
||||
unsigned int pos; /* Buffer position */
|
||||
unsigned int periods;
|
||||
unsigned int bytes_sent;
|
||||
unsigned int bytes_received;
|
||||
unsigned int copied_total;
|
||||
uint16_t bits_per_sample;
|
||||
snd_pcm_uframes_t queue_ptr;
|
||||
bool next_track;
|
||||
enum stream_state state;
|
||||
struct q6apm_graph *graph;
|
||||
@ -123,25 +123,16 @@ static void event_handler(uint32_t opcode, uint32_t token, void *payload, void *
|
||||
{
|
||||
struct q6apm_dai_rtd *prtd = priv;
|
||||
struct snd_pcm_substream *substream = prtd->substream;
|
||||
unsigned long flags;
|
||||
|
||||
switch (opcode) {
|
||||
case APM_CLIENT_EVENT_CMD_EOS_DONE:
|
||||
prtd->state = Q6APM_STREAM_STOPPED;
|
||||
break;
|
||||
case APM_CLIENT_EVENT_DATA_WRITE_DONE:
|
||||
spin_lock_irqsave(&prtd->lock, flags);
|
||||
prtd->pos += prtd->pcm_count;
|
||||
spin_unlock_irqrestore(&prtd->lock, flags);
|
||||
snd_pcm_period_elapsed(substream);
|
||||
if (prtd->state == Q6APM_STREAM_RUNNING)
|
||||
q6apm_write_async(prtd->graph, prtd->pcm_count, 0, 0, 0);
|
||||
|
||||
break;
|
||||
case APM_CLIENT_EVENT_DATA_READ_DONE:
|
||||
spin_lock_irqsave(&prtd->lock, flags);
|
||||
prtd->pos += prtd->pcm_count;
|
||||
spin_unlock_irqrestore(&prtd->lock, flags);
|
||||
snd_pcm_period_elapsed(substream);
|
||||
if (prtd->state == Q6APM_STREAM_RUNNING)
|
||||
q6apm_read(prtd->graph);
|
||||
@ -248,7 +239,6 @@ static int q6apm_dai_prepare(struct snd_soc_component *component,
|
||||
}
|
||||
|
||||
prtd->pcm_count = snd_pcm_lib_period_bytes(substream);
|
||||
prtd->pos = 0;
|
||||
/* rate and channels are sent to audio driver */
|
||||
ret = q6apm_graph_media_format_shmem(prtd->graph, &cfg);
|
||||
if (ret < 0) {
|
||||
@ -294,6 +284,27 @@ static int q6apm_dai_prepare(struct snd_soc_component *component,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int q6apm_dai_ack(struct snd_soc_component *component, struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct q6apm_dai_rtd *prtd = runtime->private_data;
|
||||
int i, ret = 0, avail_periods;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
avail_periods = (runtime->control->appl_ptr - prtd->queue_ptr)/runtime->period_size;
|
||||
for (i = 0; i < avail_periods; i++) {
|
||||
ret = q6apm_write_async(prtd->graph, prtd->pcm_count, 0, 0, NO_TIMESTAMP);
|
||||
if (ret < 0) {
|
||||
dev_err(component->dev, "Error queuing playback buffer %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
prtd->queue_ptr += runtime->period_size;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int q6apm_dai_trigger(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream, int cmd)
|
||||
{
|
||||
@ -305,9 +316,6 @@ static int q6apm_dai_trigger(struct snd_soc_component *component,
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
/* start writing buffers for playback only as we already queued capture buffers */
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
ret = q6apm_write_async(prtd->graph, prtd->pcm_count, 0, 0, 0);
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
/* TODO support be handled via SoftPause Module */
|
||||
@ -377,13 +385,14 @@ static int q6apm_dai_open(struct snd_soc_component *component,
|
||||
}
|
||||
}
|
||||
|
||||
ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32);
|
||||
/* setup 10ms latency to accommodate DSP restrictions */
|
||||
ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 480);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "constraint for period bytes step ret = %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32);
|
||||
ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 480);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "constraint for buffer bytes step ret = %d\n", ret);
|
||||
goto err;
|
||||
@ -428,16 +437,12 @@ static snd_pcm_uframes_t q6apm_dai_pointer(struct snd_soc_component *component,
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct q6apm_dai_rtd *prtd = runtime->private_data;
|
||||
snd_pcm_uframes_t ptr;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&prtd->lock, flags);
|
||||
if (prtd->pos == prtd->pcm_size)
|
||||
prtd->pos = 0;
|
||||
ptr = q6apm_get_hw_pointer(prtd->graph, substream->stream) * runtime->period_size;
|
||||
if (ptr)
|
||||
return ptr - 1;
|
||||
|
||||
ptr = bytes_to_frames(runtime, prtd->pos);
|
||||
spin_unlock_irqrestore(&prtd->lock, flags);
|
||||
|
||||
return ptr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int q6apm_dai_hw_params(struct snd_soc_component *component,
|
||||
@ -652,8 +657,6 @@ static int q6apm_dai_compr_set_params(struct snd_soc_component *component,
|
||||
prtd->pcm_size = runtime->fragments * runtime->fragment_size;
|
||||
prtd->bits_per_sample = 16;
|
||||
|
||||
prtd->pos = 0;
|
||||
|
||||
if (prtd->next_track != true) {
|
||||
memcpy(&prtd->codec, codec, sizeof(*codec));
|
||||
|
||||
@ -836,6 +839,7 @@ static const struct snd_soc_component_driver q6apm_fe_dai_component = {
|
||||
.hw_params = q6apm_dai_hw_params,
|
||||
.pointer = q6apm_dai_pointer,
|
||||
.trigger = q6apm_dai_trigger,
|
||||
.ack = q6apm_dai_ack,
|
||||
.compress_ops = &q6apm_dai_compress_ops,
|
||||
.use_dai_pcm_id = true,
|
||||
};
|
||||
|
@ -494,6 +494,19 @@ int q6apm_read(struct q6apm_graph *graph)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(q6apm_read);
|
||||
|
||||
int q6apm_get_hw_pointer(struct q6apm_graph *graph, int dir)
|
||||
{
|
||||
struct audioreach_graph_data *data;
|
||||
|
||||
if (dir == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
data = &graph->rx_data;
|
||||
else
|
||||
data = &graph->tx_data;
|
||||
|
||||
return (int)atomic_read(&data->hw_ptr);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(q6apm_get_hw_pointer);
|
||||
|
||||
static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op)
|
||||
{
|
||||
struct data_cmd_rsp_rd_sh_mem_ep_data_buffer_done_v2 *rd_done;
|
||||
@ -520,7 +533,8 @@ static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op)
|
||||
done = data->payload;
|
||||
phys = graph->rx_data.buf[token].phys;
|
||||
mutex_unlock(&graph->lock);
|
||||
|
||||
/* token numbering starts at 0 */
|
||||
atomic_set(&graph->rx_data.hw_ptr, token + 1);
|
||||
if (lower_32_bits(phys) == done->buf_addr_lsw &&
|
||||
upper_32_bits(phys) == done->buf_addr_msw) {
|
||||
graph->result.opcode = hdr->opcode;
|
||||
@ -553,6 +567,8 @@ static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op)
|
||||
rd_done = data->payload;
|
||||
phys = graph->tx_data.buf[hdr->token].phys;
|
||||
mutex_unlock(&graph->lock);
|
||||
/* token numbering starts at 0 */
|
||||
atomic_set(&graph->tx_data.hw_ptr, hdr->token + 1);
|
||||
|
||||
if (upper_32_bits(phys) == rd_done->buf_addr_msw &&
|
||||
lower_32_bits(phys) == rd_done->buf_addr_lsw) {
|
||||
|
@ -2,6 +2,7 @@
|
||||
#ifndef __Q6APM_H__
|
||||
#define __Q6APM_H__
|
||||
#include <linux/types.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/kernel.h>
|
||||
@ -77,6 +78,7 @@ struct audioreach_graph_data {
|
||||
uint32_t num_periods;
|
||||
uint32_t dsp_buf;
|
||||
uint32_t mem_map_handle;
|
||||
atomic_t hw_ptr;
|
||||
};
|
||||
|
||||
struct audioreach_graph {
|
||||
@ -150,4 +152,5 @@ int q6apm_enable_compress_module(struct device *dev, struct q6apm_graph *graph,
|
||||
int q6apm_remove_initial_silence(struct device *dev, struct q6apm_graph *graph, uint32_t samples);
|
||||
int q6apm_remove_trailing_silence(struct device *dev, struct q6apm_graph *graph, uint32_t samples);
|
||||
int q6apm_set_real_module_id(struct device *dev, struct q6apm_graph *graph, uint32_t codec_id);
|
||||
int q6apm_get_hw_pointer(struct q6apm_graph *graph, int dir);
|
||||
#endif /* __APM_GRAPH_ */
|
||||
|
@ -892,9 +892,7 @@ static int q6asm_dai_compr_set_params(struct snd_soc_component *component,
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "q6asm_open_write failed\n");
|
||||
q6asm_audio_client_free(prtd->audio_client);
|
||||
prtd->audio_client = NULL;
|
||||
return ret;
|
||||
goto open_err;
|
||||
}
|
||||
}
|
||||
|
||||
@ -903,7 +901,7 @@ static int q6asm_dai_compr_set_params(struct snd_soc_component *component,
|
||||
prtd->session_id, dir);
|
||||
if (ret) {
|
||||
dev_err(dev, "Stream reg failed ret:%d\n", ret);
|
||||
return ret;
|
||||
goto q6_err;
|
||||
}
|
||||
|
||||
ret = __q6asm_dai_compr_set_codec_params(component, stream,
|
||||
@ -911,7 +909,7 @@ static int q6asm_dai_compr_set_params(struct snd_soc_component *component,
|
||||
prtd->stream_id);
|
||||
if (ret) {
|
||||
dev_err(dev, "codec param setup failed ret:%d\n", ret);
|
||||
return ret;
|
||||
goto q6_err;
|
||||
}
|
||||
|
||||
ret = q6asm_map_memory_regions(dir, prtd->audio_client, prtd->phys,
|
||||
@ -920,12 +918,21 @@ static int q6asm_dai_compr_set_params(struct snd_soc_component *component,
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Buffer Mapping failed ret:%d\n", ret);
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto q6_err;
|
||||
}
|
||||
|
||||
prtd->state = Q6ASM_STREAM_RUNNING;
|
||||
|
||||
return 0;
|
||||
|
||||
q6_err:
|
||||
q6asm_cmd(prtd->audio_client, prtd->stream_id, CMD_CLOSE);
|
||||
|
||||
open_err:
|
||||
q6asm_audio_client_free(prtd->audio_client);
|
||||
prtd->audio_client = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int q6asm_dai_compr_set_metadata(struct snd_soc_component *component,
|
||||
|
@ -991,6 +991,10 @@ int hda_dsp_runtime_suspend(struct snd_sof_dev *sdev)
|
||||
if (!sdev->dspless_mode_selected) {
|
||||
/* cancel any attempt for DSP D0I3 */
|
||||
cancel_delayed_work_sync(&hda->d0i3_work);
|
||||
|
||||
/* Cancel the microphone privacy work if mic privacy is active */
|
||||
if (hda->mic_privacy.active)
|
||||
cancel_work_sync(&hda->mic_privacy.work);
|
||||
}
|
||||
|
||||
/* stop hda controller and power dsp off */
|
||||
@ -1017,6 +1021,10 @@ int hda_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state)
|
||||
if (!sdev->dspless_mode_selected) {
|
||||
/* cancel any attempt for DSP D0I3 */
|
||||
cancel_delayed_work_sync(&hda->d0i3_work);
|
||||
|
||||
/* Cancel the microphone privacy work if mic privacy is active */
|
||||
if (hda->mic_privacy.active)
|
||||
cancel_work_sync(&hda->mic_privacy.work);
|
||||
}
|
||||
|
||||
if (target_state == SOF_DSP_PM_D0) {
|
||||
|
@ -968,6 +968,10 @@ void hda_dsp_remove(struct snd_sof_dev *sdev)
|
||||
if (sdev->dspless_mode_selected)
|
||||
goto skip_disable_dsp;
|
||||
|
||||
/* Cancel the microphone privacy work if mic privacy is active */
|
||||
if (hda->mic_privacy.active)
|
||||
cancel_work_sync(&hda->mic_privacy.work);
|
||||
|
||||
/* no need to check for error as the DSP will be disabled anyway */
|
||||
if (chip && chip->power_down_dsp)
|
||||
chip->power_down_dsp(sdev);
|
||||
|
@ -487,6 +487,11 @@ enum sof_hda_D0_substate {
|
||||
SOF_HDA_DSP_PM_D0I3, /* low power D0 substate */
|
||||
};
|
||||
|
||||
struct sof_ace3_mic_privacy {
|
||||
bool active;
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
/* represents DSP HDA controller frontend - i.e. host facing control */
|
||||
struct sof_intel_hda_dev {
|
||||
bool imrboot_supported;
|
||||
@ -542,6 +547,9 @@ struct sof_intel_hda_dev {
|
||||
/* Intel NHLT information */
|
||||
struct nhlt_acpi_table *nhlt;
|
||||
|
||||
/* work queue for mic privacy state change notification sending */
|
||||
struct sof_ace3_mic_privacy mic_privacy;
|
||||
|
||||
/*
|
||||
* Pointing to the IPC message if immediate sending was not possible
|
||||
* because the downlink communication channel was BUSY at the time.
|
||||
|
@ -27,22 +27,44 @@ static bool sof_ptl_check_mic_privacy_irq(struct snd_sof_dev *sdev, bool alt,
|
||||
return hdac_bus_eml_is_mic_privacy_changed(sof_to_bus(sdev), alt, elid);
|
||||
}
|
||||
|
||||
static void sof_ptl_mic_privacy_work(struct work_struct *work)
|
||||
{
|
||||
struct sof_intel_hda_dev *hdev = container_of(work,
|
||||
struct sof_intel_hda_dev,
|
||||
mic_privacy.work);
|
||||
struct hdac_bus *bus = &hdev->hbus.core;
|
||||
struct snd_sof_dev *sdev = dev_get_drvdata(bus->dev);
|
||||
bool state;
|
||||
|
||||
/*
|
||||
* The microphone privacy state is only available via Soundwire shim
|
||||
* in PTL
|
||||
* The work is only scheduled on change.
|
||||
*/
|
||||
state = hdac_bus_eml_get_mic_privacy_state(bus, 1,
|
||||
AZX_REG_ML_LEPTR_ID_SDW);
|
||||
sof_ipc4_mic_privacy_state_change(sdev, state);
|
||||
}
|
||||
|
||||
static void sof_ptl_process_mic_privacy(struct snd_sof_dev *sdev, bool alt,
|
||||
int elid)
|
||||
{
|
||||
bool state;
|
||||
struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata;
|
||||
|
||||
if (!alt || elid != AZX_REG_ML_LEPTR_ID_SDW)
|
||||
return;
|
||||
|
||||
state = hdac_bus_eml_get_mic_privacy_state(sof_to_bus(sdev), alt, elid);
|
||||
|
||||
sof_ipc4_mic_privacy_state_change(sdev, state);
|
||||
/*
|
||||
* Schedule the work to read the microphone privacy state and send IPC
|
||||
* message about the new state to the firmware
|
||||
*/
|
||||
schedule_work(&hdev->mic_privacy.work);
|
||||
}
|
||||
|
||||
static void sof_ptl_set_mic_privacy(struct snd_sof_dev *sdev,
|
||||
struct sof_ipc4_intel_mic_privacy_cap *caps)
|
||||
{
|
||||
struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata;
|
||||
u32 micpvcp;
|
||||
|
||||
if (!caps || !caps->capabilities_length)
|
||||
@ -58,6 +80,9 @@ static void sof_ptl_set_mic_privacy(struct snd_sof_dev *sdev,
|
||||
hdac_bus_eml_set_mic_privacy_mask(sof_to_bus(sdev), true,
|
||||
AZX_REG_ML_LEPTR_ID_SDW,
|
||||
PTL_MICPVCP_GET_SDW_MASK(micpvcp));
|
||||
|
||||
INIT_WORK(&hdev->mic_privacy.work, sof_ptl_mic_privacy_work);
|
||||
hdev->mic_privacy.active = true;
|
||||
}
|
||||
|
||||
int sof_ptl_set_ops(struct snd_sof_dev *sdev, struct snd_sof_dsp_ops *dsp_ops)
|
||||
|
Loading…
x
Reference in New Issue
Block a user