Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit fc274c1

Browse files
AlanSterngregkh
authored andcommitted
USB: gadget: Add a new bus for gadgets
This patch adds a "gadget" bus and uses it for registering gadgets and their drivers. From now on, bindings will be managed by the driver core rather than through ad-hoc manipulations in the UDC core. As part of this change, the driver_pending_list is removed. The UDC core won't need to keep track of unbound drivers for later binding, because the driver core handles all of that for us. However, we do need one new feature: a way to prevent gadget drivers from being bound to more than one gadget at a time. The existing code does this automatically, but the driver core doesn't -- it's perfectly happy to bind a single driver to all the matching devices on the bus. The patch adds a new bitflag to the usb_gadget_driver structure for this purpose. A nice side effect of this change is a reduction in the total lines of code, since now the driver core will do part of the work that the UDC used to do. A possible future patch could add udc devices to the gadget bus, say as a separate device type. Signed-off-by: Alan Stern <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent d59f6d9 commit fc274c1

File tree

2 files changed

+139
-143
lines changed

2 files changed

+139
-143
lines changed

drivers/usb/gadget/udc/core.c

Lines changed: 122 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
#include "trace.h"
2525

26+
static struct bus_type gadget_bus_type;
27+
2628
/**
2729
* struct usb_udc - describes one usb device controller
2830
* @driver: the gadget driver pointer. For use by the class code
@@ -47,11 +49,9 @@ struct usb_udc {
4749

4850
static struct class *udc_class;
4951
static LIST_HEAD(udc_list);
50-
static LIST_HEAD(gadget_driver_pending_list);
51-
static DEFINE_MUTEX(udc_lock);
5252

53-
static int udc_bind_to_driver(struct usb_udc *udc,
54-
struct usb_gadget_driver *driver);
53+
/* Protects udc_list, udc->driver, driver->is_bound, and related calls */
54+
static DEFINE_MUTEX(udc_lock);
5555

5656
/* ------------------------------------------------------------------------- */
5757

@@ -1238,24 +1238,6 @@ static void usb_udc_nop_release(struct device *dev)
12381238
dev_vdbg(dev, "%s\n", __func__);
12391239
}
12401240

1241-
/* should be called with udc_lock held */
1242-
static int check_pending_gadget_drivers(struct usb_udc *udc)
1243-
{
1244-
struct usb_gadget_driver *driver;
1245-
int ret = 0;
1246-
1247-
list_for_each_entry(driver, &gadget_driver_pending_list, pending)
1248-
if (!driver->udc_name || strcmp(driver->udc_name,
1249-
dev_name(&udc->dev)) == 0) {
1250-
ret = udc_bind_to_driver(udc, driver);
1251-
if (ret != -EPROBE_DEFER)
1252-
list_del_init(&driver->pending);
1253-
break;
1254-
}
1255-
1256-
return ret;
1257-
}
1258-
12591241
/**
12601242
* usb_initialize_gadget - initialize a gadget and its embedded struct device
12611243
* @parent: the parent device to this udc. Usually the controller driver's
@@ -1276,6 +1258,7 @@ void usb_initialize_gadget(struct device *parent, struct usb_gadget *gadget,
12761258
gadget->dev.release = usb_udc_nop_release;
12771259

12781260
device_initialize(&gadget->dev);
1261+
gadget->dev.bus = &gadget_bus_type;
12791262
}
12801263
EXPORT_SYMBOL_GPL(usb_initialize_gadget);
12811264

@@ -1312,6 +1295,7 @@ int usb_add_gadget(struct usb_gadget *gadget)
13121295

13131296
mutex_lock(&udc_lock);
13141297
list_add_tail(&udc->list, &udc_list);
1298+
mutex_unlock(&udc_lock);
13151299

13161300
ret = device_add(&udc->dev);
13171301
if (ret)
@@ -1324,23 +1308,14 @@ int usb_add_gadget(struct usb_gadget *gadget)
13241308
if (ret)
13251309
goto err_del_udc;
13261310

1327-
/* pick up one of pending gadget drivers */
1328-
ret = check_pending_gadget_drivers(udc);
1329-
if (ret)
1330-
goto err_del_gadget;
1331-
1332-
mutex_unlock(&udc_lock);
1333-
13341311
return 0;
13351312

