This is actually a kernel bug, in Linux. The issue is the absence of
platform data for this particular board in the snd_soc_rt5645 module.

The issue can be worked around by creating
/etc/modprobe.d/hacksound.conf with the following contents:

# Invert jack detection (1) and use detection mode 2 (2).
options snd_soc_rt5645 quirk=0x21

This takes advantage of the "quirk" option for the module, added in
https://github.com/torvalds/linux/commit/4999b0214b05a08b42bbafcb29a0b9c413002d3f,
which allows overriding the platform data it usually just has built into
it about how audio jacks are hooked up on particular systems.

It looks like this board needs special system info added to
sound/soc/codecs/rt5645.c, keyed on DMI data. The platform data would
look something like:

static const struct rt5645_platform_data lattepanda_platform_data = {
        .jd_mode = 2,
        .inv_jd1_1 = true
};

Here's the DMI data for the motherboard; it's a bit generic. I can
provide other DMI data to match on if needed.

Base Board Information
        Manufacturer: AMI Corporation
        Product Name: Cherry Trail CR
        Version: Default string
        Serial Number: Default string
        Asset Tag: Default string
        Features:
                Board is a hosting board
                Board is replaceable
        Location In Chassis: Default string
        Chassis Handle: 0x0003
        Type: Motherboard
        Contained Object Handles: 0


** Package changed: alsa-lib (Ubuntu) => linux (Ubuntu)

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to alsa-lib in Ubuntu.
https://bugs.launchpad.net/bugs/1824259

Title:
  Headphone jack switch sense is inverted: plugging in headphones
  disables headphone output

Status in linux package in Ubuntu:
  Incomplete

Bug description:
  My machine is a LattePanda board, which uses a "chtrt5645" device as a
  sound card. It has a single headphone output jack, which I think is a
  TRRS jack, with a mic input, such as is normally used on phones.

  When I don't have headphones plugged in, the system thinks headphones
  *are* plugged in. Gnome Control Center shows my audio device as being
  headphones. If I insert a headphone connector partway into the jack, I
  can even get sound in the headphones.

  But if I plug the headphones all the way in, the system decided that I
  have *un*plugged the headphones, and switches output over to
  "Speaker". The system doesn't actually have a speaker, only a
  headphone jack. And when the system switches over to "Speaker", I get
  no sound out of the headphones, even if I open "pavucontrol" and swap
  over to "Headphones (unplugged)" on the "Output Devices" tab.

  This is what "pacmd"'s "list-cards" command says with my headphones
  *unplugged*:

  2 card(s) available.
      index: 0
        name: <alsa_card.pci-0000_00_02.0-platform-hdmi-lpe-audio>
        driver: <module-alsa-card.c>
        owner module: 7
        properties:
                alsa.card = "1"
                alsa.card_name = "Intel HDMI/DP LPE Audio"
                alsa.long_card_name = "Intel HDMI/DP LPE Audio"
                alsa.driver_name = "snd_hdmi_lpe_audio"
                device.bus_path = "pci-0000:00:02.0-platform-hdmi-lpe-audio"
                sysfs.path = 
"/devices/pci0000:00/0000:00:02.0/hdmi-lpe-audio/sound/card1"
                device.bus = "pci"
                device.vendor.id = "8086"
                device.vendor.name = "Intel Corporation"
                device.product.id = "22b0"
                device.product.name = "Atom/Celeron/Pentium Processor 
x5-E8000/J3xxx/N3xxx Series PCI Configuration Registers"
                device.string = "1"
                device.description = "Atom/Celeron/Pentium Processor 
x5-E8000/J3xxx/N3xxx Series PCI Configuration Registers"
                module-udev-detect.discovered = "1"
                device.icon_name = "audio-card-pci"
        profiles:
                output:hdmi-stereo: Digital Stereo (HDMI) Output (priority 
5900, available: no)
                output:hdmi-surround: Digital Surround 5.1 (HDMI) Output 
(priority 800, available: no)
                output:hdmi-surround71: Digital Surround 7.1 (HDMI) Output 
(priority 800, available: no)
                output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output 
(priority 5700, available: no)
                output:hdmi-surround-extra1: Digital Surround 5.1 (HDMI 2) 
Output (priority 600, available: no)
                output:hdmi-surround71-extra1: Digital Surround 7.1 (HDMI 2) 
Output (priority 600, available: no)
                output:hdmi-stereo-extra2: Digital Stereo (HDMI 3) Output 
(priority 5700, available: no)
                output:hdmi-surround-extra2: Digital Surround 5.1 (HDMI 3) 
Output (priority 600, available: no)
                output:hdmi-surround71-extra2: Digital Surround 7.1 (HDMI 3) 
Output (priority 600, available: no)
                off: Off (priority 0, available: unknown)
        active profile: <off>
        ports:
                hdmi-output-0: HDMI / DisplayPort (priority 5900, latency 
offset 0 usec, available: no)
                        properties:
                                device.icon_name = "video-display"
                hdmi-output-1: HDMI / DisplayPort 2 (priority 5800, latency 
offset 0 usec, available: no)
                        properties:
                                device.icon_name = "video-display"
                hdmi-output-2: HDMI / DisplayPort 3 (priority 5700, latency 
offset 0 usec, available: no)
                        properties:
                                device.icon_name = "video-display"
      index: 1
        name: <alsa_card.platform-cht-bsw-rt5645>
        driver: <module-alsa-card.c>
        owner module: 8
        properties:
                alsa.card = "0"
                alsa.card_name = "chtrt5645"
                alsa.long_card_name = 
