diff options
author | Octavian Purdila <octavian.purdila@intel.com> | 2015-01-19 06:51:35 -0500 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2015-01-22 10:55:58 -0500 |
commit | ee231aeed9dc43f3755a3d654fb3bafcb11d4e88 (patch) | |
tree | a052aadf7df9002f0b95e2279da1be1c39ad4008 | |
parent | c68a8658a47615f8c07981782ec6bfd90d0d175c (diff) |
mfd: dln2: Add start/stop RX URBs helpers
This is in preparation for adding suspend / resume support.
Signed-off-by: Octavian Purdila <octavian.purdila@intel.com>
Reviewed-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r-- | drivers/mfd/dln2.c | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/drivers/mfd/dln2.c b/drivers/mfd/dln2.c index 6d49685d4ee4..8311820cde45 100644 --- a/drivers/mfd/dln2.c +++ b/drivers/mfd/dln2.c | |||
@@ -587,12 +587,19 @@ static void dln2_free_rx_urbs(struct dln2_dev *dln2) | |||
587 | int i; | 587 | int i; |
588 | 588 | ||
589 | for (i = 0; i < DLN2_MAX_URBS; i++) { | 589 | for (i = 0; i < DLN2_MAX_URBS; i++) { |
590 | usb_kill_urb(dln2->rx_urb[i]); | ||
591 | usb_free_urb(dln2->rx_urb[i]); | 590 | usb_free_urb(dln2->rx_urb[i]); |
592 | kfree(dln2->rx_buf[i]); | 591 | kfree(dln2->rx_buf[i]); |
593 | } | 592 | } |
594 | } | 593 | } |
595 | 594 | ||
595 | static void dln2_stop_rx_urbs(struct dln2_dev *dln2) | ||
596 | { | ||
597 | int i; | ||
598 | |||
599 | for (i = 0; i < DLN2_MAX_URBS; i++) | ||
600 | usb_kill_urb(dln2->rx_urb[i]); | ||
601 | } | ||
602 | |||
596 | static void dln2_free(struct dln2_dev *dln2) | 603 | static void dln2_free(struct dln2_dev *dln2) |
597 | { | 604 | { |
598 | dln2_free_rx_urbs(dln2); | 605 | dln2_free_rx_urbs(dln2); |
@@ -604,9 +611,7 @@ static int dln2_setup_rx_urbs(struct dln2_dev *dln2, | |||
604 | struct usb_host_interface *hostif) | 611 | struct usb_host_interface *hostif) |
605 | { | 612 | { |
606 | int i; | 613 | int i; |
607 | int ret; | ||
608 | const int rx_max_size = DLN2_RX_BUF_SIZE; | 614 | const int rx_max_size = DLN2_RX_BUF_SIZE; |
609 | struct device *dev = &dln2->interface->dev; | ||
610 | 615 | ||
611 | for (i = 0; i < DLN2_MAX_URBS; i++) { | 616 | for (i = 0; i < DLN2_MAX_URBS; i++) { |
612 | dln2->rx_buf[i] = kmalloc(rx_max_size, GFP_KERNEL); | 617 | dln2->rx_buf[i] = kmalloc(rx_max_size, GFP_KERNEL); |
@@ -620,8 +625,19 @@ static int dln2_setup_rx_urbs(struct dln2_dev *dln2, | |||
620 | usb_fill_bulk_urb(dln2->rx_urb[i], dln2->usb_dev, | 625 | usb_fill_bulk_urb(dln2->rx_urb[i], dln2->usb_dev, |
621 | usb_rcvbulkpipe(dln2->usb_dev, dln2->ep_in), | 626 | usb_rcvbulkpipe(dln2->usb_dev, dln2->ep_in), |
622 | dln2->rx_buf[i], rx_max_size, dln2_rx, dln2); | 627 | dln2->rx_buf[i], rx_max_size, dln2_rx, dln2); |
628 | } | ||
629 | |||
630 | return 0; | ||
631 | } | ||
623 | 632 | ||
624 | ret = usb_submit_urb(dln2->rx_urb[i], GFP_KERNEL); | 633 | static int dln2_start_rx_urbs(struct dln2_dev *dln2, gfp_t gfp) |
634 | { | ||
635 | struct device *dev = &dln2->interface->dev; | ||
636 | int ret; | ||
637 | int i; | ||
638 | |||
639 | for (i = 0; i < DLN2_MAX_URBS; i++) { | ||
640 | ret = usb_submit_urb(dln2->rx_urb[i], gfp); | ||
625 | if (ret < 0) { | 641 | if (ret < 0) { |
626 | dev_err(dev, "failed to submit RX URB: %d\n", ret); | 642 | dev_err(dev, "failed to submit RX URB: %d\n", ret); |
627 | return ret; | 643 | return ret; |
@@ -665,9 +681,8 @@ static const struct mfd_cell dln2_devs[] = { | |||
665 | }, | 681 | }, |
666 | }; | 682 | }; |
667 | 683 | ||
668 | static void dln2_disconnect(struct usb_interface *interface) | 684 | static void dln2_stop(struct dln2_dev *dln2) |
669 | { | 685 | { |
670 | struct dln2_dev *dln2 = usb_get_intfdata(interface); | ||
671 | int i, j; | 686 | int i, j; |
672 | 687 | ||
673 | /* don't allow starting new transfers */ | 688 | /* don't allow starting new transfers */ |
@@ -696,6 +711,15 @@ static void dln2_disconnect(struct usb_interface *interface) | |||
696 | /* wait for transfers to end */ | 711 | /* wait for transfers to end */ |
697 | wait_event(dln2->disconnect_wq, !dln2->active_transfers); | 712 | wait_event(dln2->disconnect_wq, !dln2->active_transfers); |
698 | 713 | ||
714 | dln2_stop_rx_urbs(dln2); | ||
715 | } | ||
716 | |||
717 | static void dln2_disconnect(struct usb_interface *interface) | ||
718 | { | ||
719 | struct dln2_dev *dln2 = usb_get_intfdata(interface); | ||
720 | |||
721 | dln2_stop(dln2); | ||
722 | |||
699 | mfd_remove_devices(&interface->dev); | 723 | mfd_remove_devices(&interface->dev); |
700 | 724 | ||
701 | dln2_free(dln2); | 725 | dln2_free(dln2); |
@@ -738,23 +762,30 @@ static int dln2_probe(struct usb_interface *interface, | |||
738 | 762 | ||
739 | ret = dln2_setup_rx_urbs(dln2, hostif); | 763 | ret = dln2_setup_rx_urbs(dln2, hostif); |
740 | if (ret) | 764 | if (ret) |
741 | goto out_cleanup; | 765 | goto out_free; |
766 | |||
767 | ret = dln2_start_rx_urbs(dln2, GFP_KERNEL); | ||
768 | if (ret) | ||
769 | goto out_stop_rx; | ||
742 | 770 | ||
743 | ret = dln2_hw_init(dln2); | 771 | ret = dln2_hw_init(dln2); |
744 | if (ret < 0) { | 772 | if (ret < 0) { |
745 | dev_err(dev, "failed to initialize hardware\n"); | 773 | dev_err(dev, "failed to initialize hardware\n"); |
746 | goto out_cleanup; | 774 | goto out_stop_rx; |
747 | } | 775 | } |
748 | 776 | ||
749 | ret = mfd_add_hotplug_devices(dev, dln2_devs, ARRAY_SIZE(dln2_devs)); | 777 | ret = mfd_add_hotplug_devices(dev, dln2_devs, ARRAY_SIZE(dln2_devs)); |
750 | if (ret != 0) { | 778 | if (ret != 0) { |
751 | dev_err(dev, "failed to add mfd devices to core\n"); | 779 | dev_err(dev, "failed to add mfd devices to core\n"); |
752 | goto out_cleanup; | 780 | goto out_stop_rx; |
753 | } | 781 | } |
754 | 782 | ||
755 | return 0; | 783 | return 0; |
756 | 784 | ||
757 | out_cleanup: | 785 | out_stop_rx: |
786 | dln2_stop_rx_urbs(dln2); | ||
787 | |||
788 | out_free: | ||
758 | dln2_free(dln2); | 789 | dln2_free(dln2); |
759 | 790 | ||
760 | return ret; | 791 | return ret; |