| To support DP MST audio, HD Audio hdmi codec driver introduces virtual pin |
| and dynamic pcm assignment. |
| |
| Virtual pin is an extension of per_pin. The most difference of DP MST |
| from legacy is that DP MST introduces device entry. Each pin can contain |
| several device entries. Each device entry behaves as a pin. |
| |
| As each pin may contain several device entries and each codec may contain |
| several pins, if we use one pcm per per_pin, there will be many PCMs. |
| The new solution is to create a few PCMs and to dynamically bind pcm to |
| per_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use |
| the new solution. |
| |
| PCM |
| === |
| To be added |
| |
| |
| Jack |
| ==== |
| |
| Presume: |
| - MST must be dyn_pcm_assign, and it is acomp (for Intel scenario); |
| - NON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp; |
| |
| So there are the following scenarios: |
| a. MST (&& dyn_pcm_assign && acomp) |
| b. NON-MST && dyn_pcm_assign && acomp |
| c. NON-MST && !dyn_pcm_assign && !acomp |
| |
| Below discussion will ignore MST and NON-MST difference as it doesn't |
| impact on jack handling too much. |
| |
| Driver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is |
| a member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer. |
| |
| For !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically. |
| |
| For dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] |
| when monitor is hotplugged. |
| |
| |
| Build Jack |
| ---------- |
| |
| - dyn_pcm_assign |
| Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly. |
| |
| - !dyn_pcm_assign |
| Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically. |
| |
| |
| Unsolicited Event Enabling |
| -------------------------- |
| Enable unsolicited event if !acomp. |
| |
| |
| Monitor Hotplug Event Handling |
| ------------------------------ |
| - acomp |
| pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() -> |
| sync_eld_via_acomp(). |
| Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for |
| both dyn_pcm_assign and !dyn_pcm_assign |
| |
| - !acomp |
| Hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() -> |
| hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs() |
| Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign. |
| Use hda_jack mechanism to handle jack events. |
| |
| |
| Others to be added later |
| ======================== |