"AMICorporation-Defaultstring-Defaultstring-CherryTrailCR"
                alsa.driver_name = "snd_soc_sst_cht_bsw_rt5645"
                device.bus_path = "platform-cht-bsw-rt5645"
                sysfs.path = 
"/devices/pci0000:00/808622A8:00/cht-bsw-rt5645/sound/card0"
                device.form_factor = "internal"
                device.string = "0"
                device.description = "Built-in Audio"
                module-udev-detect.discovered = "1"
                device.icon_name = "audio-card"
        profiles:
                HiFi: Default (priority 8000, available: unknown)
                off: Off (priority 0, available: unknown)
        active profile: <HiFi>
        sinks:
                
alsa_output.platform-cht-bsw-rt5645.HiFi__hw_chtrt5645__sink/#0: Built-in Audio 
Headphones + Speaker
        sources:
                
alsa_output.platform-cht-bsw-rt5645.HiFi__hw_chtrt5645__sink.monitor/#0: 
Monitor of Built-in Audio Headphones + Speaker
                
alsa_input.platform-cht-bsw-rt5645.HiFi__hw_chtrt5645__source/#1: Built-in 
Audio Headset Microphone + Internal Analog Microphone
        ports:
                [Out] Headphones: Headphones (priority 100, latency offset 0 
usec, available: yes)
                        properties:
                                
                [Out] Speaker: Speaker (priority 100, latency offset 0 usec, 
available: no)
                        properties:
                                
                [In] HSMic: Headset Microphone (priority 100, latency offset 0 
usec, available: yes)
                        properties:
                                
                [In] Mic: Internal Analog Microphone (priority 150, latency 
offset 0 usec, available: no)
                        properties:
                                

  
  When I plug in the headphones, the entry for card 1 changes to:

      index: 1
        name: <alsa_card.platform-cht-bsw-rt5645>
        driver: <module-alsa-card.c>
        owner module: 8
        properties:
                alsa.card = "0"
                alsa.card_name = "chtrt5645"
                alsa.long_card_name = 
"AMICorporation-Defaultstring-Defaultstring-CherryTrailCR"
                alsa.driver_name = "snd_soc_sst_cht_bsw_rt5645"
                device.bus_path = "platform-cht-bsw-rt5645"
                sysfs.path = 
"/devices/pci0000:00/808622A8:00/cht-bsw-rt5645/sound/card0"
                device.form_factor = "internal"
                device.string = "0"
                device.description = "Built-in Audio"
                module-udev-detect.discovered = "1"
                device.icon_name = "audio-card"
        profiles:
                HiFi: Default (priority 8000, available: unknown)
                off: Off (priority 0, available: unknown)
        active profile: <HiFi>
        sinks:
                
alsa_output.platform-cht-bsw-rt5645.HiFi__hw_chtrt5645__sink/#0: Built-in Audio 
Headphones + Speaker
        sources:
                
alsa_output.platform-cht-bsw-rt5645.HiFi__hw_chtrt5645__sink.monitor/#0: 
Monitor of Built-in Audio Headphones + Speaker
                
alsa_input.platform-cht-bsw-rt5645.HiFi__hw_chtrt5645__source/#1: Built-in 
Audio Headset Microphone + Internal Analog Microphone
        ports:
                [Out] Headphones: Headphones (priority 100, latency offset 0 
usec, available: no)
                        properties:
                                
                [Out] Speaker: Speaker (priority 100, latency offset 0 usec, 
available: unknown)
                        properties:
                                
                [In] HSMic: Headset Microphone (priority 100, latency offset 0 
usec, available: no)
                        properties:
                                
                [In] Mic: Internal Analog Microphone (priority 150, latency 
offset 0 usec, available: unknown)
                        properties:
                                

  Note that the "Headphones" port is now "available: no".

  PulseAudio is getting all these ports from Alsa's UCM (Use Case
  Manager) system, which has a bunch of config files that live in
  /usr/share/alsa/ucm. I tried editing
  /usr/share/alsa/ucm/chtrt5645/HiFi.conf to swap the enable and disable
  procedures for the headphones and the speakers, in hopes of convincing
  it to route audio out the headphone jack, but that didn't work.

  This problem has affected me since at least Ubuntu 18.04. I've
  upgraded through 18.10 and to 19.04 today. All three releases have the
  same problem.

  1. How is the PulseAudio/ALSA system determining whether headphones
  are plugged in or not?

  2. How do I invert the sense of that test?

  ProblemType: Bug
  DistroRelease: Ubuntu 19.04
  Package: libasound2 1.1.8-1
  ProcVersionSignature: Ubuntu 5.0.0-8.9-generic 5.0.1
  Uname: Linux 5.0.0-8-generic x86_64
  ApportVersion: 2.20.10-0ubuntu26
  Architecture: amd64
  CurrentDesktop: ubuntu:GNOME
  Date: Wed Apr 10 19:21:09 2019
  InstallationDate: Installed on 2018-12-08 (123 days ago)
  InstallationMedia: Ubuntu 18.04.1 LTS "Bionic Beaver" - Release amd64 
(20180725)
  ProcEnviron:
   TERM=xterm-256color
   PATH=(custom, no user)
   XDG_RUNTIME_DIR=<set>
   LANG=en_US.UTF-8
   SHELL=/bin/bash
  SourcePackage: alsa-lib
  UpgradeStatus: Upgraded to disco on 2019-04-11 (0 days ago)

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1824259/+subscriptions

-- 
Mailing list: https://launchpad.net/~kernel-packages
Post to     : kernel-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~kernel-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to