Lines Matching +full:big +full:- +full:endian +full:- +full:regs
1 // SPDX-License-Identifier: GPL-2.0
6 * Copyright 2010-2012 Hauke Mehrtens <hauke@hauke-m.de>
9 * Derived from the ohci-ssb driver
12 * Derived from the EHCI-PCI driver
13 * Copyright (c) 2000-2004 by David Brownell
15 * Derived from the ohci-pci driver
17 * Copyright 2000-2002 David Brownell
23 #include <linux/dma-mapping.h>
43 #define hcd_to_ehci_priv(h) ((struct ehci_platform_priv *)hcd_to_ehci(h)->priv)
57 static const char hcd_name[] = "ehci-platform";
61 struct platform_device *pdev = to_platform_device(hcd->self.controller); in ehci_platform_reset()
62 struct usb_ehci_pdata *pdata = dev_get_platdata(&pdev->dev); in ehci_platform_reset()
66 ehci->has_synopsys_hc_bug = pdata->has_synopsys_hc_bug; in ehci_platform_reset()
68 if (pdata->pre_setup) { in ehci_platform_reset()
69 retval = pdata->pre_setup(hcd); in ehci_platform_reset()
74 ehci->caps = hcd->regs + pdata->caps_offset; in ehci_platform_reset()
79 if (pdata->no_io_watchdog) in ehci_platform_reset()
80 ehci->need_io_watchdog = 0; in ehci_platform_reset()
82 if (of_device_is_compatible(pdev->dev.of_node, "brcm,xgs-iproc-ehci")) in ehci_platform_reset()
84 &ehci->regs->bcm_iproc_insnreg01); in ehci_platform_reset()
95 for (clk = 0; clk < EHCI_MAX_CLKS && priv->clks[clk]; clk++) { in ehci_platform_power_on()
96 ret = clk_prepare_enable(priv->clks[clk]); in ehci_platform_power_on()
104 while (--clk >= 0) in ehci_platform_power_on()
105 clk_disable_unprepare(priv->clks[clk]); in ehci_platform_power_on()
116 for (clk = EHCI_MAX_CLKS - 1; clk >= 0; clk--) in ehci_platform_power_off()
117 if (priv->clks[clk]) in ehci_platform_power_off()
118 clk_disable_unprepare(priv->clks[clk]); in ehci_platform_power_off()
135 * quirk_poll_check_port_status - Poll port_status if the device sticks
138 * Since EHCI/OHCI controllers on R-Car Gen3 SoCs are possible to be getting
147 u32 port_status = ehci_readl(ehci, &ehci->regs->port_status[0]); in quirk_poll_check_port_status()
159 * quirk_poll_rebind_companion - rebind comanion device to recover
162 * Since EHCI/OHCI controllers on R-Car Gen3 SoCs are possible to be getting
172 companion_dev = usb_of_get_companion_dev(hcd->self.controller); in quirk_poll_rebind_companion()
215 schedule_delayed_work(&priv->poll_work, msecs_to_jiffies(5)); in quirk_poll_timer()
218 mod_timer(&priv->poll_timer, jiffies + HZ); in quirk_poll_timer()
223 INIT_DELAYED_WORK(&priv->poll_work, quirk_poll_work); in quirk_poll_init()
224 timer_setup(&priv->poll_timer, quirk_poll_timer, 0); in quirk_poll_init()
225 mod_timer(&priv->poll_timer, jiffies + HZ); in quirk_poll_init()
230 del_timer_sync(&priv->poll_timer); in quirk_poll_end()
231 cancel_delayed_work(&priv->poll_work); in quirk_poll_end()
235 { .family = "R-Car Gen3" },
243 struct usb_ehci_pdata *pdata = dev_get_platdata(&dev->dev); in ehci_platform_probe()
249 return -ENODEV; in ehci_platform_probe()
258 err = dma_coerce_mask_and_coherent(&dev->dev, in ehci_platform_probe()
259 pdata->dma_mask_64 ? DMA_BIT_MASK(64) : DMA_BIT_MASK(32)); in ehci_platform_probe()
261 dev_err(&dev->dev, "Error: DMA mask configuration failed\n"); in ehci_platform_probe()
269 hcd = usb_create_hcd(&ehci_platform_hc_driver, &dev->dev, in ehci_platform_probe()
270 dev_name(&dev->dev)); in ehci_platform_probe()
272 return -ENOMEM; in ehci_platform_probe()
275 dev->dev.platform_data = pdata; in ehci_platform_probe()
279 if (pdata == &ehci_platform_defaults && dev->dev.of_node) { in ehci_platform_probe()
280 if (of_property_read_bool(dev->dev.of_node, "big-endian-regs")) in ehci_platform_probe()
281 ehci->big_endian_mmio = 1; in ehci_platform_probe()
283 if (of_property_read_bool(dev->dev.of_node, "big-endian-desc")) in ehci_platform_probe()
284 ehci->big_endian_desc = 1; in ehci_platform_probe()
286 if (of_property_read_bool(dev->dev.of_node, "big-endian")) in ehci_platform_probe()
287 ehci->big_endian_mmio = ehci->big_endian_desc = 1; in ehci_platform_probe()
289 if (of_property_read_bool(dev->dev.of_node, in ehci_platform_probe()
290 "needs-reset-on-resume")) in ehci_platform_probe()
291 priv->reset_on_resume = true; in ehci_platform_probe()
293 if (of_property_read_bool(dev->dev.of_node, in ehci_platform_probe()
294 "has-transaction-translator")) in ehci_platform_probe()
295 hcd->has_tt = 1; in ehci_platform_probe()
298 priv->quirk_poll = true; in ehci_platform_probe()
301 priv->clks[clk] = of_clk_get(dev->dev.of_node, clk); in ehci_platform_probe()
302 if (IS_ERR(priv->clks[clk])) { in ehci_platform_probe()
303 err = PTR_ERR(priv->clks[clk]); in ehci_platform_probe()
304 if (err == -EPROBE_DEFER) in ehci_platform_probe()
306 priv->clks[clk] = NULL; in ehci_platform_probe()
312 priv->rsts = devm_reset_control_array_get_optional_shared(&dev->dev); in ehci_platform_probe()
313 if (IS_ERR(priv->rsts)) { in ehci_platform_probe()
314 err = PTR_ERR(priv->rsts); in ehci_platform_probe()
318 err = reset_control_deassert(priv->rsts); in ehci_platform_probe()
322 if (pdata->big_endian_desc) in ehci_platform_probe()
323 ehci->big_endian_desc = 1; in ehci_platform_probe()
324 if (pdata->big_endian_mmio) in ehci_platform_probe()
325 ehci->big_endian_mmio = 1; in ehci_platform_probe()
326 if (pdata->has_tt) in ehci_platform_probe()
327 hcd->has_tt = 1; in ehci_platform_probe()
328 if (pdata->reset_on_resume) in ehci_platform_probe()
329 priv->reset_on_resume = true; in ehci_platform_probe()
332 if (ehci->big_endian_mmio) { in ehci_platform_probe()
333 dev_err(&dev->dev, in ehci_platform_probe()
335 err = -EINVAL; in ehci_platform_probe()
340 if (ehci->big_endian_desc) { in ehci_platform_probe()
341 dev_err(&dev->dev, in ehci_platform_probe()
343 err = -EINVAL; in ehci_platform_probe()
348 if (pdata->power_on) { in ehci_platform_probe()
349 err = pdata->power_on(dev); in ehci_platform_probe()
355 hcd->regs = devm_ioremap_resource(&dev->dev, res_mem); in ehci_platform_probe()
356 if (IS_ERR(hcd->regs)) { in ehci_platform_probe()
357 err = PTR_ERR(hcd->regs); in ehci_platform_probe()
360 hcd->rsrc_start = res_mem->start; in ehci_platform_probe()
361 hcd->rsrc_len = resource_size(res_mem); in ehci_platform_probe()
367 device_wakeup_enable(hcd->self.controller); in ehci_platform_probe()
368 device_enable_async_suspend(hcd->self.controller); in ehci_platform_probe()
371 if (priv->quirk_poll) in ehci_platform_probe()
377 if (pdata->power_off) in ehci_platform_probe()
378 pdata->power_off(dev); in ehci_platform_probe()
380 reset_control_assert(priv->rsts); in ehci_platform_probe()
382 while (--clk >= 0) in ehci_platform_probe()
383 clk_put(priv->clks[clk]); in ehci_platform_probe()
386 dev->dev.platform_data = NULL; in ehci_platform_probe()
396 struct usb_ehci_pdata *pdata = dev_get_platdata(&dev->dev); in ehci_platform_remove()
400 if (priv->quirk_poll) in ehci_platform_remove()
405 if (pdata->power_off) in ehci_platform_remove()
406 pdata->power_off(dev); in ehci_platform_remove()
408 reset_control_assert(priv->rsts); in ehci_platform_remove()
410 for (clk = 0; clk < EHCI_MAX_CLKS && priv->clks[clk]; clk++) in ehci_platform_remove()
411 clk_put(priv->clks[clk]); in ehci_platform_remove()
416 dev->dev.platform_data = NULL; in ehci_platform_remove()
430 if (priv->quirk_poll) in ehci_platform_suspend()
437 if (pdata->power_suspend) in ehci_platform_suspend()
438 pdata->power_suspend(pdev); in ehci_platform_suspend()
451 if (pdata->power_on) { in ehci_platform_resume()
452 int err = pdata->power_on(pdev); in ehci_platform_resume()
457 companion_dev = usb_of_get_companion_dev(hcd->self.controller); in ehci_platform_resume()
459 device_pm_wait_for_dev(hcd->self.controller, companion_dev); in ehci_platform_resume()
463 ehci_resume(hcd, priv->reset_on_resume); in ehci_platform_resume()
469 if (priv->quirk_poll) in ehci_platform_resume()
476 { .compatible = "via,vt8500-ehci", },
477 { .compatible = "wm,prizm-ehci", },
478 { .compatible = "generic-ehci", },
479 { .compatible = "cavium,octeon-6335-ehci", },
493 { "ehci-platform", 0 },
507 .name = "ehci-platform",
517 return -ENODEV; in ehci_platform_init()