Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Octavian Purdila and committed by
Lee Jones
ee231aee c68a8658

+41 -10
+41 -10
drivers/mfd/dln2.c
··· 587 587 int i; 588 588 589 589 for (i = 0; i < DLN2_MAX_URBS; i++) { 590 - usb_kill_urb(dln2->rx_urb[i]); 591 590 usb_free_urb(dln2->rx_urb[i]); 592 591 kfree(dln2->rx_buf[i]); 593 592 } 593 + } 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]); 594 601 } 595 602 596 603 static void dln2_free(struct dln2_dev *dln2) ··· 611 604 struct usb_host_interface *hostif) 612 605 { 613 606 int i; 614 - int ret; 615 607 const int rx_max_size = DLN2_RX_BUF_SIZE; 616 - struct device *dev = &dln2->interface->dev; 617 608 618 609 for (i = 0; i < DLN2_MAX_URBS; i++) { 619 610 dln2->rx_buf[i] = kmalloc(rx_max_size, GFP_KERNEL); ··· 625 620 usb_fill_bulk_urb(dln2->rx_urb[i], dln2->usb_dev, 626 621 usb_rcvbulkpipe(dln2->usb_dev, dln2->ep_in), 627 622 dln2->rx_buf[i], rx_max_size, dln2_rx, dln2); 623 + } 628 624 629 - ret = usb_submit_urb(dln2->rx_urb[i], GFP_KERNEL); 625 + return 0; 626 + } 627 + 628 + static int dln2_start_rx_urbs(struct dln2_dev *dln2, gfp_t gfp) 629 + { 630 + struct device *dev = &dln2->interface->dev; 631 + int ret; 632 + int i; 633 + 634 + for (i = 0; i < DLN2_MAX_URBS; i++) { 635 + ret = usb_submit_urb(dln2->rx_urb[i], gfp); 630 636 if (ret < 0) { 631 637 dev_err(dev, "failed to submit RX URB: %d\n", ret); 632 638 return ret; ··· 681 665 }, 682 666 }; 683 667 684 - static void dln2_disconnect(struct usb_interface *interface) 668 + static void dln2_stop(struct dln2_dev *dln2) 685 669 { 686 - struct dln2_dev *dln2 = usb_get_intfdata(interface); 687 670 int i, j; 688 671 689 672 /* don't allow starting new transfers */ ··· 710 695 711 696 /* wait for transfers to end */ 712 697 wait_event(dln2->disconnect_wq, !dln2->active_transfers); 698 + 699 + dln2_stop_rx_urbs(dln2); 700 + } 701 + 702 + static void dln2_disconnect(struct usb_interface *interface) 703 + { 704 + struct dln2_dev *dln2 = usb_get_intfdata(interface); 705 + 706 + dln2_stop(dln2); 713 707 714 708 mfd_remove_devices(&interface->dev); 715 709 ··· 762 738 763 739 ret = dln2_setup_rx_urbs(dln2, hostif); 764 740 if (ret) 765 - goto out_cleanup; 741 + goto out_free; 742 + 743 + ret = dln2_start_rx_urbs(dln2, GFP_KERNEL); 744 + if (ret) 745 + goto out_stop_rx; 766 746 767 747 ret = dln2_hw_init(dln2); 768 748 if (ret < 0) { 769 749 dev_err(dev, "failed to initialize hardware\n"); 770 - goto out_cleanup; 750 + goto out_stop_rx; 771 751 } 772 752 773 753 ret = mfd_add_hotplug_devices(dev, dln2_devs, ARRAY_SIZE(dln2_devs)); 774 754 if (ret != 0) { 775 755 dev_err(dev, "failed to add mfd devices to core\n"); 776 - goto out_cleanup; 756 + goto out_stop_rx; 777 757 } 778 758 779 759 return 0; 780 760 781 - out_cleanup: 761 + out_stop_rx: 762 + dln2_stop_rx_urbs(dln2); 763 + 764 + out_free: 782 765 dln2_free(dln2); 783 766 784 767 return ret;