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 --- |