48
48
#define RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET 0x1000
49
49
#define RCAR_GEN4_PCIE_EP_FUNC_DBI2_OFFSET 0x800
50
50
51
+ struct rcar_gen4_pcie_drvdata {
52
+ enum dw_pcie_device_mode mode ;
53
+ };
54
+
51
55
struct rcar_gen4_pcie {
52
56
struct dw_pcie dw ;
53
57
void __iomem * base ;
54
58
struct platform_device * pdev ;
55
- enum dw_pcie_device_mode mode ;
59
+ const struct rcar_gen4_pcie_drvdata * drvdata ;
56
60
};
57
61
#define to_rcar_gen4_pcie (_dw ) container_of(_dw, struct rcar_gen4_pcie, dw)
58
62
@@ -137,7 +141,7 @@ static int rcar_gen4_pcie_start_link(struct dw_pcie *dw)
137
141
* Since dw_pcie_setup_rc() sets it once, PCIe Gen2 will be trained.
138
142
* So, this needs remaining times for up to PCIe Gen4 if RC mode.
139
143
*/
140
- if (changes && rcar -> mode == DW_PCIE_RC_TYPE )
144
+ if (changes && rcar -> drvdata -> mode == DW_PCIE_RC_TYPE )
141
145
changes -- ;
142
146
143
147
for (i = 0 ; i < changes ; i ++ ) {
@@ -172,9 +176,9 @@ static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
172
176
reset_control_assert (dw -> core_rsts [DW_PCIE_PWR_RST ].rstc );
173
177
174
178
val = readl (rcar -> base + PCIEMSR0 );
175
- if (rcar -> mode == DW_PCIE_RC_TYPE ) {
179
+ if (rcar -> drvdata -> mode == DW_PCIE_RC_TYPE ) {
176
180
val |= DEVICE_TYPE_RC ;
177
- } else if (rcar -> mode == DW_PCIE_EP_TYPE ) {
181
+ } else if (rcar -> drvdata -> mode == DW_PCIE_EP_TYPE ) {
178
182
val |= DEVICE_TYPE_EP ;
179
183
} else {
180
184
ret = - EINVAL ;
@@ -451,9 +455,11 @@ static void rcar_gen4_remove_dw_pcie_ep(struct rcar_gen4_pcie *rcar)
451
455
/* Common */
452
456
static int rcar_gen4_add_dw_pcie (struct rcar_gen4_pcie * rcar )
453
457
{
454
- rcar -> mode = (uintptr_t )of_device_get_match_data (& rcar -> pdev -> dev );
458
+ rcar -> drvdata = of_device_get_match_data (& rcar -> pdev -> dev );
459
+ if (!rcar -> drvdata )
460
+ return - EINVAL ;
455
461
456
- switch (rcar -> mode ) {
462
+ switch (rcar -> drvdata -> mode ) {
457
463
case DW_PCIE_RC_TYPE :
458
464
return rcar_gen4_add_dw_pcie_rp (rcar );
459
465
case DW_PCIE_EP_TYPE :
@@ -494,7 +500,7 @@ static int rcar_gen4_pcie_probe(struct platform_device *pdev)
494
500
495
501
static void rcar_gen4_remove_dw_pcie (struct rcar_gen4_pcie * rcar )
496
502
{
497
- switch (rcar -> mode ) {
503
+ switch (rcar -> drvdata -> mode ) {
498
504
case DW_PCIE_RC_TYPE :
499
505
rcar_gen4_remove_dw_pcie_rp (rcar );
500
506
break ;
@@ -514,14 +520,22 @@ static void rcar_gen4_pcie_remove(struct platform_device *pdev)
514
520
rcar_gen4_pcie_unprepare (rcar );
515
521
}
516
522
523
+ static struct rcar_gen4_pcie_drvdata drvdata_rcar_gen4_pcie = {
524
+ .mode = DW_PCIE_RC_TYPE ,
525
+ };
526
+
527
+ static struct rcar_gen4_pcie_drvdata drvdata_rcar_gen4_pcie_ep = {
528
+ .mode = DW_PCIE_EP_TYPE ,
529
+ };
530
+
517
531
static const struct of_device_id rcar_gen4_pcie_of_match [] = {
518
532
{
519
533
.compatible = "renesas,rcar-gen4-pcie" ,
520
- .data = ( void * ) DW_PCIE_RC_TYPE ,
534
+ .data = & drvdata_rcar_gen4_pcie ,
521
535
},
522
536
{
523
537
.compatible = "renesas,rcar-gen4-pcie-ep" ,
524
- .data = ( void * ) DW_PCIE_EP_TYPE ,
538
+ .data = & drvdata_rcar_gen4_pcie_ep ,
525
539
},
526
540
{},
527
541
};
0 commit comments