@@ -51,6 +51,7 @@ struct irq_domain *ti_sci_inta_msi_create_irq_domain(struct fwnode_handle *fwnod
5151 struct irq_domain * domain ;
5252
5353 ti_sci_inta_msi_update_chip_ops (info );
54+ info -> flags |= MSI_FLAG_FREE_MSI_DESCS ;
5455
5556 domain = msi_create_irq_domain (fwnode , info , parent );
5657 if (domain )
@@ -60,50 +61,32 @@ struct irq_domain *ti_sci_inta_msi_create_irq_domain(struct fwnode_handle *fwnod
6061}
6162EXPORT_SYMBOL_GPL (ti_sci_inta_msi_create_irq_domain );
6263
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-
7364static int ti_sci_inta_msi_alloc_descs (struct device * dev ,
7465 struct ti_sci_resource * res )
7566{
76- struct msi_desc * msi_desc ;
67+ struct msi_desc msi_desc ;
7768 int set , i , count = 0 ;
7869
70+ memset (& msi_desc , 0 , sizeof (msi_desc ));
71+ msi_desc .nvec_used = 1 ;
72+
7973 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 ;
9178 }
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 ;
10384 }
10485 }
105-
10686 return count ;
87+ fail :
88+ msi_free_msi_descs (dev );
89+ return - ENOMEM ;
10790}
10891
10992int 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,
124107 if (ret )
125108 return ret ;
126109
110+ msi_lock_descs (dev );
127111 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 ;
135115 }
136116
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 );
141122 return ret ;
142123}
143124EXPORT_SYMBOL_GPL (ti_sci_inta_msi_domain_alloc_irqs );
144125
145126void ti_sci_inta_msi_domain_free_irqs (struct device * dev )
146127{
147128 msi_domain_free_irqs (dev -> msi .domain , dev );
148- ti_sci_inta_msi_free_descs (dev );
149129}
150130EXPORT_SYMBOL_GPL (ti_sci_inta_msi_domain_free_irqs );
0 commit comments