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