Linux Sound subsystem development
 help / color / mirror / Atom feed
From: "Stefan Binding \(Opensource\)" <sbinding@opensource.cirrus.com>
To: "'KM.Plass'" <kmplass@pm.me>, <linux-sound@vger.kernel.org>
Cc: <tiwai@suse.de>, <patches@opensource.cirrus.com>
Subject: RE: BUG] cs35l41-hda: OTP_BOOT_DONE timeout / I2C lost arbitration persists independent of bus speed (Lenovo Legion Slim 7 16APH8, BIOS M1CN48WW)
Date: Mon, 7 Sep 2026 11:00:32 +0100	[thread overview]
Message-ID: <012001dd3eaf$b89515c0$29bf4140$@opensource.cirrus.com> (raw)
In-Reply-To: <e93b780f-2989-4353-9316-71df451f7da7@pm.me>

Hi,

Please create a bugzilla ticket at the below address and CC Cirrus Patches (patches@opensource.cirrus.com) to it, we will investigate the issue as soon as we can.

https://bugzilla.kernel.org/

Please attach an acpi dump and dmesg to the ticket.

Creating a public Bugzilla allows others with the same laptop to find relevant information pertaining to this issue.

Thanks,

Stefan

> -----Original Message-----
> From: KM.Plass <kmplass@pm.me>
> Sent: Sunday, September 6, 2026 10:17 PM
> To: linux-sound@vger.kernel.org
> Cc: sbinding@opensource.cirrus.com; tiwai@suse.de
> Subject: BUG] cs35l41-hda: OTP_BOOT_DONE timeout / I2C lost arbitration
> persists independent of bus speed (Lenovo Legion Slim 7 16APH8, BIOS
> M1CN48WW)
> 
> Hi there.
> 
> System information
> Machine: Lenovo Legion Slim 7 16APH8 (82Y4), AMD Ryzen 7 7840HS BIOS
> version: M1CN48WW
> Kernel: 7.0.0-31-generic (Ubuntu)
> ACPI subsystem ID reported by driver: 17AA38B7 Audio codec: cs35l41-hda
> (I2C, ACPI HID "CSC3551"), 2 amplifiers at I2C addresses 0x40 and 0x41 on
> _SB.I2CD (i2c-designware controller instance
> AMDI0010:03)
> Symptom
> 
> Both amplifier instances fail probe with:
> 
> cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Failed waiting for
> OTP_BOOT_DONE cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: probe with
> driver cs35l41-hda failed with error -11 cs35l41-hda i2c-CSC3551:00-cs35l41-
> hda.1: Failed waiting for OTP_BOOT_DONE cs35l41-hda i2c-CSC3551:00-
> cs35l41-hda.1: probe with driver cs35l41-hda failed with error -11
> 
> occurring at the exact same timestamps as:
> 
> i2c_designware AMDI0010:03: i2c_dw_handle_tx_abort: lost arbitration
> 
> (repeated ~30 times within a few milliseconds, matching the probe attempts).
> 
> Internal speakers remain silent; headphones and Bluetooth audio work
> normally, isolating the problem to the internal CS35L41 amplifiers.
> 
> Background: a known fix for this exact SSID does not resolve the issue on this
> BIOS revision
> 
> A community-documented DSDT workaround exists for this exact model and
> subsystem ID (17AA38B7) on an earlier BIOS revision (M1CN42WW):
> lowering the I2C bus speed for both amplifiers from 1 MHz to 400 kHz in the
> DSDT resolves the "lost arbitration" failure there. Reference:
> https://forum.garudalinux.org/t/fix-lenovo-legion-slim-7-16aph8-82y4-
> silent-speakers-on-linux-cs35l41-at-400-khz/48722
> 
> On BIOS M1CN48WW this fix does NOT resolve the issue. I tested all of the
> following I2C bus speeds by patching the DSDT (I2cSerialBusV2 resources for
> both 0x40 and 0x41 on _SB.I2CD) and loading the modified table via the
> kernel's initrd ACPI table-upgrade mechanism (confirmed successfully loaded
> via ACPI: DSDT ACPI table found in initrd,
> CONFIG_ACPI_TABLE_UPGRADE=y):
> 
> 1 MHz (0x000F4240) - original firmware value - fails
> 400 kHz (0x00061A80) - matches the published M1CN42WW fix - fails
> identically
> 100 kHz (0x000186A0) - the speed the i2c-designware driver itself already
> force-downgrades AMDI0010:00 to, logged as "known not-working"
> at 400 kHz on that other bus instance - fails identically
> 
> All three speeds produce the exact same "lost arbitration" and "Failed waiting
> for OTP_BOOT_DONE" errors at the same point in boot. This strongly suggests
> I2C clock speed is not the (sole) root cause on this particular BIOS/board
> revision.
> 
> Kernel-side configuration checked
> 
> The cs35l41_hda_property.c table entry for this SSID appears correct:
> 
> { "17AA38B7", 2, EXTERNAL, { CS35L41_LEFT, CS35L41_RIGHT, 0, 0 }, 0, 1, -1,
> 0, 0, 0 },
> 
> reset_gpio_index = 0 correctly maps to the only GpioIo resource with
> IoRestrictionOutputOnly (ACPI pin 0x0082) among the GPIO resources
> appended to the device's _CRS (the SPK1 device has no _DSD at all; full _CRS
> excerpt below).
> 
> /sys/kernel/debug/gpio confirms this pin (#130) has already been claimed as
> an output by some consumer (shown as output with state low), so GPIO
> acquisition itself does not appear to be failing. dmesg contains no "Unable to
> get" / gpiod error messages related to this device or HID.
> 
> I was not able to determine, from userspace logs alone, whether the reset line
> is toggled with correct timing relative to the first I2C transaction (assertion
> duration / settle time before the driver attempts to talk to the amp) - this
> would require kernel-side GPIO tracing or a hardware logic analyzer, which I
> don't have access to.
> 
> Relevant ACPI _CRS excerpt (Device SPK1, decompiled DSDT) Method (_CRS,
> 0, NotSerialized) {
>      Name (IBUF, ResourceTemplate ()
>      {
>          I2cSerialBusV2 (0x0040, ControllerInitiated, 0x000F4240,
>              AddressingMode7Bit, "\_SB.I2CD", 0x00, ResourceConsumer, ,
> Exclusive, )
>          I2cSerialBusV2 (0x0041, ControllerInitiated, 0x000F4240,
>              AddressingMode7Bit, "\_SB.I2CD", 0x00, ResourceConsumer, ,
> Exclusive, )
>      })
>      Return (ConcatenateResTemplate (IBUF, GPIA)) }
> 
> Name (GPIA, ResourceTemplate ()
> {
>      GpioIo (Exclusive, PullNone, 0x0000, 0x0000, IoRestrictionOutputOnly,
>          "\_SB.GPIO", 0x00, ResourceConsumer, , ) { 0x0082 }
>      GpioIo (Exclusive, PullNone, 0x0000, 0x0000, IoRestrictionInputOnly,
>          "\_SB.GPIO", 0x00, ResourceConsumer, , ) { 0x0055 }
>      GpioIo (Shared, PullUp, 0x0064, 0x0000, IoRestrictionInputOnly,
>          "\_SB.GPIO", 0x00, ResourceConsumer, , ) { 0x005A }
>      GpioInt (Edge, ActiveLow, Shared, PullNone, 0x0064,
>          "\_SB.GPIO", 0x00, ResourceConsumer, , ) { 0x005A }
> })
> Attachments to include when submitting
> Full dmesg output from a boot with the original (1 MHz) DSDT Full dmesg
> output from a boot with the 400 kHz DSDT test Full dmesg output from a boot
> with the 100 kHz DSDT test Full decompiled DSDT (iasl -d dsdt.aml) or at least
> the complete SPK1 device block plus the _SB.I2CD scope Question for
> maintainers
> 
> Is there a known timing/sequencing difference for CS35L41 reset handling on
> M1CN48WW (or in general for this board's GPIO controller / AMDI0010
> revision) that could cause "lost arbitration" independent of I2C clock speed?
> Could this point to an incorrect reset assertion duration or settle time rather
> than clock speed, and if so, is this adjustable from DSDT/userspace, or would
> it require a driver change (e.g. an additional delay after deasserting reset
> before the first OTP_BOOT_DONE poll)?
> 
> Happy to provide any additional logs, test patches, or run further tests on this
> hardware.
> 
> BTW: I'm not into computing, just tried to solve that problem using Claude.
> 



      reply	other threads:[~2026-09-07 10:01 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-06 21:16 BUG] cs35l41-hda: OTP_BOOT_DONE timeout / I2C lost arbitration persists independent of bus speed (Lenovo Legion Slim 7 16APH8, BIOS M1CN48WW) KM.Plass
2026-09-07 10:00 ` Stefan Binding (Opensource) [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='012001dd3eaf$b89515c0$29bf4140$@opensource.cirrus.com' \
    --to=sbinding@opensource.cirrus.com \
    --cc=kmplass@pm.me \
    --cc=linux-sound@vger.kernel.org \
    --cc=patches@opensource.cirrus.com \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox