This patch converts the acm_ms gadget to make use of the function
framework to request the ACM function.

With nokia beeing the last user of the include interface, it is gone
now.

Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
---
 drivers/usb/gadget/Kconfig    |    1 +
 drivers/usb/gadget/f_acm.c    |   36 ------------------
 drivers/usb/gadget/nokia.c    |   81 ++++++++++++++++++++++++++++-------------
 drivers/usb/gadget/u_serial.h |    1 -
 4 files changed, 57 insertions(+), 62 deletions(-)

diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index b61c72f..32597b8 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -832,6 +832,7 @@ config USB_G_NOKIA
        depends on PHONET
        select USB_LIBCOMPOSITE
        select USB_U_SERIAL
+       select USB_F_ACM
        help
          The Nokia composite gadget provides support for acm, obex
          and phonet in only one composite gadget driver.
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c
index 5b6d2c0..1a82ef7 100644
--- a/drivers/usb/gadget/f_acm.c
+++ b/drivers/usb/gadget/f_acm.c
@@ -755,41 +755,6 @@ static struct f_acm *acm_alloc_basic_func(void)
        return acm;
 }
 
-#ifdef USB_FACM_INCLUDED
-/**
- * acm_bind_config - add a CDC ACM function to a configuration
- * @c: the configuration to support the CDC ACM instance
- * @port_num: /dev/ttyGS* port this interface will use
- * Context: single threaded during gadget setup
- *
- * Returns zero on success, else negative errno.
- *
- * Caller must have called @gserial_setup() with enough ports to
- * handle all the ones it binds.  Caller is also responsible
- * for calling @gserial_cleanup() before module unload.
- */
-int acm_bind_config(struct usb_configuration *c, u8 port_num)
-{
-       struct f_acm    *acm;
-       int             status;
-
-       /* allocate and initialize one new instance */
-       acm = acm_alloc_basic_func();
-       if (!acm)
-               return -ENOMEM;
-
-       acm->port_num = port_num;
-
-       acm->port.func.unbind = acm_unbind;
-
-       status = usb_add_function(c, &acm->port.func);
-       if (status)
-               kfree(acm);
-       return status;
-}
-
-#else
-
 static void acm_free_func(struct usb_function *f)
 {
        acm_unbind(NULL, f);
@@ -831,4 +796,3 @@ static struct usb_function_instance 
*acm_alloc_instance(void)
 }
 DECLARE_USB_FUNCTION_INIT(acm, acm_alloc_instance, acm_alloc_func);
 MODULE_LICENSE("GPL");
-#endif
diff --git a/drivers/usb/gadget/nokia.c b/drivers/usb/gadget/nokia.c
index a000fb7..7fcb240 100644
--- a/drivers/usb/gadget/nokia.c
+++ b/drivers/usb/gadget/nokia.c
@@ -37,8 +37,6 @@
  * 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"
 #include "f_ecm.c"
 #include "f_obex.c"
 #include "f_serial.c"
@@ -98,11 +96,31 @@ 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 usb_configuration nokia_config_500ma_driver = {
+       .label          = "Bus Powered",
+       .bConfigurationValue = 1,
+       /* .iConfiguration = DYNAMIC */
+       .bmAttributes   = USB_CONFIG_ATT_ONE,
+       .bMaxPower      = 250, /* 500mA */
+};
+
+static struct usb_configuration nokia_config_100ma_driver = {
+       .label          = "Self Powered",
+       .bConfigurationValue = 2,
+       /* .iConfiguration = DYNAMIC */
+       .bmAttributes   = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
+       .bMaxPower      = 50, /* 100 mA */
+};
+
+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);
@@ -117,36 +135,36 @@ 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, 2);
+       f_acm = usb_get_function(fi_acm);
+       if (IS_ERR(f_acm))
+               return PTR_ERR(f_acm);
+
+       status = usb_add_function(c, f_acm);
        if (status)
-               printk(KERN_DEBUG "could not bind acm config\n");
+               goto err_conf;
 
        status = ecm_bind_config(c, hostaddr);
-       if (status)
-               printk(KERN_DEBUG "could not bind ecm config\n");
+       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,
-       .bMaxPower      = 250, /* 500mA */
-};
-
-static struct usb_configuration nokia_config_100ma_driver = {
-       .label          = "Self Powered",
-       .bConfigurationValue = 2,
-       /* .iConfiguration = DYNAMIC */
-       .bmAttributes   = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower      = 50, /* 100 mA */
-};
-
 static int __init nokia_bind(struct usb_composite_dev *cdev)
 {
        struct usb_gadget       *gadget = cdev->gadget;
+       struct f_serial_opts    *opts;
        int                     status;
 
        status = gphonet_setup(cdev->gadget);
@@ -173,22 +191,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;
+       opts = container_of(fi_acm, struct f_serial_opts, func_inst);
+       opts->port_num = 2;
+
        /* 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();
 err_ether:
@@ -201,6 +229,9 @@ static int __init nokia_bind(struct usb_composite_dev *cdev)
 
 static int __exit nokia_unbind(struct usb_composite_dev *cdev)
 {
+       usb_put_function(f_acm_cfg1);
+       usb_put_function(f_acm_cfg2);
+       usb_put_function_instance(fi_acm);
        gphonet_cleanup();
        gserial_cleanup();
        gether_cleanup();
diff --git a/drivers/usb/gadget/u_serial.h b/drivers/usb/gadget/u_serial.h
index e2546cd..7939645 100644
--- a/drivers/usb/gadget/u_serial.h
+++ b/drivers/usb/gadget/u_serial.h
@@ -66,7 +66,6 @@ int gserial_connect(struct gserial *, u8 port_num);
 void gserial_disconnect(struct gserial *);
 
 /* functions are bound to configurations by a config or gadget driver */
-int acm_bind_config(struct usb_configuration *c, u8 port_num);
 int gser_bind_config(struct usb_configuration *c, u8 port_num);
 int obex_bind_config(struct usb_configuration *c, u8 port_num);
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to