mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
sound fixes for 6.5-rc3
A pile of fixes that have been gathered since the previous PR. Most of changes are device-specific, and nothing looks too scary. - A memory leak fix in ALSA sequencer code in 6.5-rc - Many fixes for ASoC Qualcomm CODEC drivers, covering SoundWire probe problems - A series of ASoC AMD fixes - A few fixes and cleanups of selftest stuff - HD-audio codec fixes and quirks for Clevo, HP, Lenovo, Dell -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmS5W0wOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE/e7A/9F0DDB2yIJE8TEcivDs0p7jFsq9jfMjTmoydD nSmjKLuMOHMLix3yw+94LYLwuWpL1pwO5h8zR0Nf5UpEbolRg0JmDAfIcFfOaUjd hoaSX07UitTZIP0hno5d6Nh6T5M4KGDXreAvfwOmENnVTWkuhxusQnSfw3Ou1+Qg hZFBSfpP9gajiWun/+vsS51to7brNZg01bIihQJz+mWBzkkEfm3+reXwu5RiZDco p2drxqR+oZZq7LUjBfbsr10MmC8S7lv5fI6Vgu+ZKT20wu8h+X6a7RA/UiVJUifo Oabd+zJd33e2g59ylEp3EadFWSoSrTmDdF2PmncbNc5UtGrJQtR68YkucoWfdvYK qde/7P7Dyb3yd4aJM5R8oPg1ak6mLeWSboSwkL4ld2j3fHFFjHkh4EdY43yswI3E I5/umVHTsqmVZaB9s15X6xwT3bgtREHEswVs4dbnicV67wJl7xup4t0UvIK6RR6A kWudMyGd5S7ne/3xFIfRG+tdcT4ZObGEtnL0+zU6V10e1EzXltxPZqJbNLVKnFUO JNNJ5Sx6g2lk1Y1Yki9zCZPuBUa35QLWnPbOOCEUQjOEWCrnOOO5DJjthz4slUzX pYHSdO4V3vNyddP98nMyh1mz0t3TWIWAqEvrG2puM+sdWK7wT2Ha3JtlyUA7L9lH AXAWP3c= =ZvTz -----END PGP SIGNATURE----- Merge tag 'sound-6.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A pile of fixes that have been gathered since the previous pull. Most of changes are device-specific, and nothing looks too scary. - A memory leak fix in ALSA sequencer code in 6.5-rc - Many fixes for ASoC Qualcomm CODEC drivers, covering SoundWire probe problems - A series of ASoC AMD fixes - A few fixes and cleanups of selftest stuff - HD-audio codec fixes and quirks for Clevo, HP, Lenovo, Dell" * tag 'sound-6.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (52 commits) ALSA: hda/realtek: Add support for DELL Oasis 13/14/16 laptops ALSA: hda/realtek: Fix generic fixup definition for cs35l41 amp ALSA: hda/realtek: Enable Mute LED on HP Laptop 15s-eq2xxx selftests: ALSA: Add test-pcmtest-driver to .gitignore ALSA: hda/realtek: Add quirk for Clevo NS70AU ASoC: fsl_sai: Disable bit clock with transmitter ALSA: seq: Fix memory leak at error path in snd_seq_create_port() ASoC: SOF: ipc3-dtrace: uninitialized data in dfsentry_trace_filter_write() ASoC: cs42l51: fix driver to properly autoload with automatic module loading MAINTAINERS: Redo addition of ssm3515 to APPLE SOUND ASoC: rt5640: Fix the issue of speaker noise ALSA: hda/realtek - remove 3k pull low procedure selftests: ALSA: Fix fclose on an already fclosed file pointer ALSA: pcmtest: Don't use static storage to track per device data ALSA: pcmtest: Convert to platform remove callback returning void ASoC: dt-bindings: audio-graph-card2: Drop incomplete example ASoC: dt-bindings: Update maintainer email id ASoC: amd: ps: Fix extraneous error messages ASoC: fsl_sai: Revert "ASoC: fsl_sai: Enable MCTL_MCLK_EN bit for master mode" ASoC: codecs: SND_SOC_WCD934X should select REGMAP_IRQ ...
This commit is contained in:
commit
3c05547a5f
@ -39,22 +39,4 @@ required:
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
sound {
|
||||
compatible = "audio-graph-card2";
|
||||
|
||||
links = <&cpu_port>;
|
||||
};
|
||||
|
||||
cpu {
|
||||
compatible = "cpu-driver";
|
||||
|
||||
cpu_port: port { cpu_ep: endpoint { remote-endpoint = <&codec_ep>; }; };
|
||||
};
|
||||
|
||||
codec {
|
||||
compatible = "codec-driver";
|
||||
|
||||
port { codec_ep: endpoint { remote-endpoint = <&cpu_ep>; }; };
|
||||
};
|
||||
...
|
||||
|
@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
title: Google SC7180-Trogdor ASoC sound card driver
|
||||
|
||||
maintainers:
|
||||
- Rohit kumar <rohitkr@codeaurora.org>
|
||||
- Rohit kumar <quic_rohkumar@quicinc.com>
|
||||
- Cheng-Yi Chiang <cychiang@chromium.org>
|
||||
|
||||
description:
|
||||
|
@ -8,7 +8,7 @@ title: Qualcomm Technologies Inc. LPASS CPU dai driver
|
||||
|
||||
maintainers:
|
||||
- Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
- Rohit kumar <rohitkr@codeaurora.org>
|
||||
- Rohit kumar <quic_rohkumar@quicinc.com>
|
||||
|
||||
description: |
|
||||
Qualcomm Technologies Inc. SOC Low-Power Audio SubSystem (LPASS) that consist
|
||||
|
@ -1865,9 +1865,11 @@ M: Martin Povišer <povik+lin@cutebit.org>
|
||||
L: asahi@lists.linux.dev
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/sound/adi,ssm3515.yaml
|
||||
F: Documentation/devicetree/bindings/sound/apple,*
|
||||
F: sound/soc/apple/*
|
||||
F: sound/soc/codecs/cs42l83-i2c.c
|
||||
F: sound/soc/codecs/ssm3515.c
|
||||
|
||||
ARM/APPLE MACHINE SUPPORT
|
||||
M: Hector Martin <marcan@marcan.st>
|
||||
|
@ -149,6 +149,7 @@ int snd_seq_create_port(struct snd_seq_client *client, int port,
|
||||
write_lock_irq(&client->ports_lock);
|
||||
list_for_each_entry(p, &client->ports_list_head, list) {
|
||||
if (p->addr.port == port) {
|
||||
kfree(new_port);
|
||||
num = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
|
@ -110,8 +110,6 @@ struct pcmtst_buf_iter {
|
||||
struct timer_list timer_instance;
|
||||
};
|
||||
|
||||
static struct pcmtst *pcmtst;
|
||||
|
||||
static struct snd_pcm_hardware snd_pcmtst_hw = {
|
||||
.info = (SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
||||
@ -552,6 +550,7 @@ _err_free_chip:
|
||||
static int pcmtst_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_card *card;
|
||||
struct pcmtst *pcmtst;
|
||||
int err;
|
||||
|
||||
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
|
||||
@ -573,13 +572,16 @@ static int pcmtst_probe(struct platform_device *pdev)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
platform_set_drvdata(pdev, pcmtst);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pdev_remove(struct platform_device *dev)
|
||||
static void pdev_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pcmtst *pcmtst = platform_get_drvdata(pdev);
|
||||
|
||||
snd_pcmtst_free(pcmtst);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_device pcmtst_pdev = {
|
||||
@ -589,7 +591,7 @@ static struct platform_device pcmtst_pdev = {
|
||||
|
||||
static struct platform_driver pcmtst_pdrv = {
|
||||
.probe = pcmtst_probe,
|
||||
.remove = pdev_remove,
|
||||
.remove_new = pdev_remove,
|
||||
.driver = {
|
||||
.name = "pcmtest",
|
||||
},
|
||||
|
@ -122,6 +122,7 @@ struct alc_spec {
|
||||
unsigned int ultra_low_power:1;
|
||||
unsigned int has_hs_key:1;
|
||||
unsigned int no_internal_mic_pin:1;
|
||||
unsigned int en_3kpull_low:1;
|
||||
|
||||
/* for PLL fix */
|
||||
hda_nid_t pll_nid;
|
||||
@ -3622,6 +3623,7 @@ static void alc256_shutup(struct hda_codec *codec)
|
||||
if (!hp_pin)
|
||||
hp_pin = 0x21;
|
||||
|
||||
alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
|
||||
hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
|
||||
|
||||
if (hp_pin_sense)
|
||||
@ -3638,8 +3640,7 @@ static void alc256_shutup(struct hda_codec *codec)
|
||||
/* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
|
||||
* when booting with headset plugged. So skip setting it for the codec alc257
|
||||
*/
|
||||
if (codec->core.vendor_id != 0x10ec0236 &&
|
||||
codec->core.vendor_id != 0x10ec0257)
|
||||
if (spec->en_3kpull_low)
|
||||
alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
|
||||
|
||||
if (!spec->no_shutup_pins)
|
||||
@ -4623,6 +4624,21 @@ static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
|
||||
}
|
||||
}
|
||||
|
||||
static void alc236_fixup_hp_mute_led_coefbit2(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 = 0x07;
|
||||
spec->mute_led_coef.mask = 1;
|
||||
spec->mute_led_coef.on = 1;
|
||||
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)
|
||||
@ -7143,6 +7159,7 @@ enum {
|
||||
ALC285_FIXUP_HP_GPIO_LED,
|
||||
ALC285_FIXUP_HP_MUTE_LED,
|
||||
ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
|
||||
ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
|
||||
ALC236_FIXUP_HP_GPIO_LED,
|
||||
ALC236_FIXUP_HP_MUTE_LED,
|
||||
ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
|
||||
@ -7213,6 +7230,7 @@ enum {
|
||||
ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
|
||||
ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
|
||||
ALC236_FIXUP_DELL_DUAL_CODECS,
|
||||
ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
|
||||
};
|
||||
|
||||
/* A special fixup for Lenovo C940 and Yoga Duet 7;
|
||||
@ -8632,6 +8650,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc285_fixup_hp_spectre_x360_mute_led,
|
||||
},
|
||||
[ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc236_fixup_hp_mute_led_coefbit2,
|
||||
},
|
||||
[ALC236_FIXUP_HP_GPIO_LED] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc236_fixup_hp_gpio_led,
|
||||
@ -9145,8 +9167,6 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
[ALC287_FIXUP_CS35L41_I2C_2] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cs35l41_fixup_i2c_two,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
|
||||
},
|
||||
[ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
@ -9283,6 +9303,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
},
|
||||
[ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cs35l41_fixup_i2c_two,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
@ -9393,6 +9419,14 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
|
||||
SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
|
||||
SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
|
||||
SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis MLK 14 RPL-P", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
|
||||
@ -9516,6 +9550,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||
SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
|
||||
@ -9727,6 +9762,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
@ -9810,14 +9846,14 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
||||
SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
||||
SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
|
||||
@ -10682,6 +10718,8 @@ static int patch_alc269(struct hda_codec *codec)
|
||||
spec->shutup = alc256_shutup;
|
||||
spec->init_hook = alc256_init;
|
||||
spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
|
||||
if (codec->bus->pci->vendor == PCI_VENDOR_ID_AMD)
|
||||
spec->en_3kpull_low = true;
|
||||
break;
|
||||
case 0x10ec0257:
|
||||
spec->codec_variant = ALC269_TYPE_ALC257;
|
||||
|
@ -173,7 +173,7 @@ int snd_amd_acp_find_config(struct pci_dev *pci);
|
||||
|
||||
static inline u64 acp_get_byte_count(struct acp_dev_data *adata, int dai_id, int direction)
|
||||
{
|
||||
u64 byte_count, low = 0, high = 0;
|
||||
u64 byte_count = 0, low = 0, high = 0;
|
||||
|
||||
if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
switch (dai_id) {
|
||||
@ -191,7 +191,7 @@ static inline u64 acp_get_byte_count(struct acp_dev_data *adata, int dai_id, int
|
||||
break;
|
||||
default:
|
||||
dev_err(adata->dev, "Invalid dai id %x\n", dai_id);
|
||||
return -EINVAL;
|
||||
goto POINTER_RETURN_BYTES;
|
||||
}
|
||||
} else {
|
||||
switch (dai_id) {
|
||||
@ -213,12 +213,13 @@ static inline u64 acp_get_byte_count(struct acp_dev_data *adata, int dai_id, int
|
||||
break;
|
||||
default:
|
||||
dev_err(adata->dev, "Invalid dai id %x\n", dai_id);
|
||||
return -EINVAL;
|
||||
goto POINTER_RETURN_BYTES;
|
||||
}
|
||||
}
|
||||
/* Get 64 bit value from two 32 bit registers */
|
||||
byte_count = (high << 32) | low;
|
||||
|
||||
POINTER_RETURN_BYTES:
|
||||
return byte_count;
|
||||
}
|
||||
|
||||
|
@ -116,8 +116,28 @@
|
||||
#define ACP63_SDW0_DMA_MAX_STREAMS 6
|
||||
#define ACP63_SDW1_DMA_MAX_STREAMS 2
|
||||
#define ACP_P1_AUDIO_TX_THRESHOLD 6
|
||||
|
||||
/*
|
||||
* Below entries describes SDW0 instance DMA stream id and DMA irq bit mapping
|
||||
* in ACP_EXTENAL_INTR_CNTL register.
|
||||
* Stream id IRQ Bit
|
||||
* 0 (SDW0_AUDIO0_TX) 28
|
||||
* 1 (SDW0_AUDIO1_TX) 26
|
||||
* 2 (SDW0_AUDIO2_TX) 24
|
||||
* 3 (SDW0_AUDIO0_RX) 27
|
||||
* 4 (SDW0_AUDIO1_RX) 25
|
||||
* 5 (SDW0_AUDIO2_RX) 23
|
||||
*/
|
||||
#define SDW0_DMA_TX_IRQ_MASK(i) (ACP_AUDIO0_TX_THRESHOLD - (2 * (i)))
|
||||
#define SDW0_DMA_RX_IRQ_MASK(i) (ACP_AUDIO0_RX_THRESHOLD - (2 * (i)))
|
||||
#define SDW0_DMA_RX_IRQ_MASK(i) (ACP_AUDIO0_RX_THRESHOLD - (2 * ((i) - 3)))
|
||||
|
||||
/*
|
||||
* Below entries describes SDW1 instance DMA stream id and DMA irq bit mapping
|
||||
* in ACP_EXTENAL_INTR_CNTL1 register.
|
||||
* Stream id IRQ Bit
|
||||
* 0 (SDW1_AUDIO1_TX) 6
|
||||
* 1 (SDW1_AUDIO1_RX) 5
|
||||
*/
|
||||
#define SDW1_DMA_IRQ_MASK(i) (ACP_P1_AUDIO_TX_THRESHOLD - (i))
|
||||
|
||||
#define ACP_DELAY_US 5
|
||||
|
@ -257,7 +257,7 @@ static int sdw_amd_scan_controller(struct device *dev)
|
||||
&sdw_manager_bitmap, 1);
|
||||
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to read mipi-sdw-manager-list: %d\n", ret);
|
||||
dev_dbg(dev, "Failed to read mipi-sdw-manager-list: %d\n", ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
count = hweight32(sdw_manager_bitmap);
|
||||
@ -641,7 +641,7 @@ static int snd_acp63_probe(struct pci_dev *pci,
|
||||
ret = get_acp63_device_config(val, pci, adata);
|
||||
/* ACP PCI driver probe should be continued even PDM or SoundWire Devices are not found */
|
||||
if (ret) {
|
||||
dev_err(&pci->dev, "get acp device config failed:%d\n", ret);
|
||||
dev_dbg(&pci->dev, "get acp device config failed:%d\n", ret);
|
||||
goto skip_pdev_creation;
|
||||
}
|
||||
ret = create_acp63_platform_devs(pci, adata, addr);
|
||||
|
@ -30,7 +30,7 @@ static struct sdw_dma_ring_buf_reg sdw0_dma_ring_buf_reg[ACP63_SDW0_DMA_MAX_STRE
|
||||
ACP_AUDIO2_TX_LINEARPOSITIONCNTR_LOW, ACP_AUDIO2_TX_LINEARPOSITIONCNTR_HIGH},
|
||||
{ACP_AUDIO0_RX_DMA_SIZE, ACP_AUDIO0_RX_FIFOADDR, ACP_AUDIO0_RX_FIFOSIZE,
|
||||
ACP_AUDIO0_RX_RINGBUFSIZE, ACP_AUDIO0_RX_RINGBUFADDR, ACP_AUDIO0_RX_INTR_WATERMARK_SIZE,
|
||||
ACP_AUDIO0_TX_LINEARPOSITIONCNTR_LOW, ACP_AUDIO0_TX_LINEARPOSITIONCNTR_HIGH},
|
||||
ACP_AUDIO0_RX_LINEARPOSITIONCNTR_LOW, ACP_AUDIO0_RX_LINEARPOSITIONCNTR_HIGH},
|
||||
{ACP_AUDIO1_RX_DMA_SIZE, ACP_AUDIO1_RX_FIFOADDR, ACP_AUDIO1_RX_FIFOSIZE,
|
||||
ACP_AUDIO1_RX_RINGBUFSIZE, ACP_AUDIO1_RX_RINGBUFADDR, ACP_AUDIO1_RX_INTR_WATERMARK_SIZE,
|
||||
ACP_AUDIO1_RX_LINEARPOSITIONCNTR_LOW, ACP_AUDIO1_RX_LINEARPOSITIONCNTR_HIGH},
|
||||
@ -39,6 +39,11 @@ static struct sdw_dma_ring_buf_reg sdw0_dma_ring_buf_reg[ACP63_SDW0_DMA_MAX_STRE
|
||||
ACP_AUDIO2_RX_LINEARPOSITIONCNTR_LOW, ACP_AUDIO2_RX_LINEARPOSITIONCNTR_HIGH}
|
||||
};
|
||||
|
||||
/*
|
||||
* SDW1 instance supports one TX stream and one RX stream.
|
||||
* For TX/RX streams DMA registers programming for SDW1 instance, it uses ACP_P1_AUDIO1 register
|
||||
* set as per hardware register documentation
|
||||
*/
|
||||
static struct sdw_dma_ring_buf_reg sdw1_dma_ring_buf_reg[ACP63_SDW1_DMA_MAX_STREAMS] = {
|
||||
{ACP_P1_AUDIO1_TX_DMA_SIZE, ACP_P1_AUDIO1_TX_FIFOADDR, ACP_P1_AUDIO1_TX_FIFOSIZE,
|
||||
ACP_P1_AUDIO1_TX_RINGBUFSIZE, ACP_P1_AUDIO1_TX_RINGBUFADDR,
|
||||
@ -59,6 +64,12 @@ static u32 sdw0_dma_enable_reg[ACP63_SDW0_DMA_MAX_STREAMS] = {
|
||||
ACP_SW0_AUDIO2_RX_EN,
|
||||
};
|
||||
|
||||
/*
|
||||
* SDW1 instance supports one TX stream and one RX stream.
|
||||
* For TX/RX streams DMA enable register programming for SDW1 instance,
|
||||
* it uses ACP_SW1_AUDIO1_TX_EN and ACP_SW1_AUDIO1_RX_EN registers
|
||||
* as per hardware register documentation.
|
||||
*/
|
||||
static u32 sdw1_dma_enable_reg[ACP63_SDW1_DMA_MAX_STREAMS] = {
|
||||
ACP_SW1_AUDIO1_TX_EN,
|
||||
ACP_SW1_AUDIO1_RX_EN,
|
||||
@ -307,12 +318,13 @@ static u64 acp63_sdw_get_byte_count(struct acp_sdw_dma_stream *stream, void __io
|
||||
pos_high_reg = sdw1_dma_ring_buf_reg[stream->stream_id].pos_high_reg;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
goto POINTER_RETURN_BYTES;
|
||||
}
|
||||
if (pos_low_reg) {
|
||||
byte_count.bcount.high = readl(acp_base + pos_high_reg);
|
||||
byte_count.bcount.low = readl(acp_base + pos_low_reg);
|
||||
}
|
||||
POINTER_RETURN_BYTES:
|
||||
return byte_count.bytescount;
|
||||
}
|
||||
|
||||
|
@ -715,6 +715,7 @@ config SND_SOC_CS35L41_I2C
|
||||
|
||||
config SND_SOC_CS35L45
|
||||
tristate
|
||||
select REGMAP_IRQ
|
||||
|
||||
config SND_SOC_CS35L45_SPI
|
||||
tristate "Cirrus Logic CS35L45 CODEC (SPI)"
|
||||
@ -1942,6 +1943,7 @@ config SND_SOC_WCD934X
|
||||
tristate "WCD9340/WCD9341 Codec"
|
||||
depends on COMMON_CLK
|
||||
depends on SLIMBUS
|
||||
select REGMAP_IRQ
|
||||
select REGMAP_SLIMBUS
|
||||
select SND_SOC_WCD_MBHC
|
||||
depends on MFD_WCD934X || COMPILE_TEST
|
||||
|
@ -19,6 +19,12 @@ static struct i2c_device_id cs42l51_i2c_id[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, cs42l51_i2c_id);
|
||||
|
||||
const struct of_device_id cs42l51_of_match[] = {
|
||||
{ .compatible = "cirrus,cs42l51", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, cs42l51_of_match);
|
||||
|
||||
static int cs42l51_i2c_probe(struct i2c_client *i2c)
|
||||
{
|
||||
struct regmap_config config;
|
||||
|
@ -823,13 +823,6 @@ int __maybe_unused cs42l51_resume(struct device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cs42l51_resume);
|
||||
|
||||
const struct of_device_id cs42l51_of_match[] = {
|
||||
{ .compatible = "cirrus,cs42l51", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, cs42l51_of_match);
|
||||
EXPORT_SYMBOL_GPL(cs42l51_of_match);
|
||||
|
||||
MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
|
||||
MODULE_DESCRIPTION("Cirrus Logic CS42L51 ALSA SoC Codec Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -16,7 +16,6 @@ int cs42l51_probe(struct device *dev, struct regmap *regmap);
|
||||
void cs42l51_remove(struct device *dev);
|
||||
int __maybe_unused cs42l51_suspend(struct device *dev);
|
||||
int __maybe_unused cs42l51_resume(struct device *dev);
|
||||
extern const struct of_device_id cs42l51_of_match[];
|
||||
|
||||
#define CS42L51_CHIP_ID 0x1B
|
||||
#define CS42L51_CHIP_REV_A 0x00
|
||||
|
@ -53,7 +53,6 @@ static const struct reg_sequence init_list[] = {
|
||||
{RT5640_PR_BASE + 0x3d, 0x3600},
|
||||
{RT5640_PR_BASE + 0x12, 0x0aa8},
|
||||
{RT5640_PR_BASE + 0x14, 0x0aaa},
|
||||
{RT5640_PR_BASE + 0x20, 0x6110},
|
||||
{RT5640_PR_BASE + 0x21, 0xe0e0},
|
||||
{RT5640_PR_BASE + 0x23, 0x1804},
|
||||
};
|
||||
@ -2567,7 +2566,8 @@ static void rt5640_enable_jack_detect(struct snd_soc_component *component,
|
||||
if (jack_data && jack_data->use_platform_clock)
|
||||
rt5640->use_platform_clock = jack_data->use_platform_clock;
|
||||
|
||||
ret = request_irq(rt5640->irq, rt5640_irq,
|
||||
ret = devm_request_threaded_irq(component->dev, rt5640->irq,
|
||||
NULL, rt5640_irq,
|
||||
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
"rt5640", rt5640);
|
||||
if (ret) {
|
||||
@ -2622,8 +2622,9 @@ static void rt5640_enable_hda_jack_detect(
|
||||
|
||||
rt5640->jack = jack;
|
||||
|
||||
ret = request_irq(rt5640->irq, rt5640_irq,
|
||||
IRQF_TRIGGER_RISING | IRQF_ONESHOT, "rt5640", rt5640);
|
||||
ret = devm_request_threaded_irq(component->dev, rt5640->irq,
|
||||
NULL, rt5640_irq, IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
||||
"rt5640", rt5640);
|
||||
if (ret) {
|
||||
dev_warn(component->dev, "Failed to reguest IRQ %d: %d\n", rt5640->irq, ret);
|
||||
rt5640->irq = -ENXIO;
|
||||
|
@ -3950,7 +3950,11 @@ static int rt5645_i2c_probe(struct i2c_client *i2c)
|
||||
* read and power On.
|
||||
*/
|
||||
msleep(TIME_TO_POWER_MS);
|
||||
regmap_read(regmap, RT5645_VENDOR_ID2, &val);
|
||||
ret = regmap_read(regmap, RT5645_VENDOR_ID2, &val);
|
||||
if (ret < 0) {
|
||||
dev_err(&i2c->dev, "Failed to read: 0x%02X\n, ret = %d", RT5645_VENDOR_ID2, ret);
|
||||
goto err_enable;
|
||||
}
|
||||
|
||||
switch (val) {
|
||||
case RT5645_DEVICE_ID:
|
||||
|
@ -1454,7 +1454,7 @@ struct wcd_mbhc *wcd_mbhc_init(struct snd_soc_component *component,
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
mbhc = devm_kzalloc(dev, sizeof(*mbhc), GFP_KERNEL);
|
||||
mbhc = kzalloc(sizeof(*mbhc), GFP_KERNEL);
|
||||
if (!mbhc)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@ -1474,61 +1474,76 @@ struct wcd_mbhc *wcd_mbhc_init(struct snd_soc_component *component,
|
||||
|
||||
INIT_WORK(&mbhc->correct_plug_swch, wcd_correct_swch_plug);
|
||||
|
||||
ret = devm_request_threaded_irq(dev, mbhc->intr_ids->mbhc_sw_intr, NULL,
|
||||
ret = request_threaded_irq(mbhc->intr_ids->mbhc_sw_intr, NULL,
|
||||
wcd_mbhc_mech_plug_detect_irq,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"mbhc sw intr", mbhc);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_free_mbhc;
|
||||
|
||||
ret = devm_request_threaded_irq(dev, mbhc->intr_ids->mbhc_btn_press_intr, NULL,
|
||||
ret = request_threaded_irq(mbhc->intr_ids->mbhc_btn_press_intr, NULL,
|
||||
wcd_mbhc_btn_press_handler,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"Button Press detect", mbhc);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_free_sw_intr;
|
||||
|
||||
ret = devm_request_threaded_irq(dev, mbhc->intr_ids->mbhc_btn_release_intr, NULL,
|
||||
ret = request_threaded_irq(mbhc->intr_ids->mbhc_btn_release_intr, NULL,
|
||||
wcd_mbhc_btn_release_handler,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"Button Release detect", mbhc);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_free_btn_press_intr;
|
||||
|
||||
ret = devm_request_threaded_irq(dev, mbhc->intr_ids->mbhc_hs_ins_intr, NULL,
|
||||
ret = request_threaded_irq(mbhc->intr_ids->mbhc_hs_ins_intr, NULL,
|
||||
wcd_mbhc_adc_hs_ins_irq,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"Elect Insert", mbhc);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_free_btn_release_intr;
|
||||
|
||||
disable_irq_nosync(mbhc->intr_ids->mbhc_hs_ins_intr);
|
||||
|
||||
ret = devm_request_threaded_irq(dev, mbhc->intr_ids->mbhc_hs_rem_intr, NULL,
|
||||
ret = request_threaded_irq(mbhc->intr_ids->mbhc_hs_rem_intr, NULL,
|
||||
wcd_mbhc_adc_hs_rem_irq,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"Elect Remove", mbhc);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_free_hs_ins_intr;
|
||||
|
||||
disable_irq_nosync(mbhc->intr_ids->mbhc_hs_rem_intr);
|
||||
|
||||
ret = devm_request_threaded_irq(dev, mbhc->intr_ids->hph_left_ocp, NULL,
|
||||
ret = request_threaded_irq(mbhc->intr_ids->hph_left_ocp, NULL,
|
||||
wcd_mbhc_hphl_ocp_irq,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"HPH_L OCP detect", mbhc);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_free_hs_rem_intr;
|
||||
|
||||
ret = devm_request_threaded_irq(dev, mbhc->intr_ids->hph_right_ocp, NULL,
|
||||
ret = request_threaded_irq(mbhc->intr_ids->hph_right_ocp, NULL,
|
||||
wcd_mbhc_hphr_ocp_irq,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"HPH_R OCP detect", mbhc);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_free_hph_left_ocp;
|
||||
|
||||
return mbhc;
|
||||
err:
|
||||
|
||||
err_free_hph_left_ocp:
|
||||
free_irq(mbhc->intr_ids->hph_left_ocp, mbhc);
|
||||
err_free_hs_rem_intr:
|
||||
free_irq(mbhc->intr_ids->mbhc_hs_rem_intr, mbhc);
|
||||
err_free_hs_ins_intr:
|
||||
free_irq(mbhc->intr_ids->mbhc_hs_ins_intr, mbhc);
|
||||
err_free_btn_release_intr:
|
||||
free_irq(mbhc->intr_ids->mbhc_btn_release_intr, mbhc);
|
||||
err_free_btn_press_intr:
|
||||
free_irq(mbhc->intr_ids->mbhc_btn_press_intr, mbhc);
|
||||
err_free_sw_intr:
|
||||
free_irq(mbhc->intr_ids->mbhc_sw_intr, mbhc);
|
||||
err_free_mbhc:
|
||||
kfree(mbhc);
|
||||
|
||||
dev_err(dev, "Failed to request mbhc interrupts %d\n", ret);
|
||||
|
||||
return ERR_PTR(ret);
|
||||
@ -1537,9 +1552,19 @@ EXPORT_SYMBOL(wcd_mbhc_init);
|
||||
|
||||
void wcd_mbhc_deinit(struct wcd_mbhc *mbhc)
|
||||
{
|
||||
free_irq(mbhc->intr_ids->hph_right_ocp, mbhc);
|
||||
free_irq(mbhc->intr_ids->hph_left_ocp, mbhc);
|
||||
free_irq(mbhc->intr_ids->mbhc_hs_rem_intr, mbhc);
|
||||
free_irq(mbhc->intr_ids->mbhc_hs_ins_intr, mbhc);
|
||||
free_irq(mbhc->intr_ids->mbhc_btn_release_intr, mbhc);
|
||||
free_irq(mbhc->intr_ids->mbhc_btn_press_intr, mbhc);
|
||||
free_irq(mbhc->intr_ids->mbhc_sw_intr, mbhc);
|
||||
|
||||
mutex_lock(&mbhc->lock);
|
||||
wcd_cancel_hs_detect_plug(mbhc, &mbhc->correct_plug_swch);
|
||||
mutex_unlock(&mbhc->lock);
|
||||
|
||||
kfree(mbhc);
|
||||
}
|
||||
EXPORT_SYMBOL(wcd_mbhc_deinit);
|
||||
|
||||
|
@ -2642,7 +2642,7 @@ static int wcd934x_mbhc_micb_ctrl_threshold_mic(struct snd_soc_component *compon
|
||||
return rc;
|
||||
}
|
||||
|
||||
static inline void wcd934x_mbhc_get_result_params(struct wcd934x_codec *wcd934x,
|
||||
static void wcd934x_mbhc_get_result_params(struct wcd934x_codec *wcd934x,
|
||||
s16 *d1_a, u16 noff,
|
||||
int32_t *zdet)
|
||||
{
|
||||
@ -2683,7 +2683,7 @@ static inline void wcd934x_mbhc_get_result_params(struct wcd934x_codec *wcd934x,
|
||||
else if (x1 < minCode_param[noff])
|
||||
*zdet = WCD934X_ZDET_FLOATING_IMPEDANCE;
|
||||
|
||||
dev_info(wcd934x->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n",
|
||||
dev_dbg(wcd934x->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%di (milliohm)\n",
|
||||
__func__, d1, c1, x1, *zdet);
|
||||
ramp_down:
|
||||
i = 0;
|
||||
@ -2740,7 +2740,7 @@ z_right:
|
||||
*zr = zdet;
|
||||
}
|
||||
|
||||
static inline void wcd934x_wcd_mbhc_qfuse_cal(struct snd_soc_component *component,
|
||||
static void wcd934x_wcd_mbhc_qfuse_cal(struct snd_soc_component *component,
|
||||
int32_t *z_val, int flag_l_r)
|
||||
{
|
||||
s16 q1;
|
||||
@ -3044,6 +3044,17 @@ static int wcd934x_mbhc_init(struct snd_soc_component *component)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void wcd934x_mbhc_deinit(struct snd_soc_component *component)
|
||||
{
|
||||
struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(component);
|
||||
|
||||
if (!wcd->mbhc)
|
||||
return;
|
||||
|
||||
wcd_mbhc_deinit(wcd->mbhc);
|
||||
}
|
||||
|
||||
static int wcd934x_comp_probe(struct snd_soc_component *component)
|
||||
{
|
||||
struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
|
||||
@ -3077,6 +3088,7 @@ static void wcd934x_comp_remove(struct snd_soc_component *comp)
|
||||
{
|
||||
struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
|
||||
|
||||
wcd934x_mbhc_deinit(comp);
|
||||
wcd_clsh_ctrl_free(wcd->clsh_ctrl);
|
||||
}
|
||||
|
||||
|
@ -210,7 +210,7 @@ struct wcd938x_priv {
|
||||
};
|
||||
|
||||
static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800);
|
||||
static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(line_gain, 600, -3000);
|
||||
static const DECLARE_TLV_DB_SCALE(line_gain, -3000, 150, -3000);
|
||||
static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(analog_gain, 0, 3000);
|
||||
|
||||
struct wcd938x_mbhc_zdet_param {
|
||||
@ -2124,10 +2124,11 @@ static int wcd938x_mbhc_micb_ctrl_threshold_mic(struct snd_soc_component *compon
|
||||
return wcd938x_mbhc_micb_adjust_voltage(component, micb_mv, MIC_BIAS_2);
|
||||
}
|
||||
|
||||
static inline void wcd938x_mbhc_get_result_params(struct wcd938x_priv *wcd938x,
|
||||
static void wcd938x_mbhc_get_result_params(struct snd_soc_component *component,
|
||||
s16 *d1_a, u16 noff,
|
||||
int32_t *zdet)
|
||||
{
|
||||
struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
|
||||
int i;
|
||||
int val, val1;
|
||||
s16 c1;
|
||||
@ -2154,8 +2155,8 @@ static inline void wcd938x_mbhc_get_result_params(struct wcd938x_priv *wcd938x,
|
||||
usleep_range(5000, 5050);
|
||||
|
||||
if (!c1 || !x1) {
|
||||
pr_err("%s: Impedance detect ramp error, c1=%d, x1=0x%x\n",
|
||||
__func__, c1, x1);
|
||||
dev_err(component->dev, "Impedance detect ramp error, c1=%d, x1=0x%x\n",
|
||||
c1, x1);
|
||||
goto ramp_down;
|
||||
}
|
||||
d1 = d1_a[c1];
|
||||
@ -2165,7 +2166,7 @@ static inline void wcd938x_mbhc_get_result_params(struct wcd938x_priv *wcd938x,
|
||||
else if (x1 < minCode_param[noff])
|
||||
*zdet = WCD938X_ZDET_FLOATING_IMPEDANCE;
|
||||
|
||||
pr_err("%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n",
|
||||
dev_dbg(component->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d (milliohm)\n",
|
||||
__func__, d1, c1, x1, *zdet);
|
||||
ramp_down:
|
||||
i = 0;
|
||||
@ -2210,7 +2211,7 @@ static void wcd938x_mbhc_zdet_ramp(struct snd_soc_component *component,
|
||||
WCD938X_ANA_MBHC_ZDET, 0x80, 0x80);
|
||||
dev_dbg(component->dev, "%s: ramp for HPH_L, noff = %d\n",
|
||||
__func__, zdet_param->noff);
|
||||
wcd938x_mbhc_get_result_params(wcd938x, d1_a, zdet_param->noff, &zdet);
|
||||
wcd938x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet);
|
||||
regmap_update_bits(wcd938x->regmap,
|
||||
WCD938X_ANA_MBHC_ZDET, 0x80, 0x00);
|
||||
|
||||
@ -2224,14 +2225,14 @@ z_right:
|
||||
WCD938X_ANA_MBHC_ZDET, 0x40, 0x40);
|
||||
dev_dbg(component->dev, "%s: ramp for HPH_R, noff = %d\n",
|
||||
__func__, zdet_param->noff);
|
||||
wcd938x_mbhc_get_result_params(wcd938x, d1_a, zdet_param->noff, &zdet);
|
||||
wcd938x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet);
|
||||
regmap_update_bits(wcd938x->regmap,
|
||||
WCD938X_ANA_MBHC_ZDET, 0x40, 0x00);
|
||||
|
||||
*zr = zdet;
|
||||
}
|
||||
|
||||
static inline void wcd938x_wcd_mbhc_qfuse_cal(struct snd_soc_component *component,
|
||||
static void wcd938x_wcd_mbhc_qfuse_cal(struct snd_soc_component *component,
|
||||
int32_t *z_val, int flag_l_r)
|
||||
{
|
||||
s16 q1;
|
||||
@ -2625,6 +2626,8 @@ static int wcd938x_mbhc_init(struct snd_soc_component *component)
|
||||
WCD938X_IRQ_HPHR_OCP_INT);
|
||||
|
||||
wcd938x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true);
|
||||
if (IS_ERR(wcd938x->wcd_mbhc))
|
||||
return PTR_ERR(wcd938x->wcd_mbhc);
|
||||
|
||||
snd_soc_add_component_controls(component, impedance_detect_controls,
|
||||
ARRAY_SIZE(impedance_detect_controls));
|
||||
@ -2633,6 +2636,14 @@ static int wcd938x_mbhc_init(struct snd_soc_component *component)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void wcd938x_mbhc_deinit(struct snd_soc_component *component)
|
||||
{
|
||||
struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
|
||||
|
||||
wcd_mbhc_deinit(wcd938x->wcd_mbhc);
|
||||
}
|
||||
|
||||
/* END MBHC */
|
||||
|
||||
static const struct snd_kcontrol_new wcd938x_snd_controls[] = {
|
||||
@ -2652,8 +2663,8 @@ static const struct snd_kcontrol_new wcd938x_snd_controls[] = {
|
||||
wcd938x_get_swr_port, wcd938x_set_swr_port),
|
||||
SOC_SINGLE_EXT("DSD_R Switch", WCD938X_DSD_R, 0, 1, 0,
|
||||
wcd938x_get_swr_port, wcd938x_set_swr_port),
|
||||
SOC_SINGLE_TLV("HPHL Volume", WCD938X_HPH_L_EN, 0, 0x18, 0, line_gain),
|
||||
SOC_SINGLE_TLV("HPHR Volume", WCD938X_HPH_R_EN, 0, 0x18, 0, line_gain),
|
||||
SOC_SINGLE_TLV("HPHL Volume", WCD938X_HPH_L_EN, 0, 0x18, 1, line_gain),
|
||||
SOC_SINGLE_TLV("HPHR Volume", WCD938X_HPH_R_EN, 0, 0x18, 1, line_gain),
|
||||
WCD938X_EAR_PA_GAIN_TLV("EAR_PA Volume", WCD938X_ANA_EAR_COMPANDER_CTL,
|
||||
2, 0x10, 0, ear_pa_gain),
|
||||
SOC_SINGLE_EXT("ADC1 Switch", WCD938X_ADC1, 1, 1, 0,
|
||||
@ -3080,16 +3091,33 @@ static int wcd938x_irq_init(struct wcd938x_priv *wcd, struct device *dev)
|
||||
static int wcd938x_soc_codec_probe(struct snd_soc_component *component)
|
||||
{
|
||||
struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
|
||||
struct sdw_slave *tx_sdw_dev = wcd938x->tx_sdw_dev;
|
||||
struct device *dev = component->dev;
|
||||
unsigned long time_left;
|
||||
int ret, i;
|
||||
|
||||
time_left = wait_for_completion_timeout(&tx_sdw_dev->initialization_complete,
|
||||
msecs_to_jiffies(2000));
|
||||
if (!time_left) {
|
||||
dev_err(dev, "soundwire device init timeout\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
snd_soc_component_init_regmap(component, wcd938x->regmap);
|
||||
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
wcd938x->variant = snd_soc_component_read_field(component,
|
||||
WCD938X_DIGITAL_EFUSE_REG_0,
|
||||
WCD938X_ID_MASK);
|
||||
|
||||
wcd938x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD938X);
|
||||
if (IS_ERR(wcd938x->clsh_info)) {
|
||||
pm_runtime_put(dev);
|
||||
return PTR_ERR(wcd938x->clsh_info);
|
||||
}
|
||||
|
||||
wcd938x_io_init(wcd938x);
|
||||
/* Set all interrupts as edge triggered */
|
||||
@ -3098,6 +3126,8 @@ static int wcd938x_soc_codec_probe(struct snd_soc_component *component)
|
||||
(WCD938X_DIGITAL_INTR_LEVEL_0 + i), 0);
|
||||
}
|
||||
|
||||
pm_runtime_put(dev);
|
||||
|
||||
wcd938x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip,
|
||||
WCD938X_IRQ_HPHR_PDM_WD_INT);
|
||||
wcd938x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip,
|
||||
@ -3109,20 +3139,26 @@ static int wcd938x_soc_codec_probe(struct snd_soc_component *component)
|
||||
ret = request_threaded_irq(wcd938x->hphr_pdm_wd_int, NULL, wcd938x_wd_handle_irq,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"HPHR PDM WD INT", wcd938x);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to request HPHR WD interrupt (%d)\n", ret);
|
||||
goto err_free_clsh_ctrl;
|
||||
}
|
||||
|
||||
ret = request_threaded_irq(wcd938x->hphl_pdm_wd_int, NULL, wcd938x_wd_handle_irq,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"HPHL PDM WD INT", wcd938x);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to request HPHL WD interrupt (%d)\n", ret);
|
||||
goto err_free_hphr_pdm_wd_int;
|
||||
}
|
||||
|
||||
ret = request_threaded_irq(wcd938x->aux_pdm_wd_int, NULL, wcd938x_wd_handle_irq,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_RISING,
|
||||
"AUX PDM WD INT", wcd938x);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to request Aux WD interrupt (%d)\n", ret);
|
||||
goto err_free_hphl_pdm_wd_int;
|
||||
}
|
||||
|
||||
/* Disable watchdog interrupt for HPH and AUX */
|
||||
disable_irq_nosync(wcd938x->hphr_pdm_wd_int);
|
||||
@ -3137,7 +3173,7 @@ static int wcd938x_soc_codec_probe(struct snd_soc_component *component)
|
||||
dev_err(component->dev,
|
||||
"%s: Failed to add snd ctrls for variant: %d\n",
|
||||
__func__, wcd938x->variant);
|
||||
goto err;
|
||||
goto err_free_aux_pdm_wd_int;
|
||||
}
|
||||
break;
|
||||
case WCD9385:
|
||||
@ -3147,7 +3183,7 @@ static int wcd938x_soc_codec_probe(struct snd_soc_component *component)
|
||||
dev_err(component->dev,
|
||||
"%s: Failed to add snd ctrls for variant: %d\n",
|
||||
__func__, wcd938x->variant);
|
||||
goto err;
|
||||
goto err_free_aux_pdm_wd_int;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -3155,12 +3191,38 @@ static int wcd938x_soc_codec_probe(struct snd_soc_component *component)
|
||||
}
|
||||
|
||||
ret = wcd938x_mbhc_init(component);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_err(component->dev, "mbhc initialization failed\n");
|
||||
err:
|
||||
goto err_free_aux_pdm_wd_int;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_aux_pdm_wd_int:
|
||||
free_irq(wcd938x->aux_pdm_wd_int, wcd938x);
|
||||
err_free_hphl_pdm_wd_int:
|
||||
free_irq(wcd938x->hphl_pdm_wd_int, wcd938x);
|
||||
err_free_hphr_pdm_wd_int:
|
||||
free_irq(wcd938x->hphr_pdm_wd_int, wcd938x);
|
||||
err_free_clsh_ctrl:
|
||||
wcd_clsh_ctrl_free(wcd938x->clsh_info);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void wcd938x_soc_codec_remove(struct snd_soc_component *component)
|
||||
{
|
||||
struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
|
||||
|
||||
wcd938x_mbhc_deinit(component);
|
||||
|
||||
free_irq(wcd938x->aux_pdm_wd_int, wcd938x);
|
||||
free_irq(wcd938x->hphl_pdm_wd_int, wcd938x);
|
||||
free_irq(wcd938x->hphr_pdm_wd_int, wcd938x);
|
||||
|
||||
wcd_clsh_ctrl_free(wcd938x->clsh_info);
|
||||
}
|
||||
|
||||
static int wcd938x_codec_set_jack(struct snd_soc_component *comp,
|
||||
struct snd_soc_jack *jack, void *data)
|
||||
{
|
||||
@ -3177,6 +3239,7 @@ static int wcd938x_codec_set_jack(struct snd_soc_component *comp,
|
||||
static const struct snd_soc_component_driver soc_codec_dev_wcd938x = {
|
||||
.name = "wcd938x_codec",
|
||||
.probe = wcd938x_soc_codec_probe,
|
||||
.remove = wcd938x_soc_codec_remove,
|
||||
.controls = wcd938x_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(wcd938x_snd_controls),
|
||||
.dapm_widgets = wcd938x_dapm_widgets,
|
||||
|
@ -507,12 +507,6 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq)
|
||||
savediv / 2 - 1);
|
||||
}
|
||||
|
||||
if (sai->soc_data->max_register >= FSL_SAI_MCTL) {
|
||||
/* SAI is in master mode at this point, so enable MCLK */
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_MCTL,
|
||||
FSL_SAI_MCTL_MCLK_EN, FSL_SAI_MCTL_MCLK_EN);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -719,7 +713,7 @@ static void fsl_sai_config_disable(struct fsl_sai *sai, int dir)
|
||||
u32 xcsr, count = 100;
|
||||
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs),
|
||||
FSL_SAI_CSR_TERE, 0);
|
||||
FSL_SAI_CSR_TERE | FSL_SAI_CSR_BCE, 0);
|
||||
|
||||
/* TERE will remain set till the end of current frame */
|
||||
do {
|
||||
|
@ -91,6 +91,7 @@
|
||||
/* SAI Transmit/Receive Control Register */
|
||||
#define FSL_SAI_CSR_TERE BIT(31)
|
||||
#define FSL_SAI_CSR_SE BIT(30)
|
||||
#define FSL_SAI_CSR_BCE BIT(28)
|
||||
#define FSL_SAI_CSR_FR BIT(25)
|
||||
#define FSL_SAI_CSR_SR BIT(24)
|
||||
#define FSL_SAI_CSR_xF_SHIFT 16
|
||||
|
@ -476,7 +476,7 @@ static int q6afe_mi2s_set_sysclk(struct snd_soc_dai *dai,
|
||||
|
||||
static const struct snd_soc_dapm_route q6afe_dapm_routes[] = {
|
||||
{"HDMI Playback", NULL, "HDMI_RX"},
|
||||
{"Display Port Playback", NULL, "DISPLAY_PORT_RX"},
|
||||
{"DISPLAY_PORT_RX_0 Playback", NULL, "DISPLAY_PORT_RX"},
|
||||
{"Slimbus Playback", NULL, "SLIMBUS_0_RX"},
|
||||
{"Slimbus1 Playback", NULL, "SLIMBUS_1_RX"},
|
||||
{"Slimbus2 Playback", NULL, "SLIMBUS_2_RX"},
|
||||
|
@ -840,6 +840,7 @@ static const struct snd_soc_component_driver q6apm_fe_dai_component = {
|
||||
.pointer = q6apm_dai_pointer,
|
||||
.trigger = q6apm_dai_trigger,
|
||||
.compress_ops = &q6apm_dai_compress_ops,
|
||||
.use_dai_pcm_id = true,
|
||||
};
|
||||
|
||||
static int q6apm_dai_probe(struct platform_device *pdev)
|
||||
|
@ -511,6 +511,8 @@ static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op)
|
||||
|
||||
switch (hdr->opcode) {
|
||||
case DATA_CMD_RSP_WR_SH_MEM_EP_DATA_BUFFER_DONE_V2:
|
||||
if (!graph->ar_graph)
|
||||
break;
|
||||
client_event = APM_CLIENT_EVENT_DATA_WRITE_DONE;
|
||||
mutex_lock(&graph->lock);
|
||||
token = hdr->token & APM_WRITE_TOKEN_MASK;
|
||||
@ -544,6 +546,8 @@ static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op)
|
||||
wake_up(&graph->cmd_wait);
|
||||
break;
|
||||
case DATA_CMD_RSP_RD_SH_MEM_EP_DATA_BUFFER_V2:
|
||||
if (!graph->ar_graph)
|
||||
break;
|
||||
client_event = APM_CLIENT_EVENT_DATA_READ_DONE;
|
||||
mutex_lock(&graph->lock);
|
||||
rd_done = data->payload;
|
||||
@ -649,8 +653,9 @@ int q6apm_graph_close(struct q6apm_graph *graph)
|
||||
{
|
||||
struct audioreach_graph *ar_graph = graph->ar_graph;
|
||||
|
||||
gpr_free_port(graph->port);
|
||||
graph->ar_graph = NULL;
|
||||
kref_put(&ar_graph->refcount, q6apm_put_audioreach_graph);
|
||||
gpr_free_port(graph->port);
|
||||
kfree(graph);
|
||||
|
||||
return 0;
|
||||
|
@ -1277,8 +1277,8 @@ int audioreach_tplg_init(struct snd_soc_component *component)
|
||||
|
||||
ret = snd_soc_tplg_component_load(component, &audioreach_tplg_ops, fw);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "tplg component load failed%d\n", ret);
|
||||
ret = -EINVAL;
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(dev, "tplg component load failed: %d\n", ret);
|
||||
}
|
||||
|
||||
release_firmware(fw);
|
||||
|
@ -1988,8 +1988,10 @@ static int snd_soc_bind_card(struct snd_soc_card *card)
|
||||
/* probe all components used by DAI links on this card */
|
||||
ret = soc_probe_link_components(card);
|
||||
if (ret < 0) {
|
||||
if (ret != -EPROBE_DEFER) {
|
||||
dev_err(card->dev,
|
||||
"ASoC: failed to instantiate card %d\n", ret);
|
||||
}
|
||||
goto probe_end;
|
||||
}
|
||||
|
||||
|
@ -1732,6 +1732,7 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg,
|
||||
|
||||
ret = snd_soc_add_pcm_runtimes(tplg->comp->card, link, 1);
|
||||
if (ret < 0) {
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(tplg->dev, "ASoC: adding FE link failed\n");
|
||||
goto err;
|
||||
}
|
||||
@ -2492,8 +2493,11 @@ static int soc_tplg_process_headers(struct soc_tplg *tplg)
|
||||
/* load the header object */
|
||||
ret = soc_tplg_load_header(tplg, hdr);
|
||||
if (ret < 0) {
|
||||
if (ret != -EPROBE_DEFER) {
|
||||
dev_err(tplg->dev,
|
||||
"ASoC: topology: could not load header: %d\n", ret);
|
||||
"ASoC: topology: could not load header: %d\n",
|
||||
ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -217,6 +217,7 @@ int configure_and_run_sha_dma(struct acp_dev_data *adata, void *image_addr,
|
||||
unsigned int image_length)
|
||||
{
|
||||
struct snd_sof_dev *sdev = adata->dev;
|
||||
const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata);
|
||||
unsigned int tx_count, fw_qualifier, val;
|
||||
int ret;
|
||||
|
||||
@ -251,9 +252,12 @@ int configure_and_run_sha_dma(struct acp_dev_data *adata, void *image_addr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* psp_send_cmd only required for renoir platform (rev - 3) */
|
||||
if (desc->rev == 3) {
|
||||
ret = psp_send_cmd(adata, MBOX_ACP_SHA_DMA_COMMAND);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = snd_sof_dsp_read_poll_timeout(sdev, ACP_DSP_BAR, ACP_SHA_DSP_FW_QUALIFIER,
|
||||
fw_qualifier, fw_qualifier & DSP_FW_RUN_ENABLE,
|
||||
|
@ -186,7 +186,6 @@ static ssize_t dfsentry_trace_filter_write(struct file *file, const char __user
|
||||
struct snd_sof_dfsentry *dfse = file->private_data;
|
||||
struct sof_ipc_trace_filter_elem *elems = NULL;
|
||||
struct snd_sof_dev *sdev = dfse->sdev;
|
||||
loff_t pos = 0;
|
||||
int num_elems;
|
||||
char *string;
|
||||
int ret;
|
||||
@ -201,11 +200,11 @@ static ssize_t dfsentry_trace_filter_write(struct file *file, const char __user
|
||||
if (!string)
|
||||
return -ENOMEM;
|
||||
|
||||
/* assert null termination */
|
||||
string[count] = 0;
|
||||
ret = simple_write_to_buffer(string, count, &pos, from, count);
|
||||
if (ret < 0)
|
||||
if (copy_from_user(string, from, count)) {
|
||||
ret = -EFAULT;
|
||||
goto error;
|
||||
}
|
||||
string[count] = '\0';
|
||||
|
||||
ret = trace_filter_parse(sdev, string, &num_elems, &elems);
|
||||
if (ret < 0)
|
||||
|
@ -2,7 +2,7 @@
|
||||
//
|
||||
// tegra210_adx.c - Tegra210 ADX driver
|
||||
//
|
||||
// Copyright (c) 2021 NVIDIA CORPORATION. All rights reserved.
|
||||
// Copyright (c) 2021-2023 NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/device.h>
|
||||
@ -175,10 +175,20 @@ static int tegra210_adx_get_byte_map(struct snd_kcontrol *kcontrol,
|
||||
mc = (struct soc_mixer_control *)kcontrol->private_value;
|
||||
enabled = adx->byte_mask[mc->reg / 32] & (1 << (mc->reg % 32));
|
||||
|
||||
/*
|
||||
* TODO: Simplify this logic to just return from bytes_map[]
|
||||
*
|
||||
* Presently below is required since bytes_map[] is
|
||||
* tightly packed and cannot store the control value of 256.
|
||||
* Byte mask state is used to know if 256 needs to be returned.
|
||||
* Note that for control value of 256, the put() call stores 0
|
||||
* in the bytes_map[] and disables the corresponding bit in
|
||||
* byte_mask[].
|
||||
*/
|
||||
if (enabled)
|
||||
ucontrol->value.integer.value[0] = bytes_map[mc->reg];
|
||||
else
|
||||
ucontrol->value.integer.value[0] = 0;
|
||||
ucontrol->value.integer.value[0] = 256;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -192,19 +202,19 @@ static int tegra210_adx_put_byte_map(struct snd_kcontrol *kcontrol,
|
||||
int value = ucontrol->value.integer.value[0];
|
||||
struct soc_mixer_control *mc =
|
||||
(struct soc_mixer_control *)kcontrol->private_value;
|
||||
unsigned int mask_val = adx->byte_mask[mc->reg / 32];
|
||||
|
||||
if (value == bytes_map[mc->reg])
|
||||
if (value >= 0 && value <= 255)
|
||||
mask_val |= (1 << (mc->reg % 32));
|
||||
else
|
||||
mask_val &= ~(1 << (mc->reg % 32));
|
||||
|
||||
if (mask_val == adx->byte_mask[mc->reg / 32])
|
||||
return 0;
|
||||
|
||||
if (value >= 0 && value <= 255) {
|
||||
/* update byte map and enable slot */
|
||||
bytes_map[mc->reg] = value;
|
||||
adx->byte_mask[mc->reg / 32] |= (1 << (mc->reg % 32));
|
||||
} else {
|
||||
/* reset byte map and disable slot */
|
||||
bytes_map[mc->reg] = 0;
|
||||
adx->byte_mask[mc->reg / 32] &= ~(1 << (mc->reg % 32));
|
||||
}
|
||||
/* Update byte map and slot */
|
||||
bytes_map[mc->reg] = value % 256;
|
||||
adx->byte_mask[mc->reg / 32] = mask_val;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
//
|
||||
// tegra210_amx.c - Tegra210 AMX driver
|
||||
//
|
||||
// Copyright (c) 2021 NVIDIA CORPORATION. All rights reserved.
|
||||
// Copyright (c) 2021-2023 NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/device.h>
|
||||
@ -203,10 +203,20 @@ static int tegra210_amx_get_byte_map(struct snd_kcontrol *kcontrol,
|
||||
else
|
||||
enabled = amx->byte_mask[0] & (1 << reg);
|
||||
|
||||
/*
|
||||
* TODO: Simplify this logic to just return from bytes_map[]
|
||||
*
|
||||
* Presently below is required since bytes_map[] is
|
||||
* tightly packed and cannot store the control value of 256.
|
||||
* Byte mask state is used to know if 256 needs to be returned.
|
||||
* Note that for control value of 256, the put() call stores 0
|
||||
* in the bytes_map[] and disables the corresponding bit in
|
||||
* byte_mask[].
|
||||
*/
|
||||
if (enabled)
|
||||
ucontrol->value.integer.value[0] = bytes_map[reg];
|
||||
else
|
||||
ucontrol->value.integer.value[0] = 0;
|
||||
ucontrol->value.integer.value[0] = 256;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -221,25 +231,19 @@ static int tegra210_amx_put_byte_map(struct snd_kcontrol *kcontrol,
|
||||
unsigned char *bytes_map = (unsigned char *)&amx->map;
|
||||
int reg = mc->reg;
|
||||
int value = ucontrol->value.integer.value[0];
|
||||
unsigned int mask_val = amx->byte_mask[reg / 32];
|
||||
|
||||
if (value == bytes_map[reg])
|
||||
if (value >= 0 && value <= 255)
|
||||
mask_val |= (1 << (reg % 32));
|
||||
else
|
||||
mask_val &= ~(1 << (reg % 32));
|
||||
|
||||
if (mask_val == amx->byte_mask[reg / 32])
|
||||
return 0;
|
||||
|
||||
if (value >= 0 && value <= 255) {
|
||||
/* Update byte map and enable slot */
|
||||
bytes_map[reg] = value;
|
||||
if (reg > 31)
|
||||
amx->byte_mask[1] |= (1 << (reg - 32));
|
||||
else
|
||||
amx->byte_mask[0] |= (1 << reg);
|
||||
} else {
|
||||
/* Reset byte map and disable slot */
|
||||
bytes_map[reg] = 0;
|
||||
if (reg > 31)
|
||||
amx->byte_mask[1] &= ~(1 << (reg - 32));
|
||||
else
|
||||
amx->byte_mask[0] &= ~(1 << reg);
|
||||
}
|
||||
/* Update byte map and slot */
|
||||
bytes_map[reg] = value % 256;
|
||||
amx->byte_mask[reg / 32] = mask_val;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
1
tools/testing/selftests/alsa/.gitignore
vendored
1
tools/testing/selftests/alsa/.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
mixer-test
|
||||
pcm-test
|
||||
test-pcmtest-driver
|
||||
|
@ -47,10 +47,8 @@ static int read_patterns(void)
|
||||
|
||||
sprintf(pf, "/sys/kernel/debug/pcmtest/fill_pattern%d", i);
|
||||
fp = fopen(pf, "r");
|
||||
if (!fp) {
|
||||
fclose(fpl);
|
||||
if (!fp)
|
||||
return -1;
|
||||
}
|
||||
fread(patterns[i].buf, 1, patterns[i].len, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user