linux/sound/pci/hda/hda_jack.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * Jack-detection handling for HD-audio
   4 *
   5 * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de>
   6 */
   7
   8#ifndef __SOUND_HDA_JACK_H
   9#define __SOUND_HDA_JACK_H
  10
  11#include <linux/err.h>
  12#include <sound/jack.h>
  13
  14struct auto_pin_cfg;
  15struct hda_jack_tbl;
  16struct hda_jack_callback;
  17
  18typedef void (*hda_jack_callback_fn) (struct hda_codec *, struct hda_jack_callback *);
  19
  20struct hda_jack_callback {
  21        hda_nid_t nid;
  22        int dev_id;
  23        hda_jack_callback_fn func;
  24        unsigned int private_data;      /* arbitrary data */
  25        unsigned int unsol_res;         /* unsolicited event bits */
  26        struct hda_jack_tbl *jack;      /* associated jack entry */
  27        struct hda_jack_callback *next;
  28};
  29
  30struct hda_jack_tbl {
  31        hda_nid_t nid;
  32        int dev_id;
  33        unsigned char tag;              /* unsol event tag */
  34        struct hda_jack_callback *callback;
  35        /* jack-detection stuff */
  36        unsigned int pin_sense;         /* cached pin-sense value */
  37        unsigned int jack_detect:1;     /* capable of jack-detection? */
  38        unsigned int jack_dirty:1;      /* needs to update? */
  39        unsigned int phantom_jack:1;    /* a fixed, always present port? */
  40        unsigned int block_report:1;    /* in a transitional state - do not report to userspace */
  41        hda_nid_t gating_jack;          /* valid when gating jack plugged */
  42        hda_nid_t gated_jack;           /* gated is dependent on this jack */
  43        int type;
  44        int button_state;
  45        struct snd_jack *jack;
  46};
  47
  48struct hda_jack_keymap {
  49        enum snd_jack_types type;
  50        int key;
  51};
  52
  53struct hda_jack_tbl *
  54snd_hda_jack_tbl_get_mst(struct hda_codec *codec, hda_nid_t nid, int dev_id);
  55
  56/**
  57 * snd_hda_jack_tbl_get - query the jack-table entry for the given NID
  58 * @codec: the HDA codec
  59 * @nid: pin NID to refer to
  60 */
  61static inline struct hda_jack_tbl *
  62snd_hda_jack_tbl_get(struct hda_codec *codec, hda_nid_t nid)
  63{
  64        return snd_hda_jack_tbl_get_mst(codec, nid, 0);
  65}
  66
  67struct hda_jack_tbl *
  68snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec,
  69                              unsigned char tag, int dev_id);
  70
  71void snd_hda_jack_tbl_clear(struct hda_codec *codec);
  72
  73void snd_hda_jack_set_dirty_all(struct hda_codec *codec);
  74
  75int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid,
  76                               int dev_id);
  77
  78struct hda_jack_callback *
  79snd_hda_jack_detect_enable_callback_mst(struct hda_codec *codec, hda_nid_t nid,
  80                                        int dev_id, hda_jack_callback_fn func);
  81
  82/**
  83 * snd_hda_jack_detect_enable - enable the jack-detection
  84 * @codec: the HDA codec
  85 * @nid: pin NID to enable
  86 * @func: callback function to register
  87 *
  88 * In the case of error, the return value will be a pointer embedded with
  89 * errno.  Check and handle the return value appropriately with standard
  90 * macros such as @IS_ERR() and @PTR_ERR().
  91 */
  92static inline struct hda_jack_callback *
  93snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
  94                                    hda_jack_callback_fn cb)
  95{
  96        return snd_hda_jack_detect_enable_callback_mst(codec, nid, 0, cb);
  97}
  98
  99int snd_hda_jack_set_gating_jack(struct hda_codec *codec, hda_nid_t gated_nid,
 100                                 hda_nid_t gating_nid);
 101
 102u32 snd_hda_jack_pin_sense(struct hda_codec *codec, hda_nid_t nid, int dev_id);
 103
 104/* the jack state returned from snd_hda_jack_detect_state() */
 105enum {
 106        HDA_JACK_NOT_PRESENT, HDA_JACK_PRESENT, HDA_JACK_PHANTOM,
 107};
 108
 109int snd_hda_jack_detect_state_mst(struct hda_codec *codec, hda_nid_t nid,
 110                                  int dev_id);
 111
 112/**
 113 * snd_hda_jack_detect_state - query pin Presence Detect status
 114 * @codec: the CODEC to sense
 115 * @nid: the pin NID to sense
 116 *
 117 * Query and return the pin's Presence Detect status, as either
 118 * HDA_JACK_NOT_PRESENT, HDA_JACK_PRESENT or HDA_JACK_PHANTOM.
 119 */
 120static inline int
 121snd_hda_jack_detect_state(struct hda_codec *codec, hda_nid_t nid)
 122{
 123        return snd_hda_jack_detect_state_mst(codec, nid, 0);
 124}
 125
 126/**
 127 * snd_hda_jack_detect_mst - Detect the jack
 128 * @codec: the HDA codec
 129 * @nid: pin NID to check jack detection
 130 * @dev_id: pin device entry id
 131 */
 132static inline bool
 133snd_hda_jack_detect_mst(struct hda_codec *codec, hda_nid_t nid, int dev_id)
 134{
 135        return snd_hda_jack_detect_state_mst(codec, nid, dev_id) !=
 136                        HDA_JACK_NOT_PRESENT;
 137}
 138
 139/**
 140 * snd_hda_jack_detect - Detect the jack
 141 * @codec: the HDA codec
 142 * @nid: pin NID to check jack detection
 143 */
 144static inline bool
 145snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid)
 146{
 147        return snd_hda_jack_detect_mst(codec, nid, 0);
 148}
 149
 150bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid);
 151
 152int snd_hda_jack_add_kctl_mst(struct hda_codec *codec, hda_nid_t nid,
 153                              int dev_id, const char *name, bool phantom_jack,
 154                              int type, const struct hda_jack_keymap *keymap);
 155
 156/**
 157 * snd_hda_jack_add_kctl - Add a kctl for the given pin
 158 * @codec: the HDA codec
 159 * @nid: pin NID to assign
 160 * @name: string name for the jack
 161 * @phantom_jack: flag to deal as a phantom jack
 162 * @type: jack type bits to be reported, 0 for guessing from pincfg
 163 * @keymap: optional jack / key mapping
 164 *
 165 * This assigns a jack-detection kctl to the given pin.  The kcontrol
 166 * will have the given name and index.
 167 */
 168static inline int
 169snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
 170                      const char *name, bool phantom_jack,
 171                      int type, const struct hda_jack_keymap *keymap)
 172{
 173        return snd_hda_jack_add_kctl_mst(codec, nid, 0,
 174                                         name, phantom_jack, type, keymap);
 175}
 176
 177int snd_hda_jack_add_kctls(struct hda_codec *codec,
 178                           const struct auto_pin_cfg *cfg);
 179
 180void snd_hda_jack_report_sync(struct hda_codec *codec);
 181
 182void snd_hda_jack_unsol_event(struct hda_codec *codec, unsigned int res);
 183
 184void snd_hda_jack_poll_all(struct hda_codec *codec);
 185
 186#endif /* __SOUND_HDA_JACK_H */
 187