Skip to content

Commit

Permalink
usb: gadget: push VID/PID/USB BCD module option into gadgets
Browse files Browse the repository at this point in the history
This patch moves the module options idVendor, idProduct and bcdDevice
from composite.c into each gadgets. This ensures compatibility with
current gadgets and removes the global variable which brings me step
closer towards composite.c in libcomposite

Acked-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
  • Loading branch information
Sebastian Andrzej Siewior authored and Felipe Balbi committed Sep 10, 2012
1 parent 3b4a3fc commit 7d16e8d
Show file tree
Hide file tree
Showing 18 changed files with 103 additions and 28 deletions.
2 changes: 2 additions & 0 deletions drivers/usb/gadget/acm_ms.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include "f_mass_storage.c"

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

static struct usb_device_descriptor device_desc = {
.bLength = sizeof device_desc,
Expand Down Expand Up @@ -203,6 +204,7 @@ static int __init acm_ms_bind(struct usb_composite_dev *cdev)
if (status < 0)
goto fail1;

usb_composite_overwrite_options(cdev, &coverwrite);
dev_info(&gadget->dev, "%s, version: " DRIVER_VERSION "\n",
DRIVER_DESC);
fsg_common_put(&fsg_common);
Expand Down
3 changes: 3 additions & 0 deletions drivers/usb/gadget/audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

#include <linux/kernel.h>
#include <linux/utsname.h>
#include <linux/usb/composite.h>

#include "gadget_chips.h"
#define DRIVER_DESC "Linux USB Audio Gadget"
Expand All @@ -28,6 +29,7 @@
* a "gcc --combine ... part1.c part2.c part3.c ... " build would.
*/
#include "composite.c"
USB_GADGET_COMPOSITE_OPTIONS();

/* string IDs are assigned dynamically */

Expand Down Expand Up @@ -174,6 +176,7 @@ static int __init audio_bind(struct usb_composite_dev *cdev)
status = usb_add_config(cdev, &audio_config_driver, audio_do_config);
if (status < 0)
goto fail;
usb_composite_overwrite_options(cdev, &coverwrite);

INFO(cdev, "%s, version: %s\n", DRIVER_DESC, DRIVER_VERSION);
return 0;
Expand Down
2 changes: 2 additions & 0 deletions drivers/usb/gadget/cdc2.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#define CDC_PRODUCT_NUM 0xa4aa /* CDC Composite: ECM + ACM */

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

/*
* Kbuild is not very cooperative with respect to linking separately
Expand Down Expand Up @@ -204,6 +205,7 @@ static int __init cdc_bind(struct usb_composite_dev *cdev)
if (status < 0)
goto fail1;

usb_composite_overwrite_options(cdev, &coverwrite);
dev_info(&gadget->dev, "%s, version: " DRIVER_VERSION "\n",
DRIVER_DESC);

Expand Down
63 changes: 39 additions & 24 deletions drivers/usb/gadget/composite.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,19 +32,6 @@
* published in the device descriptor, either numbers or strings or both.
* String parameters are in UTF-8 (superset of ASCII's 7 bit characters).
*/

static ushort idVendor;
module_param(idVendor, ushort, S_IRUGO);
MODULE_PARM_DESC(idVendor, "USB Vendor ID");

static ushort idProduct;
module_param(idProduct, ushort, S_IRUGO);
MODULE_PARM_DESC(idProduct, "USB Product ID");

static ushort bcdDevice;
module_param(bcdDevice, ushort, S_IRUGO);
MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)");

static char *iManufacturer;
module_param(iManufacturer, charp, S_IRUGO);
MODULE_PARM_DESC(iManufacturer, "USB Manufacturer string");
Expand Down Expand Up @@ -1418,6 +1405,30 @@ static u8 override_id(struct usb_composite_dev *cdev, u8 *desc)
return *desc;
}

