@@ -365,8 +365,9 @@ static void mrfld_irq_handler(struct irq_desc *desc)
365
365
chained_irq_exit (irqchip , desc );
366
366
}
367
367
368
- static void mrfld_irq_init_hw (struct mrfld_gpio * priv )
368
+ static int mrfld_irq_init_hw (struct gpio_chip * chip )
369
369
{
370
+ struct mrfld_gpio * priv = gpiochip_get_data (chip );
370
371
void __iomem * reg ;
371
372
unsigned int base ;
372
373
@@ -378,6 +379,8 @@ static void mrfld_irq_init_hw(struct mrfld_gpio *priv)
378
379
reg = gpio_reg (& priv -> chip , base , GFER );
379
380
writel (0 , reg );
380
381
}
382
+
383
+ return 0 ;
381
384
}
382
385
383
386
static const char * mrfld_gpio_get_pinctrl_dev_name (struct mrfld_gpio * priv )
@@ -396,14 +399,36 @@ static const char *mrfld_gpio_get_pinctrl_dev_name(struct mrfld_gpio *priv)
396
399
return name ;
397
400
}
398
401
399
- static int mrfld_gpio_probe (struct pci_dev * pdev , const struct pci_device_id * id )
402
+ static int mrfld_gpio_add_pin_ranges (struct gpio_chip * chip )
400
403
{
404
+ struct mrfld_gpio * priv = gpiochip_get_data (chip );
401
405
const struct mrfld_gpio_pinrange * range ;
402
406
const char * pinctrl_dev_name ;
407
+ unsigned int i ;
408
+ int retval ;
409
+
410
+ pinctrl_dev_name = mrfld_gpio_get_pinctrl_dev_name (priv );
411
+ for (i = 0 ; i < ARRAY_SIZE (mrfld_gpio_ranges ); i ++ ) {
412
+ range = & mrfld_gpio_ranges [i ];
413
+ retval = gpiochip_add_pin_range (& priv -> chip , pinctrl_dev_name ,
414
+ range -> gpio_base ,
415
+ range -> pin_base ,
416
+ range -> npins );
417
+ if (retval ) {
418
+ dev_err (priv -> dev , "failed to add GPIO pin range\n" );
419
+ return retval ;
420
+ }
421
+ }
422
+
423
+ return 0 ;
424
+ }
425
+
426
+ static int mrfld_gpio_probe (struct pci_dev * pdev , const struct pci_device_id * id )
427
+ {
428
+ struct gpio_irq_chip * girq ;
403
429
struct mrfld_gpio * priv ;
404
430
u32 gpio_base , irq_base ;
405
431
void __iomem * base ;
406
- unsigned int i ;
407
432
int retval ;
408
433
409
434
retval = pcim_enable_device (pdev );
@@ -444,42 +469,31 @@ static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id
444
469
priv -> chip .base = gpio_base ;
445
470
priv -> chip .ngpio = MRFLD_NGPIO ;
446
471
priv -> chip .can_sleep = false;
472
+ priv -> chip .add_pin_ranges = mrfld_gpio_add_pin_ranges ;
447
473
448
474
raw_spin_lock_init (& priv -> lock );
449
475
450
- pci_set_drvdata (pdev , priv );
476
+ girq = & priv -> chip .irq ;
477
+ girq -> chip = & mrfld_irqchip ;
478
+ girq -> init_hw = mrfld_irq_init_hw ;
479
+ girq -> parent_handler = mrfld_irq_handler ;
480
+ girq -> num_parents = 1 ;
481
+ girq -> parents = devm_kcalloc (& pdev -> dev , girq -> num_parents ,
482
+ sizeof (* girq -> parents ), GFP_KERNEL );
483
+ if (!girq -> parents )
484
+ return - ENOMEM ;
485
+ girq -> parents [0 ] = pdev -> irq ;
486
+ girq -> first = irq_base ;
487
+ girq -> default_type = IRQ_TYPE_NONE ;
488
+ girq -> handler = handle_bad_irq ;
489
+
451
490
retval = devm_gpiochip_add_data (& pdev -> dev , & priv -> chip , priv );
452
491
if (retval ) {
453
492
dev_err (& pdev -> dev , "gpiochip_add error %d\n" , retval );
454
493
return retval ;
455
494
}
456
495
457
- pinctrl_dev_name = mrfld_gpio_get_pinctrl_dev_name (priv );
458
- for (i = 0 ; i < ARRAY_SIZE (mrfld_gpio_ranges ); i ++ ) {
459
- range = & mrfld_gpio_ranges [i ];
460
- retval = gpiochip_add_pin_range (& priv -> chip ,
461
- pinctrl_dev_name ,
462
- range -> gpio_base ,
463
- range -> pin_base ,
464
- range -> npins );
465
- if (retval ) {
466
- dev_err (& pdev -> dev , "failed to add GPIO pin range\n" );
467
- return retval ;
468
- }
469
- }
470
-
471
- retval = gpiochip_irqchip_add (& priv -> chip , & mrfld_irqchip , irq_base ,
472
- handle_bad_irq , IRQ_TYPE_NONE );
473
- if (retval ) {
474
- dev_err (& pdev -> dev , "could not connect irqchip to gpiochip\n" );
475
- return retval ;
476
- }
477
-
478
- mrfld_irq_init_hw (priv );
479
-
480
- gpiochip_set_chained_irqchip (& priv -> chip , & mrfld_irqchip , pdev -> irq ,
481
- mrfld_irq_handler );
482
-
496
+ pci_set_drvdata (pdev , priv );
483
497
return 0 ;
484
498
}
485
499
0 commit comments