162306a36Sopenharmony_ci===================
262306a36Sopenharmony_ciASoC Machine Driver
362306a36Sopenharmony_ci===================
462306a36Sopenharmony_ci
562306a36Sopenharmony_ciThe ASoC machine (or board) driver is the code that glues together all the
662306a36Sopenharmony_cicomponent drivers (e.g. codecs, platforms and DAIs). It also describes the
762306a36Sopenharmony_cirelationships between each component which include audio paths, GPIOs,
862306a36Sopenharmony_ciinterrupts, clocking, jacks and voltage regulators.
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciThe machine driver can contain codec and platform specific code. It registers
1162306a36Sopenharmony_cithe audio subsystem with the kernel as a platform device and is represented by
1262306a36Sopenharmony_cithe following struct:-
1362306a36Sopenharmony_ci::
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci  /* SoC machine */
1662306a36Sopenharmony_ci  struct snd_soc_card {
1762306a36Sopenharmony_ci	char *name;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	...
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	int (*probe)(struct platform_device *pdev);
2262306a36Sopenharmony_ci	int (*remove)(struct platform_device *pdev);
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	/* the pre and post PM functions are used to do any PM work before and
2562306a36Sopenharmony_ci	 * after the codec and DAIs do any PM work. */
2662306a36Sopenharmony_ci	int (*suspend_pre)(struct platform_device *pdev, pm_message_t state);
2762306a36Sopenharmony_ci	int (*suspend_post)(struct platform_device *pdev, pm_message_t state);
2862306a36Sopenharmony_ci	int (*resume_pre)(struct platform_device *pdev);
2962306a36Sopenharmony_ci	int (*resume_post)(struct platform_device *pdev);
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	...
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	/* CPU <--> Codec DAI links  */
3462306a36Sopenharmony_ci	struct snd_soc_dai_link *dai_link;
3562306a36Sopenharmony_ci	int num_links;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	...
3862306a36Sopenharmony_ci  };
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciprobe()/remove()
4162306a36Sopenharmony_ci----------------
4262306a36Sopenharmony_ciprobe/remove are optional. Do any machine specific probe here.
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cisuspend()/resume()
4662306a36Sopenharmony_ci------------------
4762306a36Sopenharmony_ciThe machine driver has pre and post versions of suspend and resume to take care
4862306a36Sopenharmony_ciof any machine audio tasks that have to be done before or after the codec, DAIs
4962306a36Sopenharmony_ciand DMA is suspended and resumed. Optional.
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciMachine DAI Configuration
5362306a36Sopenharmony_ci-------------------------
5462306a36Sopenharmony_ciThe machine DAI configuration glues all the codec and CPU DAIs together. It can
5562306a36Sopenharmony_cialso be used to set up the DAI system clock and for any machine related DAI
5662306a36Sopenharmony_ciinitialisation e.g. the machine audio map can be connected to the codec audio
5762306a36Sopenharmony_cimap, unconnected codec pins can be set as such.
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistruct snd_soc_dai_link is used to set up each DAI in your machine. e.g.
6062306a36Sopenharmony_ci::
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci  /* corgi digital audio interface glue - connects codec <--> CPU */
6362306a36Sopenharmony_ci  static struct snd_soc_dai_link corgi_dai = {
6462306a36Sopenharmony_ci	.name = "WM8731",
6562306a36Sopenharmony_ci	.stream_name = "WM8731",
6662306a36Sopenharmony_ci	.cpu_dai_name = "pxa-is2-dai",
6762306a36Sopenharmony_ci	.codec_dai_name = "wm8731-hifi",
6862306a36Sopenharmony_ci	.platform_name = "pxa-pcm-audio",
6962306a36Sopenharmony_ci	.codec_name = "wm8713-codec.0-001a",
7062306a36Sopenharmony_ci	.init = corgi_wm8731_init,
7162306a36Sopenharmony_ci	.ops = &corgi_ops,
7262306a36Sopenharmony_ci  };
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistruct snd_soc_card then sets up the machine with its DAIs. e.g.
7562306a36Sopenharmony_ci::
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci  /* corgi audio machine driver */
7862306a36Sopenharmony_ci  static struct snd_soc_card snd_soc_corgi = {
7962306a36Sopenharmony_ci	.name = "Corgi",
8062306a36Sopenharmony_ci	.dai_link = &corgi_dai,
8162306a36Sopenharmony_ci	.num_links = 1,
8262306a36Sopenharmony_ci  };
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ciMachine Power Map
8662306a36Sopenharmony_ci-----------------
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ciThe machine driver can optionally extend the codec power map and to become an
8962306a36Sopenharmony_ciaudio power map of the audio subsystem. This allows for automatic power up/down
9062306a36Sopenharmony_ciof speaker/HP amplifiers, etc. Codec pins can be connected to the machines jack
9162306a36Sopenharmony_cisockets in the machine init function.
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ciMachine Controls
9562306a36Sopenharmony_ci----------------
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ciMachine specific audio mixer controls can be added in the DAI init function.
98