Lines Matching +full:zynqmp +full:- +full:dwc3

1 // SPDX-License-Identifier: GPL-2.0
3 * dwc3-xilinx.c - Xilinx DWC3 controller specific glue driver
15 #include <linux/dma-mapping.h>
22 #include <linux/firmware/xlnx-zynqmp.h>
62 reg = readl(priv_data->regs + XLNX_USB_PHY_RST_EN); in dwc3_xlnx_mask_phy_rst()
69 writel(reg, priv_data->regs + XLNX_USB_PHY_RST_EN); in dwc3_xlnx_mask_phy_rst()
74 struct device *dev = priv_data->dev; in dwc3_xlnx_set_coherency()
82 if (of_dma_is_coherent(dev->of_node) || device_iommu_mapped(dev)) { in dwc3_xlnx_set_coherency()
83 reg = readl(priv_data->regs + coherency_offset); in dwc3_xlnx_set_coherency()
85 writel(reg, priv_data->regs + coherency_offset); in dwc3_xlnx_set_coherency()
91 struct device *dev = priv_data->dev; in dwc3_xlnx_init_versal()
101 /* Assert and De-assert reset */ in dwc3_xlnx_init_versal()
110 dev_err_probe(dev, ret, "failed to De-assert Reset\n"); in dwc3_xlnx_init_versal()
122 struct device *dev = priv_data->dev; in dwc3_xlnx_init_zynqmp()
127 priv_data->usb3_phy = devm_phy_optional_get(dev, "usb3-phy"); in dwc3_xlnx_init_zynqmp()
128 if (IS_ERR(priv_data->usb3_phy)) { in dwc3_xlnx_init_zynqmp()
129 ret = PTR_ERR(priv_data->usb3_phy); in dwc3_xlnx_init_zynqmp()
139 * by the first-stage boot loader, but may be reverted by a core in dwc3_xlnx_init_zynqmp()
141 * in use but the usb3-phy entry is missing from the device tree. in dwc3_xlnx_init_zynqmp()
144 if (!priv_data->usb3_phy) { in dwc3_xlnx_init_zynqmp()
146 writel(PIPE_CLK_DESELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK); in dwc3_xlnx_init_zynqmp()
192 ret = phy_init(priv_data->usb3_phy); in dwc3_xlnx_init_zynqmp()
194 phy_exit(priv_data->usb3_phy); in dwc3_xlnx_init_zynqmp()
205 writel(FPD_POWER_PRSNT_OPTION, priv_data->regs + XLNX_USB_FPD_POWER_PRSNT); in dwc3_xlnx_init_zynqmp()
208 writel(PIPE_CLK_SELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK); in dwc3_xlnx_init_zynqmp()
222 ret = phy_power_on(priv_data->usb3_phy); in dwc3_xlnx_init_zynqmp()
224 phy_exit(priv_data->usb3_phy); in dwc3_xlnx_init_zynqmp()
229 /* ulpi reset via gpio-modepin or gpio-framework driver */ in dwc3_xlnx_init_zynqmp()
249 .compatible = "xlnx,zynqmp-dwc3",
253 .compatible = "xlnx,versal-dwc3",
262 struct device_node *np = dev->of_node, *dwc3_np; in dwc3_set_swnode()
266 dwc3_np = of_get_compatible_child(np, "snps,dwc3"); in dwc3_set_swnode()
268 ret = -ENODEV; in dwc3_set_swnode()
269 dev_err(dev, "failed to find dwc3 core child\n"); in dwc3_set_swnode()
275 props[prop_idx++] = PROPERTY_ENTRY_U16("snps,gsbuscfg0-reqinfo", in dwc3_set_swnode()
288 struct device *dev = &pdev->dev; in dwc3_xlnx_probe()
289 struct device_node *np = dev->of_node; in dwc3_xlnx_probe()
296 return -ENOMEM; in dwc3_xlnx_probe()
302 match = of_match_node(dwc3_xlnx_of_match, pdev->dev.of_node); in dwc3_xlnx_probe()
304 priv_data->pltfm_init = match->data; in dwc3_xlnx_probe()
305 priv_data->regs = regs; in dwc3_xlnx_probe()
306 priv_data->dev = dev; in dwc3_xlnx_probe()
310 ret = devm_clk_bulk_get_all(priv_data->dev, &priv_data->clks); in dwc3_xlnx_probe()
314 priv_data->num_clocks = ret; in dwc3_xlnx_probe()
316 ret = clk_bulk_prepare_enable(priv_data->num_clocks, priv_data->clks); in dwc3_xlnx_probe()
320 ret = priv_data->pltfm_init(priv_data); in dwc3_xlnx_probe()
349 clk_bulk_disable_unprepare(priv_data->num_clocks, priv_data->clks); in dwc3_xlnx_probe()
357 struct device *dev = &pdev->dev; in dwc3_xlnx_remove()
361 clk_bulk_disable_unprepare(priv_data->num_clocks, priv_data->clks); in dwc3_xlnx_remove()
362 priv_data->num_clocks = 0; in dwc3_xlnx_remove()
372 clk_bulk_disable(priv_data->num_clocks, priv_data->clks); in dwc3_xlnx_runtime_suspend()
381 return clk_bulk_enable(priv_data->num_clocks, priv_data->clks); in dwc3_xlnx_runtime_resume()
396 phy_exit(priv_data->usb3_phy); in dwc3_xlnx_suspend()
399 clk_bulk_disable(priv_data->num_clocks, priv_data->clks); in dwc3_xlnx_suspend()
409 ret = clk_bulk_enable(priv_data->num_clocks, priv_data->clks); in dwc3_xlnx_resume()
413 ret = phy_init(priv_data->usb3_phy); in dwc3_xlnx_resume()
417 ret = phy_power_on(priv_data->usb3_phy); in dwc3_xlnx_resume()
419 phy_exit(priv_data->usb3_phy); in dwc3_xlnx_resume()
437 .name = "dwc3-xilinx",
446 MODULE_DESCRIPTION("Xilinx DWC3 controller specific glue driver");