Qualcomm devicetrees are moving away from having a glue node with dwc3
as a subnode and now may just have a single flattened node.

Rockchip already have a glue_get_ctrl_dev op which returns the node for
the glue device itself, commonise this and reuse it for the new Qualcomm
node.

Lastly adjust the qscratch base address since it now requires an offset
from the dwc3 base.

Signed-off-by: Casey Connolly <[email protected]>
---
 drivers/usb/dwc3/dwc3-generic.c | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 02c02b1d80e4..22b9ef0b24e3 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -475,9 +475,16 @@ static void dwc3_qcom_select_utmi_clk(void __iomem 
*qscratch_base)
 static void dwc3_qcom_glue_configure(struct udevice *dev, int index,
                                     enum usb_dr_mode mode)
 {
        struct dwc3_glue_data *glue = dev_get_plat(dev);
-       void __iomem *qscratch_base = map_physmem(glue->regs, 0x400, 
MAP_NOCACHE);
+       fdt_addr_t regs = glue->regs;
+       void __iomem *qscratch_base;
+
+       /* Offset for qscratch base when using flat DT */
+       if (device_is_compatible(dev, "qcom,snps-dwc3"))
+               regs += SDM845_QSCRATCH_BASE_OFFSET;
+
+       qscratch_base = map_physmem(regs, 0x400, MAP_NOCACHE);
        if (IS_ERR_OR_NULL(qscratch_base)) {
                log_err("%s: Invalid qscratch base address\n", dev->name);
                return;
        }
@@ -488,23 +495,29 @@ static void dwc3_qcom_glue_configure(struct udevice *dev, 
int index,
        if (mode != USB_DR_MODE_HOST)
                dwc3_qcom_vbus_override_enable(qscratch_base, true);
 }
 
-struct dwc3_glue_ops qcom_ops = {
-       .glue_configure = dwc3_qcom_glue_configure,
-};
-
-static int dwc3_rk_glue_get_ctrl_dev(struct udevice *dev, ofnode *node)
+/* In cases where there is no dwc3 node and it's flattened into the glue node 
*/
+static int dwc3_flat_dt_get_ctrl_dev(struct udevice *dev, ofnode *node)
 {
        *node = dev_ofnode(dev);
        if (!ofnode_valid(*node))
                return -EINVAL;
 
        return 0;
 }
 
+struct dwc3_glue_ops qcom_ops = {
+       .glue_configure = dwc3_qcom_glue_configure,
+};
+
+struct dwc3_glue_ops qcom_flat_dt_ops = {
+       .glue_configure = dwc3_qcom_glue_configure,
+       .glue_get_ctrl_dev = dwc3_flat_dt_get_ctrl_dev,
+};
+
 struct dwc3_glue_ops rk_ops = {
-       .glue_get_ctrl_dev = dwc3_rk_glue_get_ctrl_dev,
+       .glue_get_ctrl_dev = dwc3_flat_dt_get_ctrl_dev,
 };
 
 static int dwc3_glue_bind_common(struct udevice *parent, ofnode node)
 {
@@ -711,8 +724,9 @@ static const struct udevice_id dwc3_glue_ids[] = {
        { .compatible = "rockchip,rk3568-dwc3", .data = (ulong)&rk_ops },
        { .compatible = "rockchip,rk3576-dwc3", .data = (ulong)&rk_ops },
        { .compatible = "rockchip,rk3588-dwc3", .data = (ulong)&rk_ops },
        { .compatible = "qcom,dwc3", .data = (ulong)&qcom_ops },
+       { .compatible = "qcom,snps-dwc3", .data = (ulong)&qcom_flat_dt_ops },
        { .compatible = "fsl,imx8mp-dwc3", .data = (ulong)&imx8mp_ops },
        { .compatible = "fsl,imx8mq-dwc3" },
        { .compatible = "intel,tangier-dwc3" },
        { .compatible = "samsung,exynos7870-dwusb3" },

-- 
2.51.0

Reply via email to