@@ -129,196 +129,6 @@ static void mvebu_icu_init(struct mvebu_icu *icu,
129
129
writel_relaxed (msg [1 ].address_lo , icu -> base + subset -> offset_clr_al );
130
130
}
131
131
132
- /* Start of area to be removed once all parent chips provide MSI parent */
133
-
134
- struct mvebu_icu_irq_data {
135
- struct mvebu_icu * icu ;
136
- unsigned int icu_group ;
137
- unsigned int type ;
138
- };
139
-
140
- static void mvebu_icu_write_msg (struct msi_desc * desc , struct msi_msg * msg )
141
- {
142
- struct irq_data * d = irq_get_irq_data (desc -> irq );
143
- struct mvebu_icu_msi_data * msi_data = platform_msi_get_host_data (d -> domain );
144
- struct mvebu_icu_irq_data * icu_irqd = d -> chip_data ;
145
- struct mvebu_icu * icu = icu_irqd -> icu ;
146
- unsigned int icu_int ;
147
-
148
- if (msg -> address_lo || msg -> address_hi ) {
149
- /* One off initialization per domain */
150
- mvebu_icu_init (icu , msi_data , msg );
151
- /* Configure the ICU with irq number & type */
152
- icu_int = msg -> data | ICU_INT_ENABLE ;
153
- if (icu_irqd -> type & IRQ_TYPE_EDGE_RISING )
154
- icu_int |= ICU_IS_EDGE ;
155
- icu_int |= icu_irqd -> icu_group << ICU_GROUP_SHIFT ;
156
- } else {
157
- /* De-configure the ICU */
158
- icu_int = 0 ;
159
- }
160
-
161
- writel_relaxed (icu_int , icu -> base + ICU_INT_CFG (d -> hwirq ));
162
-
163
- /*
164
- * The SATA unit has 2 ports, and a dedicated ICU entry per
165
- * port. The ahci sata driver supports only one irq interrupt
166
- * per SATA unit. To solve this conflict, we configure the 2
167
- * SATA wired interrupts in the south bridge into 1 GIC
168
- * interrupt in the north bridge. Even if only a single port
169
- * is enabled, if sata node is enabled, both interrupts are
170
- * configured (regardless of which port is actually in use).
171
- */
172
- if (d -> hwirq == ICU_SATA0_ICU_ID || d -> hwirq == ICU_SATA1_ICU_ID ) {
173
- writel_relaxed (icu_int ,
174
- icu -> base + ICU_INT_CFG (ICU_SATA0_ICU_ID ));
175
- writel_relaxed (icu_int ,
176
- icu -> base + ICU_INT_CFG (ICU_SATA1_ICU_ID ));
177
- }
178
- }
179
-
180
- static struct irq_chip mvebu_icu_nsr_chip = {
181
- .name = "ICU-NSR" ,
182
- .irq_mask = irq_chip_mask_parent ,
183
- .irq_unmask = irq_chip_unmask_parent ,
184
- .irq_eoi = irq_chip_eoi_parent ,
185
- .irq_set_type = irq_chip_set_type_parent ,
186
- .irq_set_affinity = irq_chip_set_affinity_parent ,
187
- };
188
-
189
- static struct irq_chip mvebu_icu_sei_chip = {
190
- .name = "ICU-SEI" ,
191
- .irq_ack = irq_chip_ack_parent ,
192
- .irq_mask = irq_chip_mask_parent ,
193
- .irq_unmask = irq_chip_unmask_parent ,
194
- .irq_set_type = irq_chip_set_type_parent ,
195
- .irq_set_affinity = irq_chip_set_affinity_parent ,
196
- };
197
-
198
- static int
199
- mvebu_icu_irq_domain_translate (struct irq_domain * d , struct irq_fwspec * fwspec ,
200
- unsigned long * hwirq , unsigned int * type )
201
- {
202
- unsigned int param_count = static_branch_unlikely (& legacy_bindings ) ? 3 : 2 ;
203
- struct mvebu_icu_msi_data * msi_data = platform_msi_get_host_data (d );
204
- struct mvebu_icu * icu = msi_data -> icu ;
205
-
206
- /* Check the count of the parameters in dt */
207
- if (WARN_ON (fwspec -> param_count != param_count )) {
208
- dev_err (icu -> dev , "wrong ICU parameter count %d\n" ,
209
- fwspec -> param_count );
210
- return - EINVAL ;
211
- }
212
-
213
- if (static_branch_unlikely (& legacy_bindings )) {
214
- * hwirq = fwspec -> param [1 ];
215
- * type = fwspec -> param [2 ] & IRQ_TYPE_SENSE_MASK ;
216
- if (fwspec -> param [0 ] != ICU_GRP_NSR ) {
217
- dev_err (icu -> dev , "wrong ICU group type %x\n" ,
218
- fwspec -> param [0 ]);
219
- return - EINVAL ;
220
- }
221
- } else {
222
- * hwirq = fwspec -> param [0 ];
223
- * type = fwspec -> param [1 ] & IRQ_TYPE_SENSE_MASK ;
224
-
225
- /*
226
- * The ICU receives level interrupts. While the NSR are also
227
- * level interrupts, SEI are edge interrupts. Force the type
228
- * here in this case. Please note that this makes the interrupt
229
- * handling unreliable.
230
- */
231
- if (msi_data -> subset_data -> icu_group == ICU_GRP_SEI )
232
- * type = IRQ_TYPE_EDGE_RISING ;
233
- }
234
-
235
- if (* hwirq >= ICU_MAX_IRQS ) {
236
- dev_err (icu -> dev , "invalid interrupt number %ld\n" , * hwirq );
237
- return - EINVAL ;
238
- }
239
-
240
- return 0 ;
241
- }
242
-
243
- static int
244
- mvebu_icu_irq_domain_alloc (struct irq_domain * domain , unsigned int virq ,
245
- unsigned int nr_irqs , void * args )
246
- {
247
- int err ;
248
- unsigned long hwirq ;
249
- struct irq_fwspec * fwspec = args ;
250
- struct mvebu_icu_msi_data * msi_data = platform_msi_get_host_data (domain );
251
- struct mvebu_icu * icu = msi_data -> icu ;
252
- struct mvebu_icu_irq_data * icu_irqd ;
253
- struct irq_chip * chip = & mvebu_icu_nsr_chip ;
254
-
255
- icu_irqd = kmalloc (sizeof (* icu_irqd ), GFP_KERNEL );
256
- if (!icu_irqd )
257
- return - ENOMEM ;
258
-
259
- err = mvebu_icu_irq_domain_translate (domain , fwspec , & hwirq ,
260
- & icu_irqd -> type );
261
- if (err ) {
262
- dev_err (icu -> dev , "failed to translate ICU parameters\n" );
263
- goto free_irqd ;
264
- }
265
-
266
- if (static_branch_unlikely (& legacy_bindings ))
267
- icu_irqd -> icu_group = fwspec -> param [0 ];
268
- else
269
- icu_irqd -> icu_group = msi_data -> subset_data -> icu_group ;
270
- icu_irqd -> icu = icu ;
271
-
272
- err = platform_msi_device_domain_alloc (domain , virq , nr_irqs );
273
- if (err ) {
274
- dev_err (icu -> dev , "failed to allocate ICU interrupt in parent domain\n" );
275
- goto free_irqd ;
276
- }
277
-
278
- /* Make sure there is no interrupt left pending by the firmware */
279
- err = irq_set_irqchip_state (virq , IRQCHIP_STATE_PENDING , false);
280
- if (err )
281
- goto free_msi ;
282
-
283
- if (icu_irqd -> icu_group == ICU_GRP_SEI )
284
- chip = & mvebu_icu_sei_chip ;
285
-
286
- err = irq_domain_set_hwirq_and_chip (domain , virq , hwirq ,
287
- chip , icu_irqd );
288
- if (err ) {
289
- dev_err (icu -> dev , "failed to set the data to IRQ domain\n" );
290
- goto free_msi ;
291
- }
292
-
293
- return 0 ;
294
-
295
- free_msi :
296
- platform_msi_device_domain_free (domain , virq , nr_irqs );
297
- free_irqd :
298
- kfree (icu_irqd );
299
- return err ;
300
- }
301
-
302
- static void
303
- mvebu_icu_irq_domain_free (struct irq_domain * domain , unsigned int virq ,
304
- unsigned int nr_irqs )
305
- {
306
- struct irq_data * d = irq_get_irq_data (virq );
307
- struct mvebu_icu_irq_data * icu_irqd = d -> chip_data ;
308
-
309
- kfree (icu_irqd );
310
-
311
- platform_msi_device_domain_free (domain , virq , nr_irqs );
312
- }
313
-
314
- static const struct irq_domain_ops mvebu_icu_domain_ops = {
315
- .translate = mvebu_icu_irq_domain_translate ,
316
- .alloc = mvebu_icu_irq_domain_alloc ,
317
- .free = mvebu_icu_irq_domain_free ,
318
- };
319
-
320
- /* End of removal area */
321
-
322
132
static int mvebu_icu_msi_init (struct irq_domain * domain , struct msi_domain_info * info ,
323
133
unsigned int virq , irq_hw_number_t hwirq , msi_alloc_info_t * arg )
324
134
{
@@ -448,9 +258,10 @@ static const struct of_device_id mvebu_icu_subset_of_match[] = {
448
258
449
259
static int mvebu_icu_subset_probe (struct platform_device * pdev )
450
260
{
261
+ const struct msi_domain_template * tmpl ;
451
262
struct mvebu_icu_msi_data * msi_data ;
452
263
struct device * dev = & pdev -> dev ;
453
- struct irq_domain * irq_domain ;
264
+ bool sei ;
454
265
455
266
msi_data = devm_kzalloc (dev , sizeof (* msi_data ), GFP_KERNEL );
456
267
if (!msi_data )
@@ -471,22 +282,11 @@ static int mvebu_icu_subset_probe(struct platform_device *pdev)
471
282
if (!irq_domain_get_of_node (dev -> msi .domain ))
472
283
return - ENODEV ;
473
284
474
- if (irq_domain_is_msi_parent (dev -> msi .domain )) {
475
- bool sei = msi_data -> subset_data -> icu_group == ICU_GRP_SEI ;
476
- const struct msi_domain_template * tmpl ;
477
-
478
- tmpl = sei ? & mvebu_icu_sei_msi_template : & mvebu_icu_nsr_msi_template ;
479
-
480
- if (!msi_create_device_irq_domain (dev , MSI_DEFAULT_DOMAIN , tmpl ,
481
- ICU_MAX_IRQS , NULL , msi_data ))
482
- return - ENOMEM ;
483
- }
285
+ sei = msi_data -> subset_data -> icu_group == ICU_GRP_SEI ;
286
+ tmpl = sei ? & mvebu_icu_sei_msi_template : & mvebu_icu_nsr_msi_template ;
484
287
485
- irq_domain = platform_msi_create_device_tree_domain (dev , ICU_MAX_IRQS ,
486
- mvebu_icu_write_msg ,
487
- & mvebu_icu_domain_ops ,
488
- msi_data );
489
- if (!irq_domain ) {
288
+ if (!msi_create_device_irq_domain (dev , MSI_DEFAULT_DOMAIN , tmpl ,
289
+ ICU_MAX_IRQS , NULL , msi_data )) {
490
290
dev_err (dev , "Failed to create ICU MSI domain\n" );
491
291
return - ENOMEM ;
492
292
}
0 commit comments