sound fixes for 6.4-rc3
A collection of small fixes that have been gathered since rc1: - Lots of small ASoC SOF Intel fixes - A couple of UAF and NULL-dereference fixes - Quirks and updates for HD-audio, USB-audio and ASoC AMD - A few minor build / sparse warning fixes - MAINTAINERS and DT updates -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmRnL6AOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9DAg//YU96xe71JZoi8TJML6rfUeOw38KIiAIEmv+s KBg+lFjNacFkZSbohDY9SMViGdVkukRxw/UTtMrTyf1sW1eTyfTxak/vw0sTnO92 S02hngTioaqUQKCXb/90bN+zTyLnIVmpdWs6CInTtnAl5YS73GcqGwq96/TnBWKj dOVcRxSC6Grh/duZkYjA7DdoCPiQTQa+hoMJSsfrazgcmQKbEO21NZNSmk1XU/DW fE0y+G8LDEQAdefyw+pVfjLEpPHr1j0Pu6k6tHq6B2yNVnyopwiQTY5FQF+XQ6Yb 3ma5bMfK1myD3CeXjP/9ws7xAhw5yzgwiHBcNuKHolXQnjEKzaP0PMEdSXMzQXPz +3iGkN2kA3NqS9zOSCMdSfQC7zVjfmHEoTewuL4xVl6jEPlWS/Ubrufsj6cKyFvh +MxT/FL3rcqEYXgCPxxtt77iVKwVhy91aZaYMMhFanL9kluGDryTumgriA2DSoQo XXD2K487+PHI9YjSAXjyU7WHjaqi84iisP0T3COdJarmTStoi+zf2DYSQZRITBTJ uDEqXV9vPleuoWEZIjPpd2Gv3/5xhRabS+PykNwbPFbv3vDP6olxIRRdHP+ohxaI LUC2rz1fM+Qe/QpuVrp8qLpj8NMJ5u9PGDgjDyHNx5qFCW1em7lm/IJO1ponnZ2O 0OCMJGQ= =3Pft -----END PGP SIGNATURE----- Merge tag 'sound-6.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of small fixes that have been gathered since rc1: - Lots of small ASoC SOF Intel fixes - A couple of UAF and NULL-dereference fixes - Quirks and updates for HD-audio, USB-audio and ASoC AMD - A few minor build / sparse warning fixes - MAINTAINERS and DT updates" * tag 'sound-6.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (38 commits) ALSA: hda: Add NVIDIA codec IDs a3 through a7 to patch table ALSA: oss: avoid missing-prototype warnings ALSA: cs46xx: mark snd_cs46xx_download_image as static ALSA: hda: Fix Oops by 9.1 surround channel names ASoC: SOF: topology: Fix tuples array allocation ASoC: SOF: Separate the tokens for input and output pin index MAINTAINERS: Remove self from Cirrus Codec drivers ASoC: cs35l56: Prevent unbalanced pm_runtime in dsp_work() on SoundWire ASoC: SOF: topology: Fix logic for copying tuples ASoC: SOF: pm: save io region state in case of errors in resume ASoC: MAINTAINERS: drop Krzysztof Kozlowski from Samsung audio ASoC: mediatek: mt8186: Fix use-after-free in driver remove path ASoC: SOF: ipc3-topology: Make sure that only one cmd is sent in dai_config ASoC: SOF: sof-client-probes: fix pm_runtime imbalance in error handling ASoC: SOF: pcm: fix pm_runtime imbalance in error handling ASoC: SOF: debug: conditionally bump runtime_pm counter on exceptions ASoC: SOF: Intel: hda-mlink: add helper to program SoundWire PCMSyCM registers ASoC: SOF: Intel: hda-mlink: initialize instance_offset member ASoC: SOF: Intel: hda-mlink: use 'ml_addr' parameter consistently ASoC: SOF: Intel: hda-mlink: fix base_ptr computation ...
This commit is contained in:
commit
46be92e58f
|
@ -55,7 +55,9 @@ properties:
|
|||
description: TDM TX current sense time slot.
|
||||
|
||||
'#sound-dai-cells':
|
||||
const: 1
|
||||
# The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward
|
||||
# compatibility but is deprecated.
|
||||
enum: [0, 1]
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
@ -72,7 +74,7 @@ examples:
|
|||
codec: codec@4c {
|
||||
compatible = "ti,tas2562";
|
||||
reg = <0x4c>;
|
||||
#sound-dai-cells = <1>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <14>;
|
||||
shutdown-gpios = <&gpio1 15 0>;
|
||||
|
|
|
@ -57,7 +57,9 @@ properties:
|
|||
- 1 # Falling edge
|
||||
|
||||
'#sound-dai-cells':
|
||||
const: 1
|
||||
# The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward
|
||||
# compatibility but is deprecated.
|
||||
enum: [0, 1]
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
@ -74,7 +76,7 @@ examples:
|
|||
codec: codec@41 {
|
||||
compatible = "ti,tas2770";
|
||||
reg = <0x41>;
|
||||
#sound-dai-cells = <1>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <14>;
|
||||
reset-gpio = <&gpio1 15 0>;
|
||||
|
|
|
@ -50,7 +50,9 @@ properties:
|
|||
description: TDM TX voltage sense time slot.
|
||||
|
||||
'#sound-dai-cells':
|
||||
const: 1
|
||||
# The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward
|
||||
# compatibility but is deprecated.
|
||||
enum: [0, 1]
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
@ -67,7 +69,7 @@ examples:
|
|||
codec: codec@38 {
|
||||
compatible = "ti,tas2764";
|
||||
reg = <0x38>;
|
||||
#sound-dai-cells = <1>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <14>;
|
||||
reset-gpios = <&gpio1 15 0>;
|
||||
|
|
|
@ -4909,7 +4909,6 @@ F: drivers/media/cec/i2c/ch7322.c
|
|||
CIRRUS LOGIC AUDIO CODEC DRIVERS
|
||||
M: James Schulman <james.schulman@cirrus.com>
|
||||
M: David Rhodes <david.rhodes@cirrus.com>
|
||||
M: Lucas Tanure <tanureal@opensource.cirrus.com>
|
||||
M: Richard Fitzgerald <rf@opensource.cirrus.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
L: patches@opensource.cirrus.com
|
||||
|
@ -18574,10 +18573,9 @@ F: Documentation/admin-guide/LSM/SafeSetID.rst
|
|||
F: security/safesetid/
|
||||
|
||||
SAMSUNG AUDIO (ASoC) DRIVERS
|
||||
M: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
M: Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
S: Maintained
|
||||
B: mailto:linux-samsung-soc@vger.kernel.org
|
||||
F: Documentation/devicetree/bindings/sound/samsung*
|
||||
F: sound/soc/samsung/
|
||||
|
|
|
@ -44,6 +44,9 @@ int hdac_bus_eml_sdw_power_down_unlocked(struct hdac_bus *bus, int sublink);
|
|||
|
||||
int hdac_bus_eml_sdw_set_lsdiid(struct hdac_bus *bus, int sublink, int dev_num);
|
||||
|
||||
int hdac_bus_eml_sdw_map_stream_ch(struct hdac_bus *bus, int sublink, int y,
|
||||
int channel_mask, int stream_id, int dir);
|
||||
|
||||
void hda_bus_ml_put_all(struct hdac_bus *bus);
|
||||
void hda_bus_ml_reset_losidv(struct hdac_bus *bus);
|
||||
int hda_bus_ml_resume(struct hdac_bus *bus);
|
||||
|
@ -51,6 +54,7 @@ int hda_bus_ml_suspend(struct hdac_bus *bus);
|
|||
|
||||
struct hdac_ext_link *hdac_bus_eml_ssp_get_hlink(struct hdac_bus *bus);
|
||||
struct hdac_ext_link *hdac_bus_eml_dmic_get_hlink(struct hdac_bus *bus);
|
||||
struct hdac_ext_link *hdac_bus_eml_sdw_get_hlink(struct hdac_bus *bus);
|
||||
|
||||
struct mutex *hdac_bus_eml_get_mutex(struct hdac_bus *bus, bool alt, int elid);
|
||||
|
||||
|
@ -144,6 +148,13 @@ hdac_bus_eml_sdw_power_down_unlocked(struct hdac_bus *bus, int sublink) { return
|
|||
static inline int
|
||||
hdac_bus_eml_sdw_set_lsdiid(struct hdac_bus *bus, int sublink, int dev_num) { return 0; }
|
||||
|
||||
static inline int
|
||||
hdac_bus_eml_sdw_map_stream_ch(struct hdac_bus *bus, int sublink, int y,
|
||||
int channel_mask, int stream_id, int dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void hda_bus_ml_put_all(struct hdac_bus *bus) { }
|
||||
static inline void hda_bus_ml_reset_losidv(struct hdac_bus *bus) { }
|
||||
static inline int hda_bus_ml_resume(struct hdac_bus *bus) { return 0; }
|
||||
|
@ -155,6 +166,9 @@ hdac_bus_eml_ssp_get_hlink(struct hdac_bus *bus) { return NULL; }
|
|||
static inline struct hdac_ext_link *
|
||||
hdac_bus_eml_dmic_get_hlink(struct hdac_bus *bus) { return NULL; }
|
||||
|
||||
static inline struct hdac_ext_link *
|
||||
hdac_bus_eml_sdw_get_hlink(struct hdac_bus *bus) { return NULL; }
|
||||
|
||||
static inline struct mutex *
|
||||
hdac_bus_eml_get_mutex(struct hdac_bus *bus, bool alt, int elid) { return NULL; }
|
||||
|
||||
|
|
|
@ -183,7 +183,7 @@
|
|||
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_INTERLEAVING_STYLE 1906
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_FMT_CFG 1907
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_IN_SAMPLE_TYPE 1908
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_PIN_INDEX 1909
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_INPUT_PIN_INDEX 1909
|
||||
/* intentional token numbering discontinuity, reserved for future use */
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_RATE 1930
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_BIT_DEPTH 1931
|
||||
|
@ -194,6 +194,7 @@
|
|||
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_INTERLEAVING_STYLE 1936
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_FMT_CFG 1937
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_SAMPLE_TYPE 1938
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_OUTPUT_PIN_INDEX 1939
|
||||
/* intentional token numbering discontinuity, reserved for future use */
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_IBS 1970
|
||||
#define SOF_TKN_CAVS_AUDIO_FORMAT_OBS 1971
|
||||
|
|
|
@ -141,6 +141,14 @@ int snd_pcm_area_copy(const struct snd_pcm_channel_area *src_channel,
|
|||
|
||||
void *snd_pcm_plug_buf_alloc(struct snd_pcm_substream *plug, snd_pcm_uframes_t size);
|
||||
void snd_pcm_plug_buf_unlock(struct snd_pcm_substream *plug, void *ptr);
|
||||
#else
|
||||
|
||||
static inline snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t drv_size) { return drv_size; }
|
||||
static inline snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t clt_size) { return clt_size; }
|
||||
static inline int snd_pcm_plug_slave_format(int format, const struct snd_mask *format_mask) { return format; }
|
||||
|
||||
#endif
|
||||
|
||||
snd_pcm_sframes_t snd_pcm_oss_write3(struct snd_pcm_substream *substream,
|
||||
const char *ptr, snd_pcm_uframes_t size,
|
||||
int in_kernel);
|
||||
|
@ -151,14 +159,6 @@ snd_pcm_sframes_t snd_pcm_oss_writev3(struct snd_pcm_substream *substream,
|
|||
snd_pcm_sframes_t snd_pcm_oss_readv3(struct snd_pcm_substream *substream,
|
||||
void **bufs, snd_pcm_uframes_t frames);
|
||||
|
||||
#else
|
||||
|
||||
static inline snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t drv_size) { return drv_size; }
|
||||
static inline snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t clt_size) { return clt_size; }
|
||||
static inline int snd_pcm_plug_slave_format(int format, const struct snd_mask *format_mask) { return format; }
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef PLUGIN_DEBUG
|
||||
#define pdprintf(fmt, args...) printk(KERN_DEBUG "plugin: " fmt, ##args)
|
||||
#else
|
||||
|
|
|
@ -259,8 +259,10 @@ int snd_dg00x_stream_init_duplex(struct snd_dg00x *dg00x)
|
|||
return err;
|
||||
|
||||
err = init_stream(dg00x, &dg00x->tx_stream);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
destroy_stream(dg00x, &dg00x->rx_stream);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = amdtp_domain_init(&dg00x->domain);
|
||||
if (err < 0) {
|
||||
|
|
|
@ -531,7 +531,7 @@ static int load_firmware(struct snd_cs46xx *chip)
|
|||
return err;
|
||||
}
|
||||
|
||||
int snd_cs46xx_download_image(struct snd_cs46xx *chip)
|
||||
static __maybe_unused int snd_cs46xx_download_image(struct snd_cs46xx *chip)
|
||||
{
|
||||
int idx, err;
|
||||
unsigned int offset = 0;
|
||||
|
|
|
@ -1155,8 +1155,8 @@ static bool path_has_mixer(struct hda_codec *codec, int path_idx, int ctl_type)
|
|||
return path && path->ctls[ctl_type];
|
||||
}
|
||||
|
||||
static const char * const channel_name[4] = {
|
||||
"Front", "Surround", "CLFE", "Side"
|
||||
static const char * const channel_name[] = {
|
||||
"Front", "Surround", "CLFE", "Side", "Back",
|
||||
};
|
||||
|
||||
/* give some appropriate ctl name prefix for the given line out channel */
|
||||
|
@ -1182,7 +1182,7 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
|
|||
|
||||
/* multi-io channels */
|
||||
if (ch >= cfg->line_outs)
|
||||
return channel_name[ch];
|
||||
goto fixed_name;
|
||||
|
||||
switch (cfg->line_out_type) {
|
||||
case AUTO_PIN_SPEAKER_OUT:
|
||||
|
@ -1234,6 +1234,7 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
|
|||
if (cfg->line_outs == 1 && !spec->multi_ios)
|
||||
return "Line Out";
|
||||
|
||||
fixed_name:
|
||||
if (ch >= ARRAY_SIZE(channel_name)) {
|
||||
snd_BUG();
|
||||
return "PCM";
|
||||
|
|
|
@ -4589,6 +4589,11 @@ HDA_CODEC_ENTRY(0x10de009d, "GPU 9d HDMI/DP", patch_nvhdmi),
|
|||
HDA_CODEC_ENTRY(0x10de009e, "GPU 9e HDMI/DP", patch_nvhdmi),
|
||||
HDA_CODEC_ENTRY(0x10de009f, "GPU 9f HDMI/DP", patch_nvhdmi),
|
||||
HDA_CODEC_ENTRY(0x10de00a0, "GPU a0 HDMI/DP", patch_nvhdmi),
|
||||
HDA_CODEC_ENTRY(0x10de00a3, "GPU a3 HDMI/DP", patch_nvhdmi),
|
||||
HDA_CODEC_ENTRY(0x10de00a4, "GPU a4 HDMI/DP", patch_nvhdmi),
|
||||
HDA_CODEC_ENTRY(0x10de00a5, "GPU a5 HDMI/DP", patch_nvhdmi),
|
||||
HDA_CODEC_ENTRY(0x10de00a6, "GPU a6 HDMI/DP", patch_nvhdmi),
|
||||
HDA_CODEC_ENTRY(0x10de00a7, "GPU a7 HDMI/DP", patch_nvhdmi),
|
||||
HDA_CODEC_ENTRY(0x10de8001, "MCP73 HDMI", patch_nvhdmi_2ch),
|
||||
HDA_CODEC_ENTRY(0x10de8067, "MCP67/68 HDMI", patch_nvhdmi_2ch),
|
||||
HDA_CODEC_ENTRY(0x67663d82, "Arise 82 HDMI/DP", patch_gf_hdmi),
|
||||
|
|
|
@ -7063,6 +7063,8 @@ enum {
|
|||
ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC295_FIXUP_DISABLE_DAC3,
|
||||
ALC285_FIXUP_SPEAKER2_TO_DAC1,
|
||||
ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
|
||||
ALC285_FIXUP_ASUS_HEADSET_MIC,
|
||||
ALC280_FIXUP_HP_HEADSET_MIC,
|
||||
ALC221_FIXUP_HP_FRONT_MIC,
|
||||
ALC292_FIXUP_TPT460,
|
||||
|
@ -8033,6 +8035,22 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_THINKPAD_ACPI
|
||||
},
|
||||
[ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc285_fixup_speaker2_to_dac1,
|
||||
.chained = true,
|
||||
.chain_id = ALC245_FIXUP_CS35L41_SPI_2
|
||||
},
|
||||
[ALC285_FIXUP_ASUS_HEADSET_MIC] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x19, 0x03a11050 },
|
||||
{ 0x1b, 0x03a11c30 },
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
|
||||
},
|
||||
[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
|
@ -9363,7 +9381,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
|
||||
SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
|
||||
SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
|
||||
SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
|
||||
SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
|
||||
|
@ -9458,7 +9476,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
|
@ -9469,8 +9487,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
|
||||
|
@ -9480,7 +9503,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8c26, "HP HP EliteBook 800G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
|
||||
SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
|
@ -9500,6 +9525,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
||||
SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604V", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
|
||||
SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
|
||||
SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
|
@ -9522,6 +9549,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
|
||||
|
@ -9618,6 +9646,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
|
@ -11663,6 +11692,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
|
||||
SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
|
||||
SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
|
||||
SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
|
||||
SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
|
||||
SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
|
||||
SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
|
||||
|
|
|
@ -311,6 +311,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
|||
DMI_MATCH(DMI_BOARD_NAME, "8A22"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "System76"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "pang12"),
|
||||
}
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -852,10 +852,11 @@ static void cs35l56_dsp_work(struct work_struct *work)
|
|||
*/
|
||||
if (cs35l56->sdw_peripheral) {
|
||||
cs35l56->sdw_irq_no_unmask = true;
|
||||
cancel_work_sync(&cs35l56->sdw_irq_work);
|
||||
flush_work(&cs35l56->sdw_irq_work);
|
||||
sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1, 0);
|
||||
sdw_read_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1);
|
||||
sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1, 0xFF);
|
||||
flush_work(&cs35l56->sdw_irq_work);
|
||||
}
|
||||
|
||||
ret = cs35l56_mbox_send(cs35l56, CS35L56_MBOX_CMD_SHUTDOWN);
|
||||
|
|
|
@ -53,6 +53,18 @@ static const struct reg_default ssm2602_reg[SSM2602_CACHEREGNUM] = {
|
|||
{ .reg = 0x09, .def = 0x0000 }
|
||||
};
|
||||
|
||||
/*
|
||||
* ssm2602 register patch
|
||||
* Workaround for playback distortions after power up: activates digital
|
||||
* core, and then powers on output, DAC, and whole chip at the same time
|
||||
*/
|
||||
|
||||
static const struct reg_sequence ssm2602_patch[] = {
|
||||
{ SSM2602_ACTIVE, 0x01 },
|
||||
{ SSM2602_PWR, 0x07 },
|
||||
{ SSM2602_RESET, 0x00 },
|
||||
};
|
||||
|
||||
|
||||
/*Appending several "None"s just for OSS mixer use*/
|
||||
static const char *ssm2602_input_select[] = {
|
||||
|
@ -598,6 +610,9 @@ static int ssm260x_component_probe(struct snd_soc_component *component)
|
|||
return ret;
|
||||
}
|
||||
|
||||
regmap_register_patch(ssm2602->regmap, ssm2602_patch,
|
||||
ARRAY_SIZE(ssm2602_patch));
|
||||
|
||||
/* set the update bits */
|
||||
regmap_update_bits(ssm2602->regmap, SSM2602_LINVOL,
|
||||
LINVOL_LRIN_BOTH, LINVOL_LRIN_BOTH);
|
||||
|
|
|
@ -132,13 +132,13 @@ static irqreturn_t i2s_irq_handler(int irq, void *dev_id)
|
|||
|
||||
/* Error Handling: TX */
|
||||
if (isr[i] & ISR_TXFO) {
|
||||
dev_err(dev->dev, "TX overrun (ch_id=%d)\n", i);
|
||||
dev_err_ratelimited(dev->dev, "TX overrun (ch_id=%d)\n", i);
|
||||
irq_valid = true;
|
||||
}
|
||||
|
||||
/* Error Handling: TX */
|
||||
if (isr[i] & ISR_RXFO) {
|
||||
dev_err(dev->dev, "RX overrun (ch_id=%d)\n", i);
|
||||
dev_err_ratelimited(dev->dev, "RX overrun (ch_id=%d)\n", i);
|
||||
irq_valid = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1159,7 +1159,7 @@ static int fsl_micfil_probe(struct platform_device *pdev)
|
|||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to pcm register\n");
|
||||
return ret;
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
fsl_micfil_dai.capture.formats = micfil->soc->formats;
|
||||
|
@ -1169,9 +1169,20 @@ static int fsl_micfil_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register component %s\n",
|
||||
fsl_micfil_component.name);
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
err_pm_disable:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void fsl_micfil_remove(struct platform_device *pdev)
|
||||
{
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
}
|
||||
|
||||
static int __maybe_unused fsl_micfil_runtime_suspend(struct device *dev)
|
||||
|
@ -1232,6 +1243,7 @@ static const struct dev_pm_ops fsl_micfil_pm_ops = {
|
|||
|
||||
static struct platform_driver fsl_micfil_driver = {
|
||||
.probe = fsl_micfil_probe,
|
||||
.remove_new = fsl_micfil_remove,
|
||||
.driver = {
|
||||
.name = "fsl-micfil-dai",
|
||||
.pm = &fsl_micfil_pm_ops,
|
||||
|
|
|
@ -218,18 +218,48 @@ static int jz4740_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int jz4740_i2s_get_i2sdiv(unsigned long mclk, unsigned long rate,
|
||||
unsigned long i2sdiv_max)
|
||||
{
|
||||
unsigned long div, rate1, rate2, err1, err2;
|
||||
|
||||
div = mclk / (64 * rate);
|
||||
if (div == 0)
|
||||
div = 1;
|
||||
|
||||
rate1 = mclk / (64 * div);
|
||||
rate2 = mclk / (64 * (div + 1));
|
||||
|
||||
err1 = abs(rate1 - rate);
|
||||
err2 = abs(rate2 - rate);
|
||||
|
||||
/*
|
||||
* Choose the divider that produces the smallest error in the
|
||||
* output rate and reject dividers with a 5% or higher error.
|
||||
* In the event that both dividers are outside the acceptable
|
||||
* error margin, reject the rate to prevent distorted audio.
|
||||
* (The number 5% is arbitrary.)
|
||||
*/
|
||||
if (div <= i2sdiv_max && err1 <= err2 && err1 < rate/20)
|
||||
return div;
|
||||
if (div < i2sdiv_max && err2 < rate/20)
|
||||
return div + 1;
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
|
||||
{
|
||||
struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
|
||||
struct regmap_field *div_field;
|
||||
unsigned long i2sdiv_max;
|
||||
unsigned int sample_size;
|
||||
uint32_t ctrl;
|
||||
int div;
|
||||
uint32_t ctrl, conf;
|
||||
int div = 1;
|
||||
|
||||
regmap_read(i2s->regmap, JZ_REG_AIC_CTRL, &ctrl);
|
||||
|
||||
div = clk_get_rate(i2s->clk_i2s) / (64 * params_rate(params));
|
||||
regmap_read(i2s->regmap, JZ_REG_AIC_CONF, &conf);
|
||||
|
||||
switch (params_format(params)) {
|
||||
case SNDRV_PCM_FORMAT_S8:
|
||||
|
@ -258,11 +288,27 @@ static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
|
|||
ctrl &= ~JZ_AIC_CTRL_MONO_TO_STEREO;
|
||||
|
||||
div_field = i2s->field_i2sdiv_playback;
|
||||
i2sdiv_max = GENMASK(i2s->soc_info->field_i2sdiv_playback.msb,
|
||||
i2s->soc_info->field_i2sdiv_playback.lsb);
|
||||
} else {
|
||||
ctrl &= ~JZ_AIC_CTRL_INPUT_SAMPLE_SIZE;
|
||||
ctrl |= FIELD_PREP(JZ_AIC_CTRL_INPUT_SAMPLE_SIZE, sample_size);
|
||||
|
||||
div_field = i2s->field_i2sdiv_capture;
|
||||
i2sdiv_max = GENMASK(i2s->soc_info->field_i2sdiv_capture.msb,
|
||||
i2s->soc_info->field_i2sdiv_capture.lsb);
|
||||
}
|
||||
|
||||
/*
|
||||
* Only calculate I2SDIV if we're supplying the bit or frame clock.
|
||||
* If the codec is supplying both clocks then the divider output is
|
||||
* unused, and we don't want it to limit the allowed sample rates.
|
||||
*/
|
||||
if (conf & (JZ_AIC_CONF_BIT_CLK_MASTER | JZ_AIC_CONF_SYNC_CLK_MASTER)) {
|
||||
div = jz4740_i2s_get_i2sdiv(clk_get_rate(i2s->clk_i2s),
|
||||
params_rate(params), i2sdiv_max);
|
||||
if (div < 0)
|
||||
return div;
|
||||
}
|
||||
|
||||
regmap_write(i2s->regmap, JZ_REG_AIC_CTRL, ctrl);
|
||||
|
|
|
@ -644,9 +644,3 @@ int mt8186_init_clock(struct mtk_base_afe *afe)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mt8186_deinit_clock(void *priv)
|
||||
{
|
||||
struct mtk_base_afe *afe = priv;
|
||||
mt8186_audsys_clk_unregister(afe);
|
||||
}
|
||||
|
|
|
@ -81,7 +81,6 @@ enum {
|
|||
struct mtk_base_afe;
|
||||
int mt8186_set_audio_int_bus_parent(struct mtk_base_afe *afe, int clk_id);
|
||||
int mt8186_init_clock(struct mtk_base_afe *afe);
|
||||
void mt8186_deinit_clock(void *priv);
|
||||
int mt8186_afe_enable_cgs(struct mtk_base_afe *afe);
|
||||
void mt8186_afe_disable_cgs(struct mtk_base_afe *afe);
|
||||
int mt8186_afe_enable_clock(struct mtk_base_afe *afe);
|
||||
|
|
|
@ -2848,10 +2848,6 @@ static int mt8186_afe_pcm_dev_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_add_action_or_reset(dev, mt8186_deinit_clock, (void *)afe);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* init memif */
|
||||
afe->memif_32bit_supported = 0;
|
||||
afe->memif_size = MT8186_MEMIF_NUM;
|
||||
|
|
|
@ -84,6 +84,29 @@ static const struct afe_gate aud_clks[CLK_AUD_NR_CLK] = {
|
|||
GATE_AUD2(CLK_AUD_ETDM_OUT1_BCLK, "aud_etdm_out1_bclk", "top_audio", 24),
|
||||
};
|
||||
|
||||
static void mt8186_audsys_clk_unregister(void *data)
|
||||
{
|
||||
struct mtk_base_afe *afe = data;
|
||||
struct mt8186_afe_private *afe_priv = afe->platform_priv;
|
||||
struct clk *clk;
|
||||
struct clk_lookup *cl;
|
||||
int i;
|
||||
|
||||
if (!afe_priv)
|
||||
return;
|
||||
|
||||
for (i = 0; i < CLK_AUD_NR_CLK; i++) {
|
||||
cl = afe_priv->lookup[i];
|
||||
if (!cl)
|
||||
continue;
|
||||
|
||||
clk = cl->clk;
|
||||
clk_unregister_gate(clk);
|
||||
|
||||
clkdev_drop(cl);
|
||||
}
|
||||
}
|
||||
|
||||
int mt8186_audsys_clk_register(struct mtk_base_afe *afe)
|
||||
{
|
||||
struct mt8186_afe_private *afe_priv = afe->platform_priv;
|
||||
|
@ -124,27 +147,6 @@ int mt8186_audsys_clk_register(struct mtk_base_afe *afe)
|
|||
afe_priv->lookup[i] = cl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return devm_add_action_or_reset(afe->dev, mt8186_audsys_clk_unregister, afe);
|
||||
}
|
||||
|
||||
void mt8186_audsys_clk_unregister(struct mtk_base_afe *afe)
|
||||
{
|
||||
struct mt8186_afe_private *afe_priv = afe->platform_priv;
|
||||
struct clk *clk;
|
||||
struct clk_lookup *cl;
|
||||
int i;
|
||||
|
||||
if (!afe_priv)
|
||||
return;
|
||||
|
||||
for (i = 0; i < CLK_AUD_NR_CLK; i++) {
|
||||
cl = afe_priv->lookup[i];
|
||||
if (!cl)
|
||||
continue;
|
||||
|
||||
clk = cl->clk;
|
||||
clk_unregister_gate(clk);
|
||||
|
||||
clkdev_drop(cl);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,5 @@
|
|||
#define _MT8186_AUDSYS_CLK_H_
|
||||
|
||||
int mt8186_audsys_clk_register(struct mtk_base_afe *afe);
|
||||
void mt8186_audsys_clk_unregister(struct mtk_base_afe *afe);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -209,7 +209,12 @@ int acp_sof_ipc_msg_data(struct snd_sof_dev *sdev, struct snd_sof_pcm_stream *sp
|
|||
acp_mailbox_read(sdev, offset, p, sz);
|
||||
} else {
|
||||
struct snd_pcm_substream *substream = sps->substream;
|
||||
struct acp_dsp_stream *stream = substream->runtime->private_data;
|
||||
struct acp_dsp_stream *stream;
|
||||
|
||||
if (!substream || !substream->runtime)
|
||||
return -ESTRPIPE;
|
||||
|
||||
stream = substream->runtime->private_data;
|
||||
|
||||
if (!stream)
|
||||
return -ESTRPIPE;
|
||||
|
|
|
@ -438,8 +438,8 @@ void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev, const char *msg)
|
|||
/* should we prevent DSP entering D3 ? */
|
||||
if (!sdev->ipc_dump_printed)
|
||||
dev_info(sdev->dev,
|
||||
"preventing DSP entering D3 state to preserve context\n");
|
||||
pm_runtime_get_noresume(sdev->dev);
|
||||
"Attempting to prevent DSP from entering D3 state to preserve context\n");
|
||||
pm_runtime_get_if_in_use(sdev->dev);
|
||||
}
|
||||
|
||||
/* dump vital information to the logs */
|
||||
|
|
|
@ -19,6 +19,9 @@
|
|||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_MLINK)
|
||||
|
||||
/* worst-case number of sublinks is used for sublink refcount array allocation only */
|
||||
#define HDAML_MAX_SUBLINKS (AZX_ML_LCTL_CPA_SHIFT - AZX_ML_LCTL_SPA_SHIFT)
|
||||
|
||||
/**
|
||||
* struct hdac_ext2_link - HDAudio extended+alternate link
|
||||
*
|
||||
|
@ -33,6 +36,7 @@
|
|||
* @leptr: extended link pointer
|
||||
* @eml_lock: mutual exclusion to access shared registers e.g. CPA/SPA bits
|
||||
* in LCTL register
|
||||
* @sublink_ref_count: array of refcounts, required to power-manage sublinks independently
|
||||
* @base_ptr: pointer to shim/ip/shim_vs space
|
||||
* @instance_offset: offset between each of @slcount instances managed by link
|
||||
* @shim_offset: offset to SHIM register base
|
||||
|
@ -53,6 +57,7 @@ struct hdac_ext2_link {
|
|||
u32 leptr;
|
||||
|
||||
struct mutex eml_lock; /* prevent concurrent access to e.g. CPA/SPA */
|
||||
int sublink_ref_count[HDAML_MAX_SUBLINKS];
|
||||
|
||||
/* internal values computed from LCAP contents */
|
||||
void __iomem *base_ptr;
|
||||
|
@ -68,6 +73,7 @@ struct hdac_ext2_link {
|
|||
#define AZX_REG_SDW_SHIM_OFFSET 0x0
|
||||
#define AZX_REG_SDW_IP_OFFSET 0x100
|
||||
#define AZX_REG_SDW_VS_SHIM_OFFSET 0x6000
|
||||
#define AZX_REG_SDW_SHIM_PCMSyCM(y) (0x16 + 0x4 * (y))
|
||||
|
||||
/* only one instance supported */
|
||||
#define AZX_REG_INTEL_DMIC_SHIM_OFFSET 0x0
|
||||
|
@ -91,7 +97,7 @@ struct hdac_ext2_link {
|
|||
*/
|
||||
|
||||
static int hdaml_lnk_enum(struct device *dev, struct hdac_ext2_link *h2link,
|
||||
void __iomem *ml_addr, int link_idx)
|
||||
void __iomem *remap_addr, void __iomem *ml_addr, int link_idx)
|
||||
{
|
||||
struct hdac_ext_link *hlink = &h2link->hext_link;
|
||||
u32 base_offset;
|
||||
|
@ -126,15 +132,16 @@ static int hdaml_lnk_enum(struct device *dev, struct hdac_ext2_link *h2link,
|
|||
link_idx, h2link->slcount);
|
||||
|
||||
/* find IP ID and offsets */
|
||||
h2link->leptr = readl(hlink->ml_addr + AZX_REG_ML_LEPTR);
|
||||
h2link->leptr = readl(ml_addr + AZX_REG_ML_LEPTR);
|
||||
|
||||
h2link->elid = FIELD_GET(AZX_REG_ML_LEPTR_ID, h2link->leptr);
|
||||
|
||||
base_offset = FIELD_GET(AZX_REG_ML_LEPTR_PTR, h2link->leptr);
|
||||
h2link->base_ptr = hlink->ml_addr + base_offset;
|
||||
h2link->base_ptr = remap_addr + base_offset;
|
||||
|
||||
switch (h2link->elid) {
|
||||
case AZX_REG_ML_LEPTR_ID_SDW:
|
||||
h2link->instance_offset = AZX_REG_SDW_INSTANCE_OFFSET;
|
||||
h2link->shim_offset = AZX_REG_SDW_SHIM_OFFSET;
|
||||
h2link->ip_offset = AZX_REG_SDW_IP_OFFSET;
|
||||
h2link->shim_vs_offset = AZX_REG_SDW_VS_SHIM_OFFSET;
|
||||
|
@ -149,6 +156,7 @@ static int hdaml_lnk_enum(struct device *dev, struct hdac_ext2_link *h2link,
|
|||
link_idx, base_offset);
|
||||
break;
|
||||
case AZX_REG_ML_LEPTR_ID_INTEL_SSP:
|
||||
h2link->instance_offset = AZX_REG_INTEL_SSP_INSTANCE_OFFSET;
|
||||
h2link->shim_offset = AZX_REG_INTEL_SSP_SHIM_OFFSET;
|
||||
h2link->ip_offset = AZX_REG_INTEL_SSP_IP_OFFSET;
|
||||
h2link->shim_vs_offset = AZX_REG_INTEL_SSP_VS_SHIM_OFFSET;
|
||||
|
@ -333,6 +341,21 @@ static void hdaml_link_set_lsdiid(u32 __iomem *lsdiid, int dev_num)
|
|||
writel(val, lsdiid);
|
||||
}
|
||||
|
||||
static void hdaml_shim_map_stream_ch(u16 __iomem *pcmsycm, int lchan, int hchan,
|
||||
int stream_id, int dir)
|
||||
{
|
||||
u16 val;
|
||||
|
||||
val = readw(pcmsycm);
|
||||
|
||||
u16p_replace_bits(&val, lchan, GENMASK(3, 0));
|
||||
u16p_replace_bits(&val, hchan, GENMASK(7, 4));
|
||||
u16p_replace_bits(&val, stream_id, GENMASK(13, 8));
|
||||
u16p_replace_bits(&val, dir, BIT(15));
|
||||
|
||||
writew(val, pcmsycm);
|
||||
}
|
||||
|
||||
static void hdaml_lctl_offload_enable(u32 __iomem *lctl, bool enable)
|
||||
{
|
||||
u32 val = readl(lctl);
|
||||
|
@ -364,7 +387,7 @@ static int hda_ml_alloc_h2link(struct hdac_bus *bus, int index)
|
|||
hlink->bus = bus;
|
||||
hlink->ml_addr = bus->mlcap + AZX_ML_BASE + (AZX_ML_INTERVAL * index);
|
||||
|
||||
ret = hdaml_lnk_enum(bus->dev, h2link, hlink->ml_addr, index);
|
||||
ret = hdaml_lnk_enum(bus->dev, h2link, bus->remap_addr, hlink->ml_addr, index);
|
||||
if (ret < 0) {
|
||||
kfree(h2link);
|
||||
return ret;
|
||||
|
@ -641,8 +664,13 @@ static int hdac_bus_eml_power_up_base(struct hdac_bus *bus, bool alt, int elid,
|
|||
if (eml_lock)
|
||||
mutex_lock(&h2link->eml_lock);
|
||||
|
||||
if (++hlink->ref_count > 1)
|
||||
goto skip_init;
|
||||
if (!alt) {
|
||||
if (++hlink->ref_count > 1)
|
||||
goto skip_init;
|
||||
} else {
|
||||
if (++h2link->sublink_ref_count[sublink] > 1)
|
||||
goto skip_init;
|
||||
}
|
||||
|
||||
ret = hdaml_link_init(hlink->ml_addr + AZX_REG_ML_LCTL, sublink);
|
||||
|
||||
|
@ -684,9 +712,13 @@ static int hdac_bus_eml_power_down_base(struct hdac_bus *bus, bool alt, int elid
|
|||
if (eml_lock)
|
||||
mutex_lock(&h2link->eml_lock);
|
||||
|
||||
if (--hlink->ref_count > 0)
|
||||
goto skip_shutdown;
|
||||
|
||||
if (!alt) {
|
||||
if (--hlink->ref_count > 0)
|
||||
goto skip_shutdown;
|
||||
} else {
|
||||
if (--h2link->sublink_ref_count[sublink] > 0)
|
||||
goto skip_shutdown;
|
||||
}
|
||||
ret = hdaml_link_shutdown(hlink->ml_addr + AZX_REG_ML_LCTL, sublink);
|
||||
|
||||
skip_shutdown:
|
||||
|
@ -740,6 +772,40 @@ int hdac_bus_eml_sdw_set_lsdiid(struct hdac_bus *bus, int sublink, int dev_num)
|
|||
return 0;
|
||||
} EXPORT_SYMBOL_NS(hdac_bus_eml_sdw_set_lsdiid, SND_SOC_SOF_HDA_MLINK);
|
||||
|
||||
/*
|
||||
* the 'y' parameter comes from the PCMSyCM hardware register naming. 'y' refers to the
|
||||
* PDI index, i.e. the FIFO used for RX or TX
|
||||
*/
|
||||
int hdac_bus_eml_sdw_map_stream_ch(struct hdac_bus *bus, int sublink, int y,
|
||||
int channel_mask, int stream_id, int dir)
|
||||
{
|
||||
struct hdac_ext2_link *h2link;
|
||||
u16 __iomem *pcmsycm;
|
||||
u16 val;
|
||||
|
||||
h2link = find_ext2_link(bus, true, AZX_REG_ML_LEPTR_ID_SDW);
|
||||
if (!h2link)
|
||||
return -ENODEV;
|
||||
|
||||
pcmsycm = h2link->base_ptr + h2link->shim_offset +
|
||||
h2link->instance_offset * sublink +
|
||||
AZX_REG_SDW_SHIM_PCMSyCM(y);
|
||||
|
||||
mutex_lock(&h2link->eml_lock);
|
||||
|
||||
hdaml_shim_map_stream_ch(pcmsycm, 0, hweight32(channel_mask),
|
||||
stream_id, dir);
|
||||
|
||||
mutex_unlock(&h2link->eml_lock);
|
||||
|
||||
val = readw(pcmsycm);
|
||||
|
||||
dev_dbg(bus->dev, "channel_mask %#x stream_id %d dir %d pcmscm %#x\n",
|
||||
channel_mask, stream_id, dir, val);
|
||||
|
||||
return 0;
|
||||
} EXPORT_SYMBOL_NS(hdac_bus_eml_sdw_map_stream_ch, SND_SOC_SOF_HDA_MLINK);
|
||||
|
||||
void hda_bus_ml_put_all(struct hdac_bus *bus)
|
||||
{
|
||||
struct hdac_ext_link *hlink;
|
||||
|
@ -836,6 +902,18 @@ struct hdac_ext_link *hdac_bus_eml_dmic_get_hlink(struct hdac_bus *bus)
|
|||
}
|
||||
EXPORT_SYMBOL_NS(hdac_bus_eml_dmic_get_hlink, SND_SOC_SOF_HDA_MLINK);
|
||||
|
||||
struct hdac_ext_link *hdac_bus_eml_sdw_get_hlink(struct hdac_bus *bus)
|
||||
{
|
||||
struct hdac_ext2_link *h2link;
|
||||
|
||||
h2link = find_ext2_link(bus, true, AZX_REG_ML_LEPTR_ID_SDW);
|
||||
if (!h2link)
|
||||
return NULL;
|
||||
|
||||
return &h2link->hext_link;
|
||||
}
|
||||
EXPORT_SYMBOL_NS(hdac_bus_eml_sdw_get_hlink, SND_SOC_SOF_HDA_MLINK);
|
||||
|
||||
int hdac_bus_eml_enable_offload(struct hdac_bus *bus, bool alt, int elid, bool enable)
|
||||
{
|
||||
struct hdac_ext2_link *h2link;
|
||||
|
|
|
@ -2103,10 +2103,13 @@ static int sof_ipc3_dai_config(struct snd_sof_dev *sdev, struct snd_sof_widget *
|
|||
* For the case of PAUSE/HW_FREE, since there are no quirks, flags can be used as is.
|
||||
*/
|
||||
|
||||
if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS)
|
||||
if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS) {
|
||||
/* Clear stale command */
|
||||
config->flags &= ~SOF_DAI_CONFIG_FLAGS_CMD_MASK;
|
||||
config->flags |= flags;
|
||||
else
|
||||
} else {
|
||||
config->flags = flags;
|
||||
}
|
||||
|
||||
/* only send the IPC if the widget is set up in the DSP */
|
||||
if (swidget->use_count > 0) {
|
||||
|
|
|
@ -59,7 +59,7 @@ static const struct sof_topology_token ipc4_in_audio_format_tokens[] = {
|
|||
audio_fmt.interleaving_style)},
|
||||
{SOF_TKN_CAVS_AUDIO_FORMAT_IN_FMT_CFG, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
|
||||
offsetof(struct sof_ipc4_pin_format, audio_fmt.fmt_cfg)},
|
||||
{SOF_TKN_CAVS_AUDIO_FORMAT_PIN_INDEX, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
|
||||
{SOF_TKN_CAVS_AUDIO_FORMAT_INPUT_PIN_INDEX, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
|
||||
offsetof(struct sof_ipc4_pin_format, pin_index)},
|
||||
{SOF_TKN_CAVS_AUDIO_FORMAT_IBS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
|
||||
offsetof(struct sof_ipc4_pin_format, buffer_size)},
|
||||
|
@ -79,7 +79,7 @@ static const struct sof_topology_token ipc4_out_audio_format_tokens[] = {
|
|||
audio_fmt.interleaving_style)},
|
||||
{SOF_TKN_CAVS_AUDIO_FORMAT_OUT_FMT_CFG, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
|
||||
offsetof(struct sof_ipc4_pin_format, audio_fmt.fmt_cfg)},
|
||||
{SOF_TKN_CAVS_AUDIO_FORMAT_PIN_INDEX, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
|
||||
{SOF_TKN_CAVS_AUDIO_FORMAT_OUTPUT_PIN_INDEX, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
|
||||
offsetof(struct sof_ipc4_pin_format, pin_index)},
|
||||
{SOF_TKN_CAVS_AUDIO_FORMAT_OBS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
|
||||
offsetof(struct sof_ipc4_pin_format, buffer_size)},
|
||||
|
|
|
@ -643,16 +643,17 @@ static int sof_pcm_probe(struct snd_soc_component *component)
|
|||
"%s/%s",
|
||||
plat_data->tplg_filename_prefix,
|
||||
plat_data->tplg_filename);
|
||||
if (!tplg_filename)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_sof_load_topology(component, tplg_filename);
|
||||
if (ret < 0) {
|
||||
dev_err(component->dev, "error: failed to load DSP topology %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
if (!tplg_filename) {
|
||||
ret = -ENOMEM;
|
||||
goto pm_error;
|
||||
}
|
||||
|
||||
ret = snd_sof_load_topology(component, tplg_filename);
|
||||
if (ret < 0)
|
||||
dev_err(component->dev, "error: failed to load DSP topology %d\n",
|
||||
ret);
|
||||
|
||||
pm_error:
|
||||
pm_runtime_mark_last_busy(component->dev);
|
||||
pm_runtime_put_autosuspend(component->dev);
|
||||
|
||||
|
|
|
@ -164,7 +164,7 @@ static int sof_resume(struct device *dev, bool runtime_resume)
|
|||
ret = tplg_ops->set_up_all_pipelines(sdev, false);
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev, "Failed to restore pipeline after resume %d\n", ret);
|
||||
return ret;
|
||||
goto setup_fail;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -178,6 +178,18 @@ static int sof_resume(struct device *dev, bool runtime_resume)
|
|||
dev_err(sdev->dev, "ctx_restore IPC error during resume: %d\n", ret);
|
||||
}
|
||||
|
||||
setup_fail:
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE)
|
||||
if (ret < 0) {
|
||||
/*
|
||||
* Debugfs cannot be read in runtime suspend, so cache
|
||||
* the contents upon failure. This allows to capture
|
||||
* possible DSP coredump information.
|
||||
*/
|
||||
sof_cache_debugfs(sdev);
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -218,12 +218,7 @@ static ssize_t sof_probes_dfs_points_read(struct file *file, char __user *to,
|
|||
|
||||
ret = ipc->points_info(cdev, &desc, &num_desc);
|
||||
if (ret < 0)
|
||||
goto exit;
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
err = pm_runtime_put_autosuspend(dev);
|
||||
if (err < 0)
|
||||
dev_err_ratelimited(dev, "debugfs read failed to idle %d\n", err);
|
||||
goto pm_error;
|
||||
|
||||
for (i = 0; i < num_desc; i++) {
|
||||
offset = strlen(buf);
|
||||
|
@ -241,6 +236,13 @@ static ssize_t sof_probes_dfs_points_read(struct file *file, char __user *to,
|
|||
ret = simple_read_from_buffer(to, count, ppos, buf, strlen(buf));
|
||||
|
||||
kfree(desc);
|
||||
|
||||
pm_error:
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
err = pm_runtime_put_autosuspend(dev);
|
||||
if (err < 0)
|
||||
dev_err_ratelimited(dev, "debugfs read failed to idle %d\n", err);
|
||||
|
||||
exit:
|
||||
kfree(buf);
|
||||
return ret;
|
||||
|
|
|
@ -586,6 +586,10 @@ static int sof_copy_tuples(struct snd_sof_dev *sdev, struct snd_soc_tplg_vendor_
|
|||
if (*num_copied_tuples == tuples_size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* stop when we've found the required token instances */
|
||||
if (found == num_tokens * token_instance_num)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* next array */
|
||||
|
@ -1261,7 +1265,7 @@ static int sof_widget_parse_tokens(struct snd_soc_component *scomp, struct snd_s
|
|||
if (num_sets > 1) {
|
||||
struct snd_sof_tuple *new_tuples;
|
||||
|
||||
num_tuples += token_list[object_token_list[i]].count * num_sets;
|
||||
num_tuples += token_list[object_token_list[i]].count * (num_sets - 1);
|
||||
new_tuples = krealloc(swidget->tuples,
|
||||
sizeof(*new_tuples) * num_tuples, GFP_KERNEL);
|
||||
if (!new_tuples) {
|
||||
|
|
|
@ -423,6 +423,7 @@ static int line6_parse_audio_format_rates_quirk(struct snd_usb_audio *chip,
|
|||
case USB_ID(0x0e41, 0x4248): /* Line6 Helix >= fw 2.82 */
|
||||
case USB_ID(0x0e41, 0x4249): /* Line6 Helix Rack >= fw 2.82 */
|
||||
case USB_ID(0x0e41, 0x424a): /* Line6 Helix LT >= fw 2.82 */
|
||||
case USB_ID(0x0e41, 0x424b): /* Line6 Pod Go */
|
||||
case USB_ID(0x19f7, 0x0011): /* Rode Rodecaster Pro */
|
||||
return set_fixed_rate(fp, 48000, SNDRV_PCM_RATE_48000);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue