Lines Matching +full:omap +full:- +full:usb2

1 // SPDX-License-Identifier: GPL-1.0+
6 * (C) Copyright 2000-2005 David Brownell
7 * (C) Copyright 2002 Hewlett-Packard Company
9 * OMAP Bus Glue
11 * Modified for OMAP by Tony Lindgren <tony@atomide.com>
12 * Based on the 2.4 OMAP OHCI driver originally done by MontaVista Software Inc.
13 * and on ohci-sa1111.c by Christopher Hoover <ch@hpl.hp.com>
19 #include <linux/dma-mapping.h>
35 #include <asm/mach-types.h>
43 #define DRIVER_DESC "OHCI OMAP driver"
52 static const char hcd_name[] = "ohci-omap";
56 ((struct ohci_omap_priv *)hcd_to_ohci(h)->priv)
61 clk_enable(priv->usb_dc_ck); in omap_ohci_clock_power()
62 clk_enable(priv->usb_host_ck); in omap_ohci_clock_power()
66 clk_disable(priv->usb_host_ck); in omap_ohci_clock_power()
67 clk_disable(priv->usb_dc_ck); in omap_ohci_clock_power()
72 * Board specific gang-switched transceiver power on/off.
80 | ((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), in omap_ohci_transceiver_power()
82 else if (priv->power) in omap_ohci_transceiver_power()
83 gpiod_set_value_cansleep(priv->power, 0); in omap_ohci_transceiver_power()
87 & ~((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), in omap_ohci_transceiver_power()
89 else if (priv->power) in omap_ohci_transceiver_power()
90 gpiod_set_value_cansleep(priv->power, 1); in omap_ohci_transceiver_power()
101 const unsigned port = hcd->self.otg_port - 1; in start_hnp()
105 otg_start_hnp(hcd->usb_phy->otg); in start_hnp()
108 hcd->usb_phy->otg->state = OTG_STATE_A_SUSPEND; in start_hnp()
109 writel (RH_PS_PSS, &ohci->regs->roothub.portstatus [port]); in start_hnp()
118 /*-------------------------------------------------------------------------*/
123 struct omap_usb_config *config = dev_get_platdata(hcd->self.controller); in ohci_omap_reset()
125 int need_transceiver = (config->otg != 0); in ohci_omap_reset()
128 dev_dbg(hcd->self.controller, "starting USB Controller\n"); in ohci_omap_reset()
130 if (config->otg) { in ohci_omap_reset()
131 hcd->self.otg_port = config->otg; in ohci_omap_reset()
133 hcd->power_budget = 8; in ohci_omap_reset()
136 /* boards can use OTG transceivers in non-OTG modes */ in ohci_omap_reset()
141 if (config->ocpi_enable) in ohci_omap_reset()
142 config->ocpi_enable(); in ohci_omap_reset()
146 hcd->usb_phy = usb_get_phy(USB_PHY_TYPE_USB2); in ohci_omap_reset()
147 if (!IS_ERR_OR_NULL(hcd->usb_phy)) { in ohci_omap_reset()
148 int status = otg_set_host(hcd->usb_phy->otg, in ohci_omap_reset()
149 &ohci_to_hcd(ohci)->self); in ohci_omap_reset()
150 dev_dbg(hcd->self.controller, "init %s phy, status %d\n", in ohci_omap_reset()
151 hcd->usb_phy->label, status); in ohci_omap_reset()
153 usb_put_phy(hcd->usb_phy); in ohci_omap_reset()
157 return -EPROBE_DEFER; in ohci_omap_reset()
159 hcd->skip_phy_initialization = 1; in ohci_omap_reset()
160 ohci->start_hnp = start_hnp; in ohci_omap_reset()
166 if (config->lb_reset) in ohci_omap_reset()
167 config->lb_reset(); in ohci_omap_reset()
173 if (config->otg || config->rwc) { in ohci_omap_reset()
174 ohci->hc_control = OHCI_CTRL_RWC; in ohci_omap_reset()
175 writel(OHCI_CTRL_RWC, &ohci->regs->control); in ohci_omap_reset()
178 /* board-specific power switching and overcurrent support */ in ohci_omap_reset()
187 ohci_to_hcd(ohci)->power_budget = 250; in ohci_omap_reset()
197 ohci_writel(ohci, rh, &ohci->regs->roothub.a); in ohci_omap_reset()
198 ohci->flags &= ~OHCI_QUIRK_HUB_POWER; in ohci_omap_reset()
200 /* We require a self-powered hub, which should have in ohci_omap_reset()
202 ohci_to_hcd(ohci)->power_budget = 0; in ohci_omap_reset()
216 /*-------------------------------------------------------------------------*/
219 * ohci_hcd_omap_probe - initialize OMAP-based HCDs
234 if (pdev->num_resources != 2) { in ohci_hcd_omap_probe()
235 dev_err(&pdev->dev, "invalid num_resources: %i\n", in ohci_hcd_omap_probe()
236 pdev->num_resources); in ohci_hcd_omap_probe()
237 return -ENODEV; in ohci_hcd_omap_probe()
240 if (pdev->resource[0].flags != IORESOURCE_MEM in ohci_hcd_omap_probe()
241 || pdev->resource[1].flags != IORESOURCE_IRQ) { in ohci_hcd_omap_probe()
242 dev_err(&pdev->dev, "invalid resource type\n"); in ohci_hcd_omap_probe()
243 return -ENODEV; in ohci_hcd_omap_probe()
246 hcd = usb_create_hcd(&ohci_omap_hc_driver, &pdev->dev, in ohci_hcd_omap_probe()
247 dev_name(&pdev->dev)); in ohci_hcd_omap_probe()
249 return -ENOMEM; in ohci_hcd_omap_probe()
251 hcd->rsrc_start = pdev->resource[0].start; in ohci_hcd_omap_probe()
252 hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1; in ohci_hcd_omap_probe()
256 priv->power = devm_gpiod_get_optional(&pdev->dev, "power", GPIOD_ASIS); in ohci_hcd_omap_probe()
257 if (IS_ERR(priv->power)) { in ohci_hcd_omap_probe()
258 retval = PTR_ERR(priv->power); in ohci_hcd_omap_probe()
261 if (priv->power) in ohci_hcd_omap_probe()
262 gpiod_set_consumer_name(priv->power, "OHCI power"); in ohci_hcd_omap_probe()
269 priv->overcurrent = devm_gpiod_get_optional(&pdev->dev, "overcurrent", in ohci_hcd_omap_probe()
271 if (IS_ERR(priv->overcurrent)) { in ohci_hcd_omap_probe()
272 retval = PTR_ERR(priv->overcurrent); in ohci_hcd_omap_probe()
275 if (priv->overcurrent) in ohci_hcd_omap_probe()
276 gpiod_set_consumer_name(priv->overcurrent, "OHCI overcurrent"); in ohci_hcd_omap_probe()
278 priv->usb_host_ck = clk_get(&pdev->dev, "usb_hhc_ck"); in ohci_hcd_omap_probe()
279 if (IS_ERR(priv->usb_host_ck)) { in ohci_hcd_omap_probe()
280 retval = PTR_ERR(priv->usb_host_ck); in ohci_hcd_omap_probe()
285 priv->usb_dc_ck = clk_get(&pdev->dev, "usb_dc_ck"); in ohci_hcd_omap_probe()
287 priv->usb_dc_ck = clk_get(&pdev->dev, "lb_ck"); in ohci_hcd_omap_probe()
289 if (IS_ERR(priv->usb_dc_ck)) { in ohci_hcd_omap_probe()
290 retval = PTR_ERR(priv->usb_dc_ck); in ohci_hcd_omap_probe()
294 if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { in ohci_hcd_omap_probe()
295 dev_dbg(&pdev->dev, "request_mem_region failed\n"); in ohci_hcd_omap_probe()
296 retval = -EBUSY; in ohci_hcd_omap_probe()
300 hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); in ohci_hcd_omap_probe()
301 if (!hcd->regs) { in ohci_hcd_omap_probe()
302 dev_err(&pdev->dev, "can't ioremap OHCI HCD\n"); in ohci_hcd_omap_probe()
303 retval = -ENOMEM; in ohci_hcd_omap_probe()
309 retval = -ENXIO; in ohci_hcd_omap_probe()
316 device_wakeup_enable(hcd->self.controller); in ohci_hcd_omap_probe()
319 iounmap(hcd->regs); in ohci_hcd_omap_probe()
321 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); in ohci_hcd_omap_probe()
323 clk_put(priv->usb_dc_ck); in ohci_hcd_omap_probe()
325 clk_put(priv->usb_host_ck); in ohci_hcd_omap_probe()
335 * ohci_hcd_omap_remove - shutdown processing for OMAP-based HCDs
349 dev_dbg(hcd->self.controller, "stopping USB Controller\n"); in ohci_hcd_omap_remove()
352 if (!IS_ERR_OR_NULL(hcd->usb_phy)) { in ohci_hcd_omap_remove()
353 (void) otg_set_host(hcd->usb_phy->otg, 0); in ohci_hcd_omap_remove()
354 usb_put_phy(hcd->usb_phy); in ohci_hcd_omap_remove()
356 iounmap(hcd->regs); in ohci_hcd_omap_remove()
357 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); in ohci_hcd_omap_remove()
358 clk_put(priv->usb_dc_ck); in ohci_hcd_omap_remove()
359 clk_put(priv->usb_host_ck); in ohci_hcd_omap_remove()
364 /*-------------------------------------------------------------------------*/
373 bool do_wakeup = device_may_wakeup(&pdev->dev); in ohci_omap_suspend()
376 if (time_before(jiffies, ohci->next_statechange)) in ohci_omap_suspend()
378 ohci->next_statechange = jiffies; in ohci_omap_suspend()
394 if (time_before(jiffies, ohci->next_statechange)) in ohci_omap_resume()
396 ohci->next_statechange = jiffies; in ohci_omap_resume()
405 /*-------------------------------------------------------------------------*/
408 * Driver definition to register with the OMAP bus
424 .product_desc = "OMAP OHCI",
432 return -ENODEV; in ohci_omap_init()