blob: af8dd4724da544c85a2b4df431262952dbb39c4a [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? */
Takashi Iwai01a61e12011-10-28 00:03:22 +020031 struct snd_kcontrol *kctl; /* assigned kctl for jack-detection */
Takashi Iwaiaad37db2011-11-02 08:54:51 +010032#ifdef CONFIG_SND_HDA_INPUT_JACK
33 int type;
34 struct snd_jack *jack;
35#endif
Takashi Iwai1835a0f2011-10-27 22:12:46 +020036};
37
38struct hda_jack_tbl *
39snd_hda_jack_tbl_get(struct hda_codec *codec, hda_nid_t nid);
Takashi Iwai3a938972011-10-28 01:16:55 +020040struct hda_jack_tbl *
41snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec, unsigned char tag);
Takashi Iwai1835a0f2011-10-27 22:12:46 +020042
43struct hda_jack_tbl *
44snd_hda_jack_tbl_new(struct hda_codec *codec, hda_nid_t nid);
45void snd_hda_jack_tbl_clear(struct hda_codec *codec);
46
47/**
Takashi Iwai3a938972011-10-28 01:16:55 +020048 * snd_hda_jack_get_action - get jack-tbl entry for the tag
Takashi Iwai1835a0f2011-10-27 22:12:46 +020049 *
Takashi Iwai3a938972011-10-28 01:16:55 +020050 * Call this from the unsol event handler to get the assigned action for the
51 * event. This will mark the dirty flag for the later reporting, too.
Takashi Iwai1835a0f2011-10-27 22:12:46 +020052 */
Takashi Iwai3a938972011-10-28 01:16:55 +020053static inline unsigned char
54snd_hda_jack_get_action(struct hda_codec *codec, unsigned int tag)
Takashi Iwai1835a0f2011-10-27 22:12:46 +020055{
Takashi Iwai3a938972011-10-28 01:16:55 +020056 struct hda_jack_tbl *jack = snd_hda_jack_tbl_get_from_tag(codec, tag);
57 if (jack) {
Takashi Iwai1835a0f2011-10-27 22:12:46 +020058 jack->jack_dirty = 1;
Takashi Iwai3a938972011-10-28 01:16:55 +020059 return jack->action;
60 }
61 return 0;
Takashi Iwai1835a0f2011-10-27 22:12:46 +020062}
63
64void snd_hda_jack_set_dirty_all(struct hda_codec *codec);
65
66int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid,
Takashi Iwai3a938972011-10-28 01:16:55 +020067 unsigned char action);
David Henningsson954df2a2012-09-25 11:30:59 +020068int snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
69 unsigned char action,
70 hda_jack_callback cb);
71
Takashi Iwai1835a0f2011-10-27 22:12:46 +020072
73u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid);
74int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid);
75
Takashi Iwaia9c74172012-02-13 11:41:42 +010076bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid);
Takashi Iwai1835a0f2011-10-27 22:12:46 +020077
Takashi Iwai01a61e12011-10-28 00:03:22 +020078int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
79 const char *name, int idx);
80int snd_hda_jack_add_kctls(struct hda_codec *codec,
81 const struct auto_pin_cfg *cfg);
82
Takashi Iwai01a61e12011-10-28 00:03:22 +020083void snd_hda_jack_report_sync(struct hda_codec *codec);
84
David Henningsson954df2a2012-09-25 11:30:59 +020085void snd_hda_jack_unsol_event(struct hda_codec *codec, unsigned int res);
Takashi Iwai01a61e12011-10-28 00:03:22 +020086
Takashi Iwai1835a0f2011-10-27 22:12:46 +020087#endif /* __SOUND_HDA_JACK_H */