core.c (879f99ef2c4c05d9a7f0a67a05f1415663119825) core.c (b09e99ee7c2b7ee80cca128b93b07fb830e6ecad)
1/**
2 * core.c - DesignWare USB3 DRD Controller Core file
3 *
4 * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Authors: Felipe Balbi <balbi@ti.com>,
7 * Sebastian Andrzej Siewior <bigeasy@linutronix.de>
8 *

--- 472 unchanged lines hidden (view full) ---

481{
482 dwc3_free_scratch_buffers(dwc);
483 usb_phy_shutdown(dwc->usb2_phy);
484 usb_phy_shutdown(dwc->usb3_phy);
485 phy_exit(dwc->usb2_generic_phy);
486 phy_exit(dwc->usb3_generic_phy);
487}
488
1/**
2 * core.c - DesignWare USB3 DRD Controller Core file
3 *
4 * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Authors: Felipe Balbi <balbi@ti.com>,
7 * Sebastian Andrzej Siewior <bigeasy@linutronix.de>
8 *

--- 472 unchanged lines hidden (view full) ---

481{
482 dwc3_free_scratch_buffers(dwc);
483 usb_phy_shutdown(dwc->usb2_phy);
484 usb_phy_shutdown(dwc->usb3_phy);
485 phy_exit(dwc->usb2_generic_phy);
486 phy_exit(dwc->usb3_generic_phy);
487}
488
489#define DWC3_ALIGN_MASK (16 - 1)
490
491static int dwc3_probe(struct platform_device *pdev)
489static int dwc3_core_get_phy(struct dwc3 *dwc)
492{
490{
493 struct device *dev = &pdev->dev;
494 struct dwc3_platform_data *pdata = dev_get_platdata(dev);
491 struct device *dev = dwc->dev;
495 struct device_node *node = dev->of_node;
492 struct device_node *node = dev->of_node;
496 struct resource *res;
497 struct dwc3 *dwc;
493 int ret;
498
494
499 int ret = -ENOMEM;
500
501 void __iomem *regs;
502 void *mem;
503
504 mem = devm_kzalloc(dev, sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
505 if (!mem) {
506 dev_err(dev, "not enough memory\n");
507 return -ENOMEM;
508 }
509 dwc = PTR_ALIGN(mem, DWC3_ALIGN_MASK + 1);
510 dwc->mem = mem;
511
512 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
513 if (!res) {
514 dev_err(dev, "missing IRQ\n");
515 return -ENODEV;
516 }
517 dwc->xhci_resources[1].start = res->start;
518 dwc->xhci_resources[1].end = res->end;
519 dwc->xhci_resources[1].flags = res->flags;
520 dwc->xhci_resources[1].name = res->name;
521
522 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
523 if (!res) {
524 dev_err(dev, "missing memory resource\n");
525 return -ENODEV;
526 }
527
528 if (node) {
495 if (node) {
529 dwc->maximum_speed = of_usb_get_maximum_speed(node);
530
531 dwc->usb2_phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 0);
532 dwc->usb3_phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 1);
496 dwc->usb2_phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 0);
497 dwc->usb3_phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 1);
533
534 dwc->needs_fifo_resize = of_property_read_bool(node, "tx-fifo-resize");
535 dwc->dr_mode = of_usb_get_dr_mode(node);
536 } else if (pdata) {
537 dwc->maximum_speed = pdata->maximum_speed;
538
539 dwc->usb2_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
540 dwc->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);
541
542 dwc->needs_fifo_resize = pdata->tx_fifo_resize;
543 dwc->dr_mode = pdata->dr_mode;
544 } else {
545 dwc->usb2_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
546 dwc->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);
547 }
548
498 } else {
499 dwc->usb2_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
500 dwc->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);
501 }
502
549 /* default to superspeed if no maximum_speed passed */
550 if (dwc->maximum_speed == USB_SPEED_UNKNOWN)
551 dwc->maximum_speed = USB_SPEED_SUPER;
552
553 if (IS_ERR(dwc->usb2_phy)) {
554 ret = PTR_ERR(dwc->usb2_phy);
555 if (ret == -ENXIO || ret == -ENODEV) {
556 dwc->usb2_phy = NULL;
557 } else if (ret == -EPROBE_DEFER) {
558 return ret;
559 } else {
560 dev_err(dev, "no usb2 phy configured\n");

--- 34 unchanged lines hidden (view full) ---

595 } else if (ret == -EPROBE_DEFER) {
596 return ret;
597 } else {
598 dev_err(dev, "no usb3 phy configured\n");
599 return ret;
600 }
601 }
602
503 if (IS_ERR(dwc->usb2_phy)) {
504 ret = PTR_ERR(dwc->usb2_phy);
505 if (ret == -ENXIO || ret == -ENODEV) {
506 dwc->usb2_phy = NULL;
507 } else if (ret == -EPROBE_DEFER) {
508 return ret;
509 } else {
510 dev_err(dev, "no usb2 phy configured\n");

--- 34 unchanged lines hidden (view full) ---

545 } else if (ret == -EPROBE_DEFER) {
546 return ret;
547 } else {
548 dev_err(dev, "no usb3 phy configured\n");
549 return ret;
550 }
551 }
552
553 return 0;
554}
555
556static int dwc3_core_init_mode(struct dwc3 *dwc)
557{
558 struct device *dev = dwc->dev;
559 int ret;
560
561 switch (dwc->dr_mode) {
562 case USB_DR_MODE_PERIPHERAL:
563 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
564 ret = dwc3_gadget_init(dwc);
565 if (ret) {
566 dev_err(dev, "failed to initialize gadget\n");
567 return ret;
568 }
569 break;
570 case USB_DR_MODE_HOST:
571 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST);
572 ret = dwc3_host_init(dwc);
573 if (ret) {
574 dev_err(dev, "failed to initialize host\n");
575 return ret;
576 }
577 break;
578 case USB_DR_MODE_OTG:
579 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
580 ret = dwc3_host_init(dwc);
581 if (ret) {
582 dev_err(dev, "failed to initialize host\n");
583 return ret;
584 }
585
586 ret = dwc3_gadget_init(dwc);
587 if (ret) {
588 dev_err(dev, "failed to initialize gadget\n");
589 return ret;
590 }
591 break;
592 default:
593 dev_err(dev, "Unsupported mode of operation %d\n", dwc->dr_mode);
594 return -EINVAL;
595 }
596
597 return 0;
598}
599
600static void dwc3_core_exit_mode(struct dwc3 *dwc)
601{
602 switch (dwc->dr_mode) {
603 case USB_DR_MODE_PERIPHERAL:
604 dwc3_gadget_exit(dwc);
605 break;
606 case USB_DR_MODE_HOST:
607 dwc3_host_exit(dwc);
608 break;
609 case USB_DR_MODE_OTG:
610 dwc3_host_exit(dwc);
611 dwc3_gadget_exit(dwc);
612 break;
613 default:
614 /* do nothing */
615 break;
616 }
617}
618
619#define DWC3_ALIGN_MASK (16 - 1)
620
621static int dwc3_probe(struct platform_device *pdev)
622{
623 struct device *dev = &pdev->dev;
624 struct dwc3_platform_data *pdata = dev_get_platdata(dev);
625 struct device_node *node = dev->of_node;
626 struct resource *res;
627 struct dwc3 *dwc;
628
629 int ret;
630
631 void __iomem *regs;
632 void *mem;
633
634 mem = devm_kzalloc(dev, sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
635 if (!mem) {
636 dev_err(dev, "not enough memory\n");
637 return -ENOMEM;
638 }
639 dwc = PTR_ALIGN(mem, DWC3_ALIGN_MASK + 1);
640 dwc->mem = mem;
641 dwc->dev = dev;
642
643 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
644 if (!res) {
645 dev_err(dev, "missing IRQ\n");
646 return -ENODEV;
647 }
648 dwc->xhci_resources[1].start = res->start;
649 dwc->xhci_resources[1].end = res->end;
650 dwc->xhci_resources[1].flags = res->flags;
651 dwc->xhci_resources[1].name = res->name;
652
653 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
654 if (!res) {
655 dev_err(dev, "missing memory resource\n");
656 return -ENODEV;
657 }
658
659 if (node) {
660 dwc->maximum_speed = of_usb_get_maximum_speed(node);
661
662 dwc->needs_fifo_resize = of_property_read_bool(node, "tx-fifo-resize");
663 dwc->dr_mode = of_usb_get_dr_mode(node);
664 } else if (pdata) {
665 dwc->maximum_speed = pdata->maximum_speed;
666
667 dwc->needs_fifo_resize = pdata->tx_fifo_resize;
668 dwc->dr_mode = pdata->dr_mode;
669 }
670
671 /* default to superspeed if no maximum_speed passed */
672 if (dwc->maximum_speed == USB_SPEED_UNKNOWN)
673 dwc->maximum_speed = USB_SPEED_SUPER;
674
675 ret = dwc3_core_get_phy(dwc);
676 if (ret)
677 return ret;
678
603 dwc->xhci_resources[0].start = res->start;
604 dwc->xhci_resources[0].end = dwc->xhci_resources[0].start +
605 DWC3_XHCI_REGS_END;
606 dwc->xhci_resources[0].flags = res->flags;
607 dwc->xhci_resources[0].name = res->name;
608
609 res->start += DWC3_GLOBALS_REGS_START;
610

--- 5 unchanged lines hidden (view full) ---

616 if (IS_ERR(regs))
617 return PTR_ERR(regs);
618
619 spin_lock_init(&dwc->lock);
620 platform_set_drvdata(pdev, dwc);
621
622 dwc->regs = regs;
623 dwc->regs_size = resource_size(res);
679 dwc->xhci_resources[0].start = res->start;
680 dwc->xhci_resources[0].end = dwc->xhci_resources[0].start +
681 DWC3_XHCI_REGS_END;
682 dwc->xhci_resources[0].flags = res->flags;
683 dwc->xhci_resources[0].name = res->name;
684
685 res->start += DWC3_GLOBALS_REGS_START;
686

--- 5 unchanged lines hidden (view full) ---

692 if (IS_ERR(regs))
693 return PTR_ERR(regs);
694
695 spin_lock_init(&dwc->lock);
696 platform_set_drvdata(pdev, dwc);
697
698 dwc->regs = regs;
699 dwc->regs_size = resource_size(res);
624 dwc->dev = dev;
625
626 dev->dma_mask = dev->parent->dma_mask;
627 dev->dma_parms = dev->parent->dma_parms;
628 dma_set_coherent_mask(dev, dev->parent->coherent_dma_mask);
629
630 pm_runtime_enable(dev);
631 pm_runtime_get_sync(dev);
632 pm_runtime_forbid(dev);

--- 32 unchanged lines hidden (view full) ---

665 goto err_usb2phy_power;
666
667 ret = dwc3_event_buffers_setup(dwc);
668 if (ret) {
669 dev_err(dwc->dev, "failed to setup event buffers\n");
670 goto err_usb3phy_power;
671 }
672
700
701 dev->dma_mask = dev->parent->dma_mask;
702 dev->dma_parms = dev->parent->dma_parms;
703 dma_set_coherent_mask(dev, dev->parent->coherent_dma_mask);
704
705 pm_runtime_enable(dev);
706 pm_runtime_get_sync(dev);
707 pm_runtime_forbid(dev);

--- 32 unchanged lines hidden (view full) ---

740 goto err_usb2phy_power;
741
742 ret = dwc3_event_buffers_setup(dwc);
743 if (ret) {
744 dev_err(dwc->dev, "failed to setup event buffers\n");
745 goto err_usb3phy_power;
746 }
747
673 switch (dwc->dr_mode) {
674 case USB_DR_MODE_PERIPHERAL:
675 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
676 ret = dwc3_gadget_init(dwc);
677 if (ret) {
678 dev_err(dev, "failed to initialize gadget\n");
679 goto err2;
680 }
681 break;
682 case USB_DR_MODE_HOST:
683 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST);
684 ret = dwc3_host_init(dwc);
685 if (ret) {
686 dev_err(dev, "failed to initialize host\n");
687 goto err2;
688 }
689 break;
690 case USB_DR_MODE_OTG:
691 dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
692 ret = dwc3_host_init(dwc);
693 if (ret) {
694 dev_err(dev, "failed to initialize host\n");
695 goto err2;
696 }
697
698 ret = dwc3_gadget_init(dwc);
699 if (ret) {
700 dev_err(dev, "failed to initialize gadget\n");
701 goto err2;
702 }
703 break;
704 default:
705 dev_err(dev, "Unsupported mode of operation %d\n", dwc->dr_mode);
748 ret = dwc3_core_init_mode(dwc);
749 if (ret)
706 goto err2;
750 goto err2;
707 }
708
709 ret = dwc3_debugfs_init(dwc);
710 if (ret) {
711 dev_err(dev, "failed to initialize debugfs\n");
712 goto err3;
713 }
714
715 pm_runtime_allow(dev);
716
717 return 0;
718
719err3:
751
752 ret = dwc3_debugfs_init(dwc);
753 if (ret) {
754 dev_err(dev, "failed to initialize debugfs\n");
755 goto err3;
756 }
757
758 pm_runtime_allow(dev);
759
760 return 0;
761
762err3:
720 switch (dwc->dr_mode) {
721 case USB_DR_MODE_PERIPHERAL:
722 dwc3_gadget_exit(dwc);
723 break;
724 case USB_DR_MODE_HOST:
725 dwc3_host_exit(dwc);
726 break;
727 case USB_DR_MODE_OTG:
728 dwc3_host_exit(dwc);
729 dwc3_gadget_exit(dwc);
730 break;
731 default:
732 /* do nothing */
733 break;
734 }
763 dwc3_core_exit_mode(dwc);
735
736err2:
737 dwc3_event_buffers_cleanup(dwc);
738
739err_usb3phy_power:
740 phy_power_off(dwc->usb3_generic_phy);
741
742err_usb2phy_power:

--- 18 unchanged lines hidden (view full) ---

761 usb_phy_set_suspend(dwc->usb3_phy, 1);
762 phy_power_off(dwc->usb2_generic_phy);
763 phy_power_off(dwc->usb3_generic_phy);
764
765 pm_runtime_put_sync(&pdev->dev);
766 pm_runtime_disable(&pdev->dev);
767
768 dwc3_debugfs_exit(dwc);
764
765err2:
766 dwc3_event_buffers_cleanup(dwc);
767
768err_usb3phy_power:
769 phy_power_off(dwc->usb3_generic_phy);
770
771err_usb2phy_power:

--- 18 unchanged lines hidden (view full) ---

790 usb_phy_set_suspend(dwc->usb3_phy, 1);
791 phy_power_off(dwc->usb2_generic_phy);
792 phy_power_off(dwc->usb3_generic_phy);
793
794 pm_runtime_put_sync(&pdev->dev);
795 pm_runtime_disable(&pdev->dev);
796
797 dwc3_debugfs_exit(dwc);
769
770 switch (dwc->dr_mode) {
771 case USB_DR_MODE_PERIPHERAL:
772 dwc3_gadget_exit(dwc);
773 break;
774 case USB_DR_MODE_HOST:
775 dwc3_host_exit(dwc);
776 break;
777 case USB_DR_MODE_OTG:
778 dwc3_host_exit(dwc);
779 dwc3_gadget_exit(dwc);
780 break;
781 default:
782 /* do nothing */
783 break;
784 }
785
798 dwc3_core_exit_mode(dwc);
786 dwc3_event_buffers_cleanup(dwc);
787 dwc3_free_event_buffers(dwc);
788 dwc3_core_exit(dwc);
789
790 return 0;
791}
792
793#ifdef CONFIG_PM_SLEEP