static void update_unchanged_dev_desc(struct usb_device_descriptor *new,
const struct usb_device_descriptor *old)
{
__le16 idVendor;
__le16 idProduct;
__le16 bcdDevice;

/*
* these variables may have been set in
* usb_composite_overwrite_options()
*/
idVendor = new->idVendor;
idProduct = new->idProduct;
bcdDevice = new->bcdDevice;

*new = *old;
if (idVendor)
new->idVendor = idVendor;
if (idProduct)
new->idProduct = idProduct;
if (bcdDevice)
new->bcdDevice = bcdDevice;
}

static struct usb_composite_driver *to_cdriver(struct usb_gadget_driver *gdrv)
{
return container_of(gdrv, struct usb_composite_driver, gadget_driver);
Expand Down Expand Up @@ -1473,17 +1484,7 @@ static int composite_bind(struct usb_gadget *gadget,
if (status < 0)
goto fail;

cdev->desc = *composite->dev;

/* standardized runtime overrides for device ID data */
if (idVendor)
cdev->desc.idVendor = cpu_to_le16(idVendor);

if (idProduct)
cdev->desc.idProduct = cpu_to_le16(idProduct);

if (bcdDevice)
cdev->desc.bcdDevice = cpu_to_le16(bcdDevice);
update_unchanged_dev_desc(&cdev->desc, composite->dev);

/* string overrides */
if (iManufacturer || !cdev->desc.iManufacturer) {
Expand Down Expand Up @@ -1686,3 +1687,17 @@ void usb_composite_setup_continue(struct usb_composite_dev *cdev)
spin_unlock_irqrestore(&cdev->lock, flags);
}

void usb_composite_overwrite_options(struct usb_composite_dev *cdev,
struct usb_composite_overwrite *covr)
{
struct usb_device_descriptor *desc = &cdev->desc;

if (covr->idVendor)
desc->idVendor = cpu_to_le16(covr->idVendor);

if (covr->idProduct)
desc->idProduct = cpu_to_le16(covr->idProduct);

if (covr->bcdDevice)
desc->bcdDevice = cpu_to_le16(covr->bcdDevice);
}
2 changes: 2 additions & 0 deletions drivers/usb/gadget/ether.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ static inline bool has_rndis(void)
#include "u_ether.c"

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

/* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!!
* Instead: allocate your own, using normal USB-IF procedures.
Expand Down Expand Up @@ -363,6 +364,7 @@ static int __init eth_bind(struct usb_composite_dev *cdev)
if (status < 0)
goto fail;

usb_composite_overwrite_options(cdev, &coverwrite);
dev_info(&gadget->dev, "%s, version: " DRIVER_VERSION "\n",
DRIVER_DESC);

Expand Down
4 changes: 3 additions & 1 deletion drivers/usb/gadget/g_ffs.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ struct gfs_ffs_obj {
struct ffs_data *ffs_data;
};

USB_GADGET_COMPOSITE_OPTIONS();

static struct usb_device_descriptor gfs_dev_desc = {
.bLength = sizeof gfs_dev_desc,
.bDescriptorType = USB_DT_DEVICE,
Expand Down Expand Up @@ -377,7 +379,7 @@ static int gfs_bind(struct usb_composite_dev *cdev)
if (unlikely(ret < 0))
goto error_unbind;
}

usb_composite_overwrite_options(cdev, &coverwrite);
return 0;

error_unbind:
Expand Down
4 changes: 3 additions & 1 deletion drivers/usb/gadget/gmidi.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ MODULE_LICENSE("GPL v2");
static const char shortname[] = "g_midi";
static const char longname[] = "MIDI Gadget";

USB_GADGET_COMPOSITE_OPTIONS();

static int index = SNDRV_DEFAULT_IDX1;
module_param(index, int, S_IRUGO);
MODULE_PARM_DESC(index, "Index value for the USB MIDI Gadget adapter.");
Expand Down Expand Up @@ -163,7 +165,7 @@ static int __init midi_bind(struct usb_composite_dev *cdev)
status = usb_add_config(cdev, &midi_config, midi_bind_config);
if (status < 0)
return status;

usb_composite_overwrite_options(cdev, &coverwrite);
pr_info("%s\n", longname);
return 0;
}
Expand Down
2 changes: 2 additions & 0 deletions drivers/usb/gadget/hid.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ struct hidg_func_node {
static LIST_HEAD(hidg_func_list);

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

static struct usb_device_descriptor device_desc = {
.bLength = sizeof device_desc,
Expand Down Expand Up @@ -188,6 +189,7 @@ static int __init hid_bind(struct usb_composite_dev *cdev)
if (status < 0)
return status;

usb_composite_overwrite_options(cdev, &coverwrite);
dev_info(&gadget->dev, DRIVER_DESC ", version: " DRIVER_VERSION "\n");

return 0;
Expand Down
3 changes: 2 additions & 1 deletion drivers/usb/gadget/mass_storage.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
#include "f_mass_storage.c"

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

static struct usb_device_descriptor msg_device_desc = {
.bLength = sizeof msg_device_desc,
Expand Down Expand Up @@ -143,7 +144,7 @@ static int __init msg_bind(struct usb_composite_dev *cdev)
status = usb_add_config(cdev, &msg_config_driver, msg_do_config);
if (status < 0)
return status;

usb_composite_overwrite_options(cdev, &coverwrite);
dev_info(&cdev->gadget->dev,
DRIVER_DESC ", version: " DRIVER_VERSION "\n");
set_bit(0, &msg_registered);
Expand Down
3 changes: 2 additions & 1 deletion drivers/usb/gadget/multi.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ MODULE_LICENSE("GPL");
#endif
#include "u_ether.c"


USB_GADGET_COMPOSITE_OPTIONS();

/***************************** Device Descriptor ****************************/

Expand Down Expand Up @@ -307,6 +307,7 @@ static int __ref multi_bind(struct usb_composite_dev *cdev)
status = cdc_config_register(cdev);
if (unlikely(status < 0))
goto fail2;
usb_composite_overwrite_options(cdev, &coverwrite);

/* we're done */
dev_info(&gadget->dev, DRIVER_DESC "\n");
Expand Down
2 changes: 2 additions & 0 deletions drivers/usb/gadget/ncm.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
#define CDC_PRODUCT_NUM 0xa4a1 /* Linux-USB Ethernet Gadget */

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

static struct usb_device_descriptor device_desc = {
.bLength = sizeof device_desc,
Expand Down Expand Up @@ -191,6 +192,7 @@ static int __init gncm_bind(struct usb_composite_dev *cdev)
if (status < 0)
goto fail;

usb_composite_overwrite_options(cdev, &coverwrite);
dev_info(&gadget->dev, "%s\n", DRIVER_DESC);

return 0;
Expand Down
2 changes: 2 additions & 0 deletions drivers/usb/gadget/nokia.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include "u_ether.c"

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

#define NOKIA_VENDOR_ID 0x0421 /* Nokia */
#define NOKIA_PRODUCT_ID 0x01c8 /* Nokia Gadget */
Expand Down Expand Up @@ -197,6 +198,7 @@ static int __init nokia_bind(struct usb_composite_dev *cdev)
if (status < 0)
goto err_usb;

usb_composite_overwrite_options(cdev, &coverwrite);
dev_info(&gadget->dev, "%s\n", NOKIA_LONG_NAME);

return 0;
Expand Down
4 changes: 4 additions & 0 deletions drivers/usb/gadget/printer.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
#include "composite.c"

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

#define DRIVER_DESC "Printer Gadget"
#define DRIVER_VERSION "2007 OCT 06"
Expand Down Expand Up @@ -1265,6 +1266,9 @@ static int __init printer_bind(struct usb_composite_dev *cdev)
device_desc.iSerialNumber = strings[STRING_SERIALNUM].id;

ret = usb_add_config(cdev, &printer_cfg_driver, printer_bind_config);
if (ret)
return ret;
usb_composite_overwrite_options(cdev, &coverwrite);
return ret;
}

Expand Down
2 changes: 2 additions & 0 deletions drivers/usb/gadget/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#include "u_serial.c"

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

/* Thanks to NetChip Technologies for donating this product ID.
*
Expand Down Expand Up @@ -212,6 +213,7 @@ static int __init gs_bind(struct usb_composite_dev *cdev)
if (status < 0)
goto fail;

usb_composite_overwrite_options(cdev, &coverwrite);
INFO(cdev, "%s\n", GS_VERSION_NAME);

return 0;
Expand Down
5 changes: 5 additions & 0 deletions drivers/usb/gadget/tcm_usb_gadget.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@

#include "tcm_usb_gadget.h"

USB_GADGET_COMPOSITE_OPTIONS();

static struct target_fabric_configfs *usbg_fabric_configfs;

static inline struct f_uas *to_f_uas(struct usb_function *f)
Expand Down Expand Up @@ -2437,6 +2439,9 @@ static int usb_target_bind(struct usb_composite_dev *cdev)

ret = usb_add_config(cdev, &usbg_config_driver,
usbg_cfg_bind);
if (ret)
return ret;
usb_composite_overwrite_options(cdev, &coverwrite);
return 0;
}

Expand Down
2 changes: 2 additions & 0 deletions drivers/usb/gadget/webcam.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include "uvc_v4l2.c"
#include "f_uvc.c"

USB_GADGET_COMPOSITE_OPTIONS();
/* --------------------------------------------------------------------------
* Device descriptor
*/
Expand Down Expand Up @@ -370,6 +371,7 @@ webcam_bind(struct usb_composite_dev *cdev)
webcam_config_bind)) < 0)
goto error;

