Lines Matching full:codec
21 * @codec: the HDA codec
26 * detection is prohibited in the codec level, the pin config has
29 bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid) in is_jack_detectable() argument
31 if (codec->no_jack_detect) in is_jack_detectable()
33 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT)) in is_jack_detectable()
35 if (get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid)) & in is_jack_detectable()
38 if (!(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) && in is_jack_detectable()
39 !codec->jackpoll_interval) in is_jack_detectable()
46 static u32 read_pin_sense(struct hda_codec *codec, hda_nid_t nid) in read_pin_sense() argument
51 if (!codec->no_trigger_sense) { in read_pin_sense()
52 pincap = snd_hda_query_pin_caps(codec, nid); in read_pin_sense()
54 snd_hda_codec_read(codec, nid, 0, in read_pin_sense()
57 val = snd_hda_codec_read(codec, nid, 0, in read_pin_sense()
59 if (codec->inv_jack_detect) in read_pin_sense()
66 * @codec: the HDA codec
70 snd_hda_jack_tbl_get(struct hda_codec *codec, hda_nid_t nid) in snd_hda_jack_tbl_get() argument
72 struct hda_jack_tbl *jack = codec->jacktbl.list; in snd_hda_jack_tbl_get()
77 for (i = 0; i < codec->jacktbl.used; i++, jack++) in snd_hda_jack_tbl_get()
86 * @codec: the HDA codec
90 snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec, unsigned char tag) in snd_hda_jack_tbl_get_from_tag() argument
92 struct hda_jack_tbl *jack = codec->jacktbl.list; in snd_hda_jack_tbl_get_from_tag()
97 for (i = 0; i < codec->jacktbl.used; i++, jack++) in snd_hda_jack_tbl_get_from_tag()
106 * @codec: the HDA codec
110 snd_hda_jack_tbl_new(struct hda_codec *codec, hda_nid_t nid) in snd_hda_jack_tbl_new() argument
112 struct hda_jack_tbl *jack = snd_hda_jack_tbl_get(codec, nid); in snd_hda_jack_tbl_new()
115 jack = snd_array_new(&codec->jacktbl); in snd_hda_jack_tbl_new()
120 jack->tag = codec->jacktbl.used; in snd_hda_jack_tbl_new()
124 void snd_hda_jack_tbl_clear(struct hda_codec *codec) in snd_hda_jack_tbl_clear() argument
126 struct hda_jack_tbl *jack = codec->jacktbl.list; in snd_hda_jack_tbl_clear()
129 for (i = 0; i < codec->jacktbl.used; i++, jack++) { in snd_hda_jack_tbl_clear()
133 if (!codec->bus->shutdown && jack->jack) in snd_hda_jack_tbl_clear()
134 snd_device_free(codec->card, jack->jack); in snd_hda_jack_tbl_clear()
141 snd_array_free(&codec->jacktbl); in snd_hda_jack_tbl_clear()
147 static void jack_detect_update(struct hda_codec *codec, in jack_detect_update() argument
156 jack->pin_sense = read_pin_sense(codec, jack->nid); in jack_detect_update()
159 if (jack->gating_jack && !snd_hda_jack_detect(codec, jack->gating_jack)) in jack_detect_update()
167 snd_hda_jack_tbl_get(codec, jack->gated_jack); in jack_detect_update()
170 jack_detect_update(codec, gated); in jack_detect_update()
177 * @codec: the HDA codec
182 void snd_hda_jack_set_dirty_all(struct hda_codec *codec) in snd_hda_jack_set_dirty_all() argument
184 struct hda_jack_tbl *jack = codec->jacktbl.list; in snd_hda_jack_set_dirty_all()
187 for (i = 0; i < codec->jacktbl.used; i++, jack++) in snd_hda_jack_set_dirty_all()
195 * @codec: the CODEC to sense
201 u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid) in snd_hda_pin_sense() argument
203 struct hda_jack_tbl *jack = snd_hda_jack_tbl_get(codec, nid); in snd_hda_pin_sense()
205 jack_detect_update(codec, jack); in snd_hda_pin_sense()
208 return read_pin_sense(codec, nid); in snd_hda_pin_sense()
214 * @codec: the CODEC to sense
220 int snd_hda_jack_detect_state(struct hda_codec *codec, hda_nid_t nid) in snd_hda_jack_detect_state() argument
222 struct hda_jack_tbl *jack = snd_hda_jack_tbl_get(codec, nid); in snd_hda_jack_detect_state()
225 else if (snd_hda_pin_sense(codec, nid) & AC_PINSENSE_PRESENCE) in snd_hda_jack_detect_state()
234 * @codec: the HDA codec
243 snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid, in snd_hda_jack_detect_enable_callback() argument
250 jack = snd_hda_jack_tbl_new(codec, nid); in snd_hda_jack_detect_enable_callback()
266 if (codec->jackpoll_interval > 0) in snd_hda_jack_detect_enable_callback()
268 err = snd_hda_codec_write_cache(codec, nid, 0, in snd_hda_jack_detect_enable_callback()
279 * @codec: the HDA codec
285 int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid) in snd_hda_jack_detect_enable() argument
287 return PTR_ERR_OR_ZERO(snd_hda_jack_detect_enable_callback(codec, nid, NULL)); in snd_hda_jack_detect_enable()
293 * @codec: the HDA codec
299 int snd_hda_jack_set_gating_jack(struct hda_codec *codec, hda_nid_t gated_nid, in snd_hda_jack_set_gating_jack() argument
302 struct hda_jack_tbl *gated = snd_hda_jack_tbl_new(codec, gated_nid); in snd_hda_jack_set_gating_jack()
303 struct hda_jack_tbl *gating = snd_hda_jack_tbl_new(codec, gating_nid); in snd_hda_jack_set_gating_jack()
317 * @codec: the HDA codec
319 void snd_hda_jack_report_sync(struct hda_codec *codec) in snd_hda_jack_report_sync() argument
325 jack = codec->jacktbl.list; in snd_hda_jack_report_sync()
326 for (i = 0; i < codec->jacktbl.used; i++, jack++) in snd_hda_jack_report_sync()
328 jack_detect_update(codec, jack); in snd_hda_jack_report_sync()
333 jack = codec->jacktbl.list; in snd_hda_jack_report_sync()
334 for (i = 0; i < codec->jacktbl.used; i++, jack++) in snd_hda_jack_report_sync()
352 static int get_input_jack_type(struct hda_codec *codec, hda_nid_t nid) in get_input_jack_type() argument
354 unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid); in get_input_jack_type()
380 * @codec: the HDA codec
390 int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid, in snd_hda_jack_add_kctl() argument
398 jack = snd_hda_jack_tbl_new(codec, nid); in snd_hda_jack_add_kctl()
405 type = get_input_jack_type(codec, nid); in snd_hda_jack_add_kctl()
413 err = snd_jack_new(codec->card, name, type | buttons, in snd_hda_jack_add_kctl()
428 state = snd_hda_jack_detect(codec, nid); in snd_hda_jack_add_kctl()
435 static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid, in add_jack_kctl() argument
446 def_conf = snd_hda_codec_get_pincfg(codec, nid); in add_jack_kctl()
451 !is_jack_detectable(codec, nid); in add_jack_kctl()
456 snd_hda_get_pin_label(codec, nid, cfg, name, sizeof(name), NULL); in add_jack_kctl()
460 err = snd_hda_jack_add_kctl(codec, nid, name, phantom_jack, 0, NULL); in add_jack_kctl()
465 return snd_hda_jack_detect_enable(codec, nid); in add_jack_kctl()
471 * @codec: the HDA codec
474 int snd_hda_jack_add_kctls(struct hda_codec *codec, in snd_hda_jack_add_kctls() argument
485 err = add_jack_kctl(codec, auto_cfg_hp_pins(cfg)[0], in snd_hda_jack_add_kctls()
488 err = add_jack_kctl(codec, cfg->inputs[i].pin, in snd_hda_jack_add_kctls()
491 err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg, in snd_hda_jack_add_kctls()
498 err = add_jack_kctl(codec, *p, cfg, NULL); in snd_hda_jack_add_kctls()
505 err = add_jack_kctl(codec, *p, cfg, NULL); in snd_hda_jack_add_kctls()
512 err = add_jack_kctl(codec, *p, cfg, NULL); in snd_hda_jack_add_kctls()
517 err = add_jack_kctl(codec, *p, cfg, NULL); in snd_hda_jack_add_kctls()
521 err = add_jack_kctl(codec, cfg->dig_in_pin, cfg, NULL); in snd_hda_jack_add_kctls()
524 err = add_jack_kctl(codec, cfg->mono_out_pin, cfg, NULL); in snd_hda_jack_add_kctls()
531 static void call_jack_callback(struct hda_codec *codec, unsigned int res, in call_jack_callback() argument
539 cb->func(codec, cb); in call_jack_callback()
543 snd_hda_jack_tbl_get(codec, jack->gated_jack); in call_jack_callback()
548 cb->func(codec, cb); in call_jack_callback()
556 * @codec: the HDA codec
559 void snd_hda_jack_unsol_event(struct hda_codec *codec, unsigned int res) in snd_hda_jack_unsol_event() argument
564 event = snd_hda_jack_tbl_get_from_tag(codec, tag); in snd_hda_jack_unsol_event()
569 call_jack_callback(codec, res, event); in snd_hda_jack_unsol_event()
570 snd_hda_jack_report_sync(codec); in snd_hda_jack_unsol_event()
576 * @codec: the HDA codec
581 void snd_hda_jack_poll_all(struct hda_codec *codec) in snd_hda_jack_poll_all() argument
583 struct hda_jack_tbl *jack = codec->jacktbl.list; in snd_hda_jack_poll_all()
586 for (i = 0; i < codec->jacktbl.used; i++, jack++) { in snd_hda_jack_poll_all()
591 jack_detect_update(codec, jack); in snd_hda_jack_poll_all()
595 call_jack_callback(codec, 0, jack); in snd_hda_jack_poll_all()
598 snd_hda_jack_report_sync(codec); in snd_hda_jack_poll_all()