1336-
err_del_gadget:
1337-
device_del(&gadget->dev);
1338-
13391313
err_del_udc:
13401314
flush_work(&gadget->work);
13411315
device_del(&udc->dev);
13421316

13431317
err_unlist_udc:
1318+
mutex_lock(&udc_lock);
13441319
list_del(&udc->list);
13451320
mutex_unlock(&udc_lock);
13461321

@@ -1419,24 +1394,6 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget)
14191394
}
14201395
EXPORT_SYMBOL_GPL(usb_add_gadget_udc);
14211396

1422-
static void usb_gadget_remove_driver(struct usb_udc *udc)
1423-
{
1424-
dev_dbg(&udc->dev, "unregistering UDC driver [%s]\n",
1425-
udc->driver->function);
1426-
1427-
kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
1428-
1429-
usb_gadget_disconnect(udc->gadget);
1430-
usb_gadget_disable_async_callbacks(udc);
1431-
if (udc->gadget->irq)
1432-
synchronize_irq(udc->gadget->irq);
1433-
udc->driver->unbind(udc->gadget);
1434-
usb_gadget_udc_stop(udc);
1435-
1436-
udc->driver = NULL;
1437-
udc->gadget->dev.driver = NULL;
1438-
}
1439-
14401397
/**
14411398
* usb_del_gadget - deletes a gadget and unregisters its udc
14421399
* @gadget: the gadget to be deleted.
@@ -1455,13 +1412,6 @@ void usb_del_gadget(struct usb_gadget *gadget)
14551412

14561413
mutex_lock(&udc_lock);
14571414
list_del(&udc->list);
1458-
1459-
if (udc->driver) {
1460-
struct usb_gadget_driver *driver = udc->driver;
1461-
1462-
usb_gadget_remove_driver(udc);
1463-
list_add(&driver->pending, &gadget_driver_pending_list);
1464-
}
14651415
mutex_unlock(&udc_lock);
14661416

14671417
kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
@@ -1486,123 +1436,147 @@ EXPORT_SYMBOL_GPL(usb_del_gadget_udc);
14861436

14871437
/* ------------------------------------------------------------------------- */
14881438

1489-
static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *driver)
1439+
static int gadget_match_driver(struct device *dev, struct device_driver *drv)
14901440
{
1491-
int ret;
1441+
struct usb_gadget *gadget = dev_to_usb_gadget(dev);
1442+
struct usb_udc *udc = gadget->udc;
1443+
struct usb_gadget_driver *driver = container_of(drv,
1444+
struct usb_gadget_driver, driver);
1445+
1446+
/* If the driver specifies a udc_name, it must match the UDC's name */
1447+
if (driver->udc_name &&
1448+
strcmp(driver->udc_name, dev_name(&udc->dev)) != 0)
1449+
return 0;
1450+
1451+
/* If the driver is already bound to a gadget, it doesn't match */
1452+
if (driver->is_bound)
1453+
return 0;
1454+
1455+
/* Otherwise any gadget driver matches any UDC */
1456+
return 1;
1457+
}
14921458

