72 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
ASoC jack detection
 | 
						|
===================
 | 
						|
 | 
						|
ALSA has a standard API for representing physical jacks to user space,
 | 
						|
the kernel side of which can be seen in include/sound/jack.h.  ASoC
 | 
						|
provides a version of this API adding two additional features:
 | 
						|
 | 
						|
 - It allows more than one jack detection method to work together on one
 | 
						|
   user visible jack.  In embedded systems it is common for multiple
 | 
						|
   to be present on a single jack but handled by separate bits of
 | 
						|
   hardware.
 | 
						|
 | 
						|
 - Integration with DAPM, allowing DAPM endpoints to be updated
 | 
						|
   automatically based on the detected jack status (eg, turning off the
 | 
						|
   headphone outputs if no headphones are present).
 | 
						|
 | 
						|
This is done by splitting the jacks up into three things working
 | 
						|
together: the jack itself represented by a struct snd_soc_jack, sets of
 | 
						|
snd_soc_jack_pins representing DAPM endpoints to update and blocks of
 | 
						|
code providing jack reporting mechanisms.
 | 
						|
 | 
						|
For example, a system may have a stereo headset jack with two reporting
 | 
						|
mechanisms, one for the headphone and one for the microphone.  Some
 | 
						|
systems won't be able to use their speaker output while a headphone is
 | 
						|
connected and so will want to make sure to update both speaker and
 | 
						|
headphone when the headphone jack status changes.
 | 
						|
 | 
						|
The jack - struct snd_soc_jack
 | 
						|
==============================
 | 
						|
 | 
						|
This represents a physical jack on the system and is what is visible to
 | 
						|
user space.  The jack itself is completely passive, it is set up by the
 | 
						|
machine driver and updated by jack detection methods.
 | 
						|
 | 
						|
Jacks are created by the machine driver calling snd_soc_jack_new().
 | 
						|
 | 
						|
snd_soc_jack_pin
 | 
						|
================
 | 
						|
 | 
						|
These represent a DAPM pin to update depending on some of the status
 | 
						|
bits supported by the jack.  Each snd_soc_jack has zero or more of these
 | 
						|
which are updated automatically.  They are created by the machine driver
 | 
						|
and associated with the jack using snd_soc_jack_add_pins().  The status
 | 
						|
of the endpoint may configured to be the opposite of the jack status if
 | 
						|
required (eg, enabling a built in microphone if a microphone is not
 | 
						|
connected via a jack).
 | 
						|
 | 
						|
Jack detection methods
 | 
						|
======================
 | 
						|
 | 
						|
Actual jack detection is done by code which is able to monitor some
 | 
						|
input to the system and update a jack by calling snd_soc_jack_report(),
 | 
						|
specifying a subset of bits to update.  The jack detection code should
 | 
						|
be set up by the machine driver, taking configuration for the jack to
 | 
						|
update and the set of things to report when the jack is connected.
 | 
						|
 | 
						|
Often this is done based on the status of a GPIO - a handler for this is
 | 
						|
provided by the snd_soc_jack_add_gpio() function.  Other methods are
 | 
						|
also available, for example integrated into CODECs.  One example of
 | 
						|
CODEC integrated jack detection can be see in the WM8350 driver.
 | 
						|
 | 
						|
Each jack may have multiple reporting mechanisms, though it will need at
 | 
						|
least one to be useful.
 | 
						|
 | 
						|
Machine drivers
 | 
						|
===============
 | 
						|
 | 
						|
These are all hooked together by the machine driver depending on the
 | 
						|
system hardware.  The machine driver will set up the snd_soc_jack and
 | 
						|
the list of pins to update then set up one or more jack detection
 | 
						|
mechanisms to update that jack based on their current status.
 |