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