--- 22 unchanged lines hidden (view full) ---

816
817static void dwc3_complete(struct device *dev)
818{
819 struct dwc3 *dwc = dev_get_drvdata(dev);
820 unsigned long flags;
821
822 spin_lock_irqsave(&dwc->lock, flags);
823
799 dwc3_event_buffers_cleanup(dwc);
800 dwc3_free_event_buffers(dwc);
801 dwc3_core_exit(dwc);
802
803 return 0;
804}
805
806#ifdef CONFIG_PM_SLEEP

--- 22 unchanged lines hidden (view full) ---

829
830static void dwc3_complete(struct device *dev)
831{
832 struct dwc3 *dwc = dev_get_drvdata(dev);
833 unsigned long flags;
834
835 spin_lock_irqsave(&dwc->lock, flags);
836
824 dwc3_event_buffers_setup(dwc);
825 switch (dwc->dr_mode) {
826 case USB_DR_MODE_PERIPHERAL:
827 case USB_DR_MODE_OTG:
828 dwc3_gadget_complete(dwc);
829 /* FALLTHROUGH */
830 case USB_DR_MODE_HOST:
831 default:
837 switch (dwc->dr_mode) {
838 case USB_DR_MODE_PERIPHERAL:
839 case USB_DR_MODE_OTG:
840 dwc3_gadget_complete(dwc);
841 /* FALLTHROUGH */
842 case USB_DR_MODE_HOST:
843 default:
844 dwc3_event_buffers_setup(dwc);
832 break;
833 }
834
835 spin_unlock_irqrestore(&dwc->lock, flags);
836}
837
838static int dwc3_suspend(struct device *dev)
839{

--- 113 unchanged lines hidden ---
845 break;
846 }
847
848 spin_unlock_irqrestore(&dwc->lock, flags);
849}
850
851static int dwc3_suspend(struct device *dev)
852{

--- 113 unchanged lines hidden ---