@@ -107,57 +107,6 @@ static void platform_msi_update_chip_ops(struct msi_domain_info *info)
107
107
info -> flags &= ~MSI_FLAG_LEVEL_CAPABLE ;
108
108
}
109
109
110
- static void platform_msi_free_descs (struct device * dev , int base , int nvec )
111
- {
112
- struct msi_desc * desc , * tmp ;
113
-
114
- list_for_each_entry_safe (desc , tmp , dev_to_msi_list (dev ), list ) {
115
- if (desc -> msi_index >= base &&
116
- desc -> msi_index < (base + nvec )) {
117
- list_del (& desc -> list );
118
- free_msi_entry (desc );
119
- }
120
- }
121
- }
122
-
123
- static int platform_msi_alloc_descs_with_irq (struct device * dev , int virq ,
124
- int nvec )
125
- {
126
- struct msi_desc * desc ;
127
- int i , base = 0 ;
128
-
129
- if (!list_empty (dev_to_msi_list (dev ))) {
130
- desc = list_last_entry (dev_to_msi_list (dev ),
131
- struct msi_desc , list );
132
- base = desc -> msi_index + 1 ;
133
- }
134
-
135
- for (i = 0 ; i < nvec ; i ++ ) {
136
- desc = alloc_msi_entry (dev , 1 , NULL );
137
- if (!desc )
138
- break ;
139
-
140
- desc -> msi_index = base + i ;
141
- desc -> irq = virq ? virq + i : 0 ;
142
-
143
- list_add_tail (& desc -> list , dev_to_msi_list (dev ));
144
- }
145
-
146
- if (i != nvec ) {
147
- /* Clean up the mess */
148
- platform_msi_free_descs (dev , base , nvec );
149
-
150
- return - ENOMEM ;
151
- }
152
-
153
- return 0 ;
154
- }
155
-
156
- static int platform_msi_alloc_descs (struct device * dev , int nvec )
157
- {
158
- return platform_msi_alloc_descs_with_irq (dev , 0 , nvec );
159
- }
160
-
161
110
/**
162
111
* platform_msi_create_irq_domain - Create a platform MSI interrupt domain
163
112
* @fwnode: Optional fwnode of the interrupt controller
@@ -180,7 +129,8 @@ struct irq_domain *platform_msi_create_irq_domain(struct fwnode_handle *fwnode,
180
129
platform_msi_update_dom_ops (info );
181
130
if (info -> flags & MSI_FLAG_USE_DEF_CHIP_OPS )
182
131
platform_msi_update_chip_ops (info );
183
- info -> flags |= MSI_FLAG_DEV_SYSFS ;
132
+ info -> flags |= MSI_FLAG_DEV_SYSFS | MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS |
133
+ MSI_FLAG_FREE_MSI_DESCS ;
184
134
185
135
domain = msi_create_irq_domain (fwnode , info , parent );
186
136
if (domain )
@@ -262,20 +212,10 @@ int platform_msi_domain_alloc_irqs(struct device *dev, unsigned int nvec,
262
212
if (err )
263
213
return err ;
264
214
265
- err = platform_msi_alloc_descs (dev , nvec );
266
- if (err )
267
- goto out_free_priv_data ;
268
-
269
215
err = msi_domain_alloc_irqs (dev -> msi .domain , dev , nvec );
270
216
if (err )
271
- goto out_free_desc ;
272
-
273
- return 0 ;
217
+ platform_msi_free_priv_data (dev );
274
218
275
- out_free_desc :
276
- platform_msi_free_descs (dev , 0 , nvec );
277
- out_free_priv_data :
278
- platform_msi_free_priv_data (dev );
279
219
return err ;
280
220
}
281
221
EXPORT_SYMBOL_GPL (platform_msi_domain_alloc_irqs );
@@ -287,7 +227,6 @@ EXPORT_SYMBOL_GPL(platform_msi_domain_alloc_irqs);
287
227
void platform_msi_domain_free_irqs (struct device * dev )
288
228
{
289
229
msi_domain_free_irqs (dev -> msi .domain , dev );
290
- platform_msi_free_descs (dev , 0 , MAX_DEV_MSIS );
291
230
platform_msi_free_priv_data (dev );
292
231
}
293
232
EXPORT_SYMBOL_GPL (platform_msi_domain_free_irqs );
@@ -361,6 +300,51 @@ __platform_msi_create_device_domain(struct device *dev,
361
300
return NULL ;
362
301
}
363
302
303
+ static void platform_msi_free_descs (struct device * dev , int base , int nvec )
304
+ {
305
+ struct msi_desc * desc , * tmp ;
306
+
307
+ list_for_each_entry_safe (desc , tmp , dev_to_msi_list (dev ), list ) {
308
+ if (desc -> msi_index >= base &&
309
+ desc -> msi_index < (base + nvec )) {
310
+ list_del (& desc -> list );
311
+ free_msi_entry (desc );
312
+ }
313
+ }
314
+ }
315
+
316
+ static int platform_msi_alloc_descs_with_irq (struct device * dev , int virq ,
317
+ int nvec )
318
+ {
319
+ struct msi_desc * desc ;
320
+ int i , base = 0 ;
321
+
322
+ if (!list_empty (dev_to_msi_list (dev ))) {
323
+ desc = list_last_entry (dev_to_msi_list (dev ),
324
+ struct msi_desc , list );
325
+ base = desc -> msi_index + 1 ;
326
+ }
327
+
328
+ for (i = 0 ; i < nvec ; i ++ ) {
329
+ desc = alloc_msi_entry (dev , 1 , NULL );
330
+ if (!desc )
331
+ break ;
332
+
333
+ desc -> msi_index = base + i ;
334
+ desc -> irq = virq + i ;
335
+
336
+ list_add_tail (& desc -> list , dev_to_msi_list (dev ));
337
+ }
338
+
339
+ if (i != nvec ) {
340
+ /* Clean up the mess */
341
+ platform_msi_free_descs (dev , base , nvec );
342
+ return - ENOMEM ;
343
+ }
344
+
345
+ return 0 ;
346
+ }
347
+
364
348
/**
365
349
* platform_msi_device_domain_free - Free interrupts associated with a platform-msi
366
350
* device domain
0 commit comments