4848#define RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET 0x1000
4949#define RCAR_GEN4_PCIE_EP_FUNC_DBI2_OFFSET 0x800
5050
51+ struct rcar_gen4_pcie_drvdata {
52+ enum dw_pcie_device_mode mode ;
53+ };
54+
5155struct rcar_gen4_pcie {
5256 struct dw_pcie dw ;
5357 void __iomem * base ;
5458 struct platform_device * pdev ;
55- enum dw_pcie_device_mode mode ;
59+ const struct rcar_gen4_pcie_drvdata * drvdata ;
5660};
5761#define to_rcar_gen4_pcie (_dw ) container_of(_dw, struct rcar_gen4_pcie, dw)
5862
@@ -137,7 +141,7 @@ static int rcar_gen4_pcie_start_link(struct dw_pcie *dw)
137141 * Since dw_pcie_setup_rc() sets it once, PCIe Gen2 will be trained.
138142 * So, this needs remaining times for up to PCIe Gen4 if RC mode.
139143 */
140- if (changes && rcar -> mode == DW_PCIE_RC_TYPE )
144+ if (changes && rcar -> drvdata -> mode == DW_PCIE_RC_TYPE )
141145 changes -- ;
142146
143147 for (i = 0 ; i < changes ; i ++ ) {
@@ -172,9 +176,9 @@ static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
172176 reset_control_assert (dw -> core_rsts [DW_PCIE_PWR_RST ].rstc );
173177
174178 val = readl (rcar -> base + PCIEMSR0 );
175- if (rcar -> mode == DW_PCIE_RC_TYPE ) {
179+ if (rcar -> drvdata -> mode == DW_PCIE_RC_TYPE ) {
176180 val |= DEVICE_TYPE_RC ;
177- } else if (rcar -> mode == DW_PCIE_EP_TYPE ) {
181+ } else if (rcar -> drvdata -> mode == DW_PCIE_EP_TYPE ) {
178182 val |= DEVICE_TYPE_EP ;
179183 } else {
180184 ret = - EINVAL ;
@@ -451,9 +455,11 @@ static void rcar_gen4_remove_dw_pcie_ep(struct rcar_gen4_pcie *rcar)
451455/* Common */
452456static int rcar_gen4_add_dw_pcie (struct rcar_gen4_pcie * rcar )
453457{
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 ;
455461
456- switch (rcar -> mode ) {
462+ switch (rcar -> drvdata -> mode ) {
457463 case DW_PCIE_RC_TYPE :
458464 return rcar_gen4_add_dw_pcie_rp (rcar );
459465 case DW_PCIE_EP_TYPE :
@@ -494,7 +500,7 @@ static int rcar_gen4_pcie_probe(struct platform_device *pdev)
494500
495501static void rcar_gen4_remove_dw_pcie (struct rcar_gen4_pcie * rcar )
496502{
497- switch (rcar -> mode ) {
503+ switch (rcar -> drvdata -> mode ) {
498504 case DW_PCIE_RC_TYPE :
499505 rcar_gen4_remove_dw_pcie_rp (rcar );
500506 break ;
@@ -514,14 +520,22 @@ static void rcar_gen4_pcie_remove(struct platform_device *pdev)
514520 rcar_gen4_pcie_unprepare (rcar );
515521}
516522
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+
517531static const struct of_device_id rcar_gen4_pcie_of_match [] = {
518532 {
519533 .compatible = "renesas,rcar-gen4-pcie" ,
520- .data = ( void * ) DW_PCIE_RC_TYPE ,
534+ .data = & drvdata_rcar_gen4_pcie ,
521535 },
522536 {
523537 .compatible = "renesas,rcar-gen4-pcie-ep" ,
524- .data = ( void * ) DW_PCIE_EP_TYPE ,
538+ .data = & drvdata_rcar_gen4_pcie_ep ,
525539 },
526540 {},
527541};
0 commit comments