22
22
23
23
#define DRV_NAME "pcm030-audio-fabric"
24
24
25
+ struct pcm030_audio_data {
26
+ struct snd_soc_card * card ;
27
+ struct platform_device * codec_device ;
28
+ };
29
+
25
30
static struct snd_soc_dai_link pcm030_fabric_dai [] = {
26
31
{
27
32
.name = "AC97" ,
@@ -51,14 +56,22 @@ static int __init pcm030_fabric_probe(struct platform_device *op)
51
56
struct device_node * np = op -> dev .of_node ;
52
57
struct device_node * platform_np ;
53
58
struct snd_soc_card * card = & pcm030_card ;
59
+ struct pcm030_audio_data * pdata ;
54
60
int ret ;
55
61
int i ;
56
62
57
63
if (!of_machine_is_compatible ("phytec,pcm030" ))
58
64
return - ENODEV ;
59
65
66
+ pdata = devm_kzalloc (& op -> dev , sizeof (struct pcm030_audio_data ),
67
+ GFP_KERNEL );
68
+ if (!pdata )
69
+ return - ENOMEM ;
70
+
60
71
card -> dev = & op -> dev ;
61
- platform_set_drvdata (op , card );
72
+ platform_set_drvdata (op , pdata );
73
+
74
+ pdata -> card = card ;
62
75
63
76
platform_np = of_parse_phandle (np , "asoc-platform" , 0 );
64
77
if (!platform_np ) {
@@ -69,6 +82,18 @@ static int __init pcm030_fabric_probe(struct platform_device *op)
69
82
for (i = 0 ; i < card -> num_links ; i ++ )
70
83
card -> dai_link [i ].platform_of_node = platform_np ;
71
84
85
+ ret = request_module ("snd-soc-wm9712" );
86
+ if (ret )
87
+ dev_err (& op -> dev , "request_module returned: %d\n" , ret );
88
+
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" );
92
+
93
+ ret = platform_device_add (pdata -> codec_device );
94
+ if (ret )
95
+ dev_err (& op -> dev , "platform_device_add() failed: %d\n" , ret );
96
+
72
97
ret = snd_soc_register_card (card );
73
98
if (ret )
74
99
dev_err (& op -> dev , "snd_soc_register_card() failed: %d\n" , ret );
@@ -78,10 +103,11 @@ static int __init pcm030_fabric_probe(struct platform_device *op)
78
103
79
104
static int __devexit pcm030_fabric_remove (struct platform_device * op )
80
105
{
81
- struct snd_soc_card * card = platform_get_drvdata (op );
106
+ struct pcm030_audio_data * pdata = platform_get_drvdata (op );
82
107
int ret ;
83
108
84
- ret = snd_soc_unregister_card (card );
109
+ ret = snd_soc_unregister_card (pdata -> card );
110
+ platform_device_unregister (pdata -> codec_device );
85
111
86
112
return ret ;
87
113
}
0 commit comments