Commit ac1d89f8 authored by Yoshihiro Shimoda's avatar Yoshihiro Shimoda Committed by Krzysztof Wilczyński

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/20240611125057.1232873-3-yoshihiro.shimoda.uh@renesas.comSigned-off-by: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: default avatarKrzysztof Wilczyński <kwilczynski@kernel.org>
Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
parent 544a18c9
...@@ -48,11 +48,15 @@ ...@@ -48,11 +48,15 @@
#define RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET 0x1000 #define RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET 0x1000
#define RCAR_GEN4_PCIE_EP_FUNC_DBI2_OFFSET 0x800 #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 rcar_gen4_pcie {
struct dw_pcie dw; struct dw_pcie dw;
void __iomem *base; void __iomem *base;
struct platform_device *pdev; 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) #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) ...@@ -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. * 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. * 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--; changes--;
for (i = 0; i < changes; i++) { for (i = 0; i < changes; i++) {
...@@ -172,9 +176,9 @@ static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar) ...@@ -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); reset_control_assert(dw->core_rsts[DW_PCIE_PWR_RST].rstc);
val = readl(rcar->base + PCIEMSR0); val = readl(rcar->base + PCIEMSR0);
if (rcar->mode == DW_PCIE_RC_TYPE) { if (rcar->drvdata->mode == DW_PCIE_RC_TYPE) {
val |= DEVICE_TYPE_RC; 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; val |= DEVICE_TYPE_EP;
} else { } else {
ret = -EINVAL; ret = -EINVAL;
...@@ -451,9 +455,11 @@ static void rcar_gen4_remove_dw_pcie_ep(struct rcar_gen4_pcie *rcar) ...@@ -451,9 +455,11 @@ static void rcar_gen4_remove_dw_pcie_ep(struct rcar_gen4_pcie *rcar)
/* Common */ /* Common */
static int rcar_gen4_add_dw_pcie(struct rcar_gen4_pcie *rcar) 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: case DW_PCIE_RC_TYPE:
return rcar_gen4_add_dw_pcie_rp(rcar); return rcar_gen4_add_dw_pcie_rp(rcar);
case DW_PCIE_EP_TYPE: case DW_PCIE_EP_TYPE:
...@@ -494,7 +500,7 @@ static int rcar_gen4_pcie_probe(struct platform_device *pdev) ...@@ -494,7 +500,7 @@ static int rcar_gen4_pcie_probe(struct platform_device *pdev)
static void rcar_gen4_remove_dw_pcie(struct rcar_gen4_pcie *rcar) static void rcar_gen4_remove_dw_pcie(struct rcar_gen4_pcie *rcar)
{ {
switch (rcar->mode) { switch (rcar->drvdata->mode) {
case DW_PCIE_RC_TYPE: case DW_PCIE_RC_TYPE:
rcar_gen4_remove_dw_pcie_rp(rcar); rcar_gen4_remove_dw_pcie_rp(rcar);
break; break;
...@@ -514,14 +520,22 @@ static void rcar_gen4_pcie_remove(struct platform_device *pdev) ...@@ -514,14 +520,22 @@ static void rcar_gen4_pcie_remove(struct platform_device *pdev)
rcar_gen4_pcie_unprepare(rcar); 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[] = { static const struct of_device_id rcar_gen4_pcie_of_match[] = {
{ {
.compatible = "renesas,rcar-gen4-pcie", .compatible = "renesas,rcar-gen4-pcie",
.data = (void *)DW_PCIE_RC_TYPE, .data = &drvdata_rcar_gen4_pcie,
}, },
{ {
.compatible = "renesas,rcar-gen4-pcie-ep", .compatible = "renesas,rcar-gen4-pcie-ep",
.data = (void *)DW_PCIE_EP_TYPE, .data = &drvdata_rcar_gen4_pcie_ep,
}, },
{}, {},
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment