Lines Matching +full:imod +full:- +full:interval +full:- +full:ns
1 // SPDX-License-Identifier: GPL-2.0
3 * xhci-plat.c - xHCI host controller driver platform Bus Glue.
5 * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com
12 #include <linux/dma-mapping.h>
25 #include "xhci-plat.h"
26 #include "xhci-mvebu.h"
43 if (priv->plat_start) in xhci_priv_plat_start()
44 priv->plat_start(hcd); in xhci_priv_plat_start()
51 if (!priv->init_quirk) in xhci_priv_init_quirk()
54 return priv->init_quirk(hcd); in xhci_priv_init_quirk()
61 if (!priv->suspend_quirk) in xhci_priv_suspend_quirk()
64 return priv->suspend_quirk(hcd); in xhci_priv_suspend_quirk()
71 if (!priv->resume_quirk) in xhci_priv_resume_quirk()
74 return priv->resume_quirk(hcd); in xhci_priv_resume_quirk()
81 xhci->quirks |= priv->quirks; in xhci_plat_quirks()
118 .compatible = "generic-xhci",
120 .compatible = "xhci-platform",
122 .compatible = "marvell,armada-375-xhci",
125 .compatible = "marvell,armada-380-xhci",
128 .compatible = "marvell,armada3700-xhci",
131 .compatible = "brcm,xhci-brcm-v2",
134 .compatible = "brcm,bcm2711-xhci",
137 .compatible = "brcm,bcm7445-xhci",
158 return -ENODEV; in xhci_plat_probe()
167 sysdev = &pdev->dev; in xhci_plat_probe()
173 pm_runtime_set_active(&pdev->dev); in xhci_plat_probe()
174 pm_runtime_enable(&pdev->dev); in xhci_plat_probe()
175 pm_runtime_get_noresume(&pdev->dev); in xhci_plat_probe()
177 hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, in xhci_plat_probe()
178 dev_name(&pdev->dev), NULL); in xhci_plat_probe()
180 ret = -ENOMEM; in xhci_plat_probe()
184 hcd->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in xhci_plat_probe()
185 if (IS_ERR(hcd->regs)) { in xhci_plat_probe()
186 ret = PTR_ERR(hcd->regs); in xhci_plat_probe()
190 hcd->rsrc_start = res->start; in xhci_plat_probe()
191 hcd->rsrc_len = resource_size(res); in xhci_plat_probe()
195 xhci->allow_single_roothub = 1; in xhci_plat_probe()
201 xhci->reg_clk = devm_clk_get_optional(&pdev->dev, "reg"); in xhci_plat_probe()
202 if (IS_ERR(xhci->reg_clk)) { in xhci_plat_probe()
203 ret = PTR_ERR(xhci->reg_clk); in xhci_plat_probe()
207 xhci->clk = devm_clk_get_optional(&pdev->dev, NULL); in xhci_plat_probe()
208 if (IS_ERR(xhci->clk)) { in xhci_plat_probe()
209 ret = PTR_ERR(xhci->clk); in xhci_plat_probe()
213 xhci->reset = devm_reset_control_array_get_optional_shared(&pdev->dev); in xhci_plat_probe()
214 if (IS_ERR(xhci->reset)) { in xhci_plat_probe()
215 ret = PTR_ERR(xhci->reset); in xhci_plat_probe()
219 ret = reset_control_deassert(xhci->reset); in xhci_plat_probe()
223 ret = clk_prepare_enable(xhci->reg_clk); in xhci_plat_probe()
227 ret = clk_prepare_enable(xhci->clk); in xhci_plat_probe()
237 device_set_wakeup_capable(&pdev->dev, true); in xhci_plat_probe()
239 xhci->main_hcd = hcd; in xhci_plat_probe()
242 xhci->imod_interval = 40000; in xhci_plat_probe()
245 for (tmpdev = &pdev->dev; tmpdev; tmpdev = tmpdev->parent) { in xhci_plat_probe()
247 if (device_property_read_bool(tmpdev, "usb2-lpm-disable")) in xhci_plat_probe()
248 xhci->quirks |= XHCI_HW_LPM_DISABLE; in xhci_plat_probe()
250 if (device_property_read_bool(tmpdev, "usb3-lpm-capable")) in xhci_plat_probe()
251 xhci->quirks |= XHCI_LPM_SUPPORT; in xhci_plat_probe()
253 if (device_property_read_bool(tmpdev, "quirk-broken-port-ped")) in xhci_plat_probe()
254 xhci->quirks |= XHCI_BROKEN_PORT_PED; in xhci_plat_probe()
256 if (device_property_read_bool(tmpdev, "xhci-sg-trb-cache-size-quirk")) in xhci_plat_probe()
257 xhci->quirks |= XHCI_SG_TRB_CACHE_SIZE_QUIRK; in xhci_plat_probe()
259 if (device_property_read_bool(tmpdev, "write-64-hi-lo-quirk")) in xhci_plat_probe()
260 xhci->quirks |= XHCI_WRITE_64_HI_LO; in xhci_plat_probe()
262 if (device_property_read_bool(tmpdev, "xhci-missing-cas-quirk")) in xhci_plat_probe()
263 xhci->quirks |= XHCI_MISSING_CAS; in xhci_plat_probe()
265 if (device_property_read_bool(tmpdev, "xhci-skip-phy-init-quirk")) in xhci_plat_probe()
266 xhci->quirks |= XHCI_SKIP_PHY_INIT; in xhci_plat_probe()
268 device_property_read_u32(tmpdev, "imod-interval-ns", in xhci_plat_probe()
269 &xhci->imod_interval); in xhci_plat_probe()
270 device_property_read_u16(tmpdev, "num-hc-interrupters", in xhci_plat_probe()
271 &xhci->max_interrupters); in xhci_plat_probe()
278 of_match = of_match_device(pdev->dev.driver->of_match_table, &pdev->dev); in xhci_plat_probe()
280 hcd->usb_phy = devm_usb_get_phy_by_phandle(sysdev, "usb-phy", 0); in xhci_plat_probe()
281 if (IS_ERR(hcd->usb_phy)) { in xhci_plat_probe()
282 ret = PTR_ERR(hcd->usb_phy); in xhci_plat_probe()
283 if (ret == -EPROBE_DEFER) in xhci_plat_probe()
285 hcd->usb_phy = NULL; in xhci_plat_probe()
287 ret = usb_phy_init(hcd->usb_phy); in xhci_plat_probe()
293 hcd->tpl_support = of_usb_host_tpl_support(sysdev->of_node); in xhci_plat_probe()
295 if ((priv && (priv->quirks & XHCI_SKIP_PHY_INIT)) || in xhci_plat_probe()
296 (xhci->quirks & XHCI_SKIP_PHY_INIT)) in xhci_plat_probe()
297 hcd->skip_phy_initialization = 1; in xhci_plat_probe()
299 if (priv && (priv->quirks & XHCI_SG_TRB_CACHE_SIZE_QUIRK)) in xhci_plat_probe()
300 xhci->quirks |= XHCI_SG_TRB_CACHE_SIZE_QUIRK; in xhci_plat_probe()
307 xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, in xhci_plat_probe()
308 dev_name(&pdev->dev), hcd); in xhci_plat_probe()
309 if (!xhci->shared_hcd) { in xhci_plat_probe()
310 ret = -ENOMEM; in xhci_plat_probe()
315 xhci->shared_hcd->usb_phy = devm_usb_get_phy_by_phandle(sysdev, in xhci_plat_probe()
316 "usb-phy", 1); in xhci_plat_probe()
317 if (IS_ERR(xhci->shared_hcd->usb_phy)) { in xhci_plat_probe()
318 xhci->shared_hcd->usb_phy = NULL; in xhci_plat_probe()
320 ret = usb_phy_init(xhci->shared_hcd->usb_phy); in xhci_plat_probe()
327 xhci->shared_hcd->tpl_support = hcd->tpl_support; in xhci_plat_probe()
331 if (usb3_hcd && HCC_MAX_PSA(xhci->hcc_params) >= 4 && in xhci_plat_probe()
332 !(xhci->quirks & XHCI_BROKEN_STREAMS)) in xhci_plat_probe()
333 usb3_hcd->can_do_streams = 1; in xhci_plat_probe()
335 if (xhci->shared_hcd) { in xhci_plat_probe()
336 xhci->shared_hcd->rsrc_start = hcd->rsrc_start; in xhci_plat_probe()
337 xhci->shared_hcd->rsrc_len = hcd->rsrc_len; in xhci_plat_probe()
338 ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED); in xhci_plat_probe()
343 device_enable_async_suspend(&pdev->dev); in xhci_plat_probe()
344 pm_runtime_put_noidle(&pdev->dev); in xhci_plat_probe()
350 pm_runtime_forbid(&pdev->dev); in xhci_plat_probe()
356 usb_put_hcd(xhci->shared_hcd); in xhci_plat_probe()
362 usb_phy_shutdown(hcd->usb_phy); in xhci_plat_probe()
365 clk_disable_unprepare(xhci->clk); in xhci_plat_probe()
368 clk_disable_unprepare(xhci->reg_clk); in xhci_plat_probe()
371 reset_control_assert(xhci->reset); in xhci_plat_probe()
377 pm_runtime_put_noidle(&pdev->dev); in xhci_plat_probe()
378 pm_runtime_disable(&pdev->dev); in xhci_plat_probe()
394 * 2. xhci_plat is child of a device from firmware (dwc3-plat) in xhci_generic_plat_probe()
395 * 3. xhci_plat is grandchild of a pci device (dwc3-pci) in xhci_generic_plat_probe()
397 for (sysdev = &pdev->dev; sysdev; sysdev = sysdev->parent) { in xhci_generic_plat_probe()
398 if (is_of_node(sysdev->fwnode) || in xhci_generic_plat_probe()
399 is_acpi_device_node(sysdev->fwnode)) in xhci_generic_plat_probe()
406 sysdev = &pdev->dev; in xhci_generic_plat_probe()
408 if (WARN_ON(!sysdev->dma_mask)) { in xhci_generic_plat_probe()
415 if (pdev->dev.of_node) in xhci_generic_plat_probe()
416 priv_match = of_device_get_match_data(&pdev->dev); in xhci_generic_plat_probe()
418 priv_match = dev_get_platdata(&pdev->dev); in xhci_generic_plat_probe()
427 struct clk *clk = xhci->clk; in xhci_plat_remove()
428 struct clk *reg_clk = xhci->reg_clk; in xhci_plat_remove()
429 struct usb_hcd *shared_hcd = xhci->shared_hcd; in xhci_plat_remove()
431 xhci->xhc_state |= XHCI_STATE_REMOVING; in xhci_plat_remove()
432 pm_runtime_get_sync(&dev->dev); in xhci_plat_remove()
436 xhci->shared_hcd = NULL; in xhci_plat_remove()
439 usb_phy_shutdown(hcd->usb_phy); in xhci_plat_remove()
448 reset_control_assert(xhci->reset); in xhci_plat_remove()
451 pm_runtime_disable(&dev->dev); in xhci_plat_remove()
452 pm_runtime_put_noidle(&dev->dev); in xhci_plat_remove()
453 pm_runtime_set_suspended(&dev->dev); in xhci_plat_remove()
477 if (!device_may_wakeup(dev) && (xhci->quirks & XHCI_SUSPEND_RESUME_CLKS)) { in xhci_plat_suspend()
478 clk_disable_unprepare(xhci->clk); in xhci_plat_suspend()
479 clk_disable_unprepare(xhci->reg_clk); in xhci_plat_suspend()
492 if (!device_may_wakeup(dev) && (xhci->quirks & XHCI_SUSPEND_RESUME_CLKS)) { in xhci_plat_resume_common()
493 ret = clk_prepare_enable(xhci->clk); in xhci_plat_resume_common()
497 ret = clk_prepare_enable(xhci->reg_clk); in xhci_plat_resume_common()
499 clk_disable_unprepare(xhci->clk); in xhci_plat_resume_common()
508 ret = xhci_resume(xhci, power_lost || priv->power_lost, false); in xhci_plat_resume_common()
519 if (!device_may_wakeup(dev) && (xhci->quirks & XHCI_SUSPEND_RESUME_CLKS)) { in xhci_plat_resume_common()
520 clk_disable_unprepare(xhci->clk); in xhci_plat_resume_common()
521 clk_disable_unprepare(xhci->reg_clk); in xhci_plat_resume_common()
574 /* XHCI-compliant USB Controller */
587 .name = "xhci-hcd",
593 MODULE_ALIAS("platform:xhci-hcd");