1 // SPDX-License-Identifier: GPL-2.0
3 * Cadence USBSS DRD Driver.
5 * Copyright (C) 2018-2019 Cadence.
6 * Copyright (C) 2017-2018 NXP
7 * Copyright (C) 2019 Texas Instruments
14 #include <linux/dma-mapping.h>
15 #include <linux/module.h>
16 #include <linux/kernel.h>
17 #include <linux/platform_device.h>
18 #include <linux/interrupt.h>
20 #include <linux/pm_runtime.h>
24 #include "host-export.h"
25 #include "gadget-export.h"
28 static int cdns3_idle_init(struct cdns3 *cdns);
31 struct cdns3_role_driver *cdns3_get_current_role_driver(struct cdns3 *cdns)
33 WARN_ON(!cdns->roles[cdns->role]);
34 return cdns->roles[cdns->role];
37 static int cdns3_role_start(struct cdns3 *cdns, enum usb_role role)
41 if (WARN_ON(role > USB_ROLE_DEVICE))
44 mutex_lock(&cdns->mutex);
46 mutex_unlock(&cdns->mutex);
48 if (!cdns->roles[role])
51 if (cdns->roles[role]->state == CDNS3_ROLE_STATE_ACTIVE)
54 mutex_lock(&cdns->mutex);
55 ret = cdns->roles[role]->start(cdns);
57 cdns->roles[role]->state = CDNS3_ROLE_STATE_ACTIVE;
58 mutex_unlock(&cdns->mutex);
63 static void cdns3_role_stop(struct cdns3 *cdns)
65 enum usb_role role = cdns->role;
67 if (WARN_ON(role > USB_ROLE_DEVICE))
70 if (cdns->roles[role]->state == CDNS3_ROLE_STATE_INACTIVE)
73 mutex_lock(&cdns->mutex);
74 cdns->roles[role]->stop(cdns);
75 cdns->roles[role]->state = CDNS3_ROLE_STATE_INACTIVE;
76 mutex_unlock(&cdns->mutex);
79 static void cdns3_exit_roles(struct cdns3 *cdns)
81 cdns3_role_stop(cdns);
85 static enum usb_role cdsn3_hw_role_state_machine(struct cdns3 *cdns);
88 * cdns3_core_init_role - initialize role of operation
89 * @cdns: Pointer to cdns3 structure
91 * Returns 0 on success otherwise negative errno
93 static int cdns3_core_init_role(struct cdns3 *cdns)
95 struct device *dev = cdns->dev;
96 enum usb_dr_mode best_dr_mode;
97 enum usb_dr_mode dr_mode;
100 dr_mode = usb_get_dr_mode(dev);
101 cdns->role = USB_ROLE_NONE;
104 * If driver can't read mode by means of usb_get_dr_mode function then
105 * chooses mode according with Kernel configuration. This setting
106 * can be restricted later depending on strap pin configuration.
108 if (dr_mode == USB_DR_MODE_UNKNOWN) {
109 if (IS_ENABLED(CONFIG_USB_CDNS3_HOST) &&
110 IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
111 dr_mode = USB_DR_MODE_OTG;
112 else if (IS_ENABLED(CONFIG_USB_CDNS3_HOST))
113 dr_mode = USB_DR_MODE_HOST;
114 else if (IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
115 dr_mode = USB_DR_MODE_PERIPHERAL;
119 * At this point cdns->dr_mode contains strap configuration.
120 * Driver try update this setting considering kernel configuration
122 best_dr_mode = cdns->dr_mode;
124 ret = cdns3_idle_init(cdns);
128 if (dr_mode == USB_DR_MODE_OTG) {
129 best_dr_mode = cdns->dr_mode;
130 } else if (cdns->dr_mode == USB_DR_MODE_OTG) {
131 best_dr_mode = dr_mode;
132 } else if (cdns->dr_mode != dr_mode) {
133 dev_err(dev, "Incorrect DRD configuration\n");
137 dr_mode = best_dr_mode;
139 if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_HOST) {
140 ret = cdns3_host_init(cdns);
142 dev_err(dev, "Host initialization failed with %d\n",
148 if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_PERIPHERAL) {
149 ret = cdns3_gadget_init(cdns);
151 dev_err(dev, "Device initialization failed with %d\n",
157 cdns->dr_mode = dr_mode;
159 ret = cdns3_drd_update_mode(cdns);
163 /* Initialize idle role to start with */
164 ret = cdns3_role_start(cdns, USB_ROLE_NONE);
168 switch (cdns->dr_mode) {
169 case USB_DR_MODE_UNKNOWN:
170 case USB_DR_MODE_OTG:
171 ret = cdns3_hw_role_switch(cdns);
175 case USB_DR_MODE_PERIPHERAL:
176 ret = cdns3_role_start(cdns, USB_ROLE_DEVICE);
180 case USB_DR_MODE_HOST:
181 ret = cdns3_role_start(cdns, USB_ROLE_HOST);
189 cdns3_exit_roles(cdns);
194 * cdsn3_hw_role_state_machine - role switch state machine based on hw events.
195 * @cdns: Pointer to controller structure.
197 * Returns next role to be entered based on hw events.
199 static enum usb_role cdsn3_hw_role_state_machine(struct cdns3 *cdns)
204 if (cdns->dr_mode != USB_DR_MODE_OTG)
207 id = cdns3_get_id(cdns);
208 vbus = cdns3_get_vbus(cdns);
211 * Role change state machine
213 * Previous state: cdns->role
221 * Driver treats USB_ROLE_NONE synonymous to IDLE state from
222 * controller specification.
225 role = USB_ROLE_HOST;
227 role = USB_ROLE_DEVICE;
229 case USB_ROLE_HOST: /* from HOST, we can only change to NONE */
231 role = USB_ROLE_NONE;
233 case USB_ROLE_DEVICE: /* from GADGET, we can only change to NONE*/
235 role = USB_ROLE_NONE;
239 dev_dbg(cdns->dev, "role %d -> %d\n", cdns->role, role);
244 if (cdns3_is_host(cdns))
245 role = USB_ROLE_HOST;
246 if (cdns3_is_device(cdns))
247 role = USB_ROLE_DEVICE;
252 static int cdns3_idle_role_start(struct cdns3 *cdns)
257 static void cdns3_idle_role_stop(struct cdns3 *cdns)
259 /* Program Lane swap and bring PHY out of RESET */
260 phy_reset(cdns->usb3_phy);
263 static int cdns3_idle_init(struct cdns3 *cdns)
265 struct cdns3_role_driver *rdrv;
267 rdrv = devm_kzalloc(cdns->dev, sizeof(*rdrv), GFP_KERNEL);
271 rdrv->start = cdns3_idle_role_start;
272 rdrv->stop = cdns3_idle_role_stop;
273 rdrv->state = CDNS3_ROLE_STATE_INACTIVE;
274 rdrv->suspend = NULL;
278 cdns->roles[USB_ROLE_NONE] = rdrv;
284 * cdns3_hw_role_switch - switch roles based on HW state
287 int cdns3_hw_role_switch(struct cdns3 *cdns)
289 enum usb_role real_role, current_role;
292 /* Do nothing if role based on syfs. */
293 if (cdns->role_override)
296 pm_runtime_get_sync(cdns->dev);
298 current_role = cdns->role;
299 real_role = cdsn3_hw_role_state_machine(cdns);
301 /* Do nothing if nothing changed */
302 if (current_role == real_role)
305 cdns3_role_stop(cdns);
307 dev_dbg(cdns->dev, "Switching role %d -> %d", current_role, real_role);
309 ret = cdns3_role_start(cdns, real_role);
311 /* Back to current role */
312 dev_err(cdns->dev, "set %d has failed, back to %d\n",
313 real_role, current_role);
314 ret = cdns3_role_start(cdns, current_role);
316 dev_err(cdns->dev, "back to %d failed too\n",
320 pm_runtime_put_sync(cdns->dev);
325 * cdsn3_role_get - get current role of controller.
327 * @dev: Pointer to device structure
331 static enum usb_role cdns3_role_get(struct device *dev)
333 struct cdns3 *cdns = dev_get_drvdata(dev);
339 * cdns3_role_set - set current role of controller.
341 * @dev: pointer to device object
342 * @role - the previous role
343 * Handles below events:
344 * - Role switch for dual-role devices
345 * - USB_ROLE_GADGET <--> USB_ROLE_NONE for peripheral-only devices
347 static int cdns3_role_set(struct device *dev, enum usb_role role)
349 struct cdns3 *cdns = dev_get_drvdata(dev);
352 pm_runtime_get_sync(cdns->dev);
355 * FIXME: switch role framework should be extended to meet
356 * requirements. Driver assumes that role can be controlled
357 * by SW or HW. Temporary workaround is to use USB_ROLE_NONE to
358 * switch from SW to HW control.
360 * For dr_mode == USB_DR_MODE_OTG:
361 * if user sets USB_ROLE_HOST or USB_ROLE_DEVICE then driver
362 * sets role_override flag and forces that role.
363 * if user sets USB_ROLE_NONE, driver clears role_override and lets
364 * HW state machine take over.
366 * For dr_mode != USB_DR_MODE_OTG:
368 * 1. Restricted user control between NONE and dr_mode.
369 * 2. Driver doesn't need to rely on role_override flag.
370 * 3. Driver needs to ensure that HW state machine is never called
371 * if dr_mode != USB_DR_MODE_OTG.
373 if (role == USB_ROLE_NONE)
374 cdns->role_override = 0;
376 cdns->role_override = 1;
379 * HW state might have changed so driver need to trigger
380 * HW state machine if dr_mode == USB_DR_MODE_OTG.
382 if (!cdns->role_override && cdns->dr_mode == USB_DR_MODE_OTG) {
383 cdns3_hw_role_switch(cdns);
387 if (cdns->role == role)
390 if (cdns->dr_mode == USB_DR_MODE_HOST) {
401 if (cdns->dr_mode == USB_DR_MODE_PERIPHERAL) {
404 case USB_ROLE_DEVICE:
412 cdns3_role_stop(cdns);
413 ret = cdns3_role_start(cdns, role);
415 dev_err(cdns->dev, "set role %d has failed\n", role);
420 pm_runtime_put_sync(cdns->dev);
424 static const struct usb_role_switch_desc cdns3_switch_desc = {
425 .set = cdns3_role_set,
426 .get = cdns3_role_get,
427 .allow_userspace_control = true,
431 * cdns3_probe - probe for cdns3 core device
432 * @pdev: Pointer to cdns3 core platform device
434 * Returns 0 on success otherwise negative errno
436 static int cdns3_probe(struct platform_device *pdev)
438 struct device *dev = &pdev->dev;
439 struct resource *res;
444 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
446 dev_err(dev, "error setting dma mask: %d\n", ret);
450 cdns = devm_kzalloc(dev, sizeof(*cdns), GFP_KERNEL);
456 platform_set_drvdata(pdev, cdns);
458 res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "host");
460 dev_err(dev, "missing host IRQ\n");
464 cdns->xhci_res[0] = *res;
466 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "xhci");
468 dev_err(dev, "couldn't get xhci resource\n");
472 cdns->xhci_res[1] = *res;
474 cdns->dev_irq = platform_get_irq_byname(pdev, "peripheral");
475 if (cdns->dev_irq == -EPROBE_DEFER)
476 return cdns->dev_irq;
478 if (cdns->dev_irq < 0)
479 dev_err(dev, "couldn't get peripheral irq\n");
481 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dev");
482 regs = devm_ioremap_resource(dev, res);
484 return PTR_ERR(regs);
485 cdns->dev_regs = regs;
487 cdns->otg_irq = platform_get_irq_byname(pdev, "otg");
488 if (cdns->otg_irq == -EPROBE_DEFER)
489 return cdns->otg_irq;
491 if (cdns->otg_irq < 0) {
492 dev_err(dev, "couldn't get otg irq\n");
493 return cdns->otg_irq;
496 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "otg");
498 dev_err(dev, "couldn't get otg resource\n");
502 cdns->otg_res = *res;
504 mutex_init(&cdns->mutex);
506 cdns->usb2_phy = devm_phy_optional_get(dev, "cdns3,usb2-phy");
507 if (IS_ERR(cdns->usb2_phy))
508 return PTR_ERR(cdns->usb2_phy);
510 ret = phy_init(cdns->usb2_phy);
514 cdns->usb3_phy = devm_phy_optional_get(dev, "cdns3,usb3-phy");
515 if (IS_ERR(cdns->usb3_phy))
516 return PTR_ERR(cdns->usb3_phy);
518 ret = phy_init(cdns->usb3_phy);
522 ret = phy_power_on(cdns->usb2_phy);
526 ret = phy_power_on(cdns->usb3_phy);
530 cdns->role_sw = usb_role_switch_register(dev, &cdns3_switch_desc);
531 if (IS_ERR(cdns->role_sw)) {
532 ret = PTR_ERR(cdns->role_sw);
533 dev_warn(dev, "Unable to register Role Switch\n");
537 ret = cdns3_drd_init(cdns);
541 ret = cdns3_core_init_role(cdns);
545 device_set_wakeup_capable(dev, true);
546 pm_runtime_set_active(dev);
547 pm_runtime_enable(dev);
550 * The controller needs less time between bus and controller suspend,
551 * and we also needs a small delay to avoid frequently entering low
554 pm_runtime_set_autosuspend_delay(dev, 20);
555 pm_runtime_mark_last_busy(dev);
556 pm_runtime_use_autosuspend(dev);
557 dev_dbg(dev, "Cadence USB3 core: probe succeed\n");
561 cdns3_drd_exit(cdns);
562 usb_role_switch_unregister(cdns->role_sw);
564 phy_power_off(cdns->usb3_phy);
567 phy_power_off(cdns->usb2_phy);
569 phy_exit(cdns->usb3_phy);
571 phy_exit(cdns->usb2_phy);
577 * cdns3_remove - unbind drd driver and clean up
578 * @pdev: Pointer to Linux platform device
580 * Returns 0 on success otherwise negative errno
582 static int cdns3_remove(struct platform_device *pdev)
584 struct cdns3 *cdns = platform_get_drvdata(pdev);
586 pm_runtime_get_sync(&pdev->dev);
587 pm_runtime_disable(&pdev->dev);
588 pm_runtime_put_noidle(&pdev->dev);
589 cdns3_exit_roles(cdns);
590 usb_role_switch_unregister(cdns->role_sw);
591 phy_power_off(cdns->usb2_phy);
592 phy_power_off(cdns->usb3_phy);
593 phy_exit(cdns->usb2_phy);
594 phy_exit(cdns->usb3_phy);
598 #ifdef CONFIG_PM_SLEEP
600 static int cdns3_suspend(struct device *dev)
602 struct cdns3 *cdns = dev_get_drvdata(dev);
605 if (cdns->role == USB_ROLE_HOST)
608 if (pm_runtime_status_suspended(dev))
609 pm_runtime_resume(dev);
611 if (cdns->roles[cdns->role]->suspend) {
612 spin_lock_irqsave(&cdns->gadget_dev->lock, flags);
613 cdns->roles[cdns->role]->suspend(cdns, false);
614 spin_unlock_irqrestore(&cdns->gadget_dev->lock, flags);
620 static int cdns3_resume(struct device *dev)
622 struct cdns3 *cdns = dev_get_drvdata(dev);
625 if (cdns->role == USB_ROLE_HOST)
628 if (cdns->roles[cdns->role]->resume) {
629 spin_lock_irqsave(&cdns->gadget_dev->lock, flags);
630 cdns->roles[cdns->role]->resume(cdns, false);
631 spin_unlock_irqrestore(&cdns->gadget_dev->lock, flags);
634 pm_runtime_disable(dev);
635 pm_runtime_set_active(dev);
636 pm_runtime_enable(dev);
642 static const struct dev_pm_ops cdns3_pm_ops = {
643 SET_SYSTEM_SLEEP_PM_OPS(cdns3_suspend, cdns3_resume)
647 static const struct of_device_id of_cdns3_match[] = {
648 { .compatible = "cdns,usb3" },
651 MODULE_DEVICE_TABLE(of, of_cdns3_match);
654 static struct platform_driver cdns3_driver = {
655 .probe = cdns3_probe,
656 .remove = cdns3_remove,
659 .of_match_table = of_match_ptr(of_cdns3_match),
664 module_platform_driver(cdns3_driver);
666 MODULE_ALIAS("platform:cdns3");
668 MODULE_LICENSE("GPL v2");
669 MODULE_DESCRIPTION("Cadence USB3 DRD Controller Driver");