1*4882a593Smuzhiyun======================= 2*4882a593SmuzhiyunHD-Audio DP-MST Support 3*4882a593Smuzhiyun======================= 4*4882a593Smuzhiyun 5*4882a593SmuzhiyunTo support DP MST audio, HD Audio hdmi codec driver introduces virtual pin 6*4882a593Smuzhiyunand dynamic pcm assignment. 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunVirtual pin is an extension of per_pin. The most difference of DP MST 9*4882a593Smuzhiyunfrom legacy is that DP MST introduces device entry. Each pin can contain 10*4882a593Smuzhiyunseveral device entries. Each device entry behaves as a pin. 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunAs each pin may contain several device entries and each codec may contain 13*4882a593Smuzhiyunseveral pins, if we use one pcm per per_pin, there will be many PCMs. 14*4882a593SmuzhiyunThe new solution is to create a few PCMs and to dynamically bind pcm to 15*4882a593Smuzhiyunper_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use 16*4882a593Smuzhiyunthe new solution. 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunPCM 19*4882a593Smuzhiyun=== 20*4882a593SmuzhiyunTo be added 21*4882a593Smuzhiyun 22*4882a593SmuzhiyunPin Initialization 23*4882a593Smuzhiyun================== 24*4882a593SmuzhiyunEach pin may have several device entries (virtual pins). On Intel platform, 25*4882a593Smuzhiyunthe device entries number is dynamically changed. If DP MST hub is connected, 26*4882a593Smuzhiyunit is in DP MST mode, and the device entries number is 3. Otherwise, the 27*4882a593Smuzhiyundevice entries number is 1. 28*4882a593Smuzhiyun 29*4882a593SmuzhiyunTo simplify the implementation, all the device entries will be initialized 30*4882a593Smuzhiyunwhen bootup no matter whether it is in DP MST mode or not. 31*4882a593Smuzhiyun 32*4882a593SmuzhiyunConnection list 33*4882a593Smuzhiyun=============== 34*4882a593SmuzhiyunDP MST reuses connection list code. The code can be reused because 35*4882a593Smuzhiyundevice entries on the same pin have the same connection list. 36*4882a593Smuzhiyun 37*4882a593SmuzhiyunThis means DP MST gets the device entry connection list without the 38*4882a593Smuzhiyundevice entry setting. 39*4882a593Smuzhiyun 40*4882a593SmuzhiyunJack 41*4882a593Smuzhiyun==== 42*4882a593Smuzhiyun 43*4882a593SmuzhiyunPresume: 44*4882a593Smuzhiyun - MST must be dyn_pcm_assign, and it is acomp (for Intel scenario); 45*4882a593Smuzhiyun - NON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp; 46*4882a593Smuzhiyun 47*4882a593SmuzhiyunSo there are the following scenarios: 48*4882a593Smuzhiyun a. MST (&& dyn_pcm_assign && acomp) 49*4882a593Smuzhiyun b. NON-MST && dyn_pcm_assign && acomp 50*4882a593Smuzhiyun c. NON-MST && !dyn_pcm_assign && !acomp 51*4882a593Smuzhiyun 52*4882a593SmuzhiyunBelow discussion will ignore MST and NON-MST difference as it doesn't 53*4882a593Smuzhiyunimpact on jack handling too much. 54*4882a593Smuzhiyun 55*4882a593SmuzhiyunDriver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is 56*4882a593Smuzhiyuna member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer. 57*4882a593Smuzhiyun 58*4882a593SmuzhiyunFor !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically. 59*4882a593Smuzhiyun 60*4882a593SmuzhiyunFor dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] 61*4882a593Smuzhiyunwhen monitor is hotplugged. 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun 64*4882a593SmuzhiyunBuild Jack 65*4882a593Smuzhiyun---------- 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun- dyn_pcm_assign 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly. 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun- !dyn_pcm_assign 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically. 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun 76*4882a593SmuzhiyunUnsolicited Event Enabling 77*4882a593Smuzhiyun-------------------------- 78*4882a593SmuzhiyunEnable unsolicited event if !acomp. 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun 81*4882a593SmuzhiyunMonitor Hotplug Event Handling 82*4882a593Smuzhiyun------------------------------ 83*4882a593Smuzhiyun- acomp 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() -> 86*4882a593Smuzhiyun sync_eld_via_acomp(). 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for 89*4882a593Smuzhiyun both dyn_pcm_assign and !dyn_pcm_assign 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun- !acomp 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() -> 94*4882a593Smuzhiyun hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs() 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign. 97*4882a593Smuzhiyun Use hda_jack mechanism to handle jack events. 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun 100*4882a593SmuzhiyunOthers to be added later 101*4882a593Smuzhiyun======================== 102