usb_composite_overwrite_options(cdev, &coverwrite);
INFO(cdev, "Webcam Video Gadget\n");
return 0;

Expand Down
2 changes: 2 additions & 0 deletions drivers/usb/gadget/zero.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
#include "f_loopback.c"

/*-------------------------------------------------------------------------*/
USB_GADGET_COMPOSITE_OPTIONS();

#define DRIVER_VERSION "Cinco de Mayo 2008"

Expand Down Expand Up @@ -305,6 +306,7 @@ static int __init zero_bind(struct usb_composite_dev *cdev)
longname, gadget->name);
device_desc.bcdDevice = cpu_to_le16(0x9999);
}
usb_composite_overwrite_options(cdev, &coverwrite);

INFO(cdev, "%s, version: " DRIVER_VERSION "\n", longname);

Expand Down
24 changes: 24 additions & 0 deletions include/linux/usb/composite.h
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,30 @@ extern int usb_string_ids_tab(struct usb_composite_dev *c,
struct usb_string *str);
extern int usb_string_ids_n(struct usb_composite_dev *c, unsigned n);

/*
* Some systems will need runtime overrides for the product identifiers
* published in the device descriptor, either numbers or strings or both.
* String parameters are in UTF-8 (superset of ASCII's 7 bit characters).
*/
struct usb_composite_overwrite {
u16 idVendor;
u16 idProduct;
u16 bcdDevice;
};
#define USB_GADGET_COMPOSITE_OPTIONS() \
static struct usb_composite_overwrite coverwrite; \
\
module_param_named(idVendor, coverwrite.idVendor, ushort, S_IRUGO); \
MODULE_PARM_DESC(idVendor, "USB Vendor ID"); \
\
module_param_named(idProduct, coverwrite.idProduct, ushort, S_IRUGO); \
MODULE_PARM_DESC(idProduct, "USB Product ID"); \
\
module_param_named(bcdDevice, coverwrite.bcdDevice, ushort, S_IRUGO); \
MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)")

void usb_composite_overwrite_options(struct usb_composite_dev *cdev,
struct usb_composite_overwrite *covr);

/* messaging utils */
#define DBG(d, fmt, args...) \
Expand Down

0 comments on commit 7d16e8d

Please sign in to comment.