• Hui Wang's avatar
    ALSA: jack: implement software jack injection via debugfs · 2d670ea2
    Hui Wang authored
    This change adds audio jack injection feature through debugfs, with
    this feature, we could validate alsa userspace changes by injecting
    plugin or plugout events to the non-phantom audio jacks.
    
    With this change, the sound core will build the folders
    $debugfs_mount_dir/sound/cardN if SND_DEBUG and DEBUG_FS are enabled.
    And if users also enable the SND_JACK_INJECTION_DEBUG, the jack
    injection nodes will be built in the folder cardN like below:
    
    $tree $debugfs_mount_dir/sound
    $debugfs_mount_dir/sound
    ├── card0
    │   ├── HDMI_DP_pcm_10_Jack
    │   │   ├── jackin_inject
    │   │   ├── kctl_id
    │   │   ├── mask_bits
    │   │   ├── status
    │   │   ├── sw_inject_enable
    │   │   └── type
    ...
    │   └── HDMI_DP_pcm_9_Jack
    │       ├── jackin_inject
    │       ├── kctl_id
    │       ├── mask_bits
    │       ├── status
    │       ├── sw_inject_enable
    │       └── type
    └── card1
        ├── HDMI_DP_pcm_5_Jack
        │   ├── jackin_inject
        │   ├── kctl_id
        │   ├── mask_bits
        │   ├── status
        │   ├── sw_inject_enable
        │   └── type
        ...
        ├── Headphone_Jack
        │   ├── jackin_inject
        │   ├── kctl_id
        │   ├── mask_bits
        │   ├── status
        │   ├── sw_inject_enable
        │   └── type
        └── Headset_Mic_Jack
            ├── jackin_inject
            ├── kctl_id
            ├── mask_bits
            ├── status
            ├── sw_inject_enable
            └── type
    
    The nodes kctl_id, mask_bits, status and type are read-only, users
    could check jack or jack_kctl's information through them.
    
    The nodes sw_inject_enable and jackin_inject are directly used for
    injection. The sw_inject_enable is read-write, users could check if
    software injection is enabled or not on this jack, and users could
    echo 1 or 0 to enable or disable software injection on this jack. Once
    the injection is enabled, the jack will not change by hardware events
    anymore, once the injection is disabled, the jack will restore the
    last reported hardware events to the jack. The jackin_inject is
    write-only, if the injection is enabled, users could echo 1 or 0 to
    this node to inject plugin or plugout events to this jack.
    
    For the detailed usage information on these nodes, please refer to
    Documentation/sound/designs/jack-injection.rst.
    Reviewed-by: default avatarTakashi Iwai <tiwai@suse.de>
    Reviewed-by: default avatarJaroslav Kysela <perex@perex.cz>
    Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
    Signed-off-by: default avatarHui Wang <hui.wang@canonical.com>
    Link: https://lore.kernel.org/r/20210127085639.74954-2-hui.wang@canonical.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    2d670ea2
jack.c 17.1 KB