@@ -405,6 +405,50 @@ static const struct power_supply_desc axp22x_usb_power_desc = {
405
405
.set_property = axp20x_usb_power_set_property ,
406
406
};
407
407
408
+ static const char * const axp20x_irq_names [] = {
409
+ "VBUS_PLUGIN" ,
410
+ "VBUS_REMOVAL" ,
411
+ "VBUS_VALID" ,
412
+ "VBUS_NOT_VALID" ,
413
+ NULL
414
+ };
415
+
416
+ static const char * const axp22x_irq_names [] = {
417
+ "VBUS_PLUGIN" ,
418
+ "VBUS_REMOVAL" ,
419
+ NULL
420
+ };
421
+
422
+ struct axp_data {
423
+ const struct power_supply_desc * power_desc ;
424
+ const char * const * irq_names ;
425
+ enum axp20x_variants axp20x_id ;
426
+ };
427
+
428
+ static const struct axp_data axp202_data = {
429
+ .power_desc = & axp20x_usb_power_desc ,
430
+ .irq_names = axp20x_irq_names ,
431
+ .axp20x_id = AXP202_ID ,
432
+ };
433
+
434
+ static const struct axp_data axp221_data = {
435
+ .power_desc = & axp22x_usb_power_desc ,
436
+ .irq_names = axp22x_irq_names ,
437
+ .axp20x_id = AXP221_ID ,
438
+ };
439
+
440
+ static const struct axp_data axp223_data = {
441
+ .power_desc = & axp22x_usb_power_desc ,
442
+ .irq_names = axp22x_irq_names ,
443
+ .axp20x_id = AXP223_ID ,
444
+ };
445
+
446
+ static const struct axp_data axp813_data = {
447
+ .power_desc = & axp22x_usb_power_desc ,
448
+ .irq_names = axp22x_irq_names ,
449
+ .axp20x_id = AXP813_ID ,
450
+ };
451
+
408
452
static int configure_iio_channels (struct platform_device * pdev ,
409
453
struct axp20x_usb_power * power )
410
454
{
@@ -440,12 +484,7 @@ static int axp20x_usb_power_probe(struct platform_device *pdev)
440
484
struct axp20x_dev * axp20x = dev_get_drvdata (pdev -> dev .parent );
441
485
struct power_supply_config psy_cfg = {};
442
486
struct axp20x_usb_power * power ;
443
- static const char * const axp20x_irq_names [] = { "VBUS_PLUGIN" ,
444
- "VBUS_REMOVAL" , "VBUS_VALID" , "VBUS_NOT_VALID" , NULL };
445
- static const char * const axp22x_irq_names [] = {
446
- "VBUS_PLUGIN" , "VBUS_REMOVAL" , NULL };
447
- const char * const * irq_names ;
448
- const struct power_supply_desc * usb_power_desc ;
487
+ const struct axp_data * axp_data ;
449
488
int i , irq , ret ;
450
489
451
490
if (!of_device_is_available (pdev -> dev .of_node ))
@@ -461,9 +500,9 @@ static int axp20x_usb_power_probe(struct platform_device *pdev)
461
500
return - ENOMEM ;
462
501
463
502
platform_set_drvdata (pdev , power );
464
- power -> axp20x_id = (enum axp20x_variants )of_device_get_match_data (
465
- & pdev -> dev );
466
503
504
+ axp_data = of_device_get_match_data (& pdev -> dev );
505
+ power -> axp20x_id = axp_data -> axp20x_id ;
467
506
power -> regmap = axp20x -> regmap ;
468
507
469
508
if (power -> axp20x_id == AXP202_ID ) {
@@ -481,18 +520,6 @@ static int axp20x_usb_power_probe(struct platform_device *pdev)
481
520
482
521
if (ret )
483
522
return ret ;
484
-
485
- usb_power_desc = & axp20x_usb_power_desc ;
486
- irq_names = axp20x_irq_names ;
487
- } else if (power -> axp20x_id == AXP221_ID ||
488
- power -> axp20x_id == AXP223_ID ||
489
- power -> axp20x_id == AXP813_ID ) {
490
- usb_power_desc = & axp22x_usb_power_desc ;
491
- irq_names = axp22x_irq_names ;
492
- } else {
493
- dev_err (& pdev -> dev , "Unsupported AXP variant: %ld\n" ,
494
- axp20x -> variant );
495
- return - EINVAL ;
496
523
}
497
524
498
525
if (power -> axp20x_id == AXP813_ID ) {
@@ -504,25 +531,26 @@ static int axp20x_usb_power_probe(struct platform_device *pdev)
504
531
psy_cfg .of_node = pdev -> dev .of_node ;
505
532
psy_cfg .drv_data = power ;
506
533
507
- power -> supply = devm_power_supply_register (& pdev -> dev , usb_power_desc ,
534
+ power -> supply = devm_power_supply_register (& pdev -> dev ,
535
+ axp_data -> power_desc ,
508
536
& psy_cfg );
509
537
if (IS_ERR (power -> supply ))
510
538
return PTR_ERR (power -> supply );
511
539
512
540
/* Request irqs after registering, as irqs may trigger immediately */
513
- for (i = 0 ; irq_names [i ]; i ++ ) {
514
- irq = platform_get_irq_byname (pdev , irq_names [i ]);
541
+ for (i = 0 ; axp_data -> irq_names [i ]; i ++ ) {
542
+ irq = platform_get_irq_byname (pdev , axp_data -> irq_names [i ]);
515
543
if (irq < 0 ) {
516
544
dev_warn (& pdev -> dev , "No IRQ for %s: %d\n" ,
517
- irq_names [i ], irq );
545
+ axp_data -> irq_names [i ], irq );
518
546
continue ;
519
547
}
520
548
irq = regmap_irq_get_virq (axp20x -> regmap_irqc , irq );
521
549
ret = devm_request_any_context_irq (& pdev -> dev , irq ,
522
550
axp20x_usb_power_irq , 0 , DRVNAME , power );
523
551
if (ret < 0 )
524
552
dev_warn (& pdev -> dev , "Error requesting %s IRQ: %d\n" ,
525
- irq_names [i ], ret );
553
+ axp_data -> irq_names [i ], ret );
526
554
}
527
555
528
556
INIT_DELAYED_WORK (& power -> vbus_detect , axp20x_usb_power_poll_vbus );
@@ -544,16 +572,16 @@ static int axp20x_usb_power_remove(struct platform_device *pdev)
544
572
static const struct of_device_id axp20x_usb_power_match [] = {
545
573
{
546
574
.compatible = "x-powers,axp202-usb-power-supply" ,
547
- .data = ( void * ) AXP202_ID ,
575
+ .data = & axp202_data ,
548
576
}, {
549
577
.compatible = "x-powers,axp221-usb-power-supply" ,
550
- .data = ( void * ) AXP221_ID ,
578
+ .data = & axp221_data ,
551
579
}, {
552
580
.compatible = "x-powers,axp223-usb-power-supply" ,
553
- .data = ( void * ) AXP223_ID ,
581
+ .data = & axp223_data ,
554
582
}, {
555
583
.compatible = "x-powers,axp813-usb-power-supply" ,
556
- .data = ( void * ) AXP813_ID ,
584
+ .data = & axp813_data ,
557
585
}, { /* sentinel */ }
558
586
};
559
587
MODULE_DEVICE_TABLE (of , axp20x_usb_power_match );
0 commit comments