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:
- 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.
- 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.
- 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.
- If I apply the initialization verbs via hda-verb (the same verbs
that I'm using in my patch), speaker output works again.
- 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