mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.8 KiB
97 lines
2.8 KiB
=================== |
|
ASoC Machine Driver |
|
=================== |
|
|
|
The ASoC machine (or board) driver is the code that glues together all the |
|
component drivers (e.g. codecs, platforms and DAIs). It also describes the |
|
relationships between each component which include audio paths, GPIOs, |
|
interrupts, clocking, jacks and voltage regulators. |
|
|
|
The machine driver can contain codec and platform specific code. It registers |
|
the audio subsystem with the kernel as a platform device and is represented by |
|
the following struct:- |
|
:: |
|
|
|
/* SoC machine */ |
|
struct snd_soc_card { |
|
char *name; |
|
|
|
... |
|
|
|
int (*probe)(struct platform_device *pdev); |
|
int (*remove)(struct platform_device *pdev); |
|
|
|
/* the pre and post PM functions are used to do any PM work before and |
|
* after the codec and DAIs do any PM work. */ |
|
int (*suspend_pre)(struct platform_device *pdev, pm_message_t state); |
|
int (*suspend_post)(struct platform_device *pdev, pm_message_t state); |
|
int (*resume_pre)(struct platform_device *pdev); |
|
int (*resume_post)(struct platform_device *pdev); |
|
|
|
... |
|
|
|
/* CPU <--> Codec DAI links */ |
|
struct snd_soc_dai_link *dai_link; |
|
int num_links; |
|
|
|
... |
|
}; |
|
|
|
probe()/remove() |
|
---------------- |
|
probe/remove are optional. Do any machine specific probe here. |
|
|
|
|
|
suspend()/resume() |
|
------------------ |
|
The machine driver has pre and post versions of suspend and resume to take care |
|
of any machine audio tasks that have to be done before or after the codec, DAIs |
|
and DMA is suspended and resumed. Optional. |
|
|
|
|
|
Machine DAI Configuration |
|
------------------------- |
|
The machine DAI configuration glues all the codec and CPU DAIs together. It can |
|
also be used to set up the DAI system clock and for any machine related DAI |
|
initialisation e.g. the machine audio map can be connected to the codec audio |
|
map, unconnected codec pins can be set as such. |
|
|
|
struct snd_soc_dai_link is used to set up each DAI in your machine. e.g. |
|
:: |
|
|
|
/* corgi digital audio interface glue - connects codec <--> CPU */ |
|
static struct snd_soc_dai_link corgi_dai = { |
|
.name = "WM8731", |
|
.stream_name = "WM8731", |
|
.cpu_dai_name = "pxa-is2-dai", |
|
.codec_dai_name = "wm8731-hifi", |
|
.platform_name = "pxa-pcm-audio", |
|
.codec_name = "wm8713-codec.0-001a", |
|
.init = corgi_wm8731_init, |
|
.ops = &corgi_ops, |
|
}; |
|
|
|
struct snd_soc_card then sets up the machine with its DAIs. e.g. |
|
:: |
|
|
|
/* corgi audio machine driver */ |
|
static struct snd_soc_card snd_soc_corgi = { |
|
.name = "Corgi", |
|
.dai_link = &corgi_dai, |
|
.num_links = 1, |
|
}; |
|
|
|
|
|
Machine Power Map |
|
----------------- |
|
|
|
The machine driver can optionally extend the codec power map and to become an |
|
audio power map of the audio subsystem. This allows for automatic power up/down |
|
of speaker/HP amplifiers, etc. Codec pins can be connected to the machines jack |
|
sockets in the machine init function. |
|
|
|
|
|
Machine Controls |
|
---------------- |
|
|
|
Machine specific audio mixer controls can be added in the DAI init function.
|
|
|