1493-
dev_dbg(&udc->dev, "registering UDC driver [%s]\n",
1494-
driver->function);
1459+
static int gadget_bind_driver(struct device *dev)
1460+
{
1461+
struct usb_gadget *gadget = dev_to_usb_gadget(dev);
1462+
struct usb_udc *udc = gadget->udc;
1463+
struct usb_gadget_driver *driver = container_of(dev->driver,
1464+
struct usb_gadget_driver, driver);
1465+
int ret = 0;
14951466

1467+
mutex_lock(&udc_lock);
1468+
if (driver->is_bound) {
1469+
mutex_unlock(&udc_lock);
1470+
return -ENXIO; /* Driver binds to only one gadget */
1471+
}
1472+
driver->is_bound = true;
14961473
udc->driver = driver;
1497-
udc->gadget->dev.driver = &driver->driver;
1474+
mutex_unlock(&udc_lock);
1475+
1476+
dev_dbg(&udc->dev, "binding gadget driver [%s]\n", driver->function);
14981477

14991478
usb_gadget_udc_set_speed(udc, driver->max_speed);
15001479

1480+
mutex_lock(&udc_lock);
15011481
ret = driver->bind(udc->gadget, driver);
15021482
if (ret)
1503-
goto err1;
1483+
goto err_bind;
1484+
15041485
ret = usb_gadget_udc_start(udc);
1505-
if (ret) {
1506-
driver->unbind(udc->gadget);
1507-
goto err1;
1508-
}
1486+
if (ret)
1487+
goto err_start;
15091488
usb_gadget_enable_async_callbacks(udc);
15101489
usb_udc_connect_control(udc);
1490+
mutex_unlock(&udc_lock);
15111491

15121492
kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
15131493
return 0;
1514-
err1:
1494+
1495+
err_start:
1496+
driver->unbind(udc->gadget);
1497+
1498+
err_bind:
15151499
if (ret != -EISNAM)
15161500
dev_err(&udc->dev, "failed to start %s: %d\n",
1517-
udc->driver->function, ret);
1501+
driver->function, ret);
1502+
15181503
udc->driver = NULL;
1519-
udc->gadget->dev.driver = NULL;
1504+
driver->is_bound = false;
1505+
mutex_unlock(&udc_lock);
1506+
15201507
return ret;
15211508
}
15221509

1523-
int usb_gadget_register_driver(struct usb_gadget_driver *driver)
1510+
static void gadget_unbind_driver(struct device *dev)
1511+
{
1512+
struct usb_gadget *gadget = dev_to_usb_gadget(dev);
1513+
struct usb_udc *udc = gadget->udc;
1514+
struct usb_gadget_driver *driver = udc->driver;
1515+
1516+
dev_dbg(&udc->dev, "unbinding gadget driver [%s]\n", driver->function);
1517+
1518+
kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
1519+
1520+
mutex_lock(&udc_lock);
1521+
usb_gadget_disconnect(gadget);
1522+
usb_gadget_disable_async_callbacks(udc);
1523+
if (gadget->irq)
1524+
synchronize_irq(gadget->irq);
1525+
udc->driver->unbind(gadget);
1526+
usb_gadget_udc_stop(udc);
1527+
1528+
driver->is_bound = false;
1529+
udc->driver = NULL;
1530+
mutex_unlock(&udc_lock);
1531+
}
1532+
1533+
/* ------------------------------------------------------------------------- */
1534+
1535+
int usb_gadget_register_driver_owner(struct usb_gadget_driver *driver,
1536+
struct module *owner, const char *mod_name)
15241537
{
1525-
struct usb_udc *udc = NULL, *iter;
1526-
int ret = -ENODEV;
1538+
int ret;
15271539

15281540
if (!driver || !driver->bind || !driver->setup)
15291541
return -EINVAL;
15301542

1543+
driver->driver.bus = &gadget_bus_type;
1544+
driver->driver.owner = owner;
1545+
driver->driver.mod_name = mod_name;
1546+
ret = driver_register(&driver->driver);
1547+
if (ret) {
1548+
pr_warn("%s: driver registration failed: %d\n",
1549+
driver->function, ret);
1550+
return ret;
1551+
}
1552+
15311553
mutex_lock(&udc_lock);
1532-
if (driver->udc_name) {
1533-
list_for_each_entry(iter, &udc_list, list) {
1534-
ret = strcmp(driver->udc_name, dev_name(&iter->dev));
1535-
if (ret)
1536-
continue;
1537-
udc = iter;
1538-
break;
1539-
}
1540-
if (ret)
1541-
ret = -ENODEV;
1542-
else if (udc->driver)
1554+
if (!driver->is_bound) {
1555+
if (driver->match_existing_only) {
1556+
pr_warn("%s: couldn't find an available UDC or it's busy\n",
1557+
driver->function);
15431558
ret = -EBUSY;
1544-
else
1545-
goto found;
1546-
} else {
1547-
list_for_each_entry(iter, &udc_list, list) {
1548-
/* For now we take the first one */
1549-
if (iter->driver)
1550-
continue;
1551-
udc = iter;
1552-
goto found;
1559+
} else {
1560+
pr_info("%s: couldn't find an available UDC\n",
1561+
driver->function);
15531562
}
1554-
}
1555-
1556-
if (!driver->match_existing_only) {
1557-
list_add_tail(&driver->pending, &gadget_driver_pending_list);
1558-
pr_info("couldn't find an available UDC - added [%s] to list of pending drivers\n",
1559-
driver->function);
15601563
ret = 0;
15611564
}
1562-
15631565
mutex_unlock(&udc_lock);
1566+
15641567
if (ret)
1565-
pr_warn("couldn't find an available UDC or it's busy: %d\n", ret);
1566-
return ret;
1567-
found:
1568-
ret = udc_bind_to_driver(udc, driver);
1569-
mutex_unlock(&udc_lock);
1568+
driver_unregister(&driver->driver);
15701569
return ret;
15711570
}
1572-
EXPORT_SYMBOL_GPL(usb_gadget_register_driver);
1571+
EXPORT_SYMBOL_GPL(usb_gadget_register_driver_owner);
15731572

15741573
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
15751574
{
1576-
struct usb_udc *udc = NULL;
1577-
int ret = -ENODEV;
1578-
15791575
if (!driver || !driver->unbind)
15801576
return -EINVAL;
15811577

1582-
mutex_lock(&udc_lock);
1583-
list_for_each_entry(udc, &udc_list, list) {
1584-
if (udc->driver == driver) {
1585-
usb_gadget_remove_driver(udc);
1586-
usb_gadget_set_state(udc->gadget,
1587-
USB_STATE_NOTATTACHED);
1588-
1589-
/* Maybe there is someone waiting for this UDC? */
1590-
check_pending_gadget_drivers(udc);
1591-
/*
1592-
* For now we ignore bind errors as probably it's
1593-
* not a valid reason to fail other's gadget unbind
1594-
*/
1595-
ret = 0;
1596-
break;
1597-
}
1598-
}
1599-
1600-
if (ret) {
1601-
list_del(&driver->pending);
1602-
ret = 0;
1603-
}
1604-
mutex_unlock(&udc_lock);
1605-
return ret;
1578+
driver_unregister(&driver->driver);
1579+
return 0;
16061580
}
16071581
EXPORT_SYMBOL_GPL(usb_gadget_unregister_driver);
16081582

@@ -1754,8 +1728,17 @@ static int usb_udc_uevent(struct device *dev, struct kobj_uevent_env *env)
17541728
return 0;
17551729
}
17561730

1731+
static struct bus_type gadget_bus_type = {
1732+
.name = "gadget",
1733+
.probe = gadget_bind_driver,
1734+
.remove = gadget_unbind_driver,
1735+
.match = gadget_match_driver,
1736+
};
1737+
17571738
static int __init usb_udc_init(void)
17581739
{
1740+
int rc;
1741+
17591742
udc_class = class_create(THIS_MODULE, "udc");
17601743
if (IS_ERR(udc_class)) {
17611744
pr_err("failed to create udc class --> %ld\n",
@@ -1764,12 +1747,17 @@ static int __init usb_udc_init(void)
17641747
}
17651748

17661749
udc_class->dev_uevent = usb_udc_uevent;
1767-
return 0;
1750+
1751+
rc = bus_register(&gadget_bus_type);
1752+
if (rc)
1753+
class_destroy(udc_class);
1754+
return rc;
17681755
}
17691756
subsys_initcall(usb_udc_init);
17701757

17711758
static void __exit usb_udc_exit(void)
17721759
{
1760+
bus_unregister(&gadget_bus_type);
17731761
class_destroy(udc_class);
17741762
}
17751763
module_exit(usb_udc_exit);

0 commit comments

Comments
 (0)