diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-31 14:38:07 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-31 14:38:07 -0700 |
commit | 4ff12049d6b6cc79ad8ee092ae226434687062ec (patch) | |
tree | 1485a69f9dcffd4d4e0f3bd846c986a5c9ed38c7 /drivers/usb/gadget/legacy/printer.c | |
parent | c2078402e479f963168bfcf7a8de78ab63748a98 (diff) | |
parent | 44840dec6127e4d7c5074f75d2dd96bc4ab85fe3 (diff) |
Merge tag 'usb-4.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB updates from Greg KH:
"Here's the big USB and PHY patchset for 4.3-rc1.
As usual, the majority of the changes are in the USB gadget portion of
the tree, lots of little changes all over the place for bugs and new
hardware. Other than that, the normal mix of new hardware support and
bugfixes.
All have been in linux-next with no reported issues"
* tag 'usb-4.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (261 commits)
USB: qcserial: add HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module
USB: ftdi_sio: Added custom PID for CustomWare products
USB: usb_wwan: silence read errors on disconnect
USB: option: silence interrupt errors
USB: symbolserial: Correct transferred data size
USB: symbolserial: Use usb_get_serial_port_data
usb: misc: usbtest: format max packet size for iso transfer
usb: host: ehci-sys: delete useless bus_to_hcd conversion
Revert "usb: interface authorization: Declare authorized attribute"
Revert "usb: interface authorization: Introduces the default interface authorization"
Revert "usb: interface authorization: Control interface probing and claiming"
Revert "usb: interface authorization: Introduces the USB interface authorization"
Revert "usb: interface authorization: SysFS part of USB interface authorization"
Revert "usb: interface authorization: Documentation part"
Revert "usb: interface authorization: Use a flag for the default device authorization"
usb: core: hub: Removed some warnings generated by checkpatch.pl
USB: host: ohci-at91: merge loops in ohci_hcd_at91_drv_probe
USB: host: ohci-at91: merge ohci_at91_of_init in ohci_hcd_at91_drv_probe
USB: host: ohci-at91: depend on OF
USB: host: ohci-at91: move at91_usbh_data definition in c file
...
Diffstat (limited to 'drivers/usb/gadget/legacy/printer.c')
-rw-r--r-- | drivers/usb/gadget/legacy/printer.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/drivers/usb/gadget/legacy/printer.c b/drivers/usb/gadget/legacy/printer.c index 1ce7df1060a5..a22d30a4def1 100644 --- a/drivers/usb/gadget/legacy/printer.c +++ b/drivers/usb/gadget/legacy/printer.c @@ -19,8 +19,6 @@ #include <linux/usb/gadget.h> #include <linux/usb/g_printer.h> -#include "gadget_chips.h" - USB_GADGET_COMPOSITE_OPTIONS(); #define DRIVER_DESC "Printer Gadget" @@ -82,16 +80,7 @@ static struct usb_device_descriptor device_desc = { .bNumConfigurations = 1 }; -static struct usb_otg_descriptor otg_descriptor = { - .bLength = sizeof otg_descriptor, - .bDescriptorType = USB_DT_OTG, - .bmAttributes = USB_OTG_SRP, -}; - -static const struct usb_descriptor_header *otg_desc[] = { - (struct usb_descriptor_header *) &otg_descriptor, - NULL, -}; +static const struct usb_descriptor_header *otg_desc[2]; /*-------------------------------------------------------------------------*/ @@ -136,7 +125,6 @@ static int printer_do_config(struct usb_configuration *c) usb_gadget_set_selfpowered(gadget); if (gadget_is_otg(gadget)) { - otg_descriptor.bmAttributes |= USB_OTG_HNP; printer_cfg_driver.descriptors = otg_desc; printer_cfg_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; } @@ -174,21 +162,39 @@ static int printer_bind(struct usb_composite_dev *cdev) opts->q_len = QLEN; ret = usb_string_ids_tab(cdev, strings); - if (ret < 0) { - usb_put_function_instance(fi_printer); - return ret; - } + if (ret < 0) + goto fail_put_func_inst; + device_desc.iManufacturer = strings[USB_GADGET_MANUFACTURER_IDX].id; device_desc.iProduct = strings[USB_GADGET_PRODUCT_IDX].id; device_desc.iSerialNumber = strings[USB_GADGET_SERIAL_IDX].id; - ret = usb_add_config(cdev, &printer_cfg_driver, printer_do_config); - if (ret) { - usb_put_function_instance(fi_printer); - return ret; + if (gadget_is_otg(cdev->gadget) && !otg_desc[0]) { + struct usb_descriptor_header *usb_desc; + + usb_desc = usb_otg_descriptor_alloc(cdev->gadget); + if (!usb_desc) { + ret = -ENOMEM; + goto fail_put_func_inst; + } + usb_otg_descriptor_init(cdev->gadget, usb_desc); + otg_desc[0] = usb_desc; + otg_desc[1] = NULL; } + + ret = usb_add_config(cdev, &printer_cfg_driver, printer_do_config); + if (ret) + goto fail_free_otg_desc; + usb_composite_overwrite_options(cdev, &coverwrite); return ret; + +fail_free_otg_desc: + kfree(otg_desc[0]); + otg_desc[0] = NULL; +fail_put_func_inst: + usb_put_function_instance(fi_printer); + return ret; } static int printer_unbind(struct usb_composite_dev *cdev) @@ -196,6 +202,9 @@ static int printer_unbind(struct usb_composite_dev *cdev) usb_put_function(f_printer); usb_put_function_instance(fi_printer); + kfree(otg_desc[0]); + otg_desc[0] = NULL; + return 0; } |