In case dwc3 has SoC specific customizations, dwc3 glue driver can base on compatible string and pass it via platform data to dwc3 core driver; and pass xhci private data further to xhci-plat like quirks. Signed-off-by: Li Jun <jun.li@xxxxxxx> --- drivers/usb/dwc3/core.h | 5 +++++ drivers/usb/dwc3/host.c | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 0b8ea8c..3146697 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -29,6 +29,7 @@ #include <linux/ulpi/interface.h> #include <linux/phy/phy.h> +#include "../host/xhci-plat.h" #define DWC3_MSG_MAX 500 @@ -924,6 +925,10 @@ struct dwc3_scratchpad_array { __le64 dma_adr[DWC3_MAX_HIBER_SCRATCHBUFS]; }; +struct dwc3_platform_data { + struct xhci_plat_priv *xhci_priv; +}; + /** * struct dwc3 - representation of our controller * @drd_work: workqueue used for role swapping diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c index bef1c1a..4f8514a 100644 --- a/drivers/usb/dwc3/host.c +++ b/drivers/usb/dwc3/host.c @@ -46,6 +46,7 @@ int dwc3_host_init(struct dwc3 *dwc) { struct property_entry props[4]; struct platform_device *xhci; + struct dwc3_platform_data *dwc3_pdata; int ret, irq; struct resource *res; struct platform_device *dwc3_pdev = to_platform_device(dwc->dev); @@ -115,6 +116,14 @@ int dwc3_host_init(struct dwc3 *dwc) } } + dwc3_pdata = (struct dwc3_platform_data *)dev_get_platdata(dwc->dev); + if (dwc3_pdata && dwc3_pdata->xhci_priv) { + ret = platform_device_add_data(xhci, dwc3_pdata->xhci_priv, + sizeof(struct xhci_plat_priv)); + if (ret) + goto err; + } + ret = platform_device_add(xhci); if (ret) { dev_err(dwc->dev, "failed to register xHCI device\n"); -- 2.7.4