Lines Matching +full:role +full:- +full:switch +full:- +full:default +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0+
6 * Based on ehci-mx6 driver
15 #include <asm-generic/gpio.h>
17 #include <asm/arch/imx-regs.h>
19 #include <asm/mach-imx/iomux-v3.h>
20 #include <asm/mach-imx/regs-usbphy.h>
21 #include <usb/ehci-ci.h>
64 switch (index) { in usb_power_config()
66 pll_ctrl = &anadig->pll3_ctrl; in usb_power_config()
73 pll_ctrl = &anadig->pll7_ctrl; in usb_power_config()
79 default: in usb_power_config()
92 usb_cmd = (void __iomem *)&ehci->usbcmd; in usb_phy_enable()
165 return -EINVAL; in ehci_hcd_init()
173 *hccr = (struct ehci_hccr *)((uint32_t)&ehci->caplength); in ehci_hcd_init()
175 HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase))); in ehci_hcd_init()
179 return -ENODEV; in ehci_hcd_init()
182 setbits_le32(&ehci->usbmode, CM_DEVICE); in ehci_hcd_init()
183 writel((PORT_PTS_UTMI | PORT_PTS_PTW), &ehci->portsc); in ehci_hcd_init()
184 setbits_le32(&ehci->portsc, USB_EN); in ehci_hcd_init()
186 setbits_le32(&ehci->usbmode, CM_HOST); in ehci_hcd_init()
187 writel((PORT_PTS_UTMI | PORT_PTS_PTW), &ehci->portsc); in ehci_hcd_init()
188 setbits_le32(&ehci->portsc, USB_EN); in ehci_hcd_init()
199 /* Possible port types (dual role mode) */
219 const void *dt_blob = gd->fdt_blob; in vf_usb_ofdata_to_platdata()
221 const char *mode; in vf_usb_ofdata_to_platdata() local
223 priv->portnr = dev->seq; in vf_usb_ofdata_to_platdata()
225 priv->ehci = (struct usb_ehci *)devfdt_get_addr(dev); in vf_usb_ofdata_to_platdata()
226 mode = fdt_getprop(dt_blob, node, "dr_mode", NULL); in vf_usb_ofdata_to_platdata()
227 if (mode) { in vf_usb_ofdata_to_platdata()
228 if (0 == strcmp(mode, "host")) { in vf_usb_ofdata_to_platdata()
229 priv->dr_mode = DR_MODE_HOST; in vf_usb_ofdata_to_platdata()
230 priv->init_type = USB_INIT_HOST; in vf_usb_ofdata_to_platdata()
231 } else if (0 == strcmp(mode, "peripheral")) { in vf_usb_ofdata_to_platdata()
232 priv->dr_mode = DR_MODE_DEVICE; in vf_usb_ofdata_to_platdata()
233 priv->init_type = USB_INIT_DEVICE; in vf_usb_ofdata_to_platdata()
234 } else if (0 == strcmp(mode, "otg")) { in vf_usb_ofdata_to_platdata()
235 priv->dr_mode = DR_MODE_OTG; in vf_usb_ofdata_to_platdata()
237 * We set init_type to device by default when OTG in vf_usb_ofdata_to_platdata()
238 * mode is requested. If a valid gpio is provided in vf_usb_ofdata_to_platdata()
239 * we will switch the init_type based on the state in vf_usb_ofdata_to_platdata()
242 priv->init_type = USB_INIT_DEVICE; in vf_usb_ofdata_to_platdata()
245 __func__, mode); in vf_usb_ofdata_to_platdata()
246 return -EINVAL; in vf_usb_ofdata_to_platdata()
249 priv->dr_mode = DR_MODE_HOST; in vf_usb_ofdata_to_platdata()
250 priv->init_type = USB_INIT_HOST; in vf_usb_ofdata_to_platdata()
253 if (priv->dr_mode == DR_MODE_OTG) { in vf_usb_ofdata_to_platdata()
255 "fsl,cdet-gpio", 0, &priv->cdet_gpio, in vf_usb_ofdata_to_platdata()
257 if (dm_gpio_is_valid(&priv->cdet_gpio)) { in vf_usb_ofdata_to_platdata()
258 if (dm_gpio_get_value(&priv->cdet_gpio)) in vf_usb_ofdata_to_platdata()
259 priv->init_type = USB_INIT_DEVICE; in vf_usb_ofdata_to_platdata()
261 priv->init_type = USB_INIT_HOST; in vf_usb_ofdata_to_platdata()
270 struct ehci_vf_priv_data *priv = dev->priv; in vf_init_after_reset()
271 enum usb_init_type type = priv->init_type; in vf_init_after_reset()
272 struct usb_ehci *ehci = priv->ehci; in vf_init_after_reset()
275 ret = ehci_vf_common_init(priv->ehci, priv->portnr); in vf_init_after_reset()
282 setbits_le32(&ehci->usbmode, CM_HOST); in vf_init_after_reset()
283 writel((PORT_PTS_UTMI | PORT_PTS_PTW), &ehci->portsc); in vf_init_after_reset()
284 setbits_le32(&ehci->portsc, USB_EN); in vf_init_after_reset()
305 dev->req_seq = num_controllers; in vf_usb_bind()
315 struct usb_ehci *ehci = priv->ehci; in ehci_usb_probe()
320 ret = ehci_vf_common_init(ehci, priv->portnr); in ehci_usb_probe()
324 if (priv->init_type != plat->init_type) in ehci_usb_probe()
325 return -ENODEV; in ehci_usb_probe()
327 if (priv->init_type == USB_INIT_HOST) { in ehci_usb_probe()
328 setbits_le32(&ehci->usbmode, CM_HOST); in ehci_usb_probe()
329 writel((PORT_PTS_UTMI | PORT_PTS_PTW), &ehci->portsc); in ehci_usb_probe()
330 setbits_le32(&ehci->portsc, USB_EN); in ehci_usb_probe()
335 hccr = (struct ehci_hccr *)((uint32_t)&ehci->caplength); in ehci_usb_probe()
337 HC_LENGTH(ehci_readl(&hccr->cr_capbase))); in ehci_usb_probe()
339 return ehci_register(dev, hccr, hcor, &vf_ehci_ops, 0, priv->init_type); in ehci_usb_probe()
343 { .compatible = "fsl,vf610-usb" },