summaryrefslogtreecommitdiff
path: root/Documentation/sound/alsa/HD-Audio-DP-MST-audio.txt
blob: 82744ac3513d83c108b81b1fe70526f9f9a73b8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
To support DP MST audio, HD Audio hdmi codec driver introduces virtual pin
and dynamic pcm assignment.

Virtual pin is an extension of per_pin. The most difference of DP MST
from legacy is that DP MST introduces device entry. Each pin can contain
several device entries. Each device entry behaves as a pin.

As each pin may contain several device entries and each codec may contain
several pins, if we use one pcm per per_pin, there will be many PCMs.
The new solution is to create a few PCMs and to dynamically bind pcm to
per_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use
the new solution.

PCM
===
To be added


Jack
====

Presume:
 - MST must be dyn_pcm_assign, and it is acomp (for Intel scenario);
 - NON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp;

So there are the following scenarios:
 a. MST (&& dyn_pcm_assign && acomp)
 b. NON-MST && dyn_pcm_assign && acomp
 c. NON-MST && !dyn_pcm_assign && !acomp

Below discussion will ignore MST and NON-MST difference as it doesn't
impact on jack handling too much.

Driver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is
a member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer.

For !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically.

For dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n]
when monitor is hotplugged.


Build Jack
----------

- dyn_pcm_assign
Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.

- !dyn_pcm_assign
Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.


Unsolicited Event Enabling
--------------------------
Enable unsolicited event if !acomp.


Monitor Hotplug Event Handling
------------------------------
- acomp
pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() ->
sync_eld_via_acomp().
Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for
both dyn_pcm_assign and !dyn_pcm_assign

- !acomp
Hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() ->
hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()
Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign.
Use hda_jack mechanism to handle jack events.


Others to be added later
========================