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 ;
@@ -400,49 +403,49 @@ static int kirin_pcie_parse_port(struct kirin_pcie *pcie,
400
403
struct device_node * node )
401
404
{
402
405
struct device * dev = & pdev -> dev ;
403
- struct device_node * parent , * child ;
404
406
int ret , slot , i ;
405
407
406
- for_each_available_child_of_node (node , parent ) {
407
- for_each_available_child_of_node (parent , child ) {
408
+ for_each_available_child_of_node_scoped (node , parent ) {
409
+ for_each_available_child_of_node_scoped (parent , child ) {
408
410
i = pcie -> num_slots ;
409
411
410
- pcie -> gpio_id_reset [i ] = of_get_named_gpio (child ,
411
- "reset-gpios" , 0 );
412
- if (pcie -> gpio_id_reset [i ] < 0 )
413
- 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
+ }
414
422
415
423
pcie -> num_slots ++ ;
416
424
if (pcie -> num_slots > MAX_PCI_SLOTS ) {
417
425
dev_err (dev , "Too many PCI slots!\n" );
418
- ret = - EINVAL ;
419
- goto put_node ;
426
+ return - EINVAL ;
420
427
}
421
428
422
429
ret = of_pci_get_devfn (child );
423
430
if (ret < 0 ) {
424
431
dev_err (dev , "failed to parse devfn: %d\n" , ret );
425
- goto put_node ;
432
+ return ret ;
426
433
}
427
434
428
435
slot = PCI_SLOT (ret );
429
436
430
437
pcie -> reset_names [i ] = devm_kasprintf (dev , GFP_KERNEL ,
431
438
"pcie_perst_%d" ,
432
439
slot );
433
- if (!pcie -> reset_names [i ]) {
434
- ret = - ENOMEM ;
435
- goto put_node ;
436
- }
440
+ if (!pcie -> reset_names [i ])
441
+ return - ENOMEM ;
442
+
443
+ gpiod_set_consumer_name (pcie -> id_reset_gpio [i ],
444
+ pcie -> reset_names [i ]);
437
445
}
438
446
}
439
447
440
448
return 0 ;
441
-
442
- put_node :
443
- of_node_put (child );
444
- of_node_put (parent );
445
- return ret ;
446
449
}
447
450
448
451
static long kirin_pcie_get_resource (struct kirin_pcie * kirin_pcie ,
@@ -463,14 +466,11 @@ static long kirin_pcie_get_resource(struct kirin_pcie *kirin_pcie,
463
466
return PTR_ERR (kirin_pcie -> apb );
464
467
465
468
/* pcie internal PERST# gpio */
466
- kirin_pcie -> gpio_id_dwc_perst = of_get_named_gpio (dev -> of_node ,
467
- "reset-gpios" , 0 );
468
- if (kirin_pcie -> gpio_id_dwc_perst == - EPROBE_DEFER ) {
469
- return - EPROBE_DEFER ;
470
- } else if (!gpio_is_valid (kirin_pcie -> gpio_id_dwc_perst )) {
471
- dev_err (dev , "unable to get a valid gpio pin\n" );
472
- return - ENODEV ;
473
- }
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" );
474
474
475
475
ret = kirin_pcie_get_gpio_enable (kirin_pcie , pdev );
476
476
if (ret )
@@ -553,7 +553,7 @@ static int kirin_pcie_add_bus(struct pci_bus *bus)
553
553
554
554
/* Send PERST# to each slot */
555
555
for (i = 0 ; i < kirin_pcie -> num_slots ; i ++ ) {
556
- ret = gpio_direction_output (kirin_pcie -> gpio_id_reset [i ], 1 );
556
+ ret = gpiod_direction_output_raw (kirin_pcie -> id_reset_gpio [i ], 1 );
557
557
if (ret ) {
558
558
dev_err (pci -> dev , "PERST# %s error: %d\n" ,
559
559
kirin_pcie -> reset_names [i ], ret );
@@ -623,44 +623,6 @@ static int kirin_pcie_host_init(struct dw_pcie_rp *pp)
623
623
return 0 ;
624
624
}
625
625
626
- static int kirin_pcie_gpio_request (struct kirin_pcie * kirin_pcie ,
627
- struct device * dev )
628
- {
629
- int ret , i ;
630
-
631
- for (i = 0 ; i < kirin_pcie -> num_slots ; i ++ ) {
632
- if (!gpio_is_valid (kirin_pcie -> gpio_id_reset [i ])) {
633
- dev_err (dev , "unable to get a valid %s gpio\n" ,
634
- kirin_pcie -> reset_names [i ]);
635
- return - ENODEV ;
636
- }
637
-
638
- ret = devm_gpio_request (dev , kirin_pcie -> gpio_id_reset [i ],
639
- kirin_pcie -> reset_names [i ]);
640
- if (ret )
641
- return ret ;
642
- }
643
-
644
- for (i = 0 ; i < kirin_pcie -> n_gpio_clkreq ; i ++ ) {
645
- if (!gpio_is_valid (kirin_pcie -> gpio_id_clkreq [i ])) {
646
- dev_err (dev , "unable to get a valid %s gpio\n" ,
647
- kirin_pcie -> clkreq_names [i ]);
648
- return - ENODEV ;
649
- }
650
-
651
- ret = devm_gpio_request (dev , kirin_pcie -> gpio_id_clkreq [i ],
652
- kirin_pcie -> clkreq_names [i ]);
653
- if (ret )
654
- return ret ;
655
-
656
- ret = gpio_direction_output (kirin_pcie -> gpio_id_clkreq [i ], 0 );
657
- if (ret )
658
- return ret ;
659
- }
660
-
661
- return 0 ;
662
- }
663
-
664
626
static const struct dw_pcie_ops kirin_dw_pcie_ops = {
665
627
.read_dbi = kirin_pcie_read_dbi ,
666
628
.write_dbi = kirin_pcie_write_dbi ,
@@ -680,7 +642,7 @@ static int kirin_pcie_power_off(struct kirin_pcie *kirin_pcie)
680
642
return hi3660_pcie_phy_power_off (kirin_pcie );
681
643
682
644
for (i = 0 ; i < kirin_pcie -> n_gpio_clkreq ; i ++ )
683
- gpio_direction_output (kirin_pcie -> gpio_id_clkreq [i ], 1 );
645
+ gpiod_direction_output_raw (kirin_pcie -> id_clkreq_gpio [i ], 1 );
684
646
685
647
phy_power_off (kirin_pcie -> phy );
686
648
phy_exit (kirin_pcie -> phy );
@@ -707,10 +669,6 @@ static int kirin_pcie_power_on(struct platform_device *pdev,
707
669
if (IS_ERR (kirin_pcie -> phy ))
708
670
return PTR_ERR (kirin_pcie -> phy );
709
671
710
- ret = kirin_pcie_gpio_request (kirin_pcie , dev );
711
- if (ret )
712
- return ret ;
713
-
714
672
ret = phy_init (kirin_pcie -> phy );
715
673
if (ret )
716
674
goto err ;
@@ -723,11 +681,9 @@ static int kirin_pcie_power_on(struct platform_device *pdev,
723
681
/* perst assert Endpoint */
724
682
usleep_range (REF_2_PERST_MIN , REF_2_PERST_MAX );
725
683
726
- if (!gpio_request (kirin_pcie -> gpio_id_dwc_perst , "pcie_perst_bridge" )) {
727
- ret = gpio_direction_output (kirin_pcie -> gpio_id_dwc_perst , 1 );
728
- if (ret )
729
- goto err ;
730
- }
684
+ ret = gpiod_direction_output_raw (kirin_pcie -> id_dwc_perst_gpio , 1 );
685
+ if (ret )
686
+ goto err ;
731
687
732
688
usleep_range (PERST_2_ACCESS_MIN , PERST_2_ACCESS_MAX );
733
689
0 commit comments