|
@@ -0,0 +1,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
|
|
|
+========================
|