Lines Matching +full:bcm7445 +full:- +full:ehci

1 // SPDX-License-Identifier: GPL-2.0
5 #include <linux/dma-mapping.h>
15 #include "ehci.h"
17 #define hcd_to_ehci_priv(h) ((struct brcm_priv *)hcd_to_ehci(h)->priv)
27 static inline void ehci_brcm_wait_for_sof(struct ehci_hcd *ehci, u32 delay) in ehci_brcm_wait_for_sof() argument
29 u32 frame_idx = ehci_readl(ehci, &ehci->regs->frame_index); in ehci_brcm_wait_for_sof()
34 res = readl_relaxed_poll_timeout(&ehci->regs->frame_index, val, in ehci_brcm_wait_for_sof()
37 ehci_err(ehci, "Error waiting for SOF\n"); in ehci_brcm_wait_for_sof()
43 * The EHCI controller has a bug where it can violate the SOF
48 * The fix is to Intercept the echi-hcd request to complete RESUME and
50 * See SWLINUX-1909 for more details
60 struct ehci_hcd *ehci = hcd_to_ehci(hcd); in ehci_brcm_hub_control() local
61 int ports = HCS_N_PORTS(ehci->hcs_params); in ehci_brcm_hub_control()
67 temp = (wIndex & 0xff) - 1; in ehci_brcm_hub_control()
68 if (temp >= HCS_N_PORTS_MAX) /* Avoid index-out-of-bounds warning */ in ehci_brcm_hub_control()
70 status_reg = &ehci->regs->port_status[temp]; in ehci_brcm_hub_control()
78 ehci->reset_done[wIndex-1] && in ehci_brcm_hub_control()
79 time_after_eq(jiffies, ehci->reset_done[wIndex-1]) && in ehci_brcm_hub_control()
80 (ehci_readl(ehci, status_reg) & PORT_RESUME)) { in ehci_brcm_hub_control()
86 ehci_dbg(ehci, "SOF alignment workaround\n"); in ehci_brcm_hub_control()
89 ehci_brcm_wait_for_sof(ehci, 5); in ehci_brcm_hub_control()
99 struct ehci_hcd *ehci = hcd_to_ehci(hcd); in ehci_brcm_reset() local
102 ehci->big_endian_mmio = 1; in ehci_brcm_reset()
104 ehci->caps = (void __iomem *)hcd->regs; in ehci_brcm_reset()
105 len = HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); in ehci_brcm_reset()
106 ehci->regs = (void __iomem *)(hcd->regs + len); in ehci_brcm_reset()
109 ehci_writel(ehci, CMD_RESET, &ehci->regs->command); in ehci_brcm_reset()
113 * SWLINUX-1705: Avoid OUT packet underflows during high memory in ehci_brcm_reset()
116 ehci_writel(ehci, 0x00800040, &ehci->regs->brcm_insnreg[1]); in ehci_brcm_reset()
117 ehci_writel(ehci, 0x00000001, &ehci->regs->brcm_insnreg[3]); in ehci_brcm_reset()
131 struct device *dev = &pdev->dev; in ehci_brcm_probe()
152 return -ENOMEM; in ehci_brcm_probe()
157 priv->clk = devm_clk_get_optional(dev, NULL); in ehci_brcm_probe()
158 if (IS_ERR(priv->clk)) { in ehci_brcm_probe()
159 err = PTR_ERR(priv->clk); in ehci_brcm_probe()
163 err = clk_prepare_enable(priv->clk); in ehci_brcm_probe()
167 hcd->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res_mem); in ehci_brcm_probe()
168 if (IS_ERR(hcd->regs)) { in ehci_brcm_probe()
169 err = PTR_ERR(hcd->regs); in ehci_brcm_probe()
172 hcd->rsrc_start = res_mem->start; in ehci_brcm_probe()
173 hcd->rsrc_len = resource_size(res_mem); in ehci_brcm_probe()
178 device_wakeup_enable(hcd->self.controller); in ehci_brcm_probe()
179 device_enable_async_suspend(hcd->self.controller); in ehci_brcm_probe()
184 clk_disable_unprepare(priv->clk); in ehci_brcm_probe()
197 clk_disable_unprepare(priv->clk); in ehci_brcm_remove()
211 clk_disable_unprepare(priv->clk); in ehci_brcm_suspend()
218 struct ehci_hcd *ehci = hcd_to_ehci(hcd); in ehci_brcm_resume() local
222 err = clk_prepare_enable(priv->clk); in ehci_brcm_resume()
226 * SWLINUX-1705: Avoid OUT packet underflows during high memory in ehci_brcm_resume()
229 ehci_writel(ehci, 0x00800040, &ehci->regs->brcm_insnreg[1]); in ehci_brcm_resume()
230 ehci_writel(ehci, 0x00000001, &ehci->regs->brcm_insnreg[3]); in ehci_brcm_resume()
245 { .compatible = "brcm,ehci-brcm-v2", },
246 { .compatible = "brcm,bcm7445-ehci", },
256 .name = "ehci-brcm",
265 return -ENODEV; in ehci_brcm_init()
278 MODULE_ALIAS("platform:ehci-brcm");
279 MODULE_DESCRIPTION("EHCI Broadcom STB driver");