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
),
75 platform_np
= of_parse_phandle(np
, "asoc-platform", 0);
77 dev_err(&op
->dev
, "ac97 not registered\n");
81 for (i
= 0; i
< card
->num_links
; i
++)
82 card
->dai_link
[i
].platform_of_node
= platform_np
;
84 ret
= request_module("snd-soc-wm9712");
86 dev_err(&op
->dev
, "request_module returned: %d\n", ret
);
88 pdata
->codec_device
= platform_device_alloc("wm9712-codec", -1);
89 if (!pdata
->codec_device
)
90 dev_err(&op
->dev
, "platform_device_alloc() failed\n");
92 ret
= platform_device_add(pdata
->codec_device
);
94 dev_err(&op
->dev
, "platform_device_add() failed: %d\n", ret
);
96 ret
= snd_soc_register_card(card
);
98 dev_err(&op
->dev
, "snd_soc_register_card() failed: %d\n", ret
);
100 platform_set_drvdata(op
, pdata
);
105 static int pcm030_fabric_remove(struct platform_device
*op
)
107 struct pcm030_audio_data
*pdata
= platform_get_drvdata(op
);
110 ret
= snd_soc_unregister_card(pdata
->card
);
111 platform_device_unregister(pdata
->codec_device
);
116 static const struct of_device_id pcm030_audio_match
[] = {
117 { .compatible
= "phytec,pcm030-audio-fabric", },
120 MODULE_DEVICE_TABLE(of
, pcm030_audio_match
);
122 static struct platform_driver pcm030_fabric_driver
= {
123 .probe
= pcm030_fabric_probe
,
124 .remove
= pcm030_fabric_remove
,
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");