aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2012-09-10 09:01:54 -0400
committerFelipe Balbi <balbi@ti.com>2012-09-10 09:13:00 -0400
commit1cf0d264088907038be560ba2dd472d5e432a3dc (patch)
treec62973c662c6c43763f672e65d8ae167e39686cc
parent276e2e4f1f3e07a0ad891bf757dbcfd655ff5f91 (diff)
usb: gadget: push iSerialNumber into gadgets
This patch pushes the iSerialNumber module argument from composite into each gadget. Once the user uses the module paramter, the string is overwritten with the final value. Acked-by: Michal Nazarewicz <mina86@mina86.com> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r--drivers/usb/gadget/composite.c20
-rw-r--r--drivers/usb/gadget/mass_storage.c21
-rw-r--r--drivers/usb/gadget/printer.c6
-rw-r--r--include/linux/usb/composite.h7
4 files changed, 41 insertions, 13 deletions
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index 317a5ece3bd2..5642b2170541 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -40,10 +40,6 @@ static char *iProduct;
40module_param(iProduct, charp, S_IRUGO); 40module_param(iProduct, charp, S_IRUGO);
41MODULE_PARM_DESC(iProduct, "USB Product string"); 41MODULE_PARM_DESC(iProduct, "USB Product string");
42 42
43static char *iSerialNumber;
44module_param(iSerialNumber, charp, S_IRUGO);
45MODULE_PARM_DESC(iSerialNumber, "SerialNumber string");
46
47static char composite_manufacturer[50]; 43static char composite_manufacturer[50];
48 44
49/*-------------------------------------------------------------------------*/ 45/*-------------------------------------------------------------------------*/
@@ -925,7 +921,7 @@ static int get_string(struct usb_composite_dev *cdev,
925 else if (cdev->product_override == id) 921 else if (cdev->product_override == id)
926 str = iProduct ?: composite->iProduct; 922 str = iProduct ?: composite->iProduct;
927 else if (cdev->serial_override == id) 923 else if (cdev->serial_override == id)
928 str = iSerialNumber ?: composite->iSerialNumber; 924 str = composite->iSerialNumber;
929 else 925 else
930 str = NULL; 926 str = NULL;
931 if (str) { 927 if (str) {
@@ -1411,6 +1407,7 @@ static void update_unchanged_dev_desc(struct usb_device_descriptor *new,
1411 __le16 idVendor; 1407 __le16 idVendor;
1412 __le16 idProduct; 1408 __le16 idProduct;
1413 __le16 bcdDevice; 1409 __le16 bcdDevice;
1410 u8 iSerialNumber;
1414 1411
1415 /* 1412 /*
1416 * these variables may have been set in 1413 * these variables may have been set in
@@ -1419,6 +1416,7 @@ static void update_unchanged_dev_desc(struct usb_device_descriptor *new,
1419 idVendor = new->idVendor; 1416 idVendor = new->idVendor;
1420 idProduct = new->idProduct; 1417 idProduct = new->idProduct;
1421 bcdDevice = new->bcdDevice; 1418 bcdDevice = new->bcdDevice;
1419 iSerialNumber = new->iSerialNumber;
1422 1420
1423 *new = *old; 1421 *new = *old;
1424 if (idVendor) 1422 if (idVendor)
@@ -1427,6 +1425,8 @@ static void update_unchanged_dev_desc(struct usb_device_descriptor *new,
1427 new->idProduct = idProduct; 1425 new->idProduct = idProduct;
1428 if (bcdDevice) 1426 if (bcdDevice)
1429 new->bcdDevice = bcdDevice; 1427 new->bcdDevice = bcdDevice;
1428 if (iSerialNumber)
1429 new->iSerialNumber = iSerialNumber;
1430} 1430}
1431 1431
1432static struct usb_composite_driver *to_cdriver(struct usb_gadget_driver *gdrv) 1432static struct usb_composite_driver *to_cdriver(struct usb_gadget_driver *gdrv)
@@ -1505,8 +1505,7 @@ static int composite_bind(struct usb_gadget *gadget,
1505 cdev->product_override = 1505 cdev->product_override =
1506 override_id(cdev, &cdev->desc.iProduct); 1506 override_id(cdev, &cdev->desc.iProduct);
1507 1507
1508 if (iSerialNumber || 1508 if (composite->iSerialNumber)
1509 (!cdev->desc.iSerialNumber && composite->iSerialNumber))
1510 cdev->serial_override = 1509 cdev->serial_override =
1511 override_id(cdev, &cdev->desc.iSerialNumber); 1510 override_id(cdev, &cdev->desc.iSerialNumber);
1512 1511
@@ -1691,6 +1690,8 @@ void usb_composite_overwrite_options(struct usb_composite_dev *cdev,
1691 struct usb_composite_overwrite *covr) 1690 struct usb_composite_overwrite *covr)
1692{ 1691{
1693 struct usb_device_descriptor *desc = &cdev->desc; 1692 struct usb_device_descriptor *desc = &cdev->desc;
1693 struct usb_gadget_strings *gstr = cdev->driver->strings[0];
1694 struct usb_string *dev_str = gstr->strings;
1694 1695
1695 if (covr->idVendor) 1696 if (covr->idVendor)
1696 desc->idVendor = cpu_to_le16(covr->idVendor); 1697 desc->idVendor = cpu_to_le16(covr->idVendor);
@@ -1700,4 +1701,9 @@ void usb_composite_overwrite_options(struct usb_composite_dev *cdev,
1700 1701
1701 if (covr->bcdDevice) 1702 if (covr->bcdDevice)
1702 desc->bcdDevice = cpu_to_le16(covr->bcdDevice); 1703 desc->bcdDevice = cpu_to_le16(covr->bcdDevice);
1704
1705 if (covr->serial_number) {
1706 desc->iSerialNumber = dev_str[USB_GADGET_SERIAL_IDX].id;
1707 dev_str[USB_GADGET_SERIAL_IDX].s = covr->serial_number;
1708 }
1703} 1709}
diff --git a/drivers/usb/gadget/mass_storage.c b/drivers/usb/gadget/mass_storage.c
index 8ffbade383f2..6f5a3b232d81 100644
--- a/drivers/usb/gadget/mass_storage.c
+++ b/drivers/usb/gadget/mass_storage.c
@@ -83,6 +83,22 @@ static const struct usb_descriptor_header *otg_desc[] = {
83 NULL, 83 NULL,
84}; 84};
85 85
86static struct usb_string strings_dev[] = {
87 [USB_GADGET_MANUFACTURER_IDX].s = "",
88 [USB_GADGET_PRODUCT_IDX].s = "",
89 [USB_GADGET_SERIAL_IDX].s = "",
90 { } /* end of list */
91};
92
93static struct usb_gadget_strings stringtab_dev = {
94 .language = 0x0409, /* en-us */
95 .strings = strings_dev,
96};
97
98static struct usb_gadget_strings *dev_strings[] = {
99 &stringtab_dev,
100 NULL,
101};
86 102
87/****************************** Configurations ******************************/ 103/****************************** Configurations ******************************/
88 104
@@ -141,6 +157,10 @@ static int __init msg_bind(struct usb_composite_dev *cdev)
141{ 157{
142 int status; 158 int status;
143 159
160 status = usb_string_ids_tab(cdev, strings_dev);
161 if (status < 0)
162 return status;
163
144 status = usb_add_config(cdev, &msg_config_driver, msg_do_config); 164 status = usb_add_config(cdev, &msg_config_driver, msg_do_config);
145 if (status < 0) 165 if (status < 0)
146 return status; 166 return status;
@@ -160,6 +180,7 @@ static __refdata struct usb_composite_driver msg_driver = {
160 .iProduct = DRIVER_DESC, 180 .iProduct = DRIVER_DESC,
161 .max_speed = USB_SPEED_SUPER, 181 .max_speed = USB_SPEED_SUPER,
162 .needs_serial = 1, 182 .needs_serial = 1,
183 .strings = dev_strings,
163 .bind = msg_bind, 184 .bind = msg_bind,
164}; 185};
165 186
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c
index f02434a10dec..3321a9df4862 100644
--- a/drivers/usb/gadget/printer.c
+++ b/drivers/usb/gadget/printer.c
@@ -118,8 +118,7 @@ static struct printer_dev usb_printer_gadget;
118 * parameters are in UTF-8 (superset of ASCII's 7 bit characters). 118 * parameters are in UTF-8 (superset of ASCII's 7 bit characters).
119 */ 119 */
120 120
121static char *iSerialNum; 121module_param_named(iSerialNum, coverwrite.serial_number, charp, S_IRUGO);
122module_param(iSerialNum, charp, S_IRUGO);
123MODULE_PARM_DESC(iSerialNum, "1"); 122MODULE_PARM_DESC(iSerialNum, "1");
124 123
125static char *iPNPstring; 124static char *iPNPstring;
@@ -1170,9 +1169,6 @@ static int __init printer_bind_config(struct usb_configuration *c)
1170 init_utsname()->sysname, init_utsname()->release, 1169 init_utsname()->sysname, init_utsname()->release,
1171 gadget->name); 1170 gadget->name);
1172 1171
1173 if (iSerialNum)
1174 strlcpy(serial_num, iSerialNum, sizeof serial_num);
1175
1176 if (iPNPstring) 1172 if (iPNPstring)
1177 strlcpy(&pnp_string[2], iPNPstring, (sizeof pnp_string)-2); 1173 strlcpy(&pnp_string[2], iPNPstring, (sizeof pnp_string)-2);
1178 1174
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h
index f821a3ad475d..9d068a4be778 100644
--- a/include/linux/usb/composite.h
+++ b/include/linux/usb/composite.h
@@ -400,6 +400,7 @@ struct usb_composite_overwrite {
400 u16 idVendor; 400 u16 idVendor;
401 u16 idProduct; 401 u16 idProduct;
402 u16 bcdDevice; 402 u16 bcdDevice;
403 char *serial_number;
403}; 404};
404#define USB_GADGET_COMPOSITE_OPTIONS() \ 405#define USB_GADGET_COMPOSITE_OPTIONS() \
405 static struct usb_composite_overwrite coverwrite; \ 406 static struct usb_composite_overwrite coverwrite; \
@@ -411,7 +412,11 @@ struct usb_composite_overwrite {
411 MODULE_PARM_DESC(idProduct, "USB Product ID"); \ 412 MODULE_PARM_DESC(idProduct, "USB Product ID"); \
412 \ 413 \
413 module_param_named(bcdDevice, coverwrite.bcdDevice, ushort, S_IRUGO); \ 414 module_param_named(bcdDevice, coverwrite.bcdDevice, ushort, S_IRUGO); \
414 MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)") 415 MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)"); \
416 \
417 module_param_named(iSerialNumber, coverwrite.serial_number, charp, \
418 S_IRUGO); \
419 MODULE_PARM_DESC(iSerialNumber, "SerialNumber string")
415 420
416void usb_composite_overwrite_options(struct usb_composite_dev *cdev, 421void usb_composite_overwrite_options(struct usb_composite_dev *cdev,
417 struct usb_composite_overwrite *covr); 422 struct usb_composite_overwrite *covr);