2 * Phytec pcm030 driver for the PSC of the Freescale MPC52xx
3 * configured as AC97 interface
5 * Copyright 2008 Jon Smirl, Digispeaker
6 * Author: Jon Smirl <jonsmirl@gmail.com>
8 * This file is licensed under the terms of the GNU General Public License
9 * version 2. This program is licensed "as is" without any warranty of any
10 * kind, whether express or implied.
13 #include <linux/init.h>
14 #include <linux/module.h>
15 #include <linux/device.h>
16 #include <linux/of_device.h>
17 #include <linux/of_platform.h>
19 #include <sound/soc.h>
21 #include "mpc5200_dma.h"
23 #define DRV_NAME "pcm030-audio-fabric"
25 struct pcm030_audio_data
{
26 struct snd_soc_card
*card
;
27 struct platform_device
*codec_device
;
30 static struct snd_soc_dai_link pcm030_fabric_dai
[] = {
33 .stream_name
= "AC97 Analog",
34 .codec_dai_name
= "wm9712-hifi",
35 .cpu_dai_name
= "mpc5200-psc-ac97.0",
36 .codec_name
= "wm9712-codec",
40 .stream_name
= "AC97 IEC958",
41 .codec_dai_name
= "wm9712-aux",
42 .cpu_dai_name
= "mpc5200-psc-ac97.1",
43 .codec_name
= "wm9712-codec",
47 static struct snd_soc_card pcm030_card
= {
50 .dai_link
= pcm030_fabric_dai
,
51 .num_links
= ARRAY_SIZE(pcm030_fabric_dai
),
54 static int pcm030_fabric_probe(struct platform_device
*op
)
56 struct device_node
*np
= op
->dev
.of_node
;
57 struct device_node
*platform_np
;
58 struct snd_soc_card
*card
= &pcm030_card
;
59 struct pcm030_audio_data
*pdata
;
63 if (!of_machine_is_compatible("phytec,pcm030"))
66 pdata
= devm_kzalloc(&op
->dev
, sizeof(struct pcm030_audio_data
),
72 platform_set_drvdata(op
, pdata
);
76 platform_np
= of_parse_phandle(np
, "asoc-platform", 0);
78 dev_err(&op
->dev
, "ac97 not registered\n");
82 for (i
= 0; i
< card
->num_links
; i
++)
83 card
->dai_link
[i
].platform_of_node
= platform_np
;
85 ret
= request_module("snd-soc-wm9712");
87 dev_err(&op
->dev
, "request_module returned: %d\n", ret
);
89 pdata
->codec_device
= platform_device_alloc("wm9712-codec", -1);
90 if (!pdata
->codec_device
)
91 dev_err(&op
->dev
, "platform_device_alloc() failed\n");
93 ret
= platform_device_add(pdata
->codec_device
);
95 dev_err(&op
->dev
, "platform_device_add() failed: %d\n", ret
);
97 ret
= snd_soc_register_card(card
);
99 dev_err(&op
->dev
, "snd_soc_register_card() failed: %d\n", ret
);
104 static int pcm030_fabric_remove(struct platform_device
*op
)
106 struct pcm030_audio_data
*pdata
= platform_get_drvdata(op
);
109 ret
= snd_soc_unregister_card(pdata
->card
);
110 platform_device_unregister(pdata
->codec_device
);
115 static struct of_device_id pcm030_audio_match
[] = {
116 { .compatible
= "phytec,pcm030-audio-fabric", },
119 MODULE_DEVICE_TABLE(of
, pcm030_audio_match
);
121 static struct platform_driver pcm030_fabric_driver
= {
122 .probe
= pcm030_fabric_probe
,
123 .remove
= pcm030_fabric_remove
,
126 .owner
= THIS_MODULE
,
127 .of_match_table
= pcm030_audio_match
,
131 module_platform_driver(pcm030_fabric_driver
);
134 MODULE_AUTHOR("Jon Smirl <jonsmirl@gmail.com>");
135 MODULE_DESCRIPTION(DRV_NAME
": mpc5200 pcm030 fabric driver");
136 MODULE_LICENSE("GPL");