usb: gadget: allocate & giveback serial ports instead hard code them
This patch removes gserial_setup() and gserial_cleanup() and adds gserial_alloc_line() and gserial_free_line() to replace them. The initial setup of u_serial happens now on module load time. A maximum of four TTY ports can be requested which is the current limit. In theory we could extend this limit, the hard limit is the number of available endpoints. alloc_tty_driver() is now called at module init time with the max available ports. The per-line footprint here is on 32bit is 3 * size of pointer + 60 bytes (for cdevs). The remaining memory (struct gs_port) is allocated once a port is requested. With this change it is possible to load g_multi and g_serial at the same time. GS0 receives the module that is loaded first, GS1 is received by the next module and so on. With the configfs interface the port number can be exported and the device node is more predictable. Nothing changes for g_serial and friends as long as one module is used. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:

committed by
Felipe Balbi

parent
b473577854
commit
19b10a8828
@@ -136,6 +136,7 @@ static struct fsg_common fsg_common;
|
||||
|
||||
static u8 hostaddr[ETH_ALEN];
|
||||
|
||||
static unsigned char tty_line;
|
||||
|
||||
/********** RNDIS **********/
|
||||
|
||||
@@ -154,7 +155,7 @@ static __init int rndis_do_config(struct usb_configuration *c)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = acm_bind_config(c, 0);
|
||||
ret = acm_bind_config(c, tty_line);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -205,7 +206,7 @@ static __init int cdc_do_config(struct usb_configuration *c)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = acm_bind_config(c, 0);
|
||||
ret = acm_bind_config(c, tty_line);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -242,7 +243,6 @@ static int cdc_config_register(struct usb_composite_dev *cdev)
|
||||
|
||||
/****************************** Gadget Bind ******************************/
|
||||
|
||||
|
||||
static int __ref multi_bind(struct usb_composite_dev *cdev)
|
||||
{
|
||||
struct usb_gadget *gadget = cdev->gadget;
|
||||
@@ -260,7 +260,7 @@ static int __ref multi_bind(struct usb_composite_dev *cdev)
|
||||
return status;
|
||||
|
||||
/* set up serial link layer */
|
||||
status = gserial_setup(cdev->gadget, 1);
|
||||
status = gserial_alloc_line(&tty_line);
|
||||
if (status < 0)
|
||||
goto fail0;
|
||||
|
||||
@@ -300,7 +300,7 @@ static int __ref multi_bind(struct usb_composite_dev *cdev)
|
||||
fail2:
|
||||
fsg_common_put(&fsg_common);
|
||||
fail1:
|
||||
gserial_cleanup();
|
||||
gserial_free_line(tty_line);
|
||||
fail0:
|
||||
gether_cleanup();
|
||||
return status;
|
||||
@@ -308,7 +308,7 @@ fail0:
|
||||
|
||||
static int __exit multi_unbind(struct usb_composite_dev *cdev)
|
||||
{
|
||||
gserial_cleanup();
|
||||
gserial_free_line(tty_line);
|
||||
gether_cleanup();
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user