diff options
Diffstat (limited to 'drivers/usb/gadget/nokia.c')
| -rw-r--r-- | drivers/usb/gadget/nokia.c | 95 | 
1 files changed, 62 insertions, 33 deletions
diff --git a/drivers/usb/gadget/nokia.c b/drivers/usb/gadget/nokia.c index def37403989..3b344b41a16 100644 --- a/drivers/usb/gadget/nokia.c +++ b/drivers/usb/gadget/nokia.c @@ -37,11 +37,9 @@   * the runtime footprint, and giving us at least some parts of what   * a "gcc --combine ... part1.c part2.c part3.c ... " build would.   */ -#define USB_FACM_INCLUDED -#include "f_acm.c" +#define USBF_OBEX_INCLUDED  #include "f_ecm.c"  #include "f_obex.c" -#include "f_serial.c"  #include "f_phonet.c"  #include "u_ether.c" @@ -98,20 +96,40 @@ MODULE_AUTHOR("Felipe Balbi");  MODULE_LICENSE("GPL");  /*-------------------------------------------------------------------------*/ - +static struct usb_function *f_acm_cfg1; +static struct usb_function *f_acm_cfg2;  static u8 hostaddr[ETH_ALEN]; +static struct eth_dev *the_dev;  enum {  	TTY_PORT_OBEX0,  	TTY_PORT_OBEX1, -	TTY_PORT_ACM,  	TTY_PORTS_MAX,  };  static unsigned char tty_lines[TTY_PORTS_MAX]; +static struct usb_configuration nokia_config_500ma_driver = { +	.label		= "Bus Powered", +	.bConfigurationValue = 1, +	/* .iConfiguration = DYNAMIC */ +	.bmAttributes	= USB_CONFIG_ATT_ONE, +	.MaxPower	= 500, +}; + +static struct usb_configuration nokia_config_100ma_driver = { +	.label		= "Self Powered", +	.bConfigurationValue = 2, +	/* .iConfiguration = DYNAMIC */ +	.bmAttributes	= USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, +	.MaxPower	= 100, +}; + +static struct usb_function_instance *fi_acm; +  static int __init nokia_bind_config(struct usb_configuration *c)  { +	struct usb_function *f_acm;  	int status = 0;  	status = phonet_bind_config(c); @@ -126,33 +144,32 @@ static int __init nokia_bind_config(struct usb_configuration *c)  	if (status)  		printk(KERN_DEBUG "could not bind obex config %d\n", 0); -	status = acm_bind_config(c, tty_lines[TTY_PORT_ACM]); -	if (status) -		printk(KERN_DEBUG "could not bind acm config\n"); +	f_acm = usb_get_function(fi_acm); +	if (IS_ERR(f_acm)) +		return PTR_ERR(f_acm); -	status = ecm_bind_config(c, hostaddr); +	status = usb_add_function(c, f_acm);  	if (status) -		printk(KERN_DEBUG "could not bind ecm config\n"); +		goto err_conf; + +	status = ecm_bind_config(c, hostaddr, the_dev); +	if (status) { +		pr_debug("could not bind ecm config %d\n", status); +		goto err_ecm; +	} +	if (c == &nokia_config_500ma_driver) +		f_acm_cfg1 = f_acm; +	else +		f_acm_cfg2 = f_acm;  	return status; +err_ecm: +	usb_remove_function(c, f_acm); +err_conf: +	usb_put_function(f_acm); +	return status;  } -static struct usb_configuration nokia_config_500ma_driver = { -	.label		= "Bus Powered", -	.bConfigurationValue = 1, -	/* .iConfiguration = DYNAMIC */ -	.bmAttributes	= USB_CONFIG_ATT_ONE, -	.MaxPower	= 500, -}; - -static struct usb_configuration nokia_config_100ma_driver = { -	.label		= "Self Powered", -	.bConfigurationValue = 2, -	/* .iConfiguration = DYNAMIC */ -	.bmAttributes	= USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, -	.MaxPower	= 100, -}; -  static int __init nokia_bind(struct usb_composite_dev *cdev)  {  	struct usb_gadget	*gadget = cdev->gadget; @@ -169,9 +186,11 @@ static int __init nokia_bind(struct usb_composite_dev *cdev)  			goto err_ether;  	} -	status = gether_setup(cdev->gadget, hostaddr); -	if (status < 0) +	the_dev = gether_setup(cdev->gadget, hostaddr); +	if (IS_ERR(the_dev)) { +		status = PTR_ERR(the_dev);  		goto err_ether; +	}  	status = usb_string_ids_tab(cdev, strings_dev);  	if (status < 0) @@ -185,24 +204,32 @@ static int __init nokia_bind(struct usb_composite_dev *cdev)  	if (!gadget_supports_altsettings(gadget))  		goto err_usb; +	fi_acm = usb_get_function_instance("acm"); +	if (IS_ERR(fi_acm)) +		goto err_usb; +  	/* finally register the configuration */  	status = usb_add_config(cdev, &nokia_config_500ma_driver,  			nokia_bind_config);  	if (status < 0) -		goto err_usb; +		goto err_acm_inst;  	status = usb_add_config(cdev, &nokia_config_100ma_driver,  			nokia_bind_config);  	if (status < 0) -		goto err_usb; +		goto err_put_cfg1;  	usb_composite_overwrite_options(cdev, &coverwrite);  	dev_info(&gadget->dev, "%s\n", NOKIA_LONG_NAME);  	return 0; +err_put_cfg1: +	usb_put_function(f_acm_cfg1); +err_acm_inst: +	usb_put_function_instance(fi_acm);  err_usb: -	gether_cleanup(); +	gether_cleanup(the_dev);  err_ether:  	cur_line--;  	while (cur_line >= 0) @@ -217,12 +244,15 @@ static int __exit nokia_unbind(struct usb_composite_dev *cdev)  {  	int i; +	usb_put_function(f_acm_cfg1); +	usb_put_function(f_acm_cfg2); +	usb_put_function_instance(fi_acm);  	gphonet_cleanup();  	for (i = 0; i < TTY_PORTS_MAX; i++)  		gserial_free_line(tty_lines[i]); -	gether_cleanup(); +	gether_cleanup(the_dev);  	return 0;  } @@ -247,4 +277,3 @@ static void __exit nokia_cleanup(void)  	usb_composite_unregister(&nokia_driver);  }  module_exit(nokia_cleanup); -  |