Re: RE: Re: [PATCH] ALSA: hda/realtek: Fix internal speakers for Legion Y9000X 2022 IAH7

From: ArcticLampyrid
Date: Thu Apr 18 2024 - 00:03:45 EST


> To clarify, was the log you attached here using:
> { "17AA386E", 2, EXTERNAL, { CS35L41_LEFT, CS35L41_RIGHT, 0, 0}, 0, 2, -1, 0, 0, 0 },
> Or was it using your original value (index 1)?

Both get the same log.

> For further investigation, can you create a bugzilla ticket at the
> below address and CC Cirrus Patches (patches@xxxxxxxxxxxxxxxxxxxxx) to
> it.

OK. https://bugzilla.kernel.org/show_bug.cgi?id=218744

> Can you also mention which distro you are using, as well which Kernel you are using.

I'm using Arch Linux, the kernel is v6.8.5-arch1.

> Both amps use the same GPIO for the interrupt line, thus the interrupt is shared, and there is only a single interrupt line.

BTW, it's connected to APIC.

> Also, can you please attach a dmesg of the error

Without any patches, I got
```log
Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 I2C devices.
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Failed property cirrus,dev-index: -22
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: error -EINVAL: Platform not supported
cs35l41-hda: probe of i2c-CSC3551:00-cs35l41-hda.0 failed with error -22
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Failed property cirrus,dev-index: -22
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: error -EINVAL: Platform not supported
cs35l41-hda: probe of i2c-CSC3551:00-cs35l41-hda.1 failed with error -22
```

With `generic_dsd_config` I got
```log
kernel: genirq: Flags mismatch irq 58. 00002088 (cs35l41 IRQ1 Controller) vs. 00002088 (cs35l41 IRQ1 Controller)
```
as memtioned in the previous email.

With my initial patch:
```log
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Adding DSD properties for 17AA386E
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Using extra _DSD properties, bypassing _DSD in ACPI
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Cirrus Logic CS35L41 (35a40), Revision: B2
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Adding DSD properties for 17AA386E
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Using extra _DSD properties, bypassing _DSD in ACPI
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Reset line busy, assuming shared reset
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Cirrus Logic CS35L41 (35a40), Revision: B2
Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 I2C devices.
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Falling back to default firmware.
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: Firmware version: 3
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: cirrus/cs35l41-dsp1-spk-prot.wmfw: Fri 24 Jun 2022 14:55:56 GMT Daylight Time
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: Firmware: 400a4 vendor: 0x2 v0.58.0, 2 algorithms
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: cirrus/cs35l41-dsp1-spk-prot.bin: v0.58.0
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: spk-prot: e:\workspace\workspace\tibranch_release_playback_6.76_2\ormis\staging\default_tunings\internal\CS35L53\Fixed_Attenuation_Mono_48000_29.78.0\full\Fixed_Attenuation_Mono_48000_29.78.0_full.bin
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: CS35L41 Bound - SSID: 17AA386E, BST: 1, VSPK: 1, CH: L, FW EN: 1, SPKID: 1
snd_hda_codec_realtek ehdaudio0D0: bound i2c-CSC3551:00-cs35l41-hda.0 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Falling back to default firmware.
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: Firmware version: 3
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: cirrus/cs35l41-dsp1-spk-prot.wmfw: Fri 24 Jun 2022 14:55:56 GMT Daylight Time
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: Firmware: 400a4 vendor: 0x2 v0.58.0, 2 algorithms
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: cirrus/cs35l41-dsp1-spk-prot.bin: v0.58.0
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: spk-prot: e:\workspace\workspace\tibranch_release_playback_6.76_2\ormis\staging\default_tunings\internal\CS35L53\Fixed_Attenuation_Mono_48000_29.78.0\full\Fixed_Attenuation_Mono_48000_29.78.0_full.bin
cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: CS35L41 Bound - SSID: 17AA386E, BST: 1, VSPK: 1, CH: R, FW EN: 1, SPKID: 1
snd_hda_codec_realtek ehdaudio0D0: bound i2c-CSC3551:00-cs35l41-hda.1 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
```

> as well as the acpidump of your laptop.

The full acpi dump is shared via
https://bugzilla.kernel.org/show_bug.cgi?id=218744

The related item I think in DSDT table may be:
```
Device (SPKR)
{
Name (_HID, "CSC3551") // _HID: Hardware ID
Name (_SUB, "17AA386E") // _SUB: Subsystem ID
Name (_UID, One) // _UID: Unique ID
Name (SRS0, 0x09060000)
Name (SIN0, 0x0908000E)
Name (SID0, 0x09060001)
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
Name (RBUF, ResourceTemplate ()
{
I2cSerialBusV2 (0x0040, ControllerInitiated, 0x000F4240,
AddressingMode7Bit, "\\_SB.PC00.I2C3",
0x00, ResourceConsumer, , Exclusive,
)
I2cSerialBusV2 (0x0041, ControllerInitiated, 0x000F4240,
AddressingMode7Bit, "\\_SB.PC00.I2C3",
0x00, ResourceConsumer, , Exclusive,
)
GpioIo (Exclusive, PullNone, 0x0000, 0x0000, IoRestrictionOutputOnly,
"\\_SB.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
GpioIo (Shared, PullNone, 0x0064, 0x0000, IoRestrictionInputOnly,
"\\_SB.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
GpioIo (Exclusive, PullNone, 0x0000, 0x0000, IoRestrictionInputOnly,
"\\_SB.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
Interrupt (ResourceConsumer, Edge, ActiveHigh, SharedAndWake, ,, _Y58)
{
0x00000000,
}
})
CreateWordField (RBUF, 0x59, RST0)
CreateWordField (RBUF, 0x7C, INT0)
CreateWordField (RBUF, 0x9F, PID0)
CreateDWordField (RBUF, \_SB.PC00.I2C3.SPKR._CRS._Y58._INT, INT1) // _INT: Interrupts
RST0 = GNUM (SRS0)
INT0 = GNUM (SIN0)
PID0 = GNUM (SID0)
INT1 = INUM (SIN0)
Return (RBUF) /* \_SB_.PC00.I2C3.SPKR._CRS.RBUF */
}

Method (_INI, 0, NotSerialized) // _INI: Initialize
{
SGRA (0x0908000E, One)
SGII (0x0908000E, Zero)
GRXE (0x0908000E, 0x03)
}

Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (0x0F)
}

Method (_DIS, 0, NotSerialized) // _DIS: Disable Device
{
}

Method (_PS0, 0, Serialized) // _PS0: Power State 0
{
^^^LPCB.H_EC.ECWT (Zero, RefOf (^^^LPCB.H_EC.AM12))
}

Method (_PS2, 0, Serialized) // _PS2: Power State 2
{
^^^LPCB.H_EC.ECWT (One, RefOf (^^^LPCB.H_EC.AM12))
}

Method (_PS3, 0, Serialized) // _PS3: Power State 3
{
}
}
```