26
26
#define ACP3x_REG_START 0x1240000
27
27
#define ACP3x_REG_END 0x125C000
28
28
29
- static struct platform_device * dmic_dev ;
30
29
static struct platform_device * pdev ;
31
30
32
31
static const struct resource acp_res [] = {
@@ -44,6 +43,26 @@ static const struct resource acp_res[] = {
44
43
},
45
44
};
46
45
46
+ static int create_acp_platform_devs (struct pci_dev * pci , struct acp_chip_info * chip )
47
+ {
48
+ int ret ;
49
+
50
+ if (chip -> is_pdm_dev && chip -> is_pdm_config ) {
51
+ chip -> dmic_codec_dev = platform_device_register_data (& pci -> dev ,
52
+ "dmic-codec" ,
53
+ PLATFORM_DEVID_NONE ,
54
+ NULL , 0 );
55
+ if (IS_ERR (chip -> dmic_codec_dev )) {
56
+ dev_err (& pci -> dev , "failed to create DMIC device\n" );
57
+ ret = PTR_ERR (chip -> dmic_codec_dev );
58
+ goto err ;
59
+ }
60
+ }
61
+ return 0 ;
62
+ err :
63
+ return ret ;
64
+ }
65
+
47
66
static int acp_pci_probe (struct pci_dev * pci , const struct pci_device_id * pci_id )
48
67
{
49
68
struct platform_device_info pdevinfo ;
@@ -102,33 +121,33 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
102
121
goto release_regions ;
103
122
}
104
123
chip -> flag = flag ;
105
- dmic_dev = platform_device_register_data (dev , "dmic-codec" , PLATFORM_DEVID_NONE , NULL , 0 );
106
- if (IS_ERR (dmic_dev )) {
107
- dev_err (dev , "failed to create DMIC device\n" );
108
- ret = PTR_ERR (dmic_dev );
109
- goto release_regions ;
110
- }
111
124
112
125
addr = pci_resource_start (pci , 0 );
113
126
chip -> base = devm_ioremap (& pci -> dev , addr , pci_resource_len (pci , 0 ));
114
127
if (!chip -> base ) {
115
128
ret = - ENOMEM ;
116
- goto unregister_dmic_dev ;
129
+ goto release_regions ;
117
130
}
118
131
119
132
chip -> acp_hw_ops_init (chip );
120
133
ret = acp_hw_init (chip );
121
134
if (ret )
122
- goto unregister_dmic_dev ;
135
+ goto release_regions ;
123
136
124
137
check_acp_config (pci , chip );
125
138
if (!chip -> is_pdm_dev && !chip -> is_i2s_config )
126
139
goto skip_pdev_creation ;
127
140
141
+ ret = create_acp_platform_devs (pci , chip );
142
+ if (ret < 0 ) {
143
+ dev_err (& pci -> dev , "ACP platform devices creation failed\n" );
144
+ goto de_init ;
145
+ }
146
+
128
147
res = devm_kcalloc (& pci -> dev , num_res , sizeof (struct resource ), GFP_KERNEL );
129
148
if (!res ) {
130
149
ret = - ENOMEM ;
131
- goto unregister_dmic_dev ;
150
+ goto de_init ;
132
151
}
133
152
134
153
for (i = 0 ; i < num_res ; i ++ , res_acp ++ ) {
@@ -156,7 +175,7 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
156
175
if (IS_ERR (pdev )) {
157
176
dev_err (& pci -> dev , "cannot register %s device\n" , pdevinfo .name );
158
177
ret = PTR_ERR (pdev );
159
- goto unregister_dmic_dev ;
178
+ goto de_init ;
160
179
}
161
180
162
181
skip_pdev_creation :
@@ -168,8 +187,8 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
168
187
pm_runtime_allow (& pci -> dev );
169
188
return ret ;
170
189
171
- unregister_dmic_dev :
172
- platform_device_unregister ( dmic_dev );
190
+ de_init :
191
+ acp_hw_deinit ( chip );
173
192
release_regions :
174
193
pci_release_regions (pci );
175
194
disable_pci :
@@ -223,8 +242,8 @@ static void acp_pci_remove(struct pci_dev *pci)
223
242
chip = pci_get_drvdata (pci );
224
243
pm_runtime_forbid (& pci -> dev );
225
244
pm_runtime_get_noresume (& pci -> dev );
226
- if (dmic_dev )
227
- platform_device_unregister (dmic_dev );
245
+ if (chip -> dmic_codec_dev )
246
+ platform_device_unregister (chip -> dmic_codec_dev );
228
247
if (pdev )
229
248
platform_device_unregister (pdev );
230
249
ret = acp_hw_deinit (chip );
0 commit comments