summaryrefslogtreecommitdiffstats
path: root/drivers/input/joystick/iforce/iforce-usb.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2018-07-26 17:36:36 -0700
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2019-06-22 23:54:38 -0700
commit38d107690df7f0826adb5b53f4e87676859ff0a6 (patch)
treec50a93a2c43c71b4c15ac6d71c07643b78004170 /drivers/input/joystick/iforce/iforce-usb.c
parentf7f3651e0887f536a6854dfcae0c21fc5463b733 (diff)
downloadlinux-38d107690df7f0826adb5b53f4e87676859ff0a6.tar.bz2
Input: iforce - introduce transport ops
In order to tease apart the driver into core and transport modules, let's introduce transport operations and make "xmit" the very first one such operation. Tested-by: Tim Schumacher <timschumi@gmx.de> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/joystick/iforce/iforce-usb.c')
-rw-r--r--drivers/input/joystick/iforce/iforce-usb.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c
index 78073259c9a1..d4f7f34db9a0 100644
--- a/drivers/input/joystick/iforce/iforce-usb.c
+++ b/drivers/input/joystick/iforce/iforce-usb.c
@@ -23,7 +23,7 @@
#include "iforce.h"
-void iforce_usb_xmit(struct iforce *iforce)
+static void __iforce_usb_xmit(struct iforce *iforce)
{
int n, c;
unsigned long flags;
@@ -69,6 +69,16 @@ void iforce_usb_xmit(struct iforce *iforce)
spin_unlock_irqrestore(&iforce->xmit_lock, flags);
}
+static void iforce_usb_xmit(struct iforce *iforce)
+{
+ if (!test_and_set_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags))
+ __iforce_usb_xmit(iforce);
+}
+
+static const struct iforce_xport_ops iforce_usb_xport_ops = {
+ .xmit = iforce_usb_xmit,
+};
+
static void iforce_usb_irq(struct urb *urb)
{
struct iforce *iforce = urb->context;
@@ -113,7 +123,7 @@ static void iforce_usb_out(struct urb *urb)
return;
}
- iforce_usb_xmit(iforce);
+ __iforce_usb_xmit(iforce);
wake_up(&iforce->wait);
}
@@ -155,6 +165,7 @@ static int iforce_usb_probe(struct usb_interface *intf,
if (!(iforce->ctrl = usb_alloc_urb(0, GFP_KERNEL)))
goto fail;
+ iforce->xport_ops = &iforce_usb_xport_ops;
iforce->bus = IFORCE_USB;
iforce->usbdev = dev;
iforce->intf = intf;