12
12
#include <linux/compiler.h>
13
13
#include <linux/delay.h>
14
14
#include <linux/err.h>
15
- #include <linux/gpio.h>
16
15
#include <linux/gpio/consumer.h>
17
16
#include <linux/interrupt.h>
18
17
#include <linux/mfd/syscon.h>
19
18
#include <linux/of.h>
20
- #include <linux/of_gpio.h>
21
19
#include <linux/of_pci.h>
22
20
#include <linux/phy/phy.h>
23
21
#include <linux/pci.h>
@@ -78,16 +76,16 @@ struct kirin_pcie {
78
76
void * phy_priv ; /* only for PCIE_KIRIN_INTERNAL_PHY */
79
77
80
78
/* DWC PERST# */
81
- int gpio_id_dwc_perst ;
79
+ struct gpio_desc * id_dwc_perst_gpio ;
82
80
83
81
/* Per-slot PERST# */
84
82
int num_slots ;
85
- int gpio_id_reset [MAX_PCI_SLOTS ];
83
+ struct gpio_desc * id_reset_gpio [MAX_PCI_SLOTS ];
86
84
const char * reset_names [MAX_PCI_SLOTS ];
87
85
88
86
/* Per-slot clkreq */
89
87
int n_gpio_clkreq ;
90
- int gpio_id_clkreq [MAX_PCI_SLOTS ];
88
+ struct gpio_desc * id_clkreq_gpio [MAX_PCI_SLOTS ];
91
89
const char * clkreq_names [MAX_PCI_SLOTS ];
92
90
};
93
91
@@ -381,15 +379,20 @@ static int kirin_pcie_get_gpio_enable(struct kirin_pcie *pcie,
381
379
pcie -> n_gpio_clkreq = ret ;
382
380
383
381
for (i = 0 ; i < pcie -> n_gpio_clkreq ; i ++ ) {
384
- pcie -> gpio_id_clkreq [i ] = of_get_named_gpio (dev -> of_node ,
385
- "hisilicon,clken-gpios" , i );
386
- if (pcie -> gpio_id_clkreq [i ] < 0 )
387
- return pcie -> gpio_id_clkreq [i ];
382
+ pcie -> id_clkreq_gpio [i ] = devm_gpiod_get_index (dev ,
383
+ "hisilicon,clken" , i ,
384
+ GPIOD_OUT_LOW );
385
+ if (IS_ERR (pcie -> id_clkreq_gpio [i ]))
386
+ return dev_err_probe (dev , PTR_ERR (pcie -> id_clkreq_gpio [i ]),
387
+ "unable to get a valid clken gpio\n" );
388
388
389
389
pcie -> clkreq_names [i ] = devm_kasprintf (dev , GFP_KERNEL ,
390
390
"pcie_clkreq_%d" , i );
391
391
if (!pcie -> clkreq_names [i ])
392
392
return - ENOMEM ;
393
+
394
+ gpiod_set_consumer_name (pcie -> id_clkreq_gpio [i ],
395
+ pcie -> clkreq_names [i ]);
393
396
}
394
397
395
398
return 0 ;
@@ -406,10 +409,16 @@ static int kirin_pcie_parse_port(struct kirin_pcie *pcie,
406
409
for_each_available_child_of_node_scoped (parent , child ) {
407
410
i = pcie -> num_slots ;
408
411
409
- pcie -> gpio_id_reset [i ] = of_get_named_gpio (child ,
410
- "reset-gpios" , 0 );
411
- if (pcie -> gpio_id_reset [i ] < 0 )
412
- continue ;
412
+ pcie -> id_reset_gpio [i ] = devm_fwnode_gpiod_get_index (dev ,
413
+ of_fwnode_handle (child ),
414
+ "reset" , 0 , GPIOD_OUT_LOW ,
415
+ NULL );
416
+ if (IS_ERR (pcie -> id_reset_gpio [i ])) {
417
+ if (PTR_ERR (pcie -> id_reset_gpio [i ]) == - ENOENT )
418
+ continue ;
419
+ return dev_err_probe (dev , PTR_ERR (pcie -> id_reset_gpio [i ]),
420
+ "unable to get a valid reset gpio\n" );
421
+ }
413
422
414
423
pcie -> num_slots ++ ;
415
424
if (pcie -> num_slots > MAX_PCI_SLOTS ) {
@@ -430,6 +439,9 @@ static int kirin_pcie_parse_port(struct kirin_pcie *pcie,
430
439
slot );
431
440
if (!pcie -> reset_names [i ])
432
441
return - ENOMEM ;
442
+
443
+ gpiod_set_consumer_name (pcie -> id_reset_gpio [i ],
444
+ pcie -> reset_names [i ]);
433
445
}
434
446
}
435
447
@@ -454,14 +466,11 @@ static long kirin_pcie_get_resource(struct kirin_pcie *kirin_pcie,
454
466
return PTR_ERR (kirin_pcie -> apb );
455
467
456
468
/* pcie internal PERST# gpio */
457
- kirin_pcie -> gpio_id_dwc_perst = of_get_named_gpio (dev -> of_node ,
458
- "reset-gpios" , 0 );
459
- if (kirin_pcie -> gpio_id_dwc_perst == - EPROBE_DEFER ) {
460
- return - EPROBE_DEFER ;
461
- } else if (!gpio_is_valid (kirin_pcie -> gpio_id_dwc_perst )) {
462
- dev_err (dev , "unable to get a valid gpio pin\n" );
463
- return - ENODEV ;
464
- }
469
+ kirin_pcie -> id_dwc_perst_gpio = devm_gpiod_get (dev , "reset" , GPIOD_OUT_LOW );
470
+ if (IS_ERR (kirin_pcie -> id_dwc_perst_gpio ))
471
+ return dev_err_probe (dev , PTR_ERR (kirin_pcie -> id_dwc_perst_gpio ),
472
+ "unable to get a valid gpio pin\n" );
473
+ gpiod_set_consumer_name (kirin_pcie -> id_dwc_perst_gpio , "pcie_perst_bridge" );
465
474
466
475
ret = kirin_pcie_get_gpio_enable (kirin_pcie , pdev );
467
476
if (ret )
@@ -544,7 +553,7 @@ static int kirin_pcie_add_bus(struct pci_bus *bus)
544
553
545
554
/* Send PERST# to each slot */
546
555
for (i = 0 ; i < kirin_pcie -> num_slots ; i ++ ) {
547
- ret = gpio_direction_output (kirin_pcie -> gpio_id_reset [i ], 1 );
556
+ ret = gpiod_direction_output_raw (kirin_pcie -> id_reset_gpio [i ], 1 );
548
557
if (ret ) {
549
558
dev_err (pci -> dev , "PERST# %s error: %d\n" ,
550
559
kirin_pcie -> reset_names [i ], ret );
@@ -614,44 +623,6 @@ static int kirin_pcie_host_init(struct dw_pcie_rp *pp)
614
623
return 0 ;
615
624
}
616
625
617
- static int kirin_pcie_gpio_request (struct kirin_pcie * kirin_pcie ,
618
- struct device * dev )
619
- {
620
- int ret , i ;
621
-
622
- for (i = 0 ; i < kirin_pcie -> num_slots ; i ++ ) {
623
- if (!gpio_is_valid (kirin_pcie -> gpio_id_reset [i ])) {
624
- dev_err (dev , "unable to get a valid %s gpio\n" ,
625
- kirin_pcie -> reset_names [i ]);
626
- return - ENODEV ;
627
- }
628
-
629
- ret = devm_gpio_request (dev , kirin_pcie -> gpio_id_reset [i ],
630
- kirin_pcie -> reset_names [i ]);
631
- if (ret )
632
- return ret ;
633
- }
634
-
635
- for (i = 0 ; i < kirin_pcie -> n_gpio_clkreq ; i ++ ) {
636
- if (!gpio_is_valid (kirin_pcie -> gpio_id_clkreq [i ])) {
637
- dev_err (dev , "unable to get a valid %s gpio\n" ,
638
- kirin_pcie -> clkreq_names [i ]);
639
- return - ENODEV ;
640
- }
641
-
642
- ret = devm_gpio_request (dev , kirin_pcie -> gpio_id_clkreq [i ],
643
- kirin_pcie -> clkreq_names [i ]);
644
- if (ret )
645
- return ret ;
646
-
647
- ret = gpio_direction_output (kirin_pcie -> gpio_id_clkreq [i ], 0 );
648
- if (ret )
649
- return ret ;
650
- }
651
-
652
- return 0 ;
653
- }
654
-
655
626
static const struct dw_pcie_ops kirin_dw_pcie_ops = {
656
627
.read_dbi = kirin_pcie_read_dbi ,
657
628
.write_dbi = kirin_pcie_write_dbi ,
@@ -671,7 +642,7 @@ static int kirin_pcie_power_off(struct kirin_pcie *kirin_pcie)
671
642
return hi3660_pcie_phy_power_off (kirin_pcie );
672
643
673
644
for (i = 0 ; i < kirin_pcie -> n_gpio_clkreq ; i ++ )
674
- gpio_direction_output (kirin_pcie -> gpio_id_clkreq [i ], 1 );
645
+ gpiod_direction_output_raw (kirin_pcie -> id_clkreq_gpio [i ], 1 );
675
646
676
647
phy_power_off (kirin_pcie -> phy );
677
648
phy_exit (kirin_pcie -> phy );
@@ -698,10 +669,6 @@ static int kirin_pcie_power_on(struct platform_device *pdev,
698
669
if (IS_ERR (kirin_pcie -> phy ))
699
670
return PTR_ERR (kirin_pcie -> phy );
700
671
701
- ret = kirin_pcie_gpio_request (kirin_pcie , dev );
702
- if (ret )
703
- return ret ;
704
-
705
672
ret = phy_init (kirin_pcie -> phy );
706
673
if (ret )
707
674
goto err ;
@@ -714,11 +681,9 @@ static int kirin_pcie_power_on(struct platform_device *pdev,
714
681
/* perst assert Endpoint */
715
682
usleep_range (REF_2_PERST_MIN , REF_2_PERST_MAX );
716
683
717
- if (!gpio_request (kirin_pcie -> gpio_id_dwc_perst , "pcie_perst_bridge" )) {
718
- ret = gpio_direction_output (kirin_pcie -> gpio_id_dwc_perst , 1 );
719
- if (ret )
720
- goto err ;
721
- }
684
+ ret = gpiod_direction_output_raw (kirin_pcie -> id_dwc_perst_gpio , 1 );
685
+ if (ret )
686
+ goto err ;
722
687
723
688
usleep_range (PERST_2_ACCESS_MIN , PERST_2_ACCESS_MAX );
724
689
0 commit comments