]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: rcar-gen4: Add struct rcar_gen4_pcie_drvdata
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tue, 11 Jun 2024 12:50:54 +0000 (21:50 +0900)
committerKrzysztof Wilczyński <kwilczynski@kernel.org>
Sat, 29 Jun 2024 19:20:35 +0000 (19:20 +0000)
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/20240611125057.1232873-3-yoshihiro.shimoda.uh@renesas.com
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
drivers/pci/controller/dwc/pcie-rcar-gen4.c

index cfeccc2f9ee1d15bf664a9585cfafdd8a894d41f..eb3ea4a5fd0a1a205aca64621e6a79967d1c11ae 100644 (file)
 #define RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET      0x1000
 #define RCAR_GEN4_PCIE_EP_FUNC_DBI2_OFFSET     0x800
 
+struct rcar_gen4_pcie_drvdata {
+       enum dw_pcie_device_mode mode;
+};
+
 struct rcar_gen4_pcie {
        struct dw_pcie dw;
        void __iomem *base;
        struct platform_device *pdev;
-       enum dw_pcie_device_mode mode;
+       const struct rcar_gen4_pcie_drvdata *drvdata;
 };
 #define to_rcar_gen4_pcie(_dw) container_of(_dw, struct rcar_gen4_pcie, dw)
 
@@ -137,7 +141,7 @@ static int rcar_gen4_pcie_start_link(struct dw_pcie *dw)
         * Since dw_pcie_setup_rc() sets it once, PCIe Gen2 will be trained.
         * So, this needs remaining times for up to PCIe Gen4 if RC mode.
         */
-       if (changes && rcar->mode == DW_PCIE_RC_TYPE)
+       if (changes && rcar->drvdata->mode == DW_PCIE_RC_TYPE)
                changes--;
 
        for (i = 0; i < changes; i++) {
@@ -172,9 +176,9 @@ static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
                reset_control_assert(dw->core_rsts[DW_PCIE_PWR_RST].rstc);
 
        val = readl(rcar->base + PCIEMSR0);
-       if (rcar->mode == DW_PCIE_RC_TYPE) {
+       if (rcar->drvdata->mode == DW_PCIE_RC_TYPE) {
                val |= DEVICE_TYPE_RC;
-       } else if (rcar->mode == DW_PCIE_EP_TYPE) {
+       } else if (rcar->drvdata->mode == DW_PCIE_EP_TYPE) {
                val |= DEVICE_TYPE_EP;
        } else {
                ret = -EINVAL;
@@ -451,9 +455,11 @@ static void rcar_gen4_remove_dw_pcie_ep(struct rcar_gen4_pcie *rcar)
 /* Common */
 static int rcar_gen4_add_dw_pcie(struct rcar_gen4_pcie *rcar)
 {
-       rcar->mode = (uintptr_t)of_device_get_match_data(&rcar->pdev->dev);
+       rcar->drvdata = of_device_get_match_data(&rcar->pdev->dev);
+       if (!rcar->drvdata)
+               return -EINVAL;
 
-       switch (rcar->mode) {
+       switch (rcar->drvdata->mode) {
        case DW_PCIE_RC_TYPE:
                return rcar_gen4_add_dw_pcie_rp(rcar);
        case DW_PCIE_EP_TYPE:
@@ -494,7 +500,7 @@ err_unprepare:
 
 static void rcar_gen4_remove_dw_pcie(struct rcar_gen4_pcie *rcar)
 {
-       switch (rcar->mode) {
+       switch (rcar->drvdata->mode) {
        case DW_PCIE_RC_TYPE:
                rcar_gen4_remove_dw_pcie_rp(rcar);
                break;
@@ -514,14 +520,22 @@ static void rcar_gen4_pcie_remove(struct platform_device *pdev)
        rcar_gen4_pcie_unprepare(rcar);
 }
 
+static struct rcar_gen4_pcie_drvdata drvdata_rcar_gen4_pcie = {
+       .mode = DW_PCIE_RC_TYPE,
+};
+
+static struct rcar_gen4_pcie_drvdata drvdata_rcar_gen4_pcie_ep = {
+       .mode = DW_PCIE_EP_TYPE,
+};
+
 static const struct of_device_id rcar_gen4_pcie_of_match[] = {
        {
                .compatible = "renesas,rcar-gen4-pcie",
-               .data = (void *)DW_PCIE_RC_TYPE,
+               .data = &drvdata_rcar_gen4_pcie,
        },
        {
                .compatible = "renesas,rcar-gen4-pcie-ep",
-               .data = (void *)DW_PCIE_EP_TYPE,
+               .data = &drvdata_rcar_gen4_pcie_ep,
        },
        {},
 };