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()
66 status_reg = &ehci->regs->port_status[(wIndex & 0xff) - 1]; in ehci_brcm_hub_control()
74 ehci->reset_done[wIndex-1] && in ehci_brcm_hub_control()
75 time_after_eq(jiffies, ehci->reset_done[wIndex-1]) && in ehci_brcm_hub_control()
76 (ehci_readl(ehci, status_reg) & PORT_RESUME)) { in ehci_brcm_hub_control()
82 ehci_dbg(ehci, "SOF alignment workaround\n"); in ehci_brcm_hub_control()
85 ehci_brcm_wait_for_sof(ehci, 5); in ehci_brcm_hub_control()
95 struct ehci_hcd *ehci = hcd_to_ehci(hcd); in ehci_brcm_reset() local
98 ehci->big_endian_mmio = 1; in ehci_brcm_reset()
100 ehci->caps = (void __iomem *)hcd->regs; in ehci_brcm_reset()
101 len = HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); in ehci_brcm_reset()
102 ehci->regs = (void __iomem *)(hcd->regs + len); in ehci_brcm_reset()
105 ehci_writel(ehci, CMD_RESET, &ehci->regs->command); in ehci_brcm_reset()
109 * SWLINUX-1705: Avoid OUT packet underflows during high memory in ehci_brcm_reset()
111 * port_status[0x0f] = Broadcom-proprietary USB_EHCI_INSNREG00 @ 0x90 in ehci_brcm_reset()
113 ehci_writel(ehci, 0x00800040, &ehci->regs->port_status[0x10]); in ehci_brcm_reset()
114 ehci_writel(ehci, 0x00000001, &ehci->regs->port_status[0x12]); in ehci_brcm_reset()
128 struct device *dev = &pdev->dev; in ehci_brcm_probe()
141 return irq ? irq : -EINVAL; in ehci_brcm_probe()
149 return -ENOMEM; in ehci_brcm_probe()
154 priv->clk = devm_clk_get_optional(dev, NULL); in ehci_brcm_probe()
155 if (IS_ERR(priv->clk)) { in ehci_brcm_probe()
156 err = PTR_ERR(priv->clk); in ehci_brcm_probe()
160 err = clk_prepare_enable(priv->clk); in ehci_brcm_probe()
164 hcd->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res_mem); in ehci_brcm_probe()
165 if (IS_ERR(hcd->regs)) { in ehci_brcm_probe()
166 err = PTR_ERR(hcd->regs); in ehci_brcm_probe()
169 hcd->rsrc_start = res_mem->start; in ehci_brcm_probe()
170 hcd->rsrc_len = resource_size(res_mem); in ehci_brcm_probe()
175 device_wakeup_enable(hcd->self.controller); in ehci_brcm_probe()
176 device_enable_async_suspend(hcd->self.controller); in ehci_brcm_probe()
181 clk_disable_unprepare(priv->clk); in ehci_brcm_probe()
194 clk_disable_unprepare(priv->clk); in ehci_brcm_remove()
209 clk_disable_unprepare(priv->clk); in ehci_brcm_suspend()
216 struct ehci_hcd *ehci = hcd_to_ehci(hcd); in ehci_brcm_resume() local
220 err = clk_prepare_enable(priv->clk); in ehci_brcm_resume()
224 * SWLINUX-1705: Avoid OUT packet underflows during high memory in ehci_brcm_resume()
226 * port_status[0x0f] = Broadcom-proprietary USB_EHCI_INSNREG00 in ehci_brcm_resume()
229 ehci_writel(ehci, 0x00800040, &ehci->regs->port_status[0x10]); in ehci_brcm_resume()
230 ehci_writel(ehci, 0x00000001, &ehci->regs->port_status[0x12]); in ehci_brcm_resume()
245 { .compatible = "brcm,ehci-brcm-v2", },
246 { .compatible = "brcm,bcm7445-ehci", },
255 .name = "ehci-brcm",
264 return -ENODEV; in ehci_brcm_init()
277 MODULE_ALIAS("platform:ehci-brcm");
278 MODULE_DESCRIPTION("EHCI Broadcom STB driver");