forked from microsoft/WSL2-Linux-Kernel
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'topic/hda-mst' into for-next
- Loading branch information
Showing
2 changed files
with
556 additions
and
66 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
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 | ||
======================== |
Oops, something went wrong.