diff options
author | Felipe Balbi <balbi@ti.com> | 2014-04-16 16:08:29 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-04-16 16:08:29 -0400 |
commit | 3c9f94aca66aa8c83d531961ea8c7b8bace9433c (patch) | |
tree | 4d2a3dfdd7f50a9beb75cf7e851d734453cc91d4 /drivers/usb/dwc3/core.c | |
parent | 687ef9817df7ed960d14575b9033dde3d04631fe (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.c | 120 |
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) | 489 | static int dwc3_core_get_phy(struct dwc3 *dwc) |
490 | |||
491 | static 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 | |||
558 | static 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; |