aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3/core.c
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2014-04-16 16:08:29 -0400
committerFelipe Balbi <balbi@ti.com>2014-04-16 16:08:29 -0400
commit3c9f94aca66aa8c83d531961ea8c7b8bace9433c (patch)
tree4d2a3dfdd7f50a9beb75cf7e851d734453cc91d4 /drivers/usb/dwc3/core.c
parent687ef9817df7ed960d14575b9033dde3d04631fe (diff)
usb: dwc3: core: refactor PHY initialization
our probe() routine is too large and we can easily refactor PHY-related code out to another function to make it slightly less painful to read. Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc3/core.c')
-rw-r--r--drivers/usb/dwc3/core.c120
1 files changed, 66 insertions, 54 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index d001417e8e37..38976f3123d3 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -486,70 +486,20 @@ static void dwc3_core_exit(struct dwc3 *dwc)
486 phy_exit(dwc->usb3_generic_phy); 486 phy_exit(dwc->usb3_generic_phy);
487} 487}
488 488
489#define DWC3_ALIGN_MASK (16 - 1) 489static int dwc3_core_get_phy(struct dwc3 *dwc)
490
491static int dwc3_probe(struct platform_device *pdev)
492{ 490{
493 struct device *dev = &pdev->dev; 491 struct device *dev = dwc->dev;
494 struct dwc3_platform_data *pdata = dev_get_platdata(dev);
495 struct device_node *node = dev->of_node; 492 struct device_node *node = dev->of_node;
496 struct resource *res; 493 int ret;
497 struct dwc3 *dwc;
498
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 494
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); 496 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); 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 { 498 } else {
545 dwc->usb2_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); 499 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); 500 dwc->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);
547 } 501 }
548 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)) { 503 if (IS_ERR(dwc->usb2_phy)) {
554 ret = PTR_ERR(dwc->usb2_phy); 504 ret = PTR_ERR(dwc->usb2_phy);
555 if (ret == -ENXIO || ret == -ENODEV) { 505 if (ret == -ENXIO || ret == -ENODEV) {
@@ -600,6 +550,69 @@ static int dwc3_probe(struct platform_device *pdev)
600 } 550 }
601 } 551 }
602 552
553 return 0;
554}
555
556#define DWC3_ALIGN_MASK (16 - 1)
557
558static int dwc3_probe(struct platform_device *pdev)
559{
560 struct device *dev = &pdev->dev;
561 struct dwc3_platform_data *pdata = dev_get_platdata(dev);
562 struct device_node *node = dev->of_node;
563 struct resource *res;
564 struct dwc3 *dwc;
565
566 int ret = -ENOMEM;
567
568 void __iomem *regs;
569 void *mem;
570
571 mem = devm_kzalloc(dev, sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
572 if (!mem) {
573 dev_err(dev, "not enough memory\n");
574 return -ENOMEM;
575 }
576 dwc = PTR_ALIGN(mem, DWC3_ALIGN_MASK + 1);
577 dwc->mem = mem;
578 dwc->dev = dev;
579
580 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
581 if (!res) {
582 dev_err(dev, "missing IRQ\n");
583 return -ENODEV;
584 }
585 dwc->xhci_resources[1].start = res->start;
586 dwc->xhci_resources[1].end = res->end;
587 dwc->xhci_resources[1].flags = res->flags;
588 dwc->xhci_resources[1].name = res->name;
589
590 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
591 if (!res) {
592 dev_err(dev, "missing memory resource\n");
593 return -ENODEV;
594 }
595
596 if (node) {
597 dwc->maximum_speed = of_usb_get_maximum_speed(node);
598
599 dwc->needs_fifo_resize = of_property_read_bool(node, "tx-fifo-resize");
600 dwc->dr_mode = of_usb_get_dr_mode(node);
601 } else if (pdata) {
602 dwc->maximum_speed = pdata->maximum_speed;
603
604 dwc->needs_fifo_resize = pdata->tx_fifo_resize;
605 dwc->dr_mode = pdata->dr_mode;
606 }
607
608 /* default to superspeed if no maximum_speed passed */
609 if (dwc->maximum_speed == USB_SPEED_UNKNOWN)
610 dwc->maximum_speed = USB_SPEED_SUPER;
611
612 ret = dwc3_core_get_phy(dwc);
613 if (ret)
614 return ret;
615
603 dwc->xhci_resources[0].start = res->start; 616 dwc->xhci_resources[0].start = res->start;
604 dwc->xhci_resources[0].end = dwc->xhci_resources[0].start + 617 dwc->xhci_resources[0].end = dwc->xhci_resources[0].start +
605 DWC3_XHCI_REGS_END; 618 DWC3_XHCI_REGS_END;
@@ -621,7 +634,6 @@ static int dwc3_probe(struct platform_device *pdev)
621 634
622 dwc->regs = regs; 635 dwc->regs = regs;
623 dwc->regs_size = resource_size(res); 636 dwc->regs_size = resource_size(res);
624 dwc->dev = dev;
625 637
626 dev->dma_mask = dev->parent->dma_mask; 638 dev->dma_mask = dev->parent->dma_mask;
627 dev->dma_parms = dev->parent->dma_parms; 639 dev->dma_parms = dev->parent->dma_parms;