Skip to content

Commit ac1d89f

Browse files
shimodaykwilczynski
authored andcommitted
PCI: rcar-gen4: Add struct rcar_gen4_pcie_drvdata
In order to support future SoCs such as r8a779g0 (R-Car V4H) and r8a779h0 (R-Car V4M) that require different initialization settings, introduce SoC specific driver data with the initial member being the device mode. No functional change. [kwilczynski: commit log] Link: https://lore.kernel.org/linux-pci/[email protected] Signed-off-by: Yoshihiro Shimoda <[email protected]> Signed-off-by: Krzysztof Wilczyński <[email protected]> Reviewed-by: Manivannan Sadhasivam <[email protected]>
1 parent 544a18c commit ac1d89f

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

drivers/pci/controller/dwc/pcie-rcar-gen4.c

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,15 @@
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+
5155
struct 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 */
452456
static 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

495501
static 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+
517531
static 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

Comments
 (0)