]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
Input: iforce - introduce transport ops
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 27 Jul 2018 00:36:36 +0000 (17:36 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 23 Jun 2019 06:54:38 +0000 (23:54 -0700)
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>
drivers/input/joystick/iforce/iforce-packets.c
drivers/input/joystick/iforce/iforce-serio.c
drivers/input/joystick/iforce/iforce-usb.c
drivers/input/joystick/iforce/iforce.h

index 91893c751524a10dc7095c0bd03ae001b9b05d3d..b8ca9bdfdef81f57c2dc161b5b1e4d649844af0f 100644 (file)
@@ -91,25 +91,9 @@ int iforce_send_packet(struct iforce *iforce, u16 cmd, unsigned char* data)
 /*
  * If necessary, start the transmission
  */
-       switch (iforce->bus) {
-
-#ifdef CONFIG_JOYSTICK_IFORCE_232
-               case IFORCE_232:
-               if (empty)
-                       iforce_serial_xmit(iforce);
-               break;
-#endif
-#ifdef CONFIG_JOYSTICK_IFORCE_USB
-               case IFORCE_USB:
+       if (empty)
+               iforce->xport_ops->xmit(iforce);
 
-               if (iforce->usbdev && empty &&
-                       !test_and_set_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags)) {
-
-                       iforce_usb_xmit(iforce);
-               }
-               break;
-#endif
-       }
        return 0;
 }
 
index f4ba4a751fe033e376eceabca4d51b7ba011d9a3..c9469209f99492d8d61c3248e6472deb994ed3b6 100644 (file)
@@ -23,7 +23,7 @@
 
 #include "iforce.h"
 
-void iforce_serial_xmit(struct iforce *iforce)
+static void iforce_serio_xmit(struct iforce *iforce)
 {
        unsigned char cs;
        int i;
@@ -67,11 +67,15 @@ again:
        spin_unlock_irqrestore(&iforce->xmit_lock, flags);
 }
 
+static const struct iforce_xport_ops iforce_serio_xport_ops = {
+       .xmit           = iforce_serio_xmit,
+};
+
 static void iforce_serio_write_wakeup(struct serio *serio)
 {
        struct iforce *iforce = serio_get_drvdata(serio);
 
-       iforce_serial_xmit(iforce);
+       iforce_serio_xmit(iforce);
 }
 
 static irqreturn_t iforce_serio_irq(struct serio *serio,
@@ -129,6 +133,7 @@ static int iforce_serio_connect(struct serio *serio, struct serio_driver *drv)
        if (!iforce)
                return -ENOMEM;
 
+       iforce->xport_ops = &iforce_serio_xport_ops;
        iforce->bus = IFORCE_232;
        iforce->serio = serio;
 
index 78073259c9a1ad3d49575379e675239566ea295c..d4f7f34db9a0dbf5edd54f12443b36508c76bdaa 100644 (file)
@@ -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;
index 0e9d01f8bcb6445545d24884d3b39f61d547a8b5..2fea3be751ed06f154ae73d41a6b91ec81eb26e3 100644 (file)
@@ -93,9 +93,16 @@ struct iforce_device {
        signed short *ff;
 };
 
+struct iforce;
+
+struct iforce_xport_ops {
+       void (*xmit)(struct iforce *iforce);
+};
+
 struct iforce {
        struct input_dev *dev;          /* Input device interface */
        struct iforce_device *type;
+       const struct iforce_xport_ops *xport_ops;
        int bus;
 
        unsigned char data[IFORCE_MAX_LENGTH];
@@ -141,12 +148,6 @@ struct iforce {
 
 
 /* Public functions */
-/* iforce-serio.c */
-void iforce_serial_xmit(struct iforce *iforce);
-
-/* iforce-usb.c */
-void iforce_usb_xmit(struct iforce *iforce);
-
 /* iforce-main.c */
 int iforce_init_device(struct iforce *iforce);