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