blob: 46e1ea83ce3c208da42afb98e8668ae3b48e8591 [file] [log] [blame]
Takashi Iwai1835a0f2011-10-27 22:12:46 +02001/*
2 * Jack-detection handling for HD-audio
3 *
4 * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de>
5 *
6 * This driver is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 */
11
12#ifndef __SOUND_HDA_JACK_H
13#define __SOUND_HDA_JACK_H
14
Takashi Iwai128bc4b2012-05-07 17:42:31 +020015struct auto_pin_cfg;
David Henningsson954df2a2012-09-25 11:30:59 +020016struct hda_jack_tbl;
17
18typedef void (*hda_jack_callback) (struct hda_codec *, struct hda_jack_tbl *);
Takashi Iwai128bc4b2012-05-07 17:42:31 +020019
Takashi Iwai1835a0f2011-10-27 22:12:46 +020020struct hda_jack_tbl {
21 hda_nid_t nid;
Takashi Iwai3a938972011-10-28 01:16:55 +020022 unsigned char action; /* event action (0 = none) */
23 unsigned char tag; /* unsol event tag */
24 unsigned int private_data; /* arbitrary data */
David Henningsson954df2a2012-09-25 11:30:59 +020025 hda_jack_callback callback;
Takashi Iwai3a938972011-10-28 01:16:55 +020026 /* jack-detection stuff */
Takashi Iwai1835a0f2011-10-27 22:12:46 +020027 unsigned int pin_sense; /* cached pin-sense value */
Takashi Iwai3a938972011-10-28 01:16:55 +020028 unsigned int jack_detect:1; /* capable of jack-detection? */
Takashi Iwai1835a0f2011-10-27 22:12:46 +020029 unsigned int jack_dirty:1; /* needs to update? */
David Henningsson80c8bfb2012-06-04 09:33:51 +020030 unsigned int phantom_jack:1; /* a fixed, always present port? */
David Henningsson0f568952013-11-07 13:38:24 +010031 unsigned int block_report:1; /* in a transitional state - do not report to userspace */
Dylan Reid0619ba82012-11-19 19:48:07 +010032 hda_nid_t gating_jack; /* valid when gating jack plugged */
33 hda_nid_t gated_jack; /* gated is dependent on this jack */
Takashi Iwai01a61e12011-10-28 00:03:22 +020034 struct snd_kcontrol *kctl; /* assigned kctl for jack-detection */
Takashi Iwaiaad37db2011-11-02 08:54:51 +010035#ifdef CONFIG_SND_HDA_INPUT_JACK
36 int type;
37 struct snd_jack *jack;
38#endif
Takashi Iwai1835a0f2011-10-27 22:12:46 +020039};
40
41struct hda_jack_tbl *
42snd_hda_jack_tbl_get(struct hda_codec *codec, hda_nid_t nid);
Takashi Iwai3a938972011-10-28 01:16:55 +020043struct hda_jack_tbl *
44snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec, unsigned char tag);
Takashi Iwai1835a0f2011-10-27 22:12:46 +020045
46struct hda_jack_tbl *
47snd_hda_jack_tbl_new(struct hda_codec *codec, hda_nid_t nid);
48void snd_hda_jack_tbl_clear(struct hda_codec *codec);
49
50/**
Takashi Iwai3a938972011-10-28 01:16:55 +020051 * snd_hda_jack_get_action - get jack-tbl entry for the tag
Takashi Iwai1835a0f2011-10-27 22:12:46 +020052 *
Takashi Iwai3a938972011-10-28 01:16:55 +020053 * Call this from the unsol event handler to get the assigned action for the
54 * event. This will mark the dirty flag for the later reporting, too.
Takashi Iwai1835a0f2011-10-27 22:12:46 +020055 */
Takashi Iwai3a938972011-10-28 01:16:55 +020056static inline unsigned char
57snd_hda_jack_get_action(struct hda_codec *codec, unsigned int tag)
Takashi Iwai1835a0f2011-10-27 22:12:46 +020058{
Takashi Iwai3a938972011-10-28 01:16:55 +020059 struct hda_jack_tbl *jack = snd_hda_jack_tbl_get_from_tag(codec, tag);
60 if (jack) {
Takashi Iwai1835a0f2011-10-27 22:12:46 +020061 jack->jack_dirty = 1;
Takashi Iwai3a938972011-10-28 01:16:55 +020062 return jack->action;
63 }
64 return 0;
Takashi Iwai1835a0f2011-10-27 22:12:46 +020065}
66
67void snd_hda_jack_set_dirty_all(struct hda_codec *codec);
68
69int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid,
Takashi Iwai3a938972011-10-28 01:16:55 +020070 unsigned char action);
David Henningsson954df2a2012-09-25 11:30:59 +020071int snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
72 unsigned char action,
73 hda_jack_callback cb);
74
Dylan Reid0619ba82012-11-19 19:48:07 +010075int snd_hda_jack_set_gating_jack(struct hda_codec *codec, hda_nid_t gated_nid,
76 hda_nid_t gating_nid);
Takashi Iwai1835a0f2011-10-27 22:12:46 +020077
78u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid);
Takashi Iwai60ea8ca2013-07-19 16:59:46 +020079
80/* the jack state returned from snd_hda_jack_detect_state() */
81enum {
82 HDA_JACK_NOT_PRESENT, HDA_JACK_PRESENT, HDA_JACK_PHANTOM,
83};
84
85int snd_hda_jack_detect_state(struct hda_codec *codec, hda_nid_t nid);
86
87static inline bool snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid)
88{
89 return snd_hda_jack_detect_state(codec, nid) != HDA_JACK_NOT_PRESENT;
90}
Takashi Iwai1835a0f2011-10-27 22:12:46 +020091
Takashi Iwaia9c74172012-02-13 11:41:42 +010092bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid);
Takashi Iwai1835a0f2011-10-27 22:12:46 +020093
Takashi Iwai01a61e12011-10-28 00:03:22 +020094int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
95 const char *name, int idx);
96int snd_hda_jack_add_kctls(struct hda_codec *codec,
97 const struct auto_pin_cfg *cfg);
98
Takashi Iwai01a61e12011-10-28 00:03:22 +020099void snd_hda_jack_report_sync(struct hda_codec *codec);
100
David Henningsson954df2a2012-09-25 11:30:59 +0200101void snd_hda_jack_unsol_event(struct hda_codec *codec, unsigned int res);
Takashi Iwai01a61e12011-10-28 00:03:22 +0200102
David Henningsson26a6cb62012-10-09 15:04:21 +0200103void snd_hda_jack_poll_all(struct hda_codec *codec);
104
Takashi Iwai1835a0f2011-10-27 22:12:46 +0200105#endif /* __SOUND_HDA_JACK_H */