[PATCH 2/5] usb: dwc3: xilinx: add platform data struct with init callback
Radhey Shyam Pandey <[email protected]>
| Newsgroups | org.kernel.vger.linux-kernel,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-usb |
|---|---|
| Message-ID | <[email protected]> |
Introduce struct dwc3_xlnx_platdata and switch the OF match table to platform data for ZynqMP and Versal. Probe calls plat->init() for platform-specific setup. The struct also reserves an exit callback; wiring for that follows in subsequent patch in this series. Signed-off-by: Radhey Shyam Pandey <[email protected]> --- drivers/usb/dwc3/dwc3-xilinx.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-xilinx.c b/drivers/usb/dwc3/dwc3-xilinx.c index 1a8619854d6d..4a04d158f872 100644 --- a/drivers/usb/dwc3/dwc3-xilinx.c +++ b/drivers/usb/dwc3/dwc3-xilinx.c @@ -42,12 +42,19 @@ #define XLNX_USB_FPD_POWER_PRSNT 0x80 #define FPD_POWER_PRSNT_OPTION BIT(0) +struct dwc3_xlnx; + +struct dwc3_xlnx_platdata { + int (*init)(struct dwc3_xlnx *priv_data); + void (*exit)(struct dwc3_xlnx *priv_data); +}; + struct dwc3_xlnx { int num_clocks; struct clk_bulk_data *clks; struct device *dev; void __iomem *regs; - int (*pltfm_init)(struct dwc3_xlnx *data); + const struct dwc3_xlnx_platdata *plat; struct phy *usb3_phy; }; @@ -237,14 +244,22 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data) return ret; } +static const struct dwc3_xlnx_platdata zynqmp_platdata = { + .init = dwc3_xlnx_init_zynqmp, +}; + +static const struct dwc3_xlnx_platdata versal_platdata = { + .init = dwc3_xlnx_init_versal, +}; + static const struct of_device_id dwc3_xlnx_of_match[] = { { .compatible = "xlnx,zynqmp-dwc3", - .data = &dwc3_xlnx_init_zynqmp, + .data = &zynqmp_platdata, }, { .compatible = "xlnx,versal-dwc3", - .data = &dwc3_xlnx_init_versal, + .data = &versal_platdata, }, { /* Sentinel */ } }; @@ -291,8 +306,11 @@ static int dwc3_xlnx_probe(struct platform_device *pdev) if (IS_ERR(regs)) return dev_err_probe(dev, PTR_ERR(regs), "failed to map registers\n"); - priv_data->pltfm_init = device_get_match_data(dev); - if (!priv_data->pltfm_init) + priv_data->plat = device_get_match_data(dev); + if (!priv_data->plat) + return dev_err_probe(dev, -ENODEV, "missing platform match data\n"); + + if (!priv_data->plat->init) return dev_err_probe(dev, -ENODEV, "missing platform init handler\n"); @@ -311,7 +329,7 @@ static int dwc3_xlnx_probe(struct platform_device *pdev) if (ret) return ret; - ret = priv_data->pltfm_init(priv_data); + ret = priv_data->plat->init(priv_data); if (ret) goto err_clk_put; -- 2.43.0