Hi,
On 8/2/21 4:35 PM, Pierre-Louis Bossart wrote:
I've also figured out how jack-detect works, since the codec's GPIO1 is used for the external-hp-amp enable, the jack-detect signals are directly connected to the Bay Trail SoC's GPIOs:
-gpioget 'INT33FC:02' 14 && gpioget 'INT33FC:00' 0 && gpioget 'INT33FC:00' 3 Nothing inserted: 1 1 0 Headset in dock: 0 1 0 Headphon in dock: 0 1 1 Headset in tabl: 1 0 0 Headphon in tabl: 1 0 0 Conclusion: GPO2 pin 14: !jack in dock GPO0 pin 0: !jack in tablet GPO0 pin 3: 1 when jack in dock with no mic
I am a bit confused about the logic. Could you have a case with 1 1 1 (separate headphones in tablet and dock jacks)?
1 1 1 is not possible since 1 in column 0 + 1 means nothing inserted, iow the jack-detect is active-low; and when nothing is inserted then the last column is always 0.
With that said yes headphones in the dock + something in the tablet-jack should be detectable as a new combination not in the table, this should give us "0 0 x" (I did not test that yet, but the 2 jacks should be fully independent). IOW we will end up with 2 separate snd_soc_jack-s which together register 4 pins. E.g. the declaration for the pins will look like this:
static struct snd_soc_jack_pin rt5640_pins[] = { { .pin = "Headphone", .mask = SND_JACK_HEADPHONE, }, { .pin = "Headset Mic", .mask = SND_JACK_MICROPHONE, }, };
static struct snd_soc_jack_pin rt5640_pins2[] = { { .pin = "Headphone 2", .mask = SND_JACK_HEADPHONE, }, { .pin = "Headset Mic 2", .mask = SND_JACK_MICROPHONE, }, };
And there will be 2 snd_soc_jack_add_gpio calls each using 1 of the set of pins (assuming I can use bias over-current detect to differentiate between headphones/headset on the jack on the tablet).
As you said in your other email "this is an interesting hardware setup" I hope I won't hit any userspace issues when I have the kernel code ready to register 2 jacks.
Regards,
Hans