18c2ecf20Sopenharmony_ci=======================
28c2ecf20Sopenharmony_ciHD-Audio DP-MST Support
38c2ecf20Sopenharmony_ci=======================
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ciTo support DP MST audio, HD Audio hdmi codec driver introduces virtual pin
68c2ecf20Sopenharmony_ciand dynamic pcm assignment.
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ciVirtual pin is an extension of per_pin. The most difference of DP MST
98c2ecf20Sopenharmony_cifrom legacy is that DP MST introduces device entry. Each pin can contain
108c2ecf20Sopenharmony_ciseveral device entries. Each device entry behaves as a pin.
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ciAs each pin may contain several device entries and each codec may contain
138c2ecf20Sopenharmony_ciseveral pins, if we use one pcm per per_pin, there will be many PCMs.
148c2ecf20Sopenharmony_ciThe new solution is to create a few PCMs and to dynamically bind pcm to
158c2ecf20Sopenharmony_ciper_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use
168c2ecf20Sopenharmony_cithe new solution.
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ciPCM
198c2ecf20Sopenharmony_ci===
208c2ecf20Sopenharmony_ciTo be added
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ciPin Initialization
238c2ecf20Sopenharmony_ci==================
248c2ecf20Sopenharmony_ciEach pin may have several device entries (virtual pins). On Intel platform,
258c2ecf20Sopenharmony_cithe device entries number is dynamically changed. If DP MST hub is connected,
268c2ecf20Sopenharmony_ciit is in DP MST mode, and the device entries number is 3. Otherwise, the
278c2ecf20Sopenharmony_cidevice entries number is 1.
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciTo simplify the implementation, all the device entries will be initialized
308c2ecf20Sopenharmony_ciwhen bootup no matter whether it is in DP MST mode or not.
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ciConnection list
338c2ecf20Sopenharmony_ci===============
348c2ecf20Sopenharmony_ciDP MST reuses connection list code. The code can be reused because
358c2ecf20Sopenharmony_cidevice entries on the same pin have the same connection list.
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ciThis means DP MST gets the device entry connection list without the
388c2ecf20Sopenharmony_cidevice entry setting.
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ciJack
418c2ecf20Sopenharmony_ci====
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ciPresume:
448c2ecf20Sopenharmony_ci - MST must be dyn_pcm_assign, and it is acomp (for Intel scenario);
458c2ecf20Sopenharmony_ci - NON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp;
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ciSo there are the following scenarios:
488c2ecf20Sopenharmony_ci a. MST (&& dyn_pcm_assign && acomp)
498c2ecf20Sopenharmony_ci b. NON-MST && dyn_pcm_assign && acomp
508c2ecf20Sopenharmony_ci c. NON-MST && !dyn_pcm_assign && !acomp
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ciBelow discussion will ignore MST and NON-MST difference as it doesn't
538c2ecf20Sopenharmony_ciimpact on jack handling too much.
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ciDriver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is
568c2ecf20Sopenharmony_cia member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer.
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ciFor !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically.
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ciFor dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n]
618c2ecf20Sopenharmony_ciwhen monitor is hotplugged.
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ciBuild Jack
658c2ecf20Sopenharmony_ci----------
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci- dyn_pcm_assign
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci  Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci- !dyn_pcm_assign
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci  Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ciUnsolicited Event Enabling
778c2ecf20Sopenharmony_ci--------------------------
788c2ecf20Sopenharmony_ciEnable unsolicited event if !acomp.
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ciMonitor Hotplug Event Handling
828c2ecf20Sopenharmony_ci------------------------------
838c2ecf20Sopenharmony_ci- acomp
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci  pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() ->
868c2ecf20Sopenharmony_ci  sync_eld_via_acomp().
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci  Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for
898c2ecf20Sopenharmony_ci  both dyn_pcm_assign and !dyn_pcm_assign
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci- !acomp
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci  hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() ->
948c2ecf20Sopenharmony_ci  hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci  Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign.
978c2ecf20Sopenharmony_ci  Use hda_jack mechanism to handle jack events.
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ciOthers to be added later
1018c2ecf20Sopenharmony_ci========================
102