1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Jack-detection handling for HD-audio
5 * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de>
8 #include <linux/init.h>
9 #include <linux/slab.h>
10 #include <linux/export.h>
11 #include <sound/core.h>
12 #include <sound/control.h>
13 #include <sound/jack.h>
14 #include <sound/hda_codec.h>
15 #include "hda_local.h"
16 #include "hda_auto_parser.h"
20 * is_jack_detectable - Check whether the given pin is jack-detectable
21 * @codec: the HDA codec
24 * Check whether the given pin is capable to report the jack detection.
25 * The jack detection might not work by various reasons, e.g. the jack
26 * detection is prohibited in the codec level, the pin config has
27 * AC_DEFCFG_MISC_NO_PRESENCE bit, no unsol support, etc.
29 bool is_jack_detectable(struct hda_codec
*codec
, hda_nid_t nid
)
31 if (codec
->no_jack_detect
)
33 if (!(snd_hda_query_pin_caps(codec
, nid
) & AC_PINCAP_PRES_DETECT
))
35 if (get_defcfg_misc(snd_hda_codec_get_pincfg(codec
, nid
)) &
36 AC_DEFCFG_MISC_NO_PRESENCE
)
38 if (!(get_wcaps(codec
, nid
) & AC_WCAP_UNSOL_CAP
) &&
39 !codec
->jackpoll_interval
)
43 EXPORT_SYMBOL_GPL(is_jack_detectable
);
45 /* execute pin sense measurement */
46 static u32
read_pin_sense(struct hda_codec
*codec
, hda_nid_t nid
, int dev_id
)
51 if (!codec
->no_trigger_sense
) {
52 pincap
= snd_hda_query_pin_caps(codec
, nid
);
53 if (pincap
& AC_PINCAP_TRIG_REQ
) /* need trigger? */
54 snd_hda_codec_read(codec
, nid
, 0,
55 AC_VERB_SET_PIN_SENSE
, 0);
57 val
= snd_hda_codec_read(codec
, nid
, 0,
58 AC_VERB_GET_PIN_SENSE
, dev_id
);
59 if (codec
->inv_jack_detect
)
60 val
^= AC_PINSENSE_PRESENCE
;
65 * snd_hda_jack_tbl_get_mst - query the jack-table entry for the given NID
66 * @codec: the HDA codec
67 * @nid: pin NID to refer to
68 * @dev_id: pin device entry id
71 snd_hda_jack_tbl_get_mst(struct hda_codec
*codec
, hda_nid_t nid
, int dev_id
)
73 struct hda_jack_tbl
*jack
= codec
->jacktbl
.list
;
78 for (i
= 0; i
< codec
->jacktbl
.used
; i
++, jack
++)
79 if (jack
->nid
== nid
&& jack
->dev_id
== dev_id
)
83 EXPORT_SYMBOL_GPL(snd_hda_jack_tbl_get_mst
);
86 * snd_hda_jack_tbl_get_from_tag - query the jack-table entry for the given tag
87 * @codec: the HDA codec
88 * @tag: tag value to refer to
89 * @dev_id: pin device entry id
92 snd_hda_jack_tbl_get_from_tag(struct hda_codec
*codec
,
93 unsigned char tag
, int dev_id
)
95 struct hda_jack_tbl
*jack
= codec
->jacktbl
.list
;
100 for (i
= 0; i
< codec
->jacktbl
.used
; i
++, jack
++)
101 if (jack
->tag
== tag
&& jack
->dev_id
== dev_id
)
105 EXPORT_SYMBOL_GPL(snd_hda_jack_tbl_get_from_tag
);
107 static struct hda_jack_tbl
*
108 any_jack_tbl_get_from_nid(struct hda_codec
*codec
, hda_nid_t nid
)
110 struct hda_jack_tbl
*jack
= codec
->jacktbl
.list
;
115 for (i
= 0; i
< codec
->jacktbl
.used
; i
++, jack
++)
116 if (jack
->nid
== nid
)
122 * snd_hda_jack_tbl_new - create a jack-table entry for the given NID
123 * @codec: the HDA codec
124 * @nid: pin NID to assign
125 * @dev_id: pin device entry id
127 static struct hda_jack_tbl
*
128 snd_hda_jack_tbl_new(struct hda_codec
*codec
, hda_nid_t nid
, int dev_id
)
130 struct hda_jack_tbl
*jack
=
131 snd_hda_jack_tbl_get_mst(codec
, nid
, dev_id
);
132 struct hda_jack_tbl
*existing_nid_jack
=
133 any_jack_tbl_get_from_nid(codec
, nid
);
135 WARN_ON(dev_id
!= 0 && !codec
->dp_mst
);
139 jack
= snd_array_new(&codec
->jacktbl
);
143 jack
->dev_id
= dev_id
;
144 jack
->jack_dirty
= 1;
145 if (existing_nid_jack
) {
146 jack
->tag
= existing_nid_jack
->tag
;
149 * Copy jack_detect from existing_nid_jack to avoid
150 * snd_hda_jack_detect_enable_callback_mst() making multiple
151 * SET_UNSOLICITED_ENABLE calls on the same pin.
153 jack
->jack_detect
= existing_nid_jack
->jack_detect
;
155 jack
->tag
= codec
->jacktbl
.used
;
161 void snd_hda_jack_tbl_disconnect(struct hda_codec
*codec
)
163 struct hda_jack_tbl
*jack
= codec
->jacktbl
.list
;
166 for (i
= 0; i
< codec
->jacktbl
.used
; i
++, jack
++) {
167 if (!codec
->bus
->shutdown
&& jack
->jack
)
168 snd_device_disconnect(codec
->card
, jack
->jack
);
172 void snd_hda_jack_tbl_clear(struct hda_codec
*codec
)
174 struct hda_jack_tbl
*jack
= codec
->jacktbl
.list
;
177 for (i
= 0; i
< codec
->jacktbl
.used
; i
++, jack
++) {
178 struct hda_jack_callback
*cb
, *next
;
180 /* free jack instances manually when clearing/reconfiguring */
181 if (!codec
->bus
->shutdown
&& jack
->jack
)
182 snd_device_free(codec
->card
, jack
->jack
);
184 for (cb
= jack
->callback
; cb
; cb
= next
) {
189 snd_array_free(&codec
->jacktbl
);
192 #define get_jack_plug_state(sense) !!(sense & AC_PINSENSE_PRESENCE)
194 /* update the cached value and notification flag if needed */
195 static void jack_detect_update(struct hda_codec
*codec
,
196 struct hda_jack_tbl
*jack
)
198 if (!jack
->jack_dirty
)
201 if (jack
->phantom_jack
)
202 jack
->pin_sense
= AC_PINSENSE_PRESENCE
;
204 jack
->pin_sense
= read_pin_sense(codec
, jack
->nid
,
207 /* A gating jack indicates the jack is invalid if gating is unplugged */
208 if (jack
->gating_jack
&&
209 !snd_hda_jack_detect_mst(codec
, jack
->gating_jack
, jack
->dev_id
))
210 jack
->pin_sense
&= ~AC_PINSENSE_PRESENCE
;
212 jack
->jack_dirty
= 0;
214 /* If a jack is gated by this one update it. */
215 if (jack
->gated_jack
) {
216 struct hda_jack_tbl
*gated
=
217 snd_hda_jack_tbl_get_mst(codec
, jack
->gated_jack
,
220 gated
->jack_dirty
= 1;
221 jack_detect_update(codec
, gated
);
227 * snd_hda_jack_set_dirty_all - Mark all the cached as dirty
228 * @codec: the HDA codec
230 * This function sets the dirty flag to all entries of jack table.
231 * It's called from the resume path in hda_codec.c.
233 void snd_hda_jack_set_dirty_all(struct hda_codec
*codec
)
235 struct hda_jack_tbl
*jack
= codec
->jacktbl
.list
;
238 for (i
= 0; i
< codec
->jacktbl
.used
; i
++, jack
++)
240 jack
->jack_dirty
= 1;
242 EXPORT_SYMBOL_GPL(snd_hda_jack_set_dirty_all
);
245 * snd_hda_jack_pin_sense - execute pin sense measurement
246 * @codec: the CODEC to sense
247 * @nid: the pin NID to sense
248 * @dev_id: pin device entry id
250 * Execute necessary pin sense measurement and return its Presence Detect,
251 * Impedance, ELD Valid etc. status bits.
253 u32
snd_hda_jack_pin_sense(struct hda_codec
*codec
, hda_nid_t nid
, int dev_id
)
255 struct hda_jack_tbl
*jack
=
256 snd_hda_jack_tbl_get_mst(codec
, nid
, dev_id
);
258 jack_detect_update(codec
, jack
);
259 return jack
->pin_sense
;
261 return read_pin_sense(codec
, nid
, dev_id
);
263 EXPORT_SYMBOL_GPL(snd_hda_jack_pin_sense
);
266 * snd_hda_jack_detect_state_mst - query pin Presence Detect status
267 * @codec: the CODEC to sense
268 * @nid: the pin NID to sense
269 * @dev_id: pin device entry id
271 * Query and return the pin's Presence Detect status, as either
272 * HDA_JACK_NOT_PRESENT, HDA_JACK_PRESENT or HDA_JACK_PHANTOM.
274 int snd_hda_jack_detect_state_mst(struct hda_codec
*codec
,
275 hda_nid_t nid
, int dev_id
)
277 struct hda_jack_tbl
*jack
=
278 snd_hda_jack_tbl_get_mst(codec
, nid
, dev_id
);
279 if (jack
&& jack
->phantom_jack
)
280 return HDA_JACK_PHANTOM
;
281 else if (snd_hda_jack_pin_sense(codec
, nid
, dev_id
) &
282 AC_PINSENSE_PRESENCE
)
283 return HDA_JACK_PRESENT
;
285 return HDA_JACK_NOT_PRESENT
;
287 EXPORT_SYMBOL_GPL(snd_hda_jack_detect_state_mst
);
289 static struct hda_jack_callback
*
290 find_callback_from_list(struct hda_jack_tbl
*jack
,
291 hda_jack_callback_fn func
)
293 struct hda_jack_callback
*cb
;
298 for (cb
= jack
->callback
; cb
; cb
= cb
->next
) {
299 if (cb
->func
== func
)
307 * snd_hda_jack_detect_enable_callback_mst - enable the jack-detection
308 * @codec: the HDA codec
309 * @nid: pin NID to enable
310 * @func: callback function to register
311 * @dev_id: pin device entry id
313 * In the case of error, the return value will be a pointer embedded with
314 * errno. Check and handle the return value appropriately with standard
315 * macros such as @IS_ERR() and @PTR_ERR().
317 struct hda_jack_callback
*
318 snd_hda_jack_detect_enable_callback_mst(struct hda_codec
*codec
, hda_nid_t nid
,
319 int dev_id
, hda_jack_callback_fn func
)
321 struct hda_jack_tbl
*jack
;
322 struct hda_jack_callback
*callback
= NULL
;
325 jack
= snd_hda_jack_tbl_new(codec
, nid
, dev_id
);
327 return ERR_PTR(-ENOMEM
);
329 callback
= find_callback_from_list(jack
, func
);
331 if (func
&& !callback
) {
332 callback
= kzalloc(sizeof(*callback
), GFP_KERNEL
);
334 return ERR_PTR(-ENOMEM
);
335 callback
->func
= func
;
336 callback
->nid
= jack
->nid
;
337 callback
->dev_id
= jack
->dev_id
;
338 callback
->next
= jack
->callback
;
339 jack
->callback
= callback
;
342 if (jack
->jack_detect
)
343 return callback
; /* already registered */
344 jack
->jack_detect
= 1;
345 if (codec
->jackpoll_interval
> 0)
346 return callback
; /* No unsol if we're polling instead */
347 err
= snd_hda_codec_write_cache(codec
, nid
, 0,
348 AC_VERB_SET_UNSOLICITED_ENABLE
,
349 AC_USRSP_EN
| jack
->tag
);
354 EXPORT_SYMBOL_GPL(snd_hda_jack_detect_enable_callback_mst
);
357 * snd_hda_jack_detect_enable - Enable the jack detection on the given pin
358 * @codec: the HDA codec
359 * @nid: pin NID to enable jack detection
360 * @dev_id: pin device entry id
362 * Enable the jack detection with the default callback. Returns zero if
363 * successful or a negative error code.
365 int snd_hda_jack_detect_enable(struct hda_codec
*codec
, hda_nid_t nid
,
368 return PTR_ERR_OR_ZERO(snd_hda_jack_detect_enable_callback_mst(codec
,
373 EXPORT_SYMBOL_GPL(snd_hda_jack_detect_enable
);
376 * snd_hda_jack_set_gating_jack - Set gating jack.
377 * @codec: the HDA codec
378 * @gated_nid: gated pin NID
379 * @gating_nid: gating pin NID
381 * Indicates the gated jack is only valid when the gating jack is plugged.
383 int snd_hda_jack_set_gating_jack(struct hda_codec
*codec
, hda_nid_t gated_nid
,
384 hda_nid_t gating_nid
)
386 struct hda_jack_tbl
*gated
= snd_hda_jack_tbl_new(codec
, gated_nid
, 0);
387 struct hda_jack_tbl
*gating
=
388 snd_hda_jack_tbl_new(codec
, gating_nid
, 0);
390 WARN_ON(codec
->dp_mst
);
392 if (!gated
|| !gating
)
395 gated
->gating_jack
= gating_nid
;
396 gating
->gated_jack
= gated_nid
;
400 EXPORT_SYMBOL_GPL(snd_hda_jack_set_gating_jack
);
403 * snd_hda_jack_bind_keymap - bind keys generated from one NID to another jack.
404 * @codec: the HDA codec
405 * @key_nid: key event is generated by this pin NID
406 * @keymap: map of key type and key code
407 * @jack_nid: key reports to the jack of this pin NID
409 * This function is used in the case of key is generated from one NID while is
410 * reported to the jack of another NID.
412 int snd_hda_jack_bind_keymap(struct hda_codec
*codec
, hda_nid_t key_nid
,
413 const struct hda_jack_keymap
*keymap
,
416 const struct hda_jack_keymap
*map
;
417 struct hda_jack_tbl
*key_gen
= snd_hda_jack_tbl_get(codec
, key_nid
);
418 struct hda_jack_tbl
*report_to
= snd_hda_jack_tbl_get(codec
, jack_nid
);
420 WARN_ON(codec
->dp_mst
);
422 if (!key_gen
|| !report_to
|| !report_to
->jack
)
425 key_gen
->key_report_jack
= jack_nid
;
428 for (map
= keymap
; map
->type
; map
++)
429 snd_jack_set_key(report_to
->jack
, map
->type
, map
->key
);
433 EXPORT_SYMBOL_GPL(snd_hda_jack_bind_keymap
);
436 * snd_hda_jack_set_button_state - report button event to the hda_jack_tbl button_state.
437 * @codec: the HDA codec
438 * @jack_nid: the button event reports to the jack_tbl of this NID
439 * @button_state: the button event captured by codec
441 * Codec driver calls this function to report the button event.
443 void snd_hda_jack_set_button_state(struct hda_codec
*codec
, hda_nid_t jack_nid
,
446 struct hda_jack_tbl
*jack
= snd_hda_jack_tbl_get(codec
, jack_nid
);
451 if (jack
->key_report_jack
) {
452 struct hda_jack_tbl
*report_to
=
453 snd_hda_jack_tbl_get(codec
, jack
->key_report_jack
);
456 report_to
->button_state
= button_state
;
461 jack
->button_state
= button_state
;
463 EXPORT_SYMBOL_GPL(snd_hda_jack_set_button_state
);
466 * snd_hda_jack_report_sync - sync the states of all jacks and report if changed
467 * @codec: the HDA codec
469 void snd_hda_jack_report_sync(struct hda_codec
*codec
)
471 struct hda_jack_tbl
*jack
;
474 /* update all jacks at first */
475 jack
= codec
->jacktbl
.list
;
476 for (i
= 0; i
< codec
->jacktbl
.used
; i
++, jack
++)
478 jack_detect_update(codec
, jack
);
480 /* report the updated jacks; it's done after updating all jacks
481 * to make sure that all gating jacks properly have been set
483 jack
= codec
->jacktbl
.list
;
484 for (i
= 0; i
< codec
->jacktbl
.used
; i
++, jack
++)
486 if (!jack
->jack
|| jack
->block_report
)
488 state
= jack
->button_state
;
489 if (get_jack_plug_state(jack
->pin_sense
))
491 snd_jack_report(jack
->jack
, state
);
492 if (jack
->button_state
) {
493 snd_jack_report(jack
->jack
,
494 state
& ~jack
->button_state
);
495 jack
->button_state
= 0; /* button released */
499 EXPORT_SYMBOL_GPL(snd_hda_jack_report_sync
);
501 /* guess the jack type from the pin-config */
502 static int get_input_jack_type(struct hda_codec
*codec
, hda_nid_t nid
)
504 unsigned int def_conf
= snd_hda_codec_get_pincfg(codec
, nid
);
505 switch (get_defcfg_device(def_conf
)) {
506 case AC_JACK_LINE_OUT
:
507 case AC_JACK_SPEAKER
:
508 return SND_JACK_LINEOUT
;
510 return SND_JACK_HEADPHONE
;
511 case AC_JACK_SPDIF_OUT
:
512 case AC_JACK_DIG_OTHER_OUT
:
513 return SND_JACK_AVOUT
;
515 return SND_JACK_MICROPHONE
;
517 return SND_JACK_LINEIN
;
521 static void hda_free_jack_priv(struct snd_jack
*jack
)
523 struct hda_jack_tbl
*jacks
= jack
->private_data
;
529 * snd_hda_jack_add_kctl_mst - Add a kctl for the given pin
530 * @codec: the HDA codec
531 * @nid: pin NID to assign
532 * @dev_id : pin device entry id
533 * @name: string name for the jack
534 * @phantom_jack: flag to deal as a phantom jack
535 * @type: jack type bits to be reported, 0 for guessing from pincfg
536 * @keymap: optional jack / key mapping
538 * This assigns a jack-detection kctl to the given pin. The kcontrol
539 * will have the given name and index.
541 int snd_hda_jack_add_kctl_mst(struct hda_codec
*codec
, hda_nid_t nid
,
542 int dev_id
, const char *name
, bool phantom_jack
,
543 int type
, const struct hda_jack_keymap
*keymap
)
545 struct hda_jack_tbl
*jack
;
546 const struct hda_jack_keymap
*map
;
547 int err
, state
, buttons
;
549 jack
= snd_hda_jack_tbl_new(codec
, nid
, dev_id
);
553 return 0; /* already created */
556 type
= get_input_jack_type(codec
, nid
);
560 for (map
= keymap
; map
->type
; map
++)
561 buttons
|= map
->type
;
564 err
= snd_jack_new(codec
->card
, name
, type
| buttons
,
565 &jack
->jack
, true, phantom_jack
);
569 jack
->phantom_jack
= !!phantom_jack
;
571 jack
->button_state
= 0;
572 jack
->jack
->private_data
= jack
;
573 jack
->jack
->private_free
= hda_free_jack_priv
;
575 for (map
= keymap
; map
->type
; map
++)
576 snd_jack_set_key(jack
->jack
, map
->type
, map
->key
);
579 state
= snd_hda_jack_detect_mst(codec
, nid
, dev_id
);
580 snd_jack_report(jack
->jack
, state
? jack
->type
: 0);
584 EXPORT_SYMBOL_GPL(snd_hda_jack_add_kctl_mst
);
586 static int add_jack_kctl(struct hda_codec
*codec
, hda_nid_t nid
,
587 const struct auto_pin_cfg
*cfg
,
588 const char *base_name
)
590 unsigned int def_conf
, conn
;
591 char name
[SNDRV_CTL_ELEM_ID_NAME_MAXLEN
];
595 WARN_ON(codec
->dp_mst
);
599 def_conf
= snd_hda_codec_get_pincfg(codec
, nid
);
600 conn
= get_defcfg_connect(def_conf
);
601 if (conn
== AC_JACK_PORT_NONE
)
603 phantom_jack
= (conn
!= AC_JACK_PORT_COMPLEX
) ||
604 !is_jack_detectable(codec
, nid
);
607 strscpy(name
, base_name
, sizeof(name
));
609 snd_hda_get_pin_label(codec
, nid
, cfg
, name
, sizeof(name
), NULL
);
611 /* Example final name: "Internal Mic Phantom Jack" */
612 strncat(name
, " Phantom", sizeof(name
) - strlen(name
) - 1);
613 err
= snd_hda_jack_add_kctl(codec
, nid
, name
, phantom_jack
, 0, NULL
);
618 return snd_hda_jack_detect_enable(codec
, nid
, 0);
623 * snd_hda_jack_add_kctls - Add kctls for all pins included in the given pincfg
624 * @codec: the HDA codec
625 * @cfg: pin config table to parse
627 int snd_hda_jack_add_kctls(struct hda_codec
*codec
,
628 const struct auto_pin_cfg
*cfg
)
633 for (i
= 0; i
< cfg
->num_inputs
; i
++) {
634 /* If we have headphone mics; make sure they get the right name
635 before grabbed by output pins */
636 if (cfg
->inputs
[i
].is_headphone_mic
) {
637 if (auto_cfg_hp_outs(cfg
) == 1)
638 err
= add_jack_kctl(codec
, auto_cfg_hp_pins(cfg
)[0],
639 cfg
, "Headphone Mic");
641 err
= add_jack_kctl(codec
, cfg
->inputs
[i
].pin
,
642 cfg
, "Headphone Mic");
644 err
= add_jack_kctl(codec
, cfg
->inputs
[i
].pin
, cfg
,
650 for (i
= 0, p
= cfg
->line_out_pins
; i
< cfg
->line_outs
; i
++, p
++) {
651 err
= add_jack_kctl(codec
, *p
, cfg
, NULL
);
655 for (i
= 0, p
= cfg
->hp_pins
; i
< cfg
->hp_outs
; i
++, p
++) {
656 if (*p
== *cfg
->line_out_pins
) /* might be duplicated */
658 err
= add_jack_kctl(codec
, *p
, cfg
, NULL
);
662 for (i
= 0, p
= cfg
->speaker_pins
; i
< cfg
->speaker_outs
; i
++, p
++) {
663 if (*p
== *cfg
->line_out_pins
) /* might be duplicated */
665 err
= add_jack_kctl(codec
, *p
, cfg
, NULL
);
669 for (i
= 0, p
= cfg
->dig_out_pins
; i
< cfg
->dig_outs
; i
++, p
++) {
670 err
= add_jack_kctl(codec
, *p
, cfg
, NULL
);
674 err
= add_jack_kctl(codec
, cfg
->dig_in_pin
, cfg
, NULL
);
677 err
= add_jack_kctl(codec
, cfg
->mono_out_pin
, cfg
, NULL
);
682 EXPORT_SYMBOL_GPL(snd_hda_jack_add_kctls
);
684 static void call_jack_callback(struct hda_codec
*codec
, unsigned int res
,
685 struct hda_jack_tbl
*jack
)
687 struct hda_jack_callback
*cb
;
689 for (cb
= jack
->callback
; cb
; cb
= cb
->next
) {
694 if (jack
->gated_jack
) {
695 struct hda_jack_tbl
*gated
=
696 snd_hda_jack_tbl_get_mst(codec
, jack
->gated_jack
,
699 for (cb
= gated
->callback
; cb
; cb
= cb
->next
) {
709 * snd_hda_jack_unsol_event - Handle an unsolicited event
710 * @codec: the HDA codec
711 * @res: the unsolicited event data
713 void snd_hda_jack_unsol_event(struct hda_codec
*codec
, unsigned int res
)
715 struct hda_jack_tbl
*event
;
716 int tag
= (res
& AC_UNSOL_RES_TAG
) >> AC_UNSOL_RES_TAG_SHIFT
;
720 (res
& AC_UNSOL_RES_DE
) >> AC_UNSOL_RES_DE_SHIFT
;
722 event
= snd_hda_jack_tbl_get_from_tag(codec
, tag
, dev_entry
);
724 event
= snd_hda_jack_tbl_get_from_tag(codec
, tag
, 0);
729 if (event
->key_report_jack
) {
730 struct hda_jack_tbl
*report_to
=
731 snd_hda_jack_tbl_get_mst(codec
, event
->key_report_jack
,
734 report_to
->jack_dirty
= 1;
736 event
->jack_dirty
= 1;
738 call_jack_callback(codec
, res
, event
);
739 snd_hda_jack_report_sync(codec
);
741 EXPORT_SYMBOL_GPL(snd_hda_jack_unsol_event
);
744 * snd_hda_jack_poll_all - Poll all jacks
745 * @codec: the HDA codec
747 * Poll all detectable jacks with dirty flag, update the status, call
748 * callbacks and call snd_hda_jack_report_sync() if any changes are found.
750 void snd_hda_jack_poll_all(struct hda_codec
*codec
)
752 struct hda_jack_tbl
*jack
= codec
->jacktbl
.list
;
755 for (i
= 0; i
< codec
->jacktbl
.used
; i
++, jack
++) {
756 unsigned int old_sense
;
757 if (!jack
->nid
|| !jack
->jack_dirty
|| jack
->phantom_jack
)
759 old_sense
= get_jack_plug_state(jack
->pin_sense
);
760 jack_detect_update(codec
, jack
);
761 if (old_sense
== get_jack_plug_state(jack
->pin_sense
))
764 call_jack_callback(codec
, 0, jack
);
767 snd_hda_jack_report_sync(codec
);
769 EXPORT_SYMBOL_GPL(snd_hda_jack_poll_all
);