Whoops, he's the correct patch:
https://bugzilla.kernel.org/attachment.cgi?id=297571&action=diff
On 6/22/21 7:00 PM, Cameron Berkenpas wrote:
Updated the patch to use the automute_hook and it works:
https://bugzilla.kernel.org/attachment.cgi?id=297569&action=diff
I suspect this is the right way to do things. Hopefully someone can
confirm.
The automute hooks are called indirectly by call_update_outputs(),
which means likely the automute hooks are called both when headphones
are plugged in as well as when they're removed. When I get around to
it, I'll add a check such that the verbs are only sent on removal.
Sending the verbs when the headphones are inserted don't appear to
harm anything, but... There's not reason to.
Thanks!
On 6/22/21 12:17 PM, Cameron Berkenpas wrote:
Hello,
I'm working on a patch to get audio output working on the speakers of
the Lenovo Legion/Yoga Slim 7 laptops:
https://bugzilla.kernel.org/attachment.cgi?id=297559&action=diff
Please let me know if this isn't the right place for these types of
questions.
Both of these laptops have ALC287's that both seem to need some codec
initialization to get the speakers working. For both laptops, the
specs report ALC3306, but Linux on both systems reports that it's an
ALC287, and looking at the PCI ID's on Windows agrees that it's an
ALC287.
This is my first time working on such a patch, and I'm having a
headphone related problem:
1. When plugging headphones into the audio jack, I get sound on the
headphones as expected. I see that the speakers are muted and the
headphones are unmuted as expected in alsamixer.
2. When I unplug the headphones, I can no longer get speaker output.
Monitoring alsamixer, I observe that unplugging the headphones
results in the speakers being unmuted and the headphones are muted as
expected. However, I am unable to get speaker output in this case.
3. If I plug in the headphones, don't play any sound, and then unplug
the headphones, I see the same behavior in alsamixer, BUT speaker
output still works.
4. If I apply the initialization verbs via hda-verb (the same verbs
that I'm using in my patch), speaker output works again.
5. If speaker output is no longer working (due to #2), putting the
laptop to sleep and resuming fixes the speakers. The code in the
kernel seems to call the sound card's init again so this makes sense.
In short, it seems I need to re-initialize the speakers when the
headphones are unplugged. Studying sound/pci/hda/patch_realtek.c,
there's alc_headset_mode_unplugged(), but as there's currently no
case for 0x10ec0287 at all. I'm not sure adding in a case that
re-initializes makes sense if the vast majority of ALC287's don't
need to when headphones are unplugged. It seems none of the other
cards, at least as far as I can tell, do a re-init when headphones
are unplugged either. They just seem to setup some pins and
coefficients for the most part if anything at all.
How can I re-init the speakers when headphones are unplugged
specifically for these specific models? The initial-initialization is
only done for these laptops, I'm just unclear what, if any, mechanism
there is for initialization on headphone unplugs?
Thanks!
-Cameron