162306a36Sopenharmony_ci=======================
262306a36Sopenharmony_ciHD-Audio DP-MST Support
362306a36Sopenharmony_ci=======================
462306a36Sopenharmony_ci
562306a36Sopenharmony_ciTo support DP MST audio, HD Audio hdmi codec driver introduces virtual pin
662306a36Sopenharmony_ciand dynamic pcm assignment.
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciVirtual pin is an extension of per_pin. The most difference of DP MST
962306a36Sopenharmony_cifrom legacy is that DP MST introduces device entry. Each pin can contain
1062306a36Sopenharmony_ciseveral device entries. Each device entry behaves as a pin.
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciAs each pin may contain several device entries and each codec may contain
1362306a36Sopenharmony_ciseveral pins, if we use one pcm per per_pin, there will be many PCMs.
1462306a36Sopenharmony_ciThe new solution is to create a few PCMs and to dynamically bind pcm to
1562306a36Sopenharmony_ciper_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use
1662306a36Sopenharmony_cithe new solution.
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ciPCM
1962306a36Sopenharmony_ci===
2062306a36Sopenharmony_ciTo be added
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciPin Initialization
2362306a36Sopenharmony_ci==================
2462306a36Sopenharmony_ciEach pin may have several device entries (virtual pins). On Intel platform,
2562306a36Sopenharmony_cithe device entries number is dynamically changed. If DP MST hub is connected,
2662306a36Sopenharmony_ciit is in DP MST mode, and the device entries number is 3. Otherwise, the
2762306a36Sopenharmony_cidevice entries number is 1.
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciTo simplify the implementation, all the device entries will be initialized
3062306a36Sopenharmony_ciwhen bootup no matter whether it is in DP MST mode or not.
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ciConnection list
3362306a36Sopenharmony_ci===============
3462306a36Sopenharmony_ciDP MST reuses connection list code. The code can be reused because
3562306a36Sopenharmony_cidevice entries on the same pin have the same connection list.
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ciThis means DP MST gets the device entry connection list without the
3862306a36Sopenharmony_cidevice entry setting.
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciJack
4162306a36Sopenharmony_ci====
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ciPresume:
4462306a36Sopenharmony_ci - MST must be dyn_pcm_assign, and it is acomp (for Intel scenario);
4562306a36Sopenharmony_ci - NON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ciSo there are the following scenarios:
4862306a36Sopenharmony_ci a. MST (&& dyn_pcm_assign && acomp)
4962306a36Sopenharmony_ci b. NON-MST && dyn_pcm_assign && acomp
5062306a36Sopenharmony_ci c. NON-MST && !dyn_pcm_assign && !acomp
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciBelow discussion will ignore MST and NON-MST difference as it doesn't
5362306a36Sopenharmony_ciimpact on jack handling too much.
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciDriver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is
5662306a36Sopenharmony_cia member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer.
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciFor !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically.
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ciFor dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n]
6162306a36Sopenharmony_ciwhen monitor is hotplugged.
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciBuild Jack
6562306a36Sopenharmony_ci----------
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci- dyn_pcm_assign
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci  Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci- !dyn_pcm_assign
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci  Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ciUnsolicited Event Enabling
7762306a36Sopenharmony_ci--------------------------
7862306a36Sopenharmony_ciEnable unsolicited event if !acomp.
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ciMonitor Hotplug Event Handling
8262306a36Sopenharmony_ci------------------------------
8362306a36Sopenharmony_ci- acomp
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci  pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() ->
8662306a36Sopenharmony_ci  sync_eld_via_acomp().
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci  Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for
8962306a36Sopenharmony_ci  both dyn_pcm_assign and !dyn_pcm_assign
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci- !acomp
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci  hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() ->
9462306a36Sopenharmony_ci  hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci  Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign.
9762306a36Sopenharmony_ci  Use hda_jack mechanism to handle jack events.
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ciOthers to be added later
10162306a36Sopenharmony_ci========================
102