@@ -51,6 +51,7 @@ struct irq_domain *ti_sci_inta_msi_create_irq_domain(struct fwnode_handle *fwnod
51
51
struct irq_domain * domain ;
52
52
53
53
ti_sci_inta_msi_update_chip_ops (info );
54
+ info -> flags |= MSI_FLAG_FREE_MSI_DESCS ;
54
55
55
56
domain = msi_create_irq_domain (fwnode , info , parent );
56
57
if (domain )
@@ -60,50 +61,32 @@ struct irq_domain *ti_sci_inta_msi_create_irq_domain(struct fwnode_handle *fwnod
60
61
}
61
62
EXPORT_SYMBOL_GPL (ti_sci_inta_msi_create_irq_domain );
62
63
63
- static void ti_sci_inta_msi_free_descs (struct device * dev )
64
- {
65
- struct msi_desc * desc , * tmp ;
66
-
67
- list_for_each_entry_safe (desc , tmp , dev_to_msi_list (dev ), list ) {
68
- list_del (& desc -> list );
69
- free_msi_entry (desc );
70
- }
71
- }
72
-
73
64
static int ti_sci_inta_msi_alloc_descs (struct device * dev ,
74
65
struct ti_sci_resource * res )
75
66
{
76
- struct msi_desc * msi_desc ;
67
+ struct msi_desc msi_desc ;
77
68
int set , i , count = 0 ;
78
69
70
+ memset (& msi_desc , 0 , sizeof (msi_desc ));
71
+ msi_desc .nvec_used = 1 ;
72
+
79
73
for (set = 0 ; set < res -> sets ; set ++ ) {
80
- for (i = 0 ; i < res -> desc [set ].num ; i ++ ) {
81
- msi_desc = alloc_msi_entry (dev , 1 , NULL );
82
- if (!msi_desc ) {
83
- ti_sci_inta_msi_free_descs (dev );
84
- return - ENOMEM ;
85
- }
86
-
87
- msi_desc -> msi_index = res -> desc [set ].start + i ;
88
- INIT_LIST_HEAD (& msi_desc -> list );
89
- list_add_tail (& msi_desc -> list , dev_to_msi_list (dev ));
90
- count ++ ;
74
+ for (i = 0 ; i < res -> desc [set ].num ; i ++ , count ++ ) {
75
+ msi_desc .msi_index = res -> desc [set ].start + i ;
76
+ if (msi_add_msi_desc (dev , & msi_desc ))
77
+ goto fail ;
91
78
}
92
- for (i = 0 ; i < res -> desc [set ].num_sec ; i ++ ) {
93
- msi_desc = alloc_msi_entry (dev , 1 , NULL );
94
- if (!msi_desc ) {
95
- ti_sci_inta_msi_free_descs (dev );
96
- return - ENOMEM ;
97
- }
98
-
99
- msi_desc -> msi_index = res -> desc [set ].start_sec + i ;
100
- INIT_LIST_HEAD (& msi_desc -> list );
101
- list_add_tail (& msi_desc -> list , dev_to_msi_list (dev ));
102
- count ++ ;
79
+
80
+ for (i = 0 ; i < res -> desc [set ].num_sec ; i ++ , count ++ ) {
81
+ msi_desc .msi_index = res -> desc [set ].start_sec + i ;
82
+ if (msi_add_msi_desc (dev , & msi_desc ))
83
+ goto fail ;
103
84
}
104
85
}
105
-
106
86
return count ;
87
+ fail :
88
+ msi_free_msi_descs (dev );
89
+ return - ENOMEM ;
107
90
}
108
91
109
92
int ti_sci_inta_msi_domain_alloc_irqs (struct device * dev ,
@@ -124,27 +107,24 @@ int ti_sci_inta_msi_domain_alloc_irqs(struct device *dev,
124
107
if (ret )
125
108
return ret ;
126
109
110
+ msi_lock_descs (dev );
127
111
nvec = ti_sci_inta_msi_alloc_descs (dev , res );
128
- if (nvec <= 0 )
129
- return nvec ;
130
-
131
- ret = msi_domain_alloc_irqs (msi_domain , dev , nvec );
132
- if (ret ) {
133
- dev_err (dev , "Failed to allocate IRQs %d\n" , ret );
134
- goto cleanup ;
112
+ if (nvec <= 0 ) {
113
+ ret = nvec ;
114
+ goto unlock ;
135
115
}
136
116
137
- return 0 ;
138
-
139
- cleanup :
140
- ti_sci_inta_msi_free_descs (& pdev -> dev );
117
+ ret = msi_domain_alloc_irqs_descs_locked (msi_domain , dev , nvec );
118
+ if (ret )
119
+ dev_err (dev , "Failed to allocate IRQs %d\n" , ret );
120
+ unlock :
121
+ msi_unlock_descs (dev );
141
122
return ret ;
142
123
}
143
124
EXPORT_SYMBOL_GPL (ti_sci_inta_msi_domain_alloc_irqs );
144
125
145
126
void ti_sci_inta_msi_domain_free_irqs (struct device * dev )
146
127
{
147
128
msi_domain_free_irqs (dev -> msi .domain , dev );
148
- ti_sci_inta_msi_free_descs (dev );
149
129
}
150
130
EXPORT_SYMBOL_GPL (ti_sci_inta_msi_domain_free_irqs );
0 commit comments