Browse Source

usb: gadget: u_serial: convert into a module

Every user of u_serial has now to select the U_SERIAL symbol instead of
including the file.
There is one limition with this: ports and and gs_tty_driver are global
variables in u_serial. Since all users share them, there can be only one
user loaded at a time i.e. either g_serial or g_nokia.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Sebastian Andrzej Siewior 12 years ago
parent
commit
3249ca22c0

+ 9 - 0
drivers/usb/gadget/Kconfig

@@ -503,6 +503,9 @@ config USB_LIBCOMPOSITE
 config USB_F_SS_LB
 config USB_F_SS_LB
 	tristate
 	tristate
 
 
+config USB_U_SERIAL
+	tristate
+
 choice
 choice
 	tristate "USB Gadget Drivers"
 	tristate "USB Gadget Drivers"
 	default USB_ETH
 	default USB_ETH
@@ -754,6 +757,7 @@ config USB_GADGET_TARGET
 
 
 config USB_G_SERIAL
 config USB_G_SERIAL
 	tristate "Serial Gadget (with CDC ACM and CDC OBEX support)"
 	tristate "Serial Gadget (with CDC ACM and CDC OBEX support)"
+	select USB_U_SERIAL
 	select USB_LIBCOMPOSITE
 	select USB_LIBCOMPOSITE
 	help
 	help
 	  The Serial Gadget talks to the Linux-USB generic serial driver.
 	  The Serial Gadget talks to the Linux-USB generic serial driver.
@@ -807,6 +811,7 @@ config USB_CDC_COMPOSITE
 	tristate "CDC Composite Device (Ethernet and ACM)"
 	tristate "CDC Composite Device (Ethernet and ACM)"
 	depends on NET
 	depends on NET
 	select USB_LIBCOMPOSITE
 	select USB_LIBCOMPOSITE
+	select USB_U_SERIAL
 	help
 	help
 	  This driver provides two functions in one configuration:
 	  This driver provides two functions in one configuration:
 	  a CDC Ethernet (ECM) link, and a CDC ACM (serial port) link.
 	  a CDC Ethernet (ECM) link, and a CDC ACM (serial port) link.
@@ -822,6 +827,7 @@ config USB_G_NOKIA
 	tristate "Nokia composite gadget"
 	tristate "Nokia composite gadget"
 	depends on PHONET
 	depends on PHONET
 	select USB_LIBCOMPOSITE
 	select USB_LIBCOMPOSITE
+	select USB_U_SERIAL
 	help
 	help
 	  The Nokia composite gadget provides support for acm, obex
 	  The Nokia composite gadget provides support for acm, obex
 	  and phonet in only one composite gadget driver.
 	  and phonet in only one composite gadget driver.
@@ -833,6 +839,7 @@ config USB_G_ACM_MS
 	tristate "CDC Composite Device (ACM and mass storage)"
 	tristate "CDC Composite Device (ACM and mass storage)"
 	depends on BLOCK
 	depends on BLOCK
 	select USB_LIBCOMPOSITE
 	select USB_LIBCOMPOSITE
+	select USB_U_SERIAL
 	help
 	help
 	  This driver provides two functions in one configuration:
 	  This driver provides two functions in one configuration:
 	  a mass storage, and a CDC ACM (serial port) link.
 	  a mass storage, and a CDC ACM (serial port) link.
@@ -845,6 +852,7 @@ config USB_G_MULTI
 	depends on BLOCK && NET
 	depends on BLOCK && NET
 	select USB_G_MULTI_CDC if !USB_G_MULTI_RNDIS
 	select USB_G_MULTI_CDC if !USB_G_MULTI_RNDIS
 	select USB_LIBCOMPOSITE
 	select USB_LIBCOMPOSITE
+	select USB_U_SERIAL
 	help
 	help
 	  The Multifunction Composite Gadget provides Ethernet (RNDIS
 	  The Multifunction Composite Gadget provides Ethernet (RNDIS
 	  and/or CDC Ethernet), mass storage and ACM serial link
 	  and/or CDC Ethernet), mass storage and ACM serial link
@@ -920,6 +928,7 @@ config USB_G_DBGP_PRINTK
 
 
 config USB_G_DBGP_SERIAL
 config USB_G_DBGP_SERIAL
 	depends on USB_G_DBGP
 	depends on USB_G_DBGP
+	select USB_U_SERIAL
 	bool "serial"
 	bool "serial"
 	help
 	help
 	  Userland can interact using /dev/ttyGSxxx.
 	  Userland can interact using /dev/ttyGSxxx.

+ 1 - 0
drivers/usb/gadget/Makefile

@@ -78,3 +78,4 @@ obj-$(CONFIG_USB_GADGET_TARGET)	+= tcm_usb_gadget.o
 # USB Functions
 # USB Functions
 f_ss_lb-y			:= f_loopback.o f_sourcesink.o
 f_ss_lb-y			:= f_loopback.o f_sourcesink.o
 obj-$(CONFIG_USB_F_SS_LB)	+= f_ss_lb.o
 obj-$(CONFIG_USB_F_SS_LB)	+= f_ss_lb.o
+obj-$(CONFIG_USB_U_SERIAL)	+= u_serial.o

+ 0 - 1
drivers/usb/gadget/acm_ms.c

@@ -41,7 +41,6 @@
  * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
  * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
  */
  */
 
 
-#include "u_serial.c"
 #include "f_acm.c"
 #include "f_acm.c"
 #include "f_mass_storage.c"
 #include "f_mass_storage.c"
 
 

+ 0 - 1
drivers/usb/gadget/cdc2.c

@@ -43,7 +43,6 @@ USB_GADGET_COMPOSITE_OPTIONS();
  * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
  * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
  */
  */
 
 
-#include "u_serial.c"
 #include "f_acm.c"
 #include "f_acm.c"
 #include "f_ecm.c"
 #include "f_ecm.c"
 #include "u_ether.c"
 #include "u_ether.c"

+ 1 - 3
drivers/usb/gadget/dbgp.c

@@ -13,9 +13,7 @@
 #include <linux/usb/ch9.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
 #include <linux/usb/gadget.h>
 
 
-#ifdef CONFIG_USB_G_DBGP_SERIAL
-#include "u_serial.c"
-#endif
+#include "u_serial.h"
 
 
 #define DRIVER_VENDOR_ID	0x0525 /* NetChip */
 #define DRIVER_VENDOR_ID	0x0525 /* NetChip */
 #define DRIVER_PRODUCT_ID	0xc0de /* undefined */
 #define DRIVER_PRODUCT_ID	0xc0de /* undefined */

+ 0 - 1
drivers/usb/gadget/multi.c

@@ -42,7 +42,6 @@ MODULE_LICENSE("GPL");
  */
  */
 #include "f_mass_storage.c"
 #include "f_mass_storage.c"
 
 
-#include "u_serial.c"
 #include "f_acm.c"
 #include "f_acm.c"
 
 
 #include "f_ecm.c"
 #include "f_ecm.c"

+ 0 - 1
drivers/usb/gadget/nokia.c

@@ -37,7 +37,6 @@
  * the runtime footprint, and giving us at least some parts of what
  * the runtime footprint, and giving us at least some parts of what
  * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
  * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
  */
  */
-#include "u_serial.c"
 #include "f_acm.c"
 #include "f_acm.c"
 #include "f_ecm.c"
 #include "f_ecm.c"
 #include "f_obex.c"
 #include "f_obex.c"

+ 0 - 1
drivers/usb/gadget/serial.c

@@ -39,7 +39,6 @@
 #include "f_acm.c"
 #include "f_acm.c"
 #include "f_obex.c"
 #include "f_obex.c"
 #include "f_serial.c"
 #include "f_serial.c"
-#include "u_serial.c"
 
 
 /*-------------------------------------------------------------------------*/
 /*-------------------------------------------------------------------------*/
 USB_GADGET_COMPOSITE_OPTIONS();
 USB_GADGET_COMPOSITE_OPTIONS();

+ 12 - 1
drivers/usb/gadget/u_serial.c

@@ -26,6 +26,7 @@
 #include <linux/tty_flip.h>
 #include <linux/tty_flip.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/export.h>
 #include <linux/export.h>
+#include <linux/module.h>
 
 
 #include "u_serial.h"
 #include "u_serial.h"
 
 
@@ -309,6 +310,7 @@ gs_alloc_req(struct usb_ep *ep, unsigned len, gfp_t kmalloc_flags)
 
 
 	return req;
 	return req;
 }
 }
+EXPORT_SYMBOL_GPL(gs_alloc_req);
 
 
 /*
 /*
  * gs_free_req
  * gs_free_req
@@ -320,6 +322,7 @@ void gs_free_req(struct usb_ep *ep, struct usb_request *req)
 	kfree(req->buf);
 	kfree(req->buf);
 	usb_ep_free_request(ep, req);
 	usb_ep_free_request(ep, req);
 }
 }
+EXPORT_SYMBOL_GPL(gs_free_req);
 
 
 /*
 /*
  * gs_send_packet
  * gs_send_packet
@@ -1081,6 +1084,9 @@ int gserial_setup(struct usb_gadget *g, unsigned count)
 	if (count == 0 || count > N_PORTS)
 	if (count == 0 || count > N_PORTS)
 		return -EINVAL;
 		return -EINVAL;
 
 
+	if (gs_tty_driver)
+		return -EBUSY;
+
 	gs_tty_driver = alloc_tty_driver(count);
 	gs_tty_driver = alloc_tty_driver(count);
 	if (!gs_tty_driver)
 	if (!gs_tty_driver)
 		return -ENOMEM;
 		return -ENOMEM;
@@ -1153,6 +1159,7 @@ fail:
 	gs_tty_driver = NULL;
 	gs_tty_driver = NULL;
 	return status;
 	return status;
 }
 }
+EXPORT_SYMBOL_GPL(gserial_setup);
 
 
 static int gs_closed(struct gs_port *port)
 static int gs_closed(struct gs_port *port)
 {
 {
@@ -1213,6 +1220,7 @@ void gserial_cleanup(void)
 
 
 	pr_debug("%s: cleaned up ttyGS* support\n", __func__);
 	pr_debug("%s: cleaned up ttyGS* support\n", __func__);
 }
 }
+EXPORT_SYMBOL_GPL(gserial_cleanup);
 
 
 /**
 /**
  * gserial_connect - notify TTY I/O glue that USB link is active
  * gserial_connect - notify TTY I/O glue that USB link is active
@@ -1292,7 +1300,7 @@ fail_out:
 	gser->in->driver_data = NULL;
 	gser->in->driver_data = NULL;
 	return status;
 	return status;
 }
 }
-
+EXPORT_SYMBOL_GPL(gserial_connect);
 /**
 /**
  * gserial_disconnect - notify TTY I/O glue that USB link is inactive
  * gserial_disconnect - notify TTY I/O glue that USB link is inactive
  * @gser: the function, on which gserial_connect() was called
  * @gser: the function, on which gserial_connect() was called
@@ -1347,3 +1355,6 @@ void gserial_disconnect(struct gserial *gser)
 
 
 	spin_unlock_irqrestore(&port->port_lock, flags);
 	spin_unlock_irqrestore(&port->port_lock, flags);
 }
 }
+EXPORT_SYMBOL_GPL(gserial_disconnect);
+
+MODULE_LICENSE